@bytetrue/byspace 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1177) hide show
  1. package/LICENSE +671 -0
  2. package/README.md +154 -0
  3. package/bin/byspace +3 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +121 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/agent/archive.d.ts +18 -0
  9. package/dist/commands/agent/archive.d.ts.map +1 -0
  10. package/dist/commands/agent/archive.js +102 -0
  11. package/dist/commands/agent/archive.js.map +1 -0
  12. package/dist/commands/agent/attach.d.ts +11 -0
  13. package/dist/commands/agent/attach.d.ts.map +1 -0
  14. package/dist/commands/agent/attach.js +159 -0
  15. package/dist/commands/agent/attach.js.map +1 -0
  16. package/dist/commands/agent/delete.d.ts +15 -0
  17. package/dist/commands/agent/delete.d.ts.map +1 -0
  18. package/dist/commands/agent/delete.js +107 -0
  19. package/dist/commands/agent/delete.js.map +1 -0
  20. package/dist/commands/agent/import.d.ts +14 -0
  21. package/dist/commands/agent/import.d.ts.map +1 -0
  22. package/dist/commands/agent/import.js +122 -0
  23. package/dist/commands/agent/import.js.map +1 -0
  24. package/dist/commands/agent/index.d.ts +3 -0
  25. package/dist/commands/agent/index.d.ts.map +1 -0
  26. package/dist/commands/agent/index.js +48 -0
  27. package/dist/commands/agent/index.js.map +1 -0
  28. package/dist/commands/agent/inspect.d.ts +15 -0
  29. package/dist/commands/agent/inspect.d.ts.map +1 -0
  30. package/dist/commands/agent/inspect.js +209 -0
  31. package/dist/commands/agent/inspect.js.map +1 -0
  32. package/dist/commands/agent/logs.d.ts +19 -0
  33. package/dist/commands/agent/logs.d.ts.map +1 -0
  34. package/dist/commands/agent/logs.js +180 -0
  35. package/dist/commands/agent/logs.js.map +1 -0
  36. package/dist/commands/agent/ls.d.ts +44 -0
  37. package/dist/commands/agent/ls.d.ts.map +1 -0
  38. package/dist/commands/agent/ls.js +204 -0
  39. package/dist/commands/agent/ls.js.map +1 -0
  40. package/dist/commands/agent/mode.d.ts +18 -0
  41. package/dist/commands/agent/mode.d.ts.map +1 -0
  42. package/dist/commands/agent/mode.js +100 -0
  43. package/dist/commands/agent/mode.js.map +1 -0
  44. package/dist/commands/agent/reload.d.ts +15 -0
  45. package/dist/commands/agent/reload.d.ts.map +1 -0
  46. package/dist/commands/agent/reload.js +75 -0
  47. package/dist/commands/agent/reload.js.map +1 -0
  48. package/dist/commands/agent/run.d.ts +44 -0
  49. package/dist/commands/agent/run.d.ts.map +1 -0
  50. package/dist/commands/agent/run.js +464 -0
  51. package/dist/commands/agent/run.js.map +1 -0
  52. package/dist/commands/agent/send.d.ts +19 -0
  53. package/dist/commands/agent/send.d.ts.map +1 -0
  54. package/dist/commands/agent/send.js +187 -0
  55. package/dist/commands/agent/send.js.map +1 -0
  56. package/dist/commands/agent/stop.d.ts +17 -0
  57. package/dist/commands/agent/stop.d.ts.map +1 -0
  58. package/dist/commands/agent/stop.js +115 -0
  59. package/dist/commands/agent/stop.js.map +1 -0
  60. package/dist/commands/agent/update.d.ts +18 -0
  61. package/dist/commands/agent/update.d.ts.map +1 -0
  62. package/dist/commands/agent/update.js +139 -0
  63. package/dist/commands/agent/update.js.map +1 -0
  64. package/dist/commands/agent/wait.d.ts +17 -0
  65. package/dist/commands/agent/wait.d.ts.map +1 -0
  66. package/dist/commands/agent/wait.js +158 -0
  67. package/dist/commands/agent/wait.js.map +1 -0
  68. package/dist/commands/chat/create.d.ts +9 -0
  69. package/dist/commands/chat/create.d.ts.map +1 -0
  70. package/dist/commands/chat/create.js +23 -0
  71. package/dist/commands/chat/create.js.map +1 -0
  72. package/dist/commands/chat/delete.d.ts +6 -0
  73. package/dist/commands/chat/delete.d.ts.map +1 -0
  74. package/dist/commands/chat/delete.js +20 -0
  75. package/dist/commands/chat/delete.js.map +1 -0
  76. package/dist/commands/chat/index.d.ts +3 -0
  77. package/dist/commands/chat/index.d.ts.map +1 -0
  78. package/dist/commands/chat/index.js +47 -0
  79. package/dist/commands/chat/index.js.map +1 -0
  80. package/dist/commands/chat/inspect.d.ts +6 -0
  81. package/dist/commands/chat/inspect.d.ts.map +1 -0
  82. package/dist/commands/chat/inspect.js +20 -0
  83. package/dist/commands/chat/inspect.js.map +1 -0
  84. package/dist/commands/chat/ls.d.ts +6 -0
  85. package/dist/commands/chat/ls.d.ts.map +1 -0
  86. package/dist/commands/chat/ls.js +20 -0
  87. package/dist/commands/chat/ls.js.map +1 -0
  88. package/dist/commands/chat/post.d.ts +9 -0
  89. package/dist/commands/chat/post.d.ts.map +1 -0
  90. package/dist/commands/chat/post.js +28 -0
  91. package/dist/commands/chat/post.js.map +1 -0
  92. package/dist/commands/chat/read.d.ts +11 -0
  93. package/dist/commands/chat/read.d.ts.map +1 -0
  94. package/dist/commands/chat/read.js +40 -0
  95. package/dist/commands/chat/read.js.map +1 -0
  96. package/dist/commands/chat/schema.d.ts +36 -0
  97. package/dist/commands/chat/schema.d.ts.map +1 -0
  98. package/dist/commands/chat/schema.js +81 -0
  99. package/dist/commands/chat/schema.js.map +1 -0
  100. package/dist/commands/chat/shared.d.ts +19 -0
  101. package/dist/commands/chat/shared.d.ts.map +1 -0
  102. package/dist/commands/chat/shared.js +118 -0
  103. package/dist/commands/chat/shared.js.map +1 -0
  104. package/dist/commands/chat/wait.d.ts +9 -0
  105. package/dist/commands/chat/wait.d.ts.map +1 -0
  106. package/dist/commands/chat/wait.js +45 -0
  107. package/dist/commands/chat/wait.js.map +1 -0
  108. package/dist/commands/clone.d.ts +17 -0
  109. package/dist/commands/clone.d.ts.map +1 -0
  110. package/dist/commands/clone.js +65 -0
  111. package/dist/commands/clone.js.map +1 -0
  112. package/dist/commands/daemon/index.d.ts +3 -0
  113. package/dist/commands/daemon/index.d.ts.map +1 -0
  114. package/dist/commands/daemon/index.js +57 -0
  115. package/dist/commands/daemon/index.js.map +1 -0
  116. package/dist/commands/daemon/local-daemon.d.ts +77 -0
  117. package/dist/commands/daemon/local-daemon.d.ts.map +1 -0
  118. package/dist/commands/daemon/local-daemon.js +545 -0
  119. package/dist/commands/daemon/local-daemon.js.map +1 -0
  120. package/dist/commands/daemon/pair.d.ts +9 -0
  121. package/dist/commands/daemon/pair.d.ts.map +1 -0
  122. package/dist/commands/daemon/pair.js +76 -0
  123. package/dist/commands/daemon/pair.js.map +1 -0
  124. package/dist/commands/daemon/restart.d.ts +12 -0
  125. package/dist/commands/daemon/restart.d.ts.map +1 -0
  126. package/dist/commands/daemon/restart.js +99 -0
  127. package/dist/commands/daemon/restart.js.map +1 -0
  128. package/dist/commands/daemon/runtime-toolchain.d.ts +6 -0
  129. package/dist/commands/daemon/runtime-toolchain.d.ts.map +1 -0
  130. package/dist/commands/daemon/runtime-toolchain.js +87 -0
  131. package/dist/commands/daemon/runtime-toolchain.js.map +1 -0
  132. package/dist/commands/daemon/set-password.d.ts +17 -0
  133. package/dist/commands/daemon/set-password.d.ts.map +1 -0
  134. package/dist/commands/daemon/set-password.js +82 -0
  135. package/dist/commands/daemon/set-password.js.map +1 -0
  136. package/dist/commands/daemon/start.d.ts +6 -0
  137. package/dist/commands/daemon/start.d.ts.map +1 -0
  138. package/dist/commands/daemon/start.js +56 -0
  139. package/dist/commands/daemon/start.js.map +1 -0
  140. package/dist/commands/daemon/status.d.ts +10 -0
  141. package/dist/commands/daemon/status.d.ts.map +1 -0
  142. package/dist/commands/daemon/status.js +337 -0
  143. package/dist/commands/daemon/status.js.map +1 -0
  144. package/dist/commands/daemon/stop.d.ts +15 -0
  145. package/dist/commands/daemon/stop.d.ts.map +1 -0
  146. package/dist/commands/daemon/stop.js +60 -0
  147. package/dist/commands/daemon/stop.js.map +1 -0
  148. package/dist/commands/hooks.d.ts +19 -0
  149. package/dist/commands/hooks.d.ts.map +1 -0
  150. package/dist/commands/hooks.js +89 -0
  151. package/dist/commands/hooks.js.map +1 -0
  152. package/dist/commands/loop/index.d.ts +3 -0
  153. package/dist/commands/loop/index.d.ts.map +1 -0
  154. package/dist/commands/loop/index.js +18 -0
  155. package/dist/commands/loop/index.js.map +1 -0
  156. package/dist/commands/loop/inspect.d.ts +13 -0
  157. package/dist/commands/loop/inspect.d.ts.map +1 -0
  158. package/dist/commands/loop/inspect.js +100 -0
  159. package/dist/commands/loop/inspect.js.map +1 -0
  160. package/dist/commands/loop/logs.d.ts +8 -0
  161. package/dist/commands/loop/logs.d.ts.map +1 -0
  162. package/dist/commands/loop/logs.js +69 -0
  163. package/dist/commands/loop/logs.js.map +1 -0
  164. package/dist/commands/loop/ls.d.ts +18 -0
  165. package/dist/commands/loop/ls.d.ts.map +1 -0
  166. package/dist/commands/loop/ls.js +62 -0
  167. package/dist/commands/loop/ls.js.map +1 -0
  168. package/dist/commands/loop/run.d.ts +30 -0
  169. package/dist/commands/loop/run.d.ts.map +1 -0
  170. package/dist/commands/loop/run.js +162 -0
  171. package/dist/commands/loop/run.js.map +1 -0
  172. package/dist/commands/loop/stop.d.ts +15 -0
  173. package/dist/commands/loop/stop.d.ts.map +1 -0
  174. package/dist/commands/loop/stop.js +56 -0
  175. package/dist/commands/loop/stop.js.map +1 -0
  176. package/dist/commands/loop/types.d.ts +138 -0
  177. package/dist/commands/loop/types.d.ts.map +1 -0
  178. package/dist/commands/loop/types.js +2 -0
  179. package/dist/commands/loop/types.js.map +1 -0
  180. package/dist/commands/onboard.d.ts +10 -0
  181. package/dist/commands/onboard.d.ts.map +1 -0
  182. package/dist/commands/onboard.js +415 -0
  183. package/dist/commands/onboard.js.map +1 -0
  184. package/dist/commands/permit/allow.d.ts +20 -0
  185. package/dist/commands/permit/allow.d.ts.map +1 -0
  186. package/dist/commands/permit/allow.js +133 -0
  187. package/dist/commands/permit/allow.js.map +1 -0
  188. package/dist/commands/permit/deny.d.ts +12 -0
  189. package/dist/commands/permit/deny.d.ts.map +1 -0
  190. package/dist/commands/permit/deny.js +105 -0
  191. package/dist/commands/permit/deny.js.map +1 -0
  192. package/dist/commands/permit/index.d.ts +3 -0
  193. package/dist/commands/permit/index.d.ts.map +1 -0
  194. package/dist/commands/permit/index.js +27 -0
  195. package/dist/commands/permit/index.js.map +1 -0
  196. package/dist/commands/permit/ls.d.ts +18 -0
  197. package/dist/commands/permit/ls.d.ts.map +1 -0
  198. package/dist/commands/permit/ls.js +66 -0
  199. package/dist/commands/permit/ls.js.map +1 -0
  200. package/dist/commands/provider/index.d.ts +3 -0
  201. package/dist/commands/provider/index.d.ts.map +1 -0
  202. package/dist/commands/provider/index.js +16 -0
  203. package/dist/commands/provider/index.js.map +1 -0
  204. package/dist/commands/provider/ls.d.ts +19 -0
  205. package/dist/commands/provider/ls.d.ts.map +1 -0
  206. package/dist/commands/provider/ls.js +73 -0
  207. package/dist/commands/provider/ls.js.map +1 -0
  208. package/dist/commands/provider/models.d.ts +20 -0
  209. package/dist/commands/provider/models.d.ts.map +1 -0
  210. package/dist/commands/provider/models.js +53 -0
  211. package/dist/commands/provider/models.js.map +1 -0
  212. package/dist/commands/schedule/create.d.ts +18 -0
  213. package/dist/commands/schedule/create.d.ts.map +1 -0
  214. package/dist/commands/schedule/create.js +40 -0
  215. package/dist/commands/schedule/create.js.map +1 -0
  216. package/dist/commands/schedule/delete.d.ts +10 -0
  217. package/dist/commands/schedule/delete.d.ts.map +1 -0
  218. package/dist/commands/schedule/delete.js +32 -0
  219. package/dist/commands/schedule/delete.js.map +1 -0
  220. package/dist/commands/schedule/index.d.ts +3 -0
  221. package/dist/commands/schedule/index.d.ts.map +1 -0
  222. package/dist/commands/schedule/index.js +66 -0
  223. package/dist/commands/schedule/index.js.map +1 -0
  224. package/dist/commands/schedule/inspect.d.ts +6 -0
  225. package/dist/commands/schedule/inspect.d.ts.map +1 -0
  226. package/dist/commands/schedule/inspect.js +24 -0
  227. package/dist/commands/schedule/inspect.js.map +1 -0
  228. package/dist/commands/schedule/logs.d.ts +6 -0
  229. package/dist/commands/schedule/logs.d.ts.map +1 -0
  230. package/dist/commands/schedule/logs.js +23 -0
  231. package/dist/commands/schedule/logs.js.map +1 -0
  232. package/dist/commands/schedule/ls.d.ts +5 -0
  233. package/dist/commands/schedule/ls.d.ts.map +1 -0
  234. package/dist/commands/schedule/ls.js +23 -0
  235. package/dist/commands/schedule/ls.js.map +1 -0
  236. package/dist/commands/schedule/pause.d.ts +5 -0
  237. package/dist/commands/schedule/pause.d.ts.map +1 -0
  238. package/dist/commands/schedule/pause.js +23 -0
  239. package/dist/commands/schedule/pause.js.map +1 -0
  240. package/dist/commands/schedule/resume.d.ts +5 -0
  241. package/dist/commands/schedule/resume.d.ts.map +1 -0
  242. package/dist/commands/schedule/resume.js +23 -0
  243. package/dist/commands/schedule/resume.js.map +1 -0
  244. package/dist/commands/schedule/run-once.d.ts +5 -0
  245. package/dist/commands/schedule/run-once.d.ts.map +1 -0
  246. package/dist/commands/schedule/run-once.js +23 -0
  247. package/dist/commands/schedule/run-once.js.map +1 -0
  248. package/dist/commands/schedule/schema.d.ts +21 -0
  249. package/dist/commands/schedule/schema.d.ts.map +1 -0
  250. package/dist/commands/schedule/schema.js +67 -0
  251. package/dist/commands/schedule/schema.js.map +1 -0
  252. package/dist/commands/schedule/shared.d.ts +56 -0
  253. package/dist/commands/schedule/shared.d.ts.map +1 -0
  254. package/dist/commands/schedule/shared.js +346 -0
  255. package/dist/commands/schedule/shared.js.map +1 -0
  256. package/dist/commands/schedule/types.d.ts +168 -0
  257. package/dist/commands/schedule/types.d.ts.map +1 -0
  258. package/dist/commands/schedule/types.js +2 -0
  259. package/dist/commands/schedule/types.js.map +1 -0
  260. package/dist/commands/schedule/update.d.ts +21 -0
  261. package/dist/commands/schedule/update.d.ts.map +1 -0
  262. package/dist/commands/schedule/update.js +39 -0
  263. package/dist/commands/schedule/update.js.map +1 -0
  264. package/dist/commands/speech/index.d.ts +3 -0
  265. package/dist/commands/speech/index.d.ts.map +1 -0
  266. package/dist/commands/speech/index.js +5 -0
  267. package/dist/commands/speech/index.js.map +1 -0
  268. package/dist/commands/terminal/capture.d.ts +10 -0
  269. package/dist/commands/terminal/capture.d.ts.map +1 -0
  270. package/dist/commands/terminal/capture.js +68 -0
  271. package/dist/commands/terminal/capture.js.map +1 -0
  272. package/dist/commands/terminal/create.d.ts +10 -0
  273. package/dist/commands/terminal/create.d.ts.map +1 -0
  274. package/dist/commands/terminal/create.js +38 -0
  275. package/dist/commands/terminal/create.js.map +1 -0
  276. package/dist/commands/terminal/index.d.ts +3 -0
  277. package/dist/commands/terminal/index.d.ts.map +1 -0
  278. package/dist/commands/terminal/index.js +43 -0
  279. package/dist/commands/terminal/index.js.map +1 -0
  280. package/dist/commands/terminal/kill.d.ts +6 -0
  281. package/dist/commands/terminal/kill.d.ts.map +1 -0
  282. package/dist/commands/terminal/kill.js +36 -0
  283. package/dist/commands/terminal/kill.js.map +1 -0
  284. package/dist/commands/terminal/ls.d.ts +10 -0
  285. package/dist/commands/terminal/ls.d.ts.map +1 -0
  286. package/dist/commands/terminal/ls.js +21 -0
  287. package/dist/commands/terminal/ls.js.map +1 -0
  288. package/dist/commands/terminal/schema.d.ts +18 -0
  289. package/dist/commands/terminal/schema.d.ts.map +1 -0
  290. package/dist/commands/terminal/schema.js +23 -0
  291. package/dist/commands/terminal/schema.js.map +1 -0
  292. package/dist/commands/terminal/send-keys.d.ts +7 -0
  293. package/dist/commands/terminal/send-keys.d.ts.map +1 -0
  294. package/dist/commands/terminal/send-keys.js +76 -0
  295. package/dist/commands/terminal/send-keys.js.map +1 -0
  296. package/dist/commands/terminal/shared.d.ts +12 -0
  297. package/dist/commands/terminal/shared.d.ts.map +1 -0
  298. package/dist/commands/terminal/shared.js +61 -0
  299. package/dist/commands/terminal/shared.js.map +1 -0
  300. package/dist/commands/worktree/archive.d.ts +20 -0
  301. package/dist/commands/worktree/archive.d.ts.map +1 -0
  302. package/dist/commands/worktree/archive.js +104 -0
  303. package/dist/commands/worktree/archive.js.map +1 -0
  304. package/dist/commands/worktree/create-input.d.ts +15 -0
  305. package/dist/commands/worktree/create-input.d.ts.map +1 -0
  306. package/dist/commands/worktree/create-input.js +56 -0
  307. package/dist/commands/worktree/create-input.js.map +1 -0
  308. package/dist/commands/worktree/create.d.ts +11 -0
  309. package/dist/commands/worktree/create.d.ts.map +1 -0
  310. package/dist/commands/worktree/create.js +58 -0
  311. package/dist/commands/worktree/create.js.map +1 -0
  312. package/dist/commands/worktree/index.d.ts +3 -0
  313. package/dist/commands/worktree/index.d.ts.map +1 -0
  314. package/dist/commands/worktree/index.js +25 -0
  315. package/dist/commands/worktree/index.js.map +1 -0
  316. package/dist/commands/worktree/ls.d.ts +19 -0
  317. package/dist/commands/worktree/ls.d.ts.map +1 -0
  318. package/dist/commands/worktree/ls.js +97 -0
  319. package/dist/commands/worktree/ls.js.map +1 -0
  320. package/dist/index.d.ts +2 -0
  321. package/dist/index.d.ts.map +1 -0
  322. package/dist/index.js +6 -0
  323. package/dist/index.js.map +1 -0
  324. package/dist/output/index.d.ts +45 -0
  325. package/dist/output/index.d.ts.map +1 -0
  326. package/dist/output/index.js +47 -0
  327. package/dist/output/index.js.map +1 -0
  328. package/dist/output/json.d.ts +11 -0
  329. package/dist/output/json.d.ts.map +1 -0
  330. package/dist/output/json.js +37 -0
  331. package/dist/output/json.js.map +1 -0
  332. package/dist/output/quiet.d.ts +9 -0
  333. package/dist/output/quiet.d.ts.map +1 -0
  334. package/dist/output/quiet.js +22 -0
  335. package/dist/output/quiet.js.map +1 -0
  336. package/dist/output/render.d.ts +15 -0
  337. package/dist/output/render.d.ts.map +1 -0
  338. package/dist/output/render.js +83 -0
  339. package/dist/output/render.js.map +1 -0
  340. package/dist/output/table.d.ts +13 -0
  341. package/dist/output/table.d.ts.map +1 -0
  342. package/dist/output/table.js +135 -0
  343. package/dist/output/table.js.map +1 -0
  344. package/dist/output/types.d.ts +73 -0
  345. package/dist/output/types.d.ts.map +1 -0
  346. package/dist/output/types.js +8 -0
  347. package/dist/output/types.js.map +1 -0
  348. package/dist/output/with-output.d.ts +41 -0
  349. package/dist/output/with-output.d.ts.map +1 -0
  350. package/dist/output/with-output.js +87 -0
  351. package/dist/output/with-output.js.map +1 -0
  352. package/dist/output/yaml.d.ts +11 -0
  353. package/dist/output/yaml.d.ts.map +1 -0
  354. package/dist/output/yaml.js +38 -0
  355. package/dist/output/yaml.js.map +1 -0
  356. package/dist/run.d.ts +9 -0
  357. package/dist/run.d.ts.map +1 -0
  358. package/dist/run.js +15 -0
  359. package/dist/run.js.map +1 -0
  360. package/dist/utils/client-id.d.ts +2 -0
  361. package/dist/utils/client-id.d.ts.map +1 -0
  362. package/dist/utils/client-id.js +37 -0
  363. package/dist/utils/client-id.js.map +1 -0
  364. package/dist/utils/client.d.ts +53 -0
  365. package/dist/utils/client.d.ts.map +1 -0
  366. package/dist/utils/client.js +339 -0
  367. package/dist/utils/client.js.map +1 -0
  368. package/dist/utils/command-options.d.ts +6 -0
  369. package/dist/utils/command-options.d.ts.map +1 -0
  370. package/dist/utils/command-options.js +17 -0
  371. package/dist/utils/command-options.js.map +1 -0
  372. package/dist/utils/duration.d.ts +7 -0
  373. package/dist/utils/duration.d.ts.map +1 -0
  374. package/dist/utils/duration.js +38 -0
  375. package/dist/utils/duration.js.map +1 -0
  376. package/dist/utils/errors.d.ts +5 -0
  377. package/dist/utils/errors.d.ts.map +1 -0
  378. package/dist/utils/errors.js +10 -0
  379. package/dist/utils/errors.js.map +1 -0
  380. package/dist/utils/paths.d.ts +12 -0
  381. package/dist/utils/paths.d.ts.map +1 -0
  382. package/dist/utils/paths.js +22 -0
  383. package/dist/utils/paths.js.map +1 -0
  384. package/dist/utils/provider-model.d.ts +11 -0
  385. package/dist/utils/provider-model.d.ts.map +1 -0
  386. package/dist/utils/provider-model.js +49 -0
  387. package/dist/utils/provider-model.js.map +1 -0
  388. package/dist/utils/timeline.d.ts +11 -0
  389. package/dist/utils/timeline.d.ts.map +1 -0
  390. package/dist/utils/timeline.js +11 -0
  391. package/dist/utils/timeline.js.map +1 -0
  392. package/dist/version.d.ts +2 -0
  393. package/dist/version.d.ts.map +1 -0
  394. package/dist/version.js +10 -0
  395. package/dist/version.js.map +1 -0
  396. package/node_modules/@bytetrue/byspace-client/README.md +12 -0
  397. package/node_modules/@bytetrue/byspace-client/dist/compat/normalize-provider-models.d.ts +11 -0
  398. package/node_modules/@bytetrue/byspace-client/dist/compat/normalize-provider-models.js +42 -0
  399. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-relay-e2ee-transport.d.ts +8 -0
  400. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-relay-e2ee-transport.js +161 -0
  401. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-runtime-metrics.d.ts +39 -0
  402. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-runtime-metrics.js +173 -0
  403. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-transport-types.d.ts +36 -0
  404. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-transport-types.js +2 -0
  405. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-transport-utils.d.ts +9 -0
  406. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-transport-utils.js +121 -0
  407. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-transport.d.ts +5 -0
  408. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-transport.js +4 -0
  409. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-websocket-transport.d.ts +8 -0
  410. package/node_modules/@bytetrue/byspace-client/dist/daemon-client-websocket-transport.js +120 -0
  411. package/node_modules/@bytetrue/byspace-client/dist/daemon-client.d.ts +1008 -0
  412. package/node_modules/@bytetrue/byspace-client/dist/daemon-client.js +3828 -0
  413. package/node_modules/@bytetrue/byspace-client/dist/index.d.ts +281 -0
  414. package/node_modules/@bytetrue/byspace-client/dist/index.js +176 -0
  415. package/node_modules/@bytetrue/byspace-client/dist/terminal-stream-router.d.ts +28 -0
  416. package/node_modules/@bytetrue/byspace-client/dist/terminal-stream-router.js +108 -0
  417. package/node_modules/@bytetrue/byspace-client/package.json +47 -0
  418. package/node_modules/@bytetrue/byspace-highlight/dist/colors.d.ts +4 -0
  419. package/node_modules/@bytetrue/byspace-highlight/dist/colors.js +45 -0
  420. package/node_modules/@bytetrue/byspace-highlight/dist/highlighter.d.ts +4 -0
  421. package/node_modules/@bytetrue/byspace-highlight/dist/highlighter.js +97 -0
  422. package/node_modules/@bytetrue/byspace-highlight/dist/index.d.ts +7 -0
  423. package/node_modules/@bytetrue/byspace-highlight/dist/index.js +5 -0
  424. package/node_modules/@bytetrue/byspace-highlight/dist/parsers.d.ts +5 -0
  425. package/node_modules/@bytetrue/byspace-highlight/dist/parsers.js +85 -0
  426. package/node_modules/@bytetrue/byspace-highlight/dist/themes.d.ts +12 -0
  427. package/node_modules/@bytetrue/byspace-highlight/dist/themes.js +235 -0
  428. package/node_modules/@bytetrue/byspace-highlight/dist/types.d.ts +6 -0
  429. package/node_modules/@bytetrue/byspace-highlight/dist/types.js +2 -0
  430. package/node_modules/@bytetrue/byspace-highlight/package.json +54 -0
  431. package/node_modules/@bytetrue/byspace-protocol/README.md +12 -0
  432. package/node_modules/@bytetrue/byspace-protocol/dist/agent-attention-notification.d.ts +41 -0
  433. package/node_modules/@bytetrue/byspace-protocol/dist/agent-attention-notification.js +140 -0
  434. package/node_modules/@bytetrue/byspace-protocol/dist/agent-labels.d.ts +7 -0
  435. package/node_modules/@bytetrue/byspace-protocol/dist/agent-labels.js +11 -0
  436. package/node_modules/@bytetrue/byspace-protocol/dist/agent-lifecycle.d.ts +3 -0
  437. package/node_modules/@bytetrue/byspace-protocol/dist/agent-lifecycle.js +8 -0
  438. package/node_modules/@bytetrue/byspace-protocol/dist/agent-state-bucket.d.ts +14 -0
  439. package/node_modules/@bytetrue/byspace-protocol/dist/agent-state-bucket.js +41 -0
  440. package/node_modules/@bytetrue/byspace-protocol/dist/agent-title-limits.d.ts +2 -0
  441. package/node_modules/@bytetrue/byspace-protocol/dist/agent-title-limits.js +2 -0
  442. package/node_modules/@bytetrue/byspace-protocol/dist/agent-types.d.ts +449 -0
  443. package/node_modules/@bytetrue/byspace-protocol/dist/agent-types.js +22 -0
  444. package/node_modules/@bytetrue/byspace-protocol/dist/binary-frames/demux.d.ts +11 -0
  445. package/node_modules/@bytetrue/byspace-protocol/dist/binary-frames/demux.js +23 -0
  446. package/node_modules/@bytetrue/byspace-protocol/dist/binary-frames/file-transfer.d.ts +50 -0
  447. package/node_modules/@bytetrue/byspace-protocol/dist/binary-frames/file-transfer.js +107 -0
  448. package/node_modules/@bytetrue/byspace-protocol/dist/binary-frames/index.d.ts +4 -0
  449. package/node_modules/@bytetrue/byspace-protocol/dist/binary-frames/index.js +4 -0
  450. package/node_modules/@bytetrue/byspace-protocol/dist/binary-frames/terminal.d.ts +31 -0
  451. package/node_modules/@bytetrue/byspace-protocol/dist/binary-frames/terminal.js +99 -0
  452. package/node_modules/@bytetrue/byspace-protocol/dist/branch-slug.d.ts +14 -0
  453. package/node_modules/@bytetrue/byspace-protocol/dist/branch-slug.js +49 -0
  454. package/node_modules/@bytetrue/byspace-protocol/dist/byspace-config-schema.d.ts +117 -0
  455. package/node_modules/@bytetrue/byspace-protocol/dist/byspace-config-schema.js +79 -0
  456. package/node_modules/@bytetrue/byspace-protocol/dist/chat/rpc-schemas.d.ts +158 -0
  457. package/node_modules/@bytetrue/byspace-protocol/dist/chat/rpc-schemas.js +103 -0
  458. package/node_modules/@bytetrue/byspace-protocol/dist/chat/types.d.ts +30 -0
  459. package/node_modules/@bytetrue/byspace-protocol/dist/chat/types.js +22 -0
  460. package/node_modules/@bytetrue/byspace-protocol/dist/client-capabilities.d.ts +8 -0
  461. package/node_modules/@bytetrue/byspace-protocol/dist/client-capabilities.js +18 -0
  462. package/node_modules/@bytetrue/byspace-protocol/dist/connection-offer.d.ts +36 -0
  463. package/node_modules/@bytetrue/byspace-protocol/dist/connection-offer.js +53 -0
  464. package/node_modules/@bytetrue/byspace-protocol/dist/daemon-endpoints.d.ts +47 -0
  465. package/node_modules/@bytetrue/byspace-protocol/dist/daemon-endpoints.js +201 -0
  466. package/node_modules/@bytetrue/byspace-protocol/dist/error-utils.d.ts +11 -0
  467. package/node_modules/@bytetrue/byspace-protocol/dist/error-utils.js +27 -0
  468. package/node_modules/@bytetrue/byspace-protocol/dist/generated/validation/ws-outbound.aot.d.ts +2 -0
  469. package/node_modules/@bytetrue/byspace-protocol/dist/generated/validation/ws-outbound.aot.js +51870 -0
  470. package/node_modules/@bytetrue/byspace-protocol/dist/git-remote.d.ts +26 -0
  471. package/node_modules/@bytetrue/byspace-protocol/dist/git-remote.js +84 -0
  472. package/node_modules/@bytetrue/byspace-protocol/dist/host-connection-schema.d.ts +11 -0
  473. package/node_modules/@bytetrue/byspace-protocol/dist/host-connection-schema.js +9 -0
  474. package/node_modules/@bytetrue/byspace-protocol/dist/literal-union.d.ts +2 -0
  475. package/node_modules/@bytetrue/byspace-protocol/dist/literal-union.js +2 -0
  476. package/node_modules/@bytetrue/byspace-protocol/dist/loop/rpc-schemas.d.ts +636 -0
  477. package/node_modules/@bytetrue/byspace-protocol/dist/loop/rpc-schemas.js +163 -0
  478. package/node_modules/@bytetrue/byspace-protocol/dist/messages.d.ts +33892 -0
  479. package/node_modules/@bytetrue/byspace-protocol/dist/messages.js +4000 -0
  480. package/node_modules/@bytetrue/byspace-protocol/dist/path-utils.d.ts +2 -0
  481. package/node_modules/@bytetrue/byspace-protocol/dist/path-utils.js +16 -0
  482. package/node_modules/@bytetrue/byspace-protocol/dist/provider-config.d.ts +126 -0
  483. package/node_modules/@bytetrue/byspace-protocol/dist/provider-config.js +110 -0
  484. package/node_modules/@bytetrue/byspace-protocol/dist/provider-icon-names.d.ts +5 -0
  485. package/node_modules/@bytetrue/byspace-protocol/dist/provider-icon-names.js +52 -0
  486. package/node_modules/@bytetrue/byspace-protocol/dist/provider-manifest.d.ts +34 -0
  487. package/node_modules/@bytetrue/byspace-protocol/dist/provider-manifest.js +230 -0
  488. package/node_modules/@bytetrue/byspace-protocol/dist/schedule/cron-expression.d.ts +13 -0
  489. package/node_modules/@bytetrue/byspace-protocol/dist/schedule/cron-expression.js +97 -0
  490. package/node_modules/@bytetrue/byspace-protocol/dist/schedule/rpc-schemas.d.ts +624 -0
  491. package/node_modules/@bytetrue/byspace-protocol/dist/schedule/rpc-schemas.js +155 -0
  492. package/node_modules/@bytetrue/byspace-protocol/dist/schedule/types.d.ts +222 -0
  493. package/node_modules/@bytetrue/byspace-protocol/dist/schedule/types.js +78 -0
  494. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-activity.d.ts +21 -0
  495. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-activity.js +25 -0
  496. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-input-mode.d.ts +26 -0
  497. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-input-mode.js +151 -0
  498. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-key-input.d.ts +13 -0
  499. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-key-input.js +201 -0
  500. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-profiles.d.ts +6 -0
  501. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-profiles.js +28 -0
  502. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-snapshot.d.ts +3 -0
  503. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-snapshot.js +178 -0
  504. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-stream-protocol.d.ts +2 -0
  505. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-stream-protocol.js +2 -0
  506. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-subscription-key.d.ts +2 -0
  507. package/node_modules/@bytetrue/byspace-protocol/dist/terminal-subscription-key.js +9 -0
  508. package/node_modules/@bytetrue/byspace-protocol/dist/tool-call-display.d.ts +11 -0
  509. package/node_modules/@bytetrue/byspace-protocol/dist/tool-call-display.js +135 -0
  510. package/node_modules/@bytetrue/byspace-protocol/dist/tool-name-normalization.d.ts +9 -0
  511. package/node_modules/@bytetrue/byspace-protocol/dist/tool-name-normalization.js +82 -0
  512. package/node_modules/@bytetrue/byspace-protocol/dist/validation/ws-outbound-schema-metadata.d.ts +6618 -0
  513. package/node_modules/@bytetrue/byspace-protocol/dist/validation/ws-outbound-schema-metadata.js +3 -0
  514. package/node_modules/@bytetrue/byspace-protocol/dist/validation/ws-outbound.d.ts +12 -0
  515. package/node_modules/@bytetrue/byspace-protocol/dist/validation/ws-outbound.js +8 -0
  516. package/node_modules/@bytetrue/byspace-protocol/package.json +42 -0
  517. package/node_modules/@bytetrue/byspace-relay/dist/base64.d.ts +3 -0
  518. package/node_modules/@bytetrue/byspace-relay/dist/base64.js +17 -0
  519. package/node_modules/@bytetrue/byspace-relay/dist/cloudflare-adapter.d.ts +76 -0
  520. package/node_modules/@bytetrue/byspace-relay/dist/cloudflare-adapter.js +504 -0
  521. package/node_modules/@bytetrue/byspace-relay/dist/crypto.d.ts +30 -0
  522. package/node_modules/@bytetrue/byspace-relay/dist/crypto.js +132 -0
  523. package/node_modules/@bytetrue/byspace-relay/dist/cutover-proxy.d.ts +6 -0
  524. package/node_modules/@bytetrue/byspace-relay/dist/cutover-proxy.js +12 -0
  525. package/node_modules/@bytetrue/byspace-relay/dist/e2ee.d.ts +5 -0
  526. package/node_modules/@bytetrue/byspace-relay/dist/e2ee.js +3 -0
  527. package/node_modules/@bytetrue/byspace-relay/dist/encrypted-channel.d.ts +76 -0
  528. package/node_modules/@bytetrue/byspace-relay/dist/encrypted-channel.js +350 -0
  529. package/node_modules/@bytetrue/byspace-relay/dist/index.d.ts +5 -0
  530. package/node_modules/@bytetrue/byspace-relay/dist/index.js +3 -0
  531. package/node_modules/@bytetrue/byspace-relay/dist/types.d.ts +27 -0
  532. package/node_modules/@bytetrue/byspace-relay/dist/types.js +11 -0
  533. package/node_modules/@bytetrue/byspace-relay/package.json +55 -0
  534. package/node_modules/@bytetrue/byspace-server/.env.example +31 -0
  535. package/node_modules/@bytetrue/byspace-server/README.md +111 -0
  536. package/node_modules/@bytetrue/byspace-server/dist/scripts/dev-runner.js +37 -0
  537. package/node_modules/@bytetrue/byspace-server/dist/scripts/mcp-stdio-socket-bridge-cli.mjs +62 -0
  538. package/node_modules/@bytetrue/byspace-server/dist/scripts/supervisor-entrypoint.js +112 -0
  539. package/node_modules/@bytetrue/byspace-server/dist/scripts/supervisor-log-config.js +31 -0
  540. package/node_modules/@bytetrue/byspace-server/dist/scripts/supervisor.js +252 -0
  541. package/node_modules/@bytetrue/byspace-server/dist/server/executable-resolution/executable-resolution.d.ts +10 -0
  542. package/node_modules/@bytetrue/byspace-server/dist/server/executable-resolution/executable-resolution.js +118 -0
  543. package/node_modules/@bytetrue/byspace-server/dist/server/executable-resolution/windows.d.ts +18 -0
  544. package/node_modules/@bytetrue/byspace-server/dist/server/executable-resolution/windows.js +65 -0
  545. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/activity-curator.d.ts +40 -0
  546. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/activity-curator.js +243 -0
  547. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-archive.d.ts +11 -0
  548. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-archive.js +16 -0
  549. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-loading.d.ts +14 -0
  550. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-loading.js +54 -0
  551. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-manager.d.ts +442 -0
  552. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-manager.js +2937 -0
  553. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-projections.d.ts +26 -0
  554. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-projections.js +389 -0
  555. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-prompt.d.ts +76 -0
  556. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-prompt.js +235 -0
  557. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-response-loop.d.ts +72 -0
  558. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-response-loop.js +333 -0
  559. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-run-state.d.ts +67 -0
  560. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-run-state.js +194 -0
  561. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-sdk-types.d.ts +653 -0
  562. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-sdk-types.js +22 -0
  563. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-storage.d.ts +120 -0
  564. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-storage.js +302 -0
  565. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-stream-coalescer.d.ts +41 -0
  566. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-stream-coalescer.js +175 -0
  567. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-timeline-content.d.ts +3 -0
  568. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-timeline-content.js +55 -0
  569. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-timeline-store-types.d.ts +50 -0
  570. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-timeline-store-types.js +2 -0
  571. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-timeline-store.d.ts +27 -0
  572. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/agent-timeline-store.js +230 -0
  573. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/audio-utils.d.ts +3 -0
  574. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/audio-utils.js +19 -0
  575. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/create-agent/create.d.ts +91 -0
  576. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/create-agent/create.js +378 -0
  577. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/create-agent-lifecycle-dispatch.d.ts +54 -0
  578. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/create-agent-lifecycle-dispatch.js +152 -0
  579. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/create-agent-mode.d.ts +13 -0
  580. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/create-agent-mode.js +65 -0
  581. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/create-agent-title.d.ts +10 -0
  582. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/create-agent-title.js +34 -0
  583. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/dictation-debug.d.ts +13 -0
  584. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/dictation-debug.js +50 -0
  585. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/import-sessions.d.ts +47 -0
  586. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/import-sessions.js +145 -0
  587. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/lifecycle-command.d.ts +73 -0
  588. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/lifecycle-command.js +99 -0
  589. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/mcp-server.d.ts +5 -0
  590. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/mcp-server.js +66 -0
  591. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/mcp-shared.d.ts +179 -0
  592. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/mcp-shared.js +197 -0
  593. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/pcm16-resampler.d.ts +14 -0
  594. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/pcm16-resampler.js +63 -0
  595. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/permission-response.d.ts +15 -0
  596. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/permission-response.js +14 -0
  597. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/prompt-attachments.d.ts +12 -0
  598. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/prompt-attachments.js +111 -0
  599. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  600. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-history-timestamps.js +16 -0
  601. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-launch-config.d.ts +43 -0
  602. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-launch-config.js +167 -0
  603. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-notices.d.ts +3 -0
  604. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-notices.js +5 -0
  605. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-registry.d.ts +41 -0
  606. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-registry.js +501 -0
  607. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-session-import.d.ts +10 -0
  608. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-session-import.js +55 -0
  609. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-snapshot-manager.d.ts +135 -0
  610. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-snapshot-manager.js +685 -0
  611. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-subagents/store.d.ts +58 -0
  612. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/provider-subagents/store.js +98 -0
  613. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/acp-agent.d.ts +373 -0
  614. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/acp-agent.js +2538 -0
  615. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/agent.d.ts +68 -0
  616. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/agent.js +4482 -0
  617. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/feature-definitions.d.ts +8 -0
  618. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/feature-definitions.js +24 -0
  619. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/model-manifest.d.ts +90 -0
  620. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/model-manifest.js +205 -0
  621. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/models.d.ts +11 -0
  622. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/models.js +97 -0
  623. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/partial-json.d.ts +5 -0
  624. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/partial-json.js +306 -0
  625. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/project-dir.d.ts +6 -0
  626. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/project-dir.js +57 -0
  627. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/query.d.ts +17 -0
  628. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/query.js +86 -0
  629. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/rewind.d.ts +30 -0
  630. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/rewind.js +30 -0
  631. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/sidechain-tracker.d.ts +26 -0
  632. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/sidechain-tracker.js +374 -0
  633. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/task-notification-tool-call.d.ts +35 -0
  634. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/task-notification-tool-call.js +272 -0
  635. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.d.ts +24 -0
  636. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/test-rewind-claude-sdk.js +23 -0
  637. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts +3 -0
  638. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +130 -0
  639. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts +16 -0
  640. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/claude/tool-call-mapper.js +129 -0
  641. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/app-server-transport.d.ts +90 -0
  642. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/app-server-transport.js +262 -0
  643. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/rewind.d.ts +21 -0
  644. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/rewind.js +46 -0
  645. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +118 -0
  646. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +417 -0
  647. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/tool-call-detail-parser.d.ts +12 -0
  648. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/tool-call-detail-parser.js +104 -0
  649. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/tool-call-mapper.d.ts +24 -0
  650. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex/tool-call-mapper.js +877 -0
  651. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex-app-server-agent.d.ts +333 -0
  652. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex-app-server-agent.js +5189 -0
  653. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex-feature-definitions.d.ts +11 -0
  654. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/codex-feature-definitions.js +45 -0
  655. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/copilot-acp-agent.d.ts +26 -0
  656. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/copilot-acp-agent.js +187 -0
  657. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/cursor-acp-agent.d.ts +17 -0
  658. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/cursor-acp-agent.js +31 -0
  659. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/diagnostic-utils.d.ts +36 -0
  660. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/diagnostic-utils.js +355 -0
  661. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/generic-acp-agent.d.ts +51 -0
  662. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/generic-acp-agent.js +174 -0
  663. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/kiro-acp-agent.d.ts +17 -0
  664. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/kiro-acp-agent.js +78 -0
  665. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/mock-load-test-agent.d.ts +86 -0
  666. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/mock-load-test-agent.js +1043 -0
  667. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/mock-slow-provider.d.ts +14 -0
  668. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/mock-slow-provider.js +39 -0
  669. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/paths.d.ts +2 -0
  670. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/paths.js +7 -0
  671. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/rewind.d.ts +18 -0
  672. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/rewind.js +14 -0
  673. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/server-manager.d.ts +95 -0
  674. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/server-manager.js +441 -0
  675. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +27 -0
  676. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/test-server-manager.js +43 -0
  677. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.d.ts +97 -0
  678. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/test-utils/test-opencode-harness.js +302 -0
  679. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/tool-call-detail-parser.d.ts +3 -0
  680. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/tool-call-detail-parser.js +256 -0
  681. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/tool-call-mapper.d.ts +13 -0
  682. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode/tool-call-mapper.js +53 -0
  683. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode-agent.d.ts +295 -0
  684. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/opencode-agent.js +3225 -0
  685. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/agent.d.ts +140 -0
  686. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/agent.js +1862 -0
  687. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/cli-runtime.d.ts +21 -0
  688. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/cli-runtime.js +272 -0
  689. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/history-mapper.d.ts +9 -0
  690. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/history-mapper.js +143 -0
  691. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/rewind.d.ts +8 -0
  692. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/rewind.js +8 -0
  693. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/rpc-types.d.ts +214 -0
  694. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/rpc-types.js +2 -0
  695. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/runtime.d.ts +59 -0
  696. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/runtime.js +60 -0
  697. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/session-descriptor.d.ts +16 -0
  698. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/session-descriptor.js +346 -0
  699. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +89 -0
  700. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +223 -0
  701. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +112 -0
  702. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/pi/tool-call-mapper.js +284 -0
  703. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/provider-image-output.d.ts +25 -0
  704. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/provider-image-output.js +165 -0
  705. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/provider-runner.d.ts +27 -0
  706. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/provider-runner.js +81 -0
  707. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/test-utils/session-stream-adapter.d.ts +3 -0
  708. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/test-utils/session-stream-adapter.js +60 -0
  709. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +884 -0
  710. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/tool-call-detail-primitives.js +778 -0
  711. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +25 -0
  712. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/tool-call-mapper-utils.js +208 -0
  713. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/trae-acp-agent.d.ts +15 -0
  714. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/providers/trae-acp-agent.js +18 -0
  715. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/recordings-debug.d.ts +3 -0
  716. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/recordings-debug.js +19 -0
  717. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/rewind/rewind.d.ts +10 -0
  718. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/rewind/rewind.js +29 -0
  719. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/rewind/test-rewind-session.d.ts +48 -0
  720. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/rewind/test-rewind-session.js +88 -0
  721. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/runtime-mcp-config.d.ts +14 -0
  722. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/runtime-mcp-config.js +53 -0
  723. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/structured-generation-providers.d.ts +29 -0
  724. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/structured-generation-providers.js +236 -0
  725. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/stt-debug.d.ts +10 -0
  726. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/stt-debug.js +33 -0
  727. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/stt-manager.d.ts +38 -0
  728. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/stt-manager.js +246 -0
  729. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/system-prompt.d.ts +2 -0
  730. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/system-prompt.js +8 -0
  731. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/timeline-append.d.ts +10 -0
  732. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/timeline-append.js +27 -0
  733. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/timeline-projection.d.ts +71 -0
  734. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/timeline-projection.js +373 -0
  735. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/tools/byspace-tools.d.ts +51 -0
  736. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/tools/byspace-tools.js +2111 -0
  737. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/tools/types.d.ts +36 -0
  738. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/tools/types.js +2 -0
  739. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/tts-debug.d.ts +8 -0
  740. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/tts-debug.js +24 -0
  741. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/tts-manager.d.ts +41 -0
  742. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent/tts-manager.js +375 -0
  743. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent-attention-policy.d.ts +29 -0
  744. package/node_modules/@bytetrue/byspace-server/dist/server/server/agent-attention-policy.js +36 -0
  745. package/node_modules/@bytetrue/byspace-server/dist/server/server/atomic-file.d.ts +3 -0
  746. package/node_modules/@bytetrue/byspace-server/dist/server/server/atomic-file.js +19 -0
  747. package/node_modules/@bytetrue/byspace-server/dist/server/server/auth.d.ts +38 -0
  748. package/node_modules/@bytetrue/byspace-server/dist/server/server/auth.js +143 -0
  749. package/node_modules/@bytetrue/byspace-server/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  750. package/node_modules/@bytetrue/byspace-server/dist/server/server/auto-archive-on-merge/archive-if-safe.js +92 -0
  751. package/node_modules/@bytetrue/byspace-server/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  752. package/node_modules/@bytetrue/byspace-server/dist/server/server/auto-archive-on-merge/index.js +15 -0
  753. package/node_modules/@bytetrue/byspace-server/dist/server/server/bootstrap.d.ts +121 -0
  754. package/node_modules/@bytetrue/byspace-server/dist/server/server/bootstrap.js +1110 -0
  755. package/node_modules/@bytetrue/byspace-server/dist/server/server/byspace-env.d.ts +13 -0
  756. package/node_modules/@bytetrue/byspace-server/dist/server/server/byspace-env.js +46 -0
  757. package/node_modules/@bytetrue/byspace-server/dist/server/server/byspace-home.d.ts +2 -0
  758. package/node_modules/@bytetrue/byspace-server/dist/server/server/byspace-home.js +19 -0
  759. package/node_modules/@bytetrue/byspace-server/dist/server/server/byspace-worktree-service.d.ts +52 -0
  760. package/node_modules/@bytetrue/byspace-server/dist/server/server/byspace-worktree-service.js +294 -0
  761. package/node_modules/@bytetrue/byspace-server/dist/server/server/chat/chat-mentions.d.ts +47 -0
  762. package/node_modules/@bytetrue/byspace-server/dist/server/server/chat/chat-mentions.js +113 -0
  763. package/node_modules/@bytetrue/byspace-server/dist/server/server/chat/chat-service.d.ts +78 -0
  764. package/node_modules/@bytetrue/byspace-server/dist/server/server/chat/chat-service.js +337 -0
  765. package/node_modules/@bytetrue/byspace-server/dist/server/server/checkout/status-projection.d.ts +19 -0
  766. package/node_modules/@bytetrue/byspace-server/dist/server/server/checkout/status-projection.js +102 -0
  767. package/node_modules/@bytetrue/byspace-server/dist/server/server/checkout-diff-manager.d.ts +41 -0
  768. package/node_modules/@bytetrue/byspace-server/dist/server/server/checkout-diff-manager.js +189 -0
  769. package/node_modules/@bytetrue/byspace-server/dist/server/server/checkout-git-utils.d.ts +11 -0
  770. package/node_modules/@bytetrue/byspace-server/dist/server/server/checkout-git-utils.js +34 -0
  771. package/node_modules/@bytetrue/byspace-server/dist/server/server/client-message-id.d.ts +3 -0
  772. package/node_modules/@bytetrue/byspace-server/dist/server/server/client-message-id.js +12 -0
  773. package/node_modules/@bytetrue/byspace-server/dist/server/server/config.d.ts +22 -0
  774. package/node_modules/@bytetrue/byspace-server/dist/server/server/config.js +324 -0
  775. package/node_modules/@bytetrue/byspace-server/dist/server/server/connection-offer.d.ts +20 -0
  776. package/node_modules/@bytetrue/byspace-server/dist/server/server/connection-offer.js +59 -0
  777. package/node_modules/@bytetrue/byspace-server/dist/server/server/daemon-config-store.d.ts +25 -0
  778. package/node_modules/@bytetrue/byspace-server/dist/server/server/daemon-config-store.js +182 -0
  779. package/node_modules/@bytetrue/byspace-server/dist/server/server/daemon-keypair.d.ts +8 -0
  780. package/node_modules/@bytetrue/byspace-server/dist/server/server/daemon-keypair.js +42 -0
  781. package/node_modules/@bytetrue/byspace-server/dist/server/server/daemon-version.d.ts +5 -0
  782. package/node_modules/@bytetrue/byspace-server/dist/server/server/daemon-version.js +22 -0
  783. package/node_modules/@bytetrue/byspace-server/dist/server/server/daemon-worker.d.ts +2 -0
  784. package/node_modules/@bytetrue/byspace-server/dist/server/server/daemon-worker.js +251 -0
  785. package/node_modules/@bytetrue/byspace-server/dist/server/server/dictation/dictation-stream-manager.d.ts +87 -0
  786. package/node_modules/@bytetrue/byspace-server/dist/server/server/dictation/dictation-stream-manager.js +572 -0
  787. package/node_modules/@bytetrue/byspace-server/dist/server/server/exports.d.ts +24 -0
  788. package/node_modules/@bytetrue/byspace-server/dist/server/server/exports.js +24 -0
  789. package/node_modules/@bytetrue/byspace-server/dist/server/server/file-download/token-store.d.ts +24 -0
  790. package/node_modules/@bytetrue/byspace-server/dist/server/server/file-download/token-store.js +40 -0
  791. package/node_modules/@bytetrue/byspace-server/dist/server/server/file-explorer/service.d.ts +51 -0
  792. package/node_modules/@bytetrue/byspace-server/dist/server/server/file-explorer/service.js +246 -0
  793. package/node_modules/@bytetrue/byspace-server/dist/server/server/file-upload/index.d.ts +27 -0
  794. package/node_modules/@bytetrue/byspace-server/dist/server/server/file-upload/index.js +158 -0
  795. package/node_modules/@bytetrue/byspace-server/dist/server/server/hostnames.d.ts +13 -0
  796. package/node_modules/@bytetrue/byspace-server/dist/server/server/hostnames.js +94 -0
  797. package/node_modules/@bytetrue/byspace-server/dist/server/server/json-utils.d.ts +11 -0
  798. package/node_modules/@bytetrue/byspace-server/dist/server/server/json-utils.js +45 -0
  799. package/node_modules/@bytetrue/byspace-server/dist/server/server/lifecycle-reasons.d.ts +4 -0
  800. package/node_modules/@bytetrue/byspace-server/dist/server/server/lifecycle-reasons.js +6 -0
  801. package/node_modules/@bytetrue/byspace-server/dist/server/server/logger.d.ts +29 -0
  802. package/node_modules/@bytetrue/byspace-server/dist/server/server/logger.js +125 -0
  803. package/node_modules/@bytetrue/byspace-server/dist/server/server/loop-service.d.ts +235 -0
  804. package/node_modules/@bytetrue/byspace-server/dist/server/server/loop-service.js +837 -0
  805. package/node_modules/@bytetrue/byspace-server/dist/server/server/managed-processes/managed-processes.d.ts +76 -0
  806. package/node_modules/@bytetrue/byspace-server/dist/server/server/managed-processes/managed-processes.js +326 -0
  807. package/node_modules/@bytetrue/byspace-server/dist/server/server/messages.d.ts +9 -0
  808. package/node_modules/@bytetrue/byspace-server/dist/server/server/messages.js +29 -0
  809. package/node_modules/@bytetrue/byspace-server/dist/server/server/migrations/backfill-workspace-id.migration.d.ts +9 -0
  810. package/node_modules/@bytetrue/byspace-server/dist/server/server/migrations/backfill-workspace-id.migration.js +64 -0
  811. package/node_modules/@bytetrue/byspace-server/dist/server/server/package-version.d.ts +19 -0
  812. package/node_modules/@bytetrue/byspace-server/dist/server/server/package-version.js +60 -0
  813. package/node_modules/@bytetrue/byspace-server/dist/server/server/pagination/cursor.d.ts +16 -0
  814. package/node_modules/@bytetrue/byspace-server/dist/server/server/pagination/cursor.js +62 -0
  815. package/node_modules/@bytetrue/byspace-server/dist/server/server/pagination/sortable-pager.d.ts +24 -0
  816. package/node_modules/@bytetrue/byspace-server/dist/server/server/pagination/sortable-pager.js +68 -0
  817. package/node_modules/@bytetrue/byspace-server/dist/server/server/pairing-offer.d.ts +18 -0
  818. package/node_modules/@bytetrue/byspace-server/dist/server/server/pairing-offer.js +47 -0
  819. package/node_modules/@bytetrue/byspace-server/dist/server/server/pairing-qr.d.ts +7 -0
  820. package/node_modules/@bytetrue/byspace-server/dist/server/server/pairing-qr.js +45 -0
  821. package/node_modules/@bytetrue/byspace-server/dist/server/server/path-utils.d.ts +5 -0
  822. package/node_modules/@bytetrue/byspace-server/dist/server/server/path-utils.js +34 -0
  823. package/node_modules/@bytetrue/byspace-server/dist/server/server/persisted-config.d.ts +313 -0
  824. package/node_modules/@bytetrue/byspace-server/dist/server/server/persisted-config.js +391 -0
  825. package/node_modules/@bytetrue/byspace-server/dist/server/server/persistence-hooks.d.ts +31 -0
  826. package/node_modules/@bytetrue/byspace-server/dist/server/server/persistence-hooks.js +93 -0
  827. package/node_modules/@bytetrue/byspace-server/dist/server/server/pid-lock.d.ts +31 -0
  828. package/node_modules/@bytetrue/byspace-server/dist/server/server/pid-lock.js +168 -0
  829. package/node_modules/@bytetrue/byspace-server/dist/server/server/private-files.d.ts +6 -0
  830. package/node_modules/@bytetrue/byspace-server/dist/server/server/private-files.js +37 -0
  831. package/node_modules/@bytetrue/byspace-server/dist/server/server/process-diagnostics.d.ts +17 -0
  832. package/node_modules/@bytetrue/byspace-server/dist/server/server/process-diagnostics.js +22 -0
  833. package/node_modules/@bytetrue/byspace-server/dist/server/server/push/notifications.d.ts +9 -0
  834. package/node_modules/@bytetrue/byspace-server/dist/server/server/push/notifications.js +15 -0
  835. package/node_modules/@bytetrue/byspace-server/dist/server/server/push/push-service.d.ts +20 -0
  836. package/node_modules/@bytetrue/byspace-server/dist/server/server/push/push-service.js +66 -0
  837. package/node_modules/@bytetrue/byspace-server/dist/server/server/push/token-store.d.ts +18 -0
  838. package/node_modules/@bytetrue/byspace-server/dist/server/server/push/token-store.js +68 -0
  839. package/node_modules/@bytetrue/byspace-server/dist/server/server/relay-transport.d.ts +31 -0
  840. package/node_modules/@bytetrue/byspace-server/dist/server/server/relay-transport.js +514 -0
  841. package/node_modules/@bytetrue/byspace-server/dist/server/server/resolve-workspace-id-for-path.d.ts +3 -0
  842. package/node_modules/@bytetrue/byspace-server/dist/server/server/resolve-workspace-id-for-path.js +41 -0
  843. package/node_modules/@bytetrue/byspace-server/dist/server/server/resolve-worktree-creation-intent.d.ts +32 -0
  844. package/node_modules/@bytetrue/byspace-server/dist/server/server/resolve-worktree-creation-intent.js +121 -0
  845. package/node_modules/@bytetrue/byspace-server/dist/server/server/schedule/cron.d.ts +4 -0
  846. package/node_modules/@bytetrue/byspace-server/dist/server/server/schedule/cron.js +81 -0
  847. package/node_modules/@bytetrue/byspace-server/dist/server/server/schedule/service.d.ts +74 -0
  848. package/node_modules/@bytetrue/byspace-server/dist/server/server/schedule/service.js +804 -0
  849. package/node_modules/@bytetrue/byspace-server/dist/server/server/schedule/store.d.ts +27 -0
  850. package/node_modules/@bytetrue/byspace-server/dist/server/server/schedule/store.js +190 -0
  851. package/node_modules/@bytetrue/byspace-server/dist/server/server/script-health-monitor.d.ts +39 -0
  852. package/node_modules/@bytetrue/byspace-server/dist/server/server/script-health-monitor.js +159 -0
  853. package/node_modules/@bytetrue/byspace-server/dist/server/server/script-proxy.d.ts +3 -0
  854. package/node_modules/@bytetrue/byspace-server/dist/server/server/script-proxy.js +2 -0
  855. package/node_modules/@bytetrue/byspace-server/dist/server/server/script-route-branch-handler.d.ts +10 -0
  856. package/node_modules/@bytetrue/byspace-server/dist/server/server/script-route-branch-handler.js +11 -0
  857. package/node_modules/@bytetrue/byspace-server/dist/server/server/script-status-projection.d.ts +36 -0
  858. package/node_modules/@bytetrue/byspace-server/dist/server/server/script-status-projection.js +200 -0
  859. package/node_modules/@bytetrue/byspace-server/dist/server/server/server-id.d.ts +17 -0
  860. package/node_modules/@bytetrue/byspace-server/dist/server/server/server-id.js +68 -0
  861. package/node_modules/@bytetrue/byspace-server/dist/server/server/service-proxy.d.ts +237 -0
  862. package/node_modules/@bytetrue/byspace-server/dist/server/server/service-proxy.js +714 -0
  863. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/agent-config/agent-config-session.d.ts +50 -0
  864. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/agent-config/agent-config-session.js +98 -0
  865. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/agent-updates/agent-updates-service.d.ts +59 -0
  866. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/agent-updates/agent-updates-service.js +220 -0
  867. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/chat/chat-schedule-loop-session.d.ts +120 -0
  868. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/chat/chat-schedule-loop-session.js +489 -0
  869. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/checkout/checkout-session.d.ts +140 -0
  870. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/checkout/checkout-session.js +927 -0
  871. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/checkout/git-metadata-generator.d.ts +53 -0
  872. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/checkout/git-metadata-generator.js +159 -0
  873. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/daemon-self-update-session-controller.d.ts +32 -0
  874. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/daemon-self-update-session-controller.js +88 -0
  875. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/daemon-self-updater.d.ts +32 -0
  876. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/daemon-self-updater.js +56 -0
  877. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/daemon-session.d.ts +76 -0
  878. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/daemon-session.js +148 -0
  879. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/diagnostics.d.ts +41 -0
  880. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/diagnostics.js +431 -0
  881. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/install-origin.d.ts +7 -0
  882. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/install-origin.js +64 -0
  883. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/npm-global-cli.d.ts +29 -0
  884. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/daemon/npm-global-cli.js +98 -0
  885. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/files/workspace-files-session.d.ts +43 -0
  886. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/files/workspace-files-session.js +218 -0
  887. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/git-mutation/git-mutation-service.d.ts +34 -0
  888. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/git-mutation/git-mutation-service.js +71 -0
  889. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/project-config/project-config-session.d.ts +34 -0
  890. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/project-config/project-config-session.js +125 -0
  891. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/provider/provider-catalog-session.d.ts +74 -0
  892. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/provider/provider-catalog-session.js +343 -0
  893. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/voice/voice-session.d.ts +166 -0
  894. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/voice/voice-session.js +904 -0
  895. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/voice/voice-turn-controller.d.ts +38 -0
  896. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/voice/voice-turn-controller.js +393 -0
  897. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.d.ts +36 -0
  898. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/workspace-git-observer/workspace-git-observer-service.js +134 -0
  899. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.d.ts +34 -0
  900. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/workspace-provisioning/workspace-provisioning-service.js +190 -0
  901. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/workspace-scripts/workspace-scripts-service.d.ts +41 -0
  902. package/node_modules/@bytetrue/byspace-server/dist/server/server/session/workspace-scripts/workspace-scripts-service.js +100 -0
  903. package/node_modules/@bytetrue/byspace-server/dist/server/server/session.d.ts +386 -0
  904. package/node_modules/@bytetrue/byspace-server/dist/server/server/session.js +4501 -0
  905. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/audio.d.ts +10 -0
  906. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/audio.js +101 -0
  907. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/provider-resolver.d.ts +3 -0
  908. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/provider-resolver.js +7 -0
  909. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/config.d.ts +30 -0
  910. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/config.js +134 -0
  911. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/models.d.ts +11 -0
  912. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/models.js +17 -0
  913. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/runtime.d.ts +31 -0
  914. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/runtime.js +135 -0
  915. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/assets/silero_vad.onnx +0 -0
  916. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/model-catalog.d.ts +56 -0
  917. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/model-catalog.js +74 -0
  918. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/model-downloader.d.ts +15 -0
  919. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/model-downloader.js +142 -0
  920. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.d.ts +49 -0
  921. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-offline-recognizer.js +73 -0
  922. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.d.ts +9 -0
  923. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-onnx-node-loader.js +107 -0
  924. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.d.ts +28 -0
  925. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-realtime-session.js +137 -0
  926. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.d.ts +21 -0
  927. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-parakeet-stt.js +133 -0
  928. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.d.ts +18 -0
  929. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  930. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-tts.d.ts +21 -0
  931. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/sherpa-tts.js +100 -0
  932. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.d.ts +19 -0
  933. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/silero-vad-provider.js +49 -0
  934. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/silero-vad-session.d.ts +38 -0
  935. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/sherpa/silero-vad-session.js +176 -0
  936. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/worker-bytes.d.ts +4 -0
  937. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/worker-bytes.js +9 -0
  938. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/worker-client.d.ts +93 -0
  939. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/worker-client.js +590 -0
  940. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/worker-process.d.ts +2 -0
  941. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/worker-process.js +270 -0
  942. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/worker-protocol.d.ts +95 -0
  943. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/local/worker-protocol.js +2 -0
  944. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/openai/config.d.ts +19 -0
  945. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/openai/config.js +148 -0
  946. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/openai/runtime.d.ts +29 -0
  947. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/openai/runtime.js +102 -0
  948. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/openai/stt.d.ts +23 -0
  949. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/openai/stt.js +209 -0
  950. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/openai/tts.d.ts +19 -0
  951. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/providers/openai/tts.js +48 -0
  952. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/speech-config-resolver.d.ts +11 -0
  953. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/speech-config-resolver.js +132 -0
  954. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/speech-provider.d.ts +59 -0
  955. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/speech-provider.js +2 -0
  956. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/speech-runtime.d.ts +45 -0
  957. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/speech-runtime.js +562 -0
  958. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/speech-types.d.ts +22 -0
  959. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/speech-types.js +8 -0
  960. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/turn-detection-provider.d.ts +23 -0
  961. package/node_modules/@bytetrue/byspace-server/dist/server/server/speech/turn-detection-provider.js +2 -0
  962. package/node_modules/@bytetrue/byspace-server/dist/server/server/utils/diff-highlighter.d.ts +57 -0
  963. package/node_modules/@bytetrue/byspace-server/dist/server/server/utils/diff-highlighter.js +279 -0
  964. package/node_modules/@bytetrue/byspace-server/dist/server/server/voice-config.d.ts +15 -0
  965. package/node_modules/@bytetrue/byspace-server/dist/server/server/voice-config.js +54 -0
  966. package/node_modules/@bytetrue/byspace-server/dist/server/server/voice-permission-policy.d.ts +4 -0
  967. package/node_modules/@bytetrue/byspace-server/dist/server/server/voice-permission-policy.js +13 -0
  968. package/node_modules/@bytetrue/byspace-server/dist/server/server/voice-types.d.ts +12 -0
  969. package/node_modules/@bytetrue/byspace-server/dist/server/server/voice-types.js +2 -0
  970. package/node_modules/@bytetrue/byspace-server/dist/server/server/web-ui.d.ts +10 -0
  971. package/node_modules/@bytetrue/byspace-server/dist/server/server/web-ui.js +205 -0
  972. package/node_modules/@bytetrue/byspace-server/dist/server/server/websocket/runtime-metrics.d.ts +94 -0
  973. package/node_modules/@bytetrue/byspace-server/dist/server/server/websocket/runtime-metrics.js +148 -0
  974. package/node_modules/@bytetrue/byspace-server/dist/server/server/websocket-server.d.ts +167 -0
  975. package/node_modules/@bytetrue/byspace-server/dist/server/server/websocket-server.js +1650 -0
  976. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-archive-service.d.ts +65 -0
  977. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-archive-service.js +229 -0
  978. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-auto-name.d.ts +55 -0
  979. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-auto-name.js +128 -0
  980. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-bootstrap-dedupe.d.ts +34 -0
  981. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-bootstrap-dedupe.js +23 -0
  982. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-directory.d.ts +93 -0
  983. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-directory.js +421 -0
  984. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-git-metadata.d.ts +24 -0
  985. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-git-metadata.js +55 -0
  986. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-git-service.d.ts +257 -0
  987. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-git-service.js +1386 -0
  988. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-reconciliation-service.d.ts +57 -0
  989. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-reconciliation-service.js +278 -0
  990. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-registry-bootstrap.d.ts +13 -0
  991. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-registry-bootstrap.js +121 -0
  992. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-registry-model.d.ts +55 -0
  993. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-registry-model.js +190 -0
  994. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-registry.d.ts +121 -0
  995. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-registry.js +211 -0
  996. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-script-runtime-store.d.ts +28 -0
  997. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-script-runtime-store.js +78 -0
  998. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-service-env.d.ts +18 -0
  999. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-service-env.js +85 -0
  1000. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-service-port-registry.d.ts +19 -0
  1001. package/node_modules/@bytetrue/byspace-server/dist/server/server/workspace-service-port-registry.js +59 -0
  1002. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree/commands.d.ts +55 -0
  1003. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree/commands.js +107 -0
  1004. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-bootstrap.d.ts +76 -0
  1005. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-bootstrap.js +720 -0
  1006. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-branch-name-generator.d.ts +35 -0
  1007. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-branch-name-generator.js +91 -0
  1008. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-core.d.ts +31 -0
  1009. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-core.js +105 -0
  1010. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-errors.d.ts +12 -0
  1011. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-errors.js +28 -0
  1012. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-session.d.ts +152 -0
  1013. package/node_modules/@bytetrue/byspace-server/dist/server/server/worktree-session.js +466 -0
  1014. package/node_modules/@bytetrue/byspace-server/dist/server/services/github-service.d.ts +337 -0
  1015. package/node_modules/@bytetrue/byspace-server/dist/server/services/github-service.js +2101 -0
  1016. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/manifest.d.ts +4 -0
  1017. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/manifest.js +52 -0
  1018. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/provider.d.ts +17 -0
  1019. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/provider.js +2 -0
  1020. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/claude.d.ts +26 -0
  1021. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/claude.js +217 -0
  1022. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/codex.d.ts +23 -0
  1023. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/codex.js +211 -0
  1024. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/copilot.d.ts +17 -0
  1025. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/copilot.js +75 -0
  1026. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/cursor.d.ts +17 -0
  1027. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/cursor.js +123 -0
  1028. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/grok.d.ts +18 -0
  1029. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/grok.js +89 -0
  1030. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/kimi.d.ts +20 -0
  1031. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/kimi.js +89 -0
  1032. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/minimax.d.ts +29 -0
  1033. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/minimax.js +227 -0
  1034. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/zai.d.ts +17 -0
  1035. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/providers/zai.js +58 -0
  1036. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/service.d.ts +28 -0
  1037. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/service.js +58 -0
  1038. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/usage.d.ts +22 -0
  1039. package/node_modules/@bytetrue/byspace-server/dist/server/services/quota-fetcher/usage.js +49 -0
  1040. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/activity/terminal-activity-tracker.d.ts +20 -0
  1041. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/activity/terminal-activity-tracker.js +59 -0
  1042. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/agent-hook-installer.d.ts +62 -0
  1043. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/agent-hook-installer.js +117 -0
  1044. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/claude/claude-settings.d.ts +7 -0
  1045. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/claude/claude-settings.js +88 -0
  1046. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/claude/claude.d.ts +4 -0
  1047. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/claude/claude.js +47 -0
  1048. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/codex/codex-settings.d.ts +7 -0
  1049. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/codex/codex-settings.js +99 -0
  1050. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/codex/codex.d.ts +4 -0
  1051. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/codex/codex.js +30 -0
  1052. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/opencode/opencode-plugin.d.ts +4 -0
  1053. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/opencode/opencode-plugin.js +46 -0
  1054. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/opencode/opencode.d.ts +3 -0
  1055. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/opencode/opencode.js +23 -0
  1056. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/provider-registry.d.ts +24 -0
  1057. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/provider-registry.js +36 -0
  1058. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.d.ts +10 -0
  1059. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/agent-hooks/terminal-agent-hook-setting.js +26 -0
  1060. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/shell-integration/zsh/.zshenv +17 -0
  1061. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/shell-integration/zsh/byspace-integration.zsh +32 -0
  1062. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-capture.d.ts +12 -0
  1063. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-capture.js +43 -0
  1064. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-manager-factory.d.ts +6 -0
  1065. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-manager-factory.js +5 -0
  1066. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-manager.d.ts +80 -0
  1067. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-manager.js +321 -0
  1068. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-output-coalescer.d.ts +34 -0
  1069. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-output-coalescer.js +73 -0
  1070. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-restore.d.ts +18 -0
  1071. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-restore.js +52 -0
  1072. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-session-controller.d.ts +85 -0
  1073. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-session-controller.js +821 -0
  1074. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-ts-loader.mjs +20 -0
  1075. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-worker-process.d.ts +2 -0
  1076. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-worker-process.js +304 -0
  1077. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-worker-protocol.d.ts +121 -0
  1078. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal-worker-protocol.js +2 -0
  1079. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal.d.ts +151 -0
  1080. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/terminal.js +1157 -0
  1081. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/worker-terminal-manager.d.ts +20 -0
  1082. package/node_modules/@bytetrue/byspace-server/dist/server/terminal/worker-terminal-manager.js +688 -0
  1083. package/node_modules/@bytetrue/byspace-server/dist/server/utils/build-metadata-prompt.d.ts +19 -0
  1084. package/node_modules/@bytetrue/byspace-server/dist/server/utils/build-metadata-prompt.js +29 -0
  1085. package/node_modules/@bytetrue/byspace-server/dist/server/utils/byspace-config-file.d.ts +30 -0
  1086. package/node_modules/@bytetrue/byspace-server/dist/server/utils/byspace-config-file.js +90 -0
  1087. package/node_modules/@bytetrue/byspace-server/dist/server/utils/checkout-git.d.ts +253 -0
  1088. package/node_modules/@bytetrue/byspace-server/dist/server/utils/checkout-git.js +2238 -0
  1089. package/node_modules/@bytetrue/byspace-server/dist/server/utils/directory-suggestions.d.ts +28 -0
  1090. package/node_modules/@bytetrue/byspace-server/dist/server/utils/directory-suggestions.js +473 -0
  1091. package/node_modules/@bytetrue/byspace-server/dist/server/utils/git-rev-parse-path.d.ts +3 -0
  1092. package/node_modules/@bytetrue/byspace-server/dist/server/utils/git-rev-parse-path.js +21 -0
  1093. package/node_modules/@bytetrue/byspace-server/dist/server/utils/github-remote.d.ts +9 -0
  1094. package/node_modules/@bytetrue/byspace-server/dist/server/utils/github-remote.js +62 -0
  1095. package/node_modules/@bytetrue/byspace-server/dist/server/utils/path.d.ts +18 -0
  1096. package/node_modules/@bytetrue/byspace-server/dist/server/utils/path.js +123 -0
  1097. package/node_modules/@bytetrue/byspace-server/dist/server/utils/project-icon.d.ts +39 -0
  1098. package/node_modules/@bytetrue/byspace-server/dist/server/utils/project-icon.js +364 -0
  1099. package/node_modules/@bytetrue/byspace-server/dist/server/utils/promise-timeout.d.ts +9 -0
  1100. package/node_modules/@bytetrue/byspace-server/dist/server/utils/promise-timeout.js +25 -0
  1101. package/node_modules/@bytetrue/byspace-server/dist/server/utils/run-git-command.d.ts +37 -0
  1102. package/node_modules/@bytetrue/byspace-server/dist/server/utils/run-git-command.js +232 -0
  1103. package/node_modules/@bytetrue/byspace-server/dist/server/utils/spawn.d.ts +25 -0
  1104. package/node_modules/@bytetrue/byspace-server/dist/server/utils/spawn.js +59 -0
  1105. package/node_modules/@bytetrue/byspace-server/dist/server/utils/string-command-shell.d.ts +13 -0
  1106. package/node_modules/@bytetrue/byspace-server/dist/server/utils/string-command-shell.js +37 -0
  1107. package/node_modules/@bytetrue/byspace-server/dist/server/utils/tree-kill.d.ts +18 -0
  1108. package/node_modules/@bytetrue/byspace-server/dist/server/utils/tree-kill.js +77 -0
  1109. package/node_modules/@bytetrue/byspace-server/dist/server/utils/windows-command.d.ts +15 -0
  1110. package/node_modules/@bytetrue/byspace-server/dist/server/utils/windows-command.js +41 -0
  1111. package/node_modules/@bytetrue/byspace-server/dist/server/utils/worktree-metadata.d.ts +39 -0
  1112. package/node_modules/@bytetrue/byspace-server/dist/server/utils/worktree-metadata.js +174 -0
  1113. package/node_modules/@bytetrue/byspace-server/dist/server/utils/worktree.d.ts +205 -0
  1114. package/node_modules/@bytetrue/byspace-server/dist/server/utils/worktree.js +1129 -0
  1115. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css +1 -0
  1116. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.br +0 -0
  1117. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/css/xterm-3bb1704bf6cb0876640973dc0244b4cb.css.gz +0 -0
  1118. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/js/web/index-09af1f9a582567d448f8e2abd4a93265.js +15938 -0
  1119. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/js/web/index-09af1f9a582567d448f8e2abd4a93265.js.br +0 -0
  1120. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/js/web/index-09af1f9a582567d448f8e2abd4a93265.js.gz +0 -0
  1121. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-2ee2179f5dd960ab4ac4484c6858cb23.js +1 -0
  1122. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-2ee2179f5dd960ab4ac4484c6858cb23.js.br +0 -0
  1123. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-2ee2179f5dd960ab4ac4484c6858cb23.js.gz +0 -0
  1124. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/apple-touch-icon.png +0 -0
  1125. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  1126. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  1127. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  1128. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  1129. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  1130. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  1131. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  1132. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  1133. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  1134. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  1135. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/@react-navigation/elements/lib/module/assets/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  1136. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  1137. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  1138. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  1139. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  1140. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  1141. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  1142. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/__node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  1143. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/assets/images/favicon-dark-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  1144. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/assets/images/favicon-dark-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  1145. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/assets/images/favicon-dark.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  1146. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/assets/images/favicon-light-attention.882b3a27dcb2073e9e31b334f9ed9728.png +0 -0
  1147. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/assets/images/favicon-light-running.8112342ff0d39e047a7f8d4fad9402f3.png +0 -0
  1148. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/assets/images/favicon-light.8005ed36ac07a5a7c60de25780897bd4.png +0 -0
  1149. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/assets/assets/images/notification-icon.3bf81d33ddbf380606bdd248ba83e158.png +0 -0
  1150. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/favicon.ico +0 -0
  1151. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/index.html +91 -0
  1152. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/index.html.br +0 -0
  1153. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/index.html.gz +0 -0
  1154. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/manifest.json +27 -0
  1155. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/manifest.json.br +0 -0
  1156. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/manifest.json.gz +0 -0
  1157. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/metadata.json +1 -0
  1158. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/metadata.json.br +1 -0
  1159. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/metadata.json.gz +0 -0
  1160. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/pwa-icon-192.png +0 -0
  1161. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/pwa-icon-512.png +0 -0
  1162. package/node_modules/@bytetrue/byspace-server/dist/server/web-ui/robots.txt +2 -0
  1163. package/node_modules/@bytetrue/byspace-server/dist/src/executable-resolution/executable-resolution.js +118 -0
  1164. package/node_modules/@bytetrue/byspace-server/dist/src/executable-resolution/windows.js +65 -0
  1165. package/node_modules/@bytetrue/byspace-server/dist/src/server/agent/provider-launch-config.js +167 -0
  1166. package/node_modules/@bytetrue/byspace-server/dist/src/server/byspace-env.js +46 -0
  1167. package/node_modules/@bytetrue/byspace-server/dist/src/server/byspace-home.js +19 -0
  1168. package/node_modules/@bytetrue/byspace-server/dist/src/server/persisted-config.js +391 -0
  1169. package/node_modules/@bytetrue/byspace-server/dist/src/server/pid-lock.js +168 -0
  1170. package/node_modules/@bytetrue/byspace-server/dist/src/server/private-files.js +37 -0
  1171. package/node_modules/@bytetrue/byspace-server/dist/src/server/speech/providers/local/sherpa/sherpa-runtime-env.js +84 -0
  1172. package/node_modules/@bytetrue/byspace-server/dist/src/terminal/shell-integration/zsh/.zshenv +17 -0
  1173. package/node_modules/@bytetrue/byspace-server/dist/src/terminal/shell-integration/zsh/byspace-integration.zsh +32 -0
  1174. package/node_modules/@bytetrue/byspace-server/dist/src/utils/spawn.js +59 -0
  1175. package/node_modules/@bytetrue/byspace-server/dist/src/utils/windows-command.js +41 -0
  1176. package/node_modules/@bytetrue/byspace-server/package.json +119 -0
  1177. package/package.json +110 -0
@@ -0,0 +1,4501 @@
1
+ import equal from "fast-deep-equal";
2
+ import { v4 as uuidv4 } from "uuid";
3
+ import { lstat, mkdir, mkdtemp, rename, rm, stat } from "node:fs/promises";
4
+ import { basename, normalize, resolve, sep } from "path";
5
+ import { homedir } from "node:os";
6
+ import { CLIENT_CAPS } from "@bytetrue/byspace-protocol/client-capabilities";
7
+ import { serializeAgentStreamEvent, } from "./messages.js";
8
+ import { TerminalSessionController } from "../terminal/terminal-session-controller.js";
9
+ import { CursorError } from "./pagination/cursor.js";
10
+ import { SortablePager } from "./pagination/sortable-pager.js";
11
+ import { buildConfigOverrides, extractTimestamps, isStoredAgentProviderAvailable, toAgentPersistenceHandle, } from "./persistence-hooks.js";
12
+ import { ensureAgentLoaded } from "./agent/agent-loading.js";
13
+ import { formatSystemNotificationPrompt, sendPromptToAgent, waitForAgentRunStartWithTimeout, unarchiveAgentState, } from "./agent/agent-prompt.js";
14
+ import { resolveCreateAgentTitles, resolveFirstAgentPromptTitle, } from "./agent/create-agent-title.js";
15
+ import { respondToAgentPermission } from "./agent/permission-response.js";
16
+ import { spawnWorkspaceScript } from "./worktree-bootstrap.js";
17
+ import { createWorkspaceScriptsService, } from "./session/workspace-scripts/workspace-scripts-service.js";
18
+ import { getErrorMessage, getErrorMessageOr } from "@bytetrue/byspace-protocol/error-utils";
19
+ import { getAgentStatusPriority } from "@bytetrue/byspace-protocol/agent-state-bucket";
20
+ import { getParentAgentIdFromLabels } from "@bytetrue/byspace-protocol/agent-labels";
21
+ import { CLIENT_SHUTDOWN_RPC_REASON, normalizeClientRestartRpcReason, } from "./lifecycle-reasons.js";
22
+ import { AgentRunCancellationError } from "./agent/agent-manager.js";
23
+ import { createAgentCommand } from "./agent/create-agent/create.js";
24
+ import { archiveAgentCommand, cancelAgentRunCommand, closeAgentCommand, detachAgentCommand, setAgentModeCommand, updateAgentCommand, } from "./agent/lifecycle-command.js";
25
+ import { buildStoredAgentPayload, resolveStoredAgentPayloadUpdatedAt, toAgentPayload, } from "./agent/agent-projections.js";
26
+ import { appendTimelineItemIfAgentKnown, emitLiveTimelineItemIfAgentKnown, } from "./agent/timeline-append.js";
27
+ import { projectTimelineRows, selectProjectedTimelinePage, } from "./agent/timeline-projection.js";
28
+ import { buildAgentForkContextAttachment } from "./agent/activity-curator.js";
29
+ import { buildAgentPrompt } from "./agent/prompt-attachments.js";
30
+ import { getAgentStreamEventTurnId, } from "./agent/agent-sdk-types.js";
31
+ import { ImportSessionsRequestError, importProviderSession, listImportableProviderSessions, normalizeImportAgentRequest, } from "./agent/import-sessions.js";
32
+ import { checkoutLiteFromGitSnapshot, deriveWorkspaceDisplayName, } from "./workspace-registry-model.js";
33
+ import { resolveWorkspaceIdForPath } from "./resolve-workspace-id-for-path.js";
34
+ import { resolveProjectDisplayName, resolveWorkspaceDisplayName, resolveWorkspaceName, } from "./workspace-registry.js";
35
+ import { wrapSpokenInput } from "./voice-config.js";
36
+ import { isVoicePermissionAllowed } from "./voice-permission-policy.js";
37
+ import { VoiceSession } from "./session/voice/voice-session.js";
38
+ import { CheckoutSession } from "./session/checkout/checkout-session.js";
39
+ import { createWorkspaceGitObserverService, } from "./session/workspace-git-observer/workspace-git-observer-service.js";
40
+ import { createAgentStructuredTextGeneration, createGitMetadataGenerator, } from "./session/checkout/git-metadata-generator.js";
41
+ import { ChatScheduleLoopSession } from "./session/chat/chat-schedule-loop-session.js";
42
+ import { ProviderCatalogSession } from "./session/provider/provider-catalog-session.js";
43
+ import { WorkspaceFilesSession } from "./session/files/workspace-files-session.js";
44
+ import { AgentConfigSession } from "./session/agent-config/agent-config-session.js";
45
+ import { ProjectConfigSession } from "./session/project-config/project-config-session.js";
46
+ import { DaemonSession } from "./session/daemon/daemon-session.js";
47
+ import { archivePersistedWorkspaceRecord, archiveWorkspaceContents, } from "./workspace-archive-service.js";
48
+ import { WorkspaceReconciliationService } from "./workspace-reconciliation-service.js";
49
+ import { renameCurrentBranch as renameCurrentBranchDefault } from "../utils/checkout-git.js";
50
+ import { createGitMutationService, } from "./session/git-mutation/git-mutation-service.js";
51
+ import { createWorkspaceProvisioningService, } from "./session/workspace-provisioning/workspace-provisioning-service.js";
52
+ import { createAgentUpdatesService, matchesAgentUpdatesFilter, } from "./session/agent-updates/agent-updates-service.js";
53
+ import { expandTilde } from "../utils/path.js";
54
+ import { searchDirectoryEntries, WORKSPACE_SEARCH_HIDDEN_DIRECTORIES, } from "../utils/directory-suggestions.js";
55
+ import { createGitHubService } from "../services/github-service.js";
56
+ import { summarizeFetchWorkspacesEntries, workspaceIdsOnCheckout, WorkspaceDirectory, } from "./workspace-directory.js";
57
+ import { shouldEmitPendingBootstrapUpdate } from "./workspace-bootstrap-dedupe.js";
58
+ import { createLocalCheckoutWorkspace, createBySpaceWorktree, } from "./byspace-worktree-service.js";
59
+ import { buildAgentSessionConfig as buildWorktreeAgentSessionConfig, createBySpaceWorktreeWorkflow as createWorktreeWorkflow, handleCreateBySpaceWorktreeRequest as handleCreateWorktreeRequest, handleBySpaceWorktreeArchiveRequest as handleWorktreeArchiveRequest, handleBySpaceWorktreeListRequest as handleWorktreeListRequest, handleWorkspaceSetupStatusRequest as handleWorkspaceSetupStatusRequestMessage, } from "./worktree-session.js";
60
+ import { archiveByScope } from "./workspace-archive-service.js";
61
+ import { WorktreeRequestError, toWorktreeRequestError, toWorktreeWireError, } from "./worktree-errors.js";
62
+ import { parseGitRemoteLocation } from "@bytetrue/byspace-protocol/git-remote";
63
+ import { createWorktree } from "../utils/worktree.js";
64
+ import { runGitCommand } from "../utils/run-git-command.js";
65
+ import { CreateAgentLifecycleDispatch } from "./agent/create-agent-lifecycle-dispatch.js";
66
+ function errorToFriendlyMessage(error) {
67
+ if (error instanceof Error)
68
+ return error.message;
69
+ if (typeof error === "string")
70
+ return error;
71
+ return "Unknown error";
72
+ }
73
+ function resolveSubscriptionId(subscribe, requestedSubscriptionId) {
74
+ if (!subscribe)
75
+ return null;
76
+ if (requestedSubscriptionId && requestedSubscriptionId.length > 0) {
77
+ return requestedSubscriptionId;
78
+ }
79
+ return uuidv4();
80
+ }
81
+ function buildWorkspaceCheckout(workspace, project,
82
+ // The persisted `branch` field is the source of truth, but it is null for
83
+ // records created before branch was lifted to its own field (no migrations,
84
+ // per data-model.md) and for any path that didn't backfill it. Fall back to
85
+ // the live git branch so checkout.currentBranch never regresses to null.
86
+ fallbackBranch) {
87
+ if (project.kind !== "git") {
88
+ return {
89
+ cwd: workspace.cwd,
90
+ isGit: false,
91
+ currentBranch: null,
92
+ remoteUrl: null,
93
+ worktreeRoot: null,
94
+ isBySpaceOwnedWorktree: false,
95
+ mainRepoRoot: null,
96
+ };
97
+ }
98
+ const currentBranch = workspace.branch ?? fallbackBranch ?? null;
99
+ if (workspace.kind === "worktree") {
100
+ return {
101
+ cwd: workspace.cwd,
102
+ isGit: true,
103
+ currentBranch,
104
+ remoteUrl: null,
105
+ worktreeRoot: workspace.cwd,
106
+ isBySpaceOwnedWorktree: true,
107
+ mainRepoRoot: project.rootPath,
108
+ };
109
+ }
110
+ return {
111
+ cwd: workspace.cwd,
112
+ isGit: true,
113
+ currentBranch,
114
+ remoteUrl: null,
115
+ worktreeRoot: workspace.cwd,
116
+ isBySpaceOwnedWorktree: false,
117
+ mainRepoRoot: null,
118
+ };
119
+ }
120
+ function beginAgentDeleteIfSupported(agentStorage, agentId) {
121
+ if ("beginDelete" in agentStorage && typeof agentStorage.beginDelete === "function") {
122
+ agentStorage.beginDelete(agentId);
123
+ }
124
+ }
125
+ const FETCH_AGENTS_SORT_KEYS = ["status_priority", "created_at", "updated_at", "title"];
126
+ export function resolveWaitForFinishError(options) {
127
+ if (options.status !== "error") {
128
+ return null;
129
+ }
130
+ const message = options.final?.lastError;
131
+ return typeof message === "string" && message.trim().length > 0 ? message : "Agent failed";
132
+ }
133
+ class SessionRequestError extends Error {
134
+ constructor(code, message) {
135
+ super(message);
136
+ this.code = code;
137
+ this.name = "SessionRequestError";
138
+ }
139
+ }
140
+ const nodeSessionFileSystem = {
141
+ async isDirectory(path) {
142
+ const stats = await stat(path).catch(() => null);
143
+ return stats?.isDirectory() ?? false;
144
+ },
145
+ };
146
+ function parseClientCapabilities(capabilities) {
147
+ if (!capabilities) {
148
+ return new Set();
149
+ }
150
+ const known = new Set(Object.values(CLIENT_CAPS));
151
+ const result = [];
152
+ for (const [key, value] of Object.entries(capabilities)) {
153
+ if (value === true && known.has(key)) {
154
+ result.push(key);
155
+ }
156
+ }
157
+ return new Set(result);
158
+ }
159
+ function describeRegistryTransition(record) {
160
+ if (!record) {
161
+ return "created";
162
+ }
163
+ return record.archivedAt ? "unarchived" : "existing";
164
+ }
165
+ /**
166
+ * Session represents a single connected client session.
167
+ * It owns all state management, orchestration logic, and message processing.
168
+ * Session has no knowledge of WebSockets - it only emits and receives messages.
169
+ */
170
+ export class Session {
171
+ constructor(options) {
172
+ this.unsubscribeAgentEvents = null;
173
+ this.unsubscribeTerminalWorkspaceContributionEvents = null;
174
+ this.workspaceUpdatesSubscription = null;
175
+ this.clientActivity = null;
176
+ this.inflightRequests = 0;
177
+ this.peakInflightRequests = 0;
178
+ this.agentsPager = new SortablePager({
179
+ validKeys: FETCH_AGENTS_SORT_KEYS,
180
+ defaultSort: [{ key: "updated_at", direction: "desc" }],
181
+ label: "fetch_agents",
182
+ getId: (agent) => agent.id,
183
+ getSortValue: (agent, key) => {
184
+ switch (key) {
185
+ case "status_priority":
186
+ return getAgentStatusPriority({
187
+ status: agent.status,
188
+ pendingPermissionCount: agent.pendingPermissions?.length ?? 0,
189
+ requiresAttention: agent.requiresAttention,
190
+ attentionReason: agent.attentionReason ?? null,
191
+ });
192
+ case "created_at":
193
+ return Date.parse(agent.createdAt);
194
+ case "updated_at":
195
+ return Date.parse(agent.updatedAt);
196
+ case "title":
197
+ return agent.title?.toLocaleLowerCase() ?? "";
198
+ }
199
+ },
200
+ });
201
+ const { clientId, appVersion, clientCapabilities, onMessage, onBinaryMessage, getTransportBufferedAmount, onLifecycleIntent, logger, downloadTokenStore, pushTokenStore, byspaceHome, worktreesRoot, agentManager, agentStorage, projectRegistry, workspaceRegistry, filesystem, chatService, scheduleService, loopService, checkoutDiffManager, github, renameCurrentBranch, workspaceGitService, workspaceAutoName, daemonConfigStore, stt, sttLanguage, tts, terminalManager, providerSnapshotManager, providerUsageService, serviceProxy, scriptRuntimeStore, workspaceSetupSnapshots, onBranchChanged, getDaemonTcpPort, getDaemonTcpHost, serviceProxyPublicBaseUrl, resolveScriptHealth, voice, voiceBridge, dictation, serverId, daemonVersion, daemonRuntimeConfig, getWebSocketRuntimeMetrics, } = options;
202
+ this.clientId = clientId;
203
+ this.appVersion = appVersion ?? null;
204
+ this.clientCapabilities = parseClientCapabilities(clientCapabilities);
205
+ this.sessionId = uuidv4();
206
+ this.onMessage = onMessage;
207
+ this.onBinaryMessage = onBinaryMessage ?? null;
208
+ this.getTransportBufferedAmount = getTransportBufferedAmount ?? (() => 0);
209
+ this.onLifecycleIntent = onLifecycleIntent ?? null;
210
+ this.pushTokenStore = pushTokenStore;
211
+ this.byspaceHome = byspaceHome;
212
+ this.worktreesRoot = worktreesRoot;
213
+ this.sessionLogger = logger.child({
214
+ module: "session",
215
+ clientId: this.clientId,
216
+ sessionId: this.sessionId,
217
+ });
218
+ this.workspaceFilesSession = new WorkspaceFilesSession({
219
+ host: {
220
+ emit: (msg) => this.emit(msg),
221
+ emitBinary: (frame) => this.emitBinary(frame),
222
+ hasBinaryChannel: () => this.onBinaryMessage !== null,
223
+ },
224
+ downloadTokenStore,
225
+ byspaceHome,
226
+ logger: this.sessionLogger,
227
+ });
228
+ this.agentManager = agentManager;
229
+ this.agentStorage = agentStorage;
230
+ this.projectRegistry = projectRegistry;
231
+ this.workspaceRegistry = workspaceRegistry;
232
+ this.filesystem = filesystem ?? nodeSessionFileSystem;
233
+ this.github = github ?? createGitHubService();
234
+ this.renameCurrentBranch = renameCurrentBranch ?? renameCurrentBranchDefault;
235
+ this.workspaceGitService = workspaceGitService;
236
+ this.gitMutation = createGitMutationService({
237
+ workspaceGitService: this.workspaceGitService,
238
+ github: this.github,
239
+ logger: this.sessionLogger,
240
+ });
241
+ this.workspaceAutoName = workspaceAutoName;
242
+ this.workspaceProvisioning = createWorkspaceProvisioningService({
243
+ workspaceRegistry: this.workspaceRegistry,
244
+ projectRegistry: this.projectRegistry,
245
+ workspaceGitService: this.workspaceGitService,
246
+ });
247
+ this.checkoutSession = new CheckoutSession({
248
+ host: {
249
+ emit: (msg) => this.emit(msg),
250
+ emitWorkspaceUpdateForCwd: (cwd) => this.emitWorkspaceUpdateForCwd(cwd),
251
+ handleWorkspaceGitBranchSnapshot: (cwd, branchName) => this.workspaceGitObserver.handleBranchSnapshot(cwd, branchName),
252
+ renameCurrentBranch: (cwd, branch) => this.renameCurrentBranch(cwd, branch),
253
+ },
254
+ gitMutation: this.gitMutation,
255
+ workspaceGitService: this.workspaceGitService,
256
+ github: this.github,
257
+ checkoutDiffManager,
258
+ gitMetadataGenerator: createGitMetadataGenerator({
259
+ workspaceGitService: this.workspaceGitService,
260
+ generation: createAgentStructuredTextGeneration({
261
+ agentManager: this.agentManager,
262
+ providerSnapshotManager,
263
+ readDaemonConfig: () => this.readStructuredGenerationDaemonConfig(),
264
+ getFocusedSelection: (cwd) => this.getFocusedAgentSelectionForCwd(cwd),
265
+ }),
266
+ }),
267
+ byspaceHome: this.byspaceHome,
268
+ worktreesRoot: this.worktreesRoot,
269
+ logger: this.sessionLogger,
270
+ });
271
+ this.workspaceGitObserver = createWorkspaceGitObserverService({
272
+ workspaceGitService: this.workspaceGitService,
273
+ describeWorkspaceRecordWithGitData: (workspace) => this.describeWorkspaceRecordWithGitData(workspace),
274
+ emitWorkspaceUpdateForCwd: (cwd) => this.emitWorkspaceUpdateForCwd(cwd),
275
+ emitWorkspaceUpdateForWorkspaceId: (workspaceId) => this.emitWorkspaceUpdateForWorkspaceId(workspaceId),
276
+ emitStatusUpdate: (cwd, snapshot) => this.checkoutSession.emitStatusUpdate(cwd, snapshot),
277
+ onBranchChanged,
278
+ logger: this.sessionLogger,
279
+ });
280
+ this.chatScheduleLoopSession = new ChatScheduleLoopSession({
281
+ host: {
282
+ emit: (msg) => this.emit(msg),
283
+ listStoredAgents: () => this.agentStorage.list(),
284
+ listLiveAgents: () => this.agentManager.listAgents(),
285
+ resolveAgentIdentifier: (identifier) => this.resolveAgentIdentifier(identifier),
286
+ sendAgentMessage: async (agentId, text) => {
287
+ await sendPromptToAgent({
288
+ agentManager: this.agentManager,
289
+ agentStorage: this.agentStorage,
290
+ agentId,
291
+ prompt: formatSystemNotificationPrompt(text),
292
+ unarchive: false,
293
+ logger: this.sessionLogger,
294
+ });
295
+ },
296
+ },
297
+ chatService,
298
+ scheduleService,
299
+ loopService,
300
+ clientId: this.clientId,
301
+ logger: this.sessionLogger,
302
+ });
303
+ this.providerCatalogSession = new ProviderCatalogSession({
304
+ host: {
305
+ emit: (msg) => this.emit(msg),
306
+ isProviderVisibleToClient: (provider) => this.isProviderVisibleToClient(provider),
307
+ supportsCustomModeIcons: () => this.supports(CLIENT_CAPS.customModeIcons),
308
+ listProviderAvailability: () => this.agentManager.listProviderAvailability(),
309
+ listDraftFeatures: (config) => this.agentManager.listDraftFeatures(config),
310
+ },
311
+ providerSnapshotManager,
312
+ providerUsageService,
313
+ logger: this.sessionLogger,
314
+ });
315
+ this.agentConfigSession = new AgentConfigSession({
316
+ host: {
317
+ emit: (msg) => this.emit(msg),
318
+ },
319
+ operations: {
320
+ setMode: async (agentId, modeId) => (await setAgentModeCommand({ agentManager }, { agentId, modeId })).notice,
321
+ setModel: (agentId, modelId) => agentManager.setAgentModel(agentId, modelId),
322
+ setFeature: (agentId, featureId, value) => agentManager.setAgentFeature(agentId, featureId, value),
323
+ setThinking: (agentId, thinkingOptionId) => agentManager.setAgentThinkingOption(agentId, thinkingOptionId),
324
+ },
325
+ logger: this.sessionLogger,
326
+ });
327
+ this.projectConfigSession = new ProjectConfigSession({
328
+ host: {
329
+ emit: (msg) => this.emit(msg),
330
+ },
331
+ projectRegistry: this.projectRegistry,
332
+ logger: this.sessionLogger,
333
+ });
334
+ this.daemonSession = new DaemonSession({
335
+ host: {
336
+ emit: (msg) => this.emit(msg),
337
+ emitLifecycleIntent: (intent) => this.emitLifecycleIntent(intent),
338
+ },
339
+ clientId: this.clientId,
340
+ byspaceHome: this.byspaceHome,
341
+ serverId,
342
+ daemonVersion,
343
+ daemonRuntimeConfig,
344
+ getWebSocketRuntimeMetrics,
345
+ listProviderAvailability: () => this.agentManager.listProviderAvailability(),
346
+ listAgents: () => this.agentManager.listAgents(),
347
+ listProjects: () => this.projectRegistry.list(),
348
+ listWorkspaces: () => this.workspaceRegistry.list(),
349
+ logger: this.sessionLogger,
350
+ });
351
+ this.daemonConfigStore = daemonConfigStore;
352
+ this.terminalManager = terminalManager;
353
+ this.terminalController = new TerminalSessionController({
354
+ terminalManager,
355
+ emit: (msg) => this.emit(msg),
356
+ emitBinary: (frame) => this.emitBinary(frame),
357
+ hasBinaryChannel: () => this.onBinaryMessage !== null,
358
+ isPathWithinRoot: (rootPath, candidatePath) => this.isPathWithinRoot(rootPath, candidatePath),
359
+ sessionLogger: this.sessionLogger,
360
+ listTerminalWorkspaceRefs: () => this.listActiveWorkspaceRefs(),
361
+ clientSupportsWrapReflow: () => this.clientCapabilities.has(CLIENT_CAPS.terminalReflowableSnapshot),
362
+ getClientBufferedAmount: () => this.getTransportBufferedAmount(),
363
+ });
364
+ this.agentUpdates = createAgentUpdatesService({
365
+ emit: (message) => this.emit(message),
366
+ buildAgentPayload: (agent) => this.buildAgentPayload(agent),
367
+ buildStoredAgentPayload: (record) => this.buildStoredAgentPayload(record),
368
+ isProviderVisibleToClient: (provider) => this.isProviderVisibleToClient(provider),
369
+ buildProjectPlacementForWorkspaceId: (workspaceId) => this.buildProjectPlacementForWorkspaceId(workspaceId),
370
+ emitWorkspaceUpdateForWorkspaceId: (workspaceId) => this.emitWorkspaceUpdateForWorkspaceId(workspaceId),
371
+ logger: this.sessionLogger,
372
+ });
373
+ this.createAgentLifecycleDispatch = new CreateAgentLifecycleDispatch({
374
+ byspaceHome: this.byspaceHome,
375
+ worktreesRoot: this.worktreesRoot,
376
+ agentManager: this.agentManager,
377
+ agentStorage: this.agentStorage,
378
+ github: this.github,
379
+ workspaceGitService: this.workspaceGitService,
380
+ createBySpaceWorktreeWorkflow: (input, workflowOptions) => this.createBySpaceWorktreeWorkflow(input, workflowOptions),
381
+ archiveAgentForClose: (agentId) => this.archiveAgentForClose(agentId),
382
+ findWorkspaceIdForCwd: (cwd) => this.findWorkspaceIdForCwd(cwd),
383
+ listActiveWorkspaces: () => this.listActiveWorkspaceRefs(),
384
+ archiveWorkspaceRecord: (workspaceId) => this.archiveWorkspaceRecord(workspaceId),
385
+ emit: (message) => this.emit(message),
386
+ emitAgentRemove: (agentId) => this.agentUpdates.removeAgent(agentId),
387
+ emitWorkspaceUpdatesForWorkspaceIds: (workspaceIds) => this.emitWorkspaceUpdatesForWorkspaceIds(workspaceIds),
388
+ markWorkspaceArchiving: (workspaceIds, archivingAt) => this.markWorkspaceArchiving(workspaceIds, archivingAt),
389
+ clearWorkspaceArchiving: (workspaceIds) => this.clearWorkspaceArchiving(workspaceIds),
390
+ killTerminalsForWorkspace: (workspaceId) => this.terminalController.killTerminalsForWorkspace(workspaceId),
391
+ logger: this.sessionLogger,
392
+ });
393
+ this.providerSnapshotManager = providerSnapshotManager;
394
+ this.serviceProxy = serviceProxy ?? null;
395
+ this.scriptRuntimeStore = scriptRuntimeStore ?? null;
396
+ this.workspaceSetupSnapshots = workspaceSetupSnapshots ?? new Map();
397
+ this.getDaemonTcpPort = getDaemonTcpPort ?? null;
398
+ this.getDaemonTcpHost = getDaemonTcpHost ?? null;
399
+ this.serviceProxyPublicBaseUrl = serviceProxyPublicBaseUrl ?? null;
400
+ this.resolveScriptHealth = resolveScriptHealth ?? null;
401
+ this.workspaceScripts = createWorkspaceScriptsService({
402
+ serviceProxy: this.serviceProxy,
403
+ scriptRuntimeStore: this.scriptRuntimeStore,
404
+ terminalManager: this.terminalManager,
405
+ workspaceRegistry: this.workspaceRegistry,
406
+ workspaceGitService: this.workspaceGitService,
407
+ getDaemonTcpPort: this.getDaemonTcpPort,
408
+ getDaemonTcpHost: this.getDaemonTcpHost,
409
+ serviceProxyPublicBaseUrl: this.serviceProxyPublicBaseUrl,
410
+ resolveScriptHealth: this.resolveScriptHealth,
411
+ logger: this.sessionLogger,
412
+ emit: (message) => this.emit(message),
413
+ spawnWorkspaceScript,
414
+ });
415
+ this.subscribeToOptionalManagers();
416
+ this.workspaceDirectory = new WorkspaceDirectory({
417
+ logger: this.sessionLogger,
418
+ projectRegistry: this.projectRegistry,
419
+ workspaceRegistry: this.workspaceRegistry,
420
+ listAgentPayloads: () => this.listAgentPayloads(),
421
+ listTerminalActivityContributions: () => this.listTerminalActivityContributions(),
422
+ isProviderVisibleToClient: (provider) => this.isProviderVisibleToClient(provider),
423
+ buildWorkspaceDescriptor: (input) => this.buildWorkspaceDescriptor(input),
424
+ });
425
+ this.voiceSession = new VoiceSession({
426
+ host: {
427
+ emit: (msg) => this.emit(msg),
428
+ loadAgent: (agentId) => ensureAgentLoaded(agentId, {
429
+ agentManager: this.agentManager,
430
+ agentStorage: this.agentStorage,
431
+ logger: this.sessionLogger,
432
+ }),
433
+ reloadAgentSession: (agentId, overrides) => this.agentManager.reloadAgentSession(agentId, overrides),
434
+ sendSpokenInput: async (agentId, text) => {
435
+ await this.handleSendAgentMessage(agentId, text, undefined, undefined, undefined, undefined, { spokenInput: true });
436
+ },
437
+ interruptAgentIfRunning: (agentId) => this.interruptAgentIfRunning(agentId),
438
+ hasActiveAgentRun: (agentId) => this.hasActiveAgentRun(agentId),
439
+ },
440
+ logger: this.sessionLogger,
441
+ sessionId: this.sessionId,
442
+ sttLanguage,
443
+ tts,
444
+ stt,
445
+ voice,
446
+ voiceBridge,
447
+ dictation,
448
+ });
449
+ this.subscribeToAgentEvents();
450
+ this.sessionLogger.trace({}, "agent.session.lifecycle.created");
451
+ }
452
+ updateAppVersion(appVersion) {
453
+ if (appVersion && appVersion !== this.appVersion) {
454
+ this.appVersion = appVersion;
455
+ }
456
+ }
457
+ updateClientCapabilities(capabilities) {
458
+ this.clientCapabilities = parseClientCapabilities(capabilities);
459
+ }
460
+ supports(capability) {
461
+ return this.clientCapabilities.has(capability);
462
+ }
463
+ async syncWorkspaceGitObserverForWorkspace(workspace) {
464
+ await this.workspaceGitObserver.syncObserverForWorkspace(workspace);
465
+ }
466
+ async emitWorkspaceUpdateForWorkspaceId(workspaceId) {
467
+ await this.emitWorkspaceUpdatesForWorkspaceIds([workspaceId], { skipReconcile: true });
468
+ }
469
+ async archiveWorkspaceRecordForExternalMutation(workspaceId) {
470
+ await this.archiveWorkspaceRecord(workspaceId);
471
+ }
472
+ markWorkspaceArchivingForExternalMutation(workspaceIds, archivingAt) {
473
+ this.markWorkspaceArchiving(workspaceIds, archivingAt);
474
+ }
475
+ clearWorkspaceArchivingForExternalMutation(workspaceIds) {
476
+ this.clearWorkspaceArchiving(workspaceIds);
477
+ }
478
+ async emitWorkspaceUpdatesForExternalWorkspaceIds(workspaceIds) {
479
+ await this.emitWorkspaceUpdatesForWorkspaceIds(workspaceIds);
480
+ }
481
+ async warmWorkspaceGitDataForWorkspace(workspace) {
482
+ await this.workspaceGitObserver.warmGitData(workspace);
483
+ }
484
+ /**
485
+ * Get the client's current activity state
486
+ */
487
+ getClientActivity() {
488
+ return this.clientActivity;
489
+ }
490
+ getFocusedAgentSelectionForCwd(cwd) {
491
+ const focusedAgentId = this.clientActivity?.focusedAgentId;
492
+ if (!focusedAgentId) {
493
+ return undefined;
494
+ }
495
+ const agent = this.agentManager.getAgent(focusedAgentId);
496
+ if (!agent || agent.cwd !== cwd) {
497
+ return undefined;
498
+ }
499
+ return {
500
+ provider: agent.provider,
501
+ model: agent.runtimeInfo?.model ?? agent.config.model ?? null,
502
+ thinkingOptionId: agent.runtimeInfo?.thinkingOptionId ?? agent.config.thinkingOptionId ?? null,
503
+ };
504
+ }
505
+ readStructuredGenerationDaemonConfig() {
506
+ return {
507
+ metadataGeneration: this.daemonConfigStore.get().metadataGeneration,
508
+ };
509
+ }
510
+ getRuntimeMetrics() {
511
+ const terminalMetrics = this.terminalController.getMetrics();
512
+ return {
513
+ terminalDirectorySubscriptionCount: terminalMetrics.directorySubscriptionCount,
514
+ terminalSubscriptionCount: terminalMetrics.streamSubscriptionCount,
515
+ inflightRequests: this.inflightRequests,
516
+ peakInflightRequests: this.peakInflightRequests,
517
+ };
518
+ }
519
+ emitServerMessage(message) {
520
+ this.emit(message);
521
+ }
522
+ /**
523
+ * Send initial state to client after connection
524
+ */
525
+ async sendInitialState() {
526
+ // No unsolicited agent list hydration. Callers must use fetch_agents_request.
527
+ }
528
+ /**
529
+ * Interrupt the agent's active run so the next prompt starts a fresh turn.
530
+ * Returns once the manager confirms the stream has been cancelled.
531
+ */
532
+ async interruptAgentIfRunning(agentId) {
533
+ const snapshot = this.agentManager.getAgent(agentId);
534
+ if (!snapshot) {
535
+ this.sessionLogger.trace({ agentId }, "agent.session.interrupt.not_found");
536
+ throw new Error(`Agent ${agentId} not found`);
537
+ }
538
+ const hasInFlightRun = this.agentManager.hasInFlightRun(agentId);
539
+ if (!hasInFlightRun) {
540
+ this.sessionLogger.trace({
541
+ agentId,
542
+ provider: snapshot.provider,
543
+ lifecycle: snapshot.lifecycle,
544
+ hasInFlightRun,
545
+ }, "agent.session.interrupt.skip_not_running");
546
+ return;
547
+ }
548
+ this.sessionLogger.debug({ agentId, lifecycle: snapshot.lifecycle, hasInFlightRun }, "interruptAgentIfRunning: interrupting");
549
+ const t0 = Date.now();
550
+ const cancellation = await this.agentManager.cancelAgentRun(agentId);
551
+ this.sessionLogger.debug({ agentId, cancellation: cancellation.status, durationMs: Date.now() - t0 }, "interruptAgentIfRunning: cancelAgentRun completed");
552
+ if (cancellation.status === "refused") {
553
+ this.sessionLogger.warn({ agentId }, "interruptAgentIfRunning: reported running but no active run was cancelled");
554
+ throw new AgentRunCancellationError(agentId, "stop");
555
+ }
556
+ }
557
+ hasActiveAgentRun(agentId) {
558
+ if (!agentId) {
559
+ return false;
560
+ }
561
+ return this.agentManager.hasInFlightRun(agentId);
562
+ }
563
+ handleAgentRunError(agentId, error, context) {
564
+ const message = errorToFriendlyMessage(error);
565
+ this.sessionLogger.error({ err: error, agentId, context }, `${context} for agent ${agentId}`);
566
+ this.emit({
567
+ type: "activity_log",
568
+ payload: {
569
+ id: uuidv4(),
570
+ timestamp: new Date(),
571
+ type: "error",
572
+ content: `${context}: ${message}`,
573
+ },
574
+ });
575
+ }
576
+ /**
577
+ * Subscribe to AgentManager events and forward them to the client
578
+ */
579
+ subscribeToOptionalManagers() {
580
+ this.terminalController.start();
581
+ if (this.terminalManager) {
582
+ this.unsubscribeTerminalWorkspaceContributionEvents =
583
+ this.terminalManager.subscribeTerminalWorkspaceContributionChanged((event) => {
584
+ void this.emitWorkspaceUpdateForTerminalContribution(event).catch((error) => {
585
+ this.sessionLogger.warn({ err: error, terminalId: event.terminalId }, "Failed to emit workspace update after terminal contribution changed");
586
+ });
587
+ });
588
+ }
589
+ this.providerCatalogSession.start();
590
+ }
591
+ subscribeToAgentEvents() {
592
+ if (this.unsubscribeAgentEvents) {
593
+ this.unsubscribeAgentEvents();
594
+ }
595
+ this.unsubscribeAgentEvents = this.agentManager.subscribe((event) => {
596
+ if (event.type === "agent_state") {
597
+ this.sessionLogger.trace({
598
+ agentId: event.agent.id,
599
+ provider: event.agent.provider,
600
+ providerSessionId: event.agent.persistence?.sessionId ?? undefined,
601
+ turnId: event.agent.activeForegroundTurnId ?? undefined,
602
+ lifecycle: event.agent.lifecycle,
603
+ }, "agent.session.forward_update");
604
+ void this.agentUpdates.forwardLiveAgent(event.agent);
605
+ return;
606
+ }
607
+ if (event.type === "provider_subagent") {
608
+ if (!this.supports(CLIENT_CAPS.providerSubagents)) {
609
+ return;
610
+ }
611
+ const update = event.event;
612
+ if (update.type === "upsert") {
613
+ this.emit({
614
+ type: "agent.provider_subagents.update",
615
+ payload: { kind: "upsert", subagent: update.subagent },
616
+ });
617
+ }
618
+ else if (update.type === "timeline") {
619
+ this.emit({
620
+ type: "agent.provider_subagents.update",
621
+ payload: {
622
+ kind: "timeline",
623
+ parentAgentId: update.parentAgentId,
624
+ subagentId: update.subagentId,
625
+ provider: update.provider,
626
+ item: update.row.item,
627
+ timestamp: update.row.timestamp,
628
+ seq: update.row.seq,
629
+ epoch: update.epoch,
630
+ },
631
+ });
632
+ }
633
+ else {
634
+ this.emit({
635
+ type: "agent.provider_subagents.update",
636
+ payload: {
637
+ kind: "remove",
638
+ parentAgentId: update.parentAgentId,
639
+ subagentId: update.subagentId,
640
+ },
641
+ });
642
+ }
643
+ return;
644
+ }
645
+ if (this.voiceSession.isActiveForAgent(event.agentId) &&
646
+ event.event.type === "permission_requested" &&
647
+ isVoicePermissionAllowed(event.event.request)) {
648
+ const requestId = event.event.request.id;
649
+ void this.agentManager
650
+ .respondToPermission(event.agentId, requestId, {
651
+ behavior: "allow",
652
+ })
653
+ .catch((error) => {
654
+ this.sessionLogger.warn({
655
+ err: error,
656
+ agentId: event.agentId,
657
+ requestId,
658
+ }, "Failed to auto-allow speak tool permission in voice mode");
659
+ });
660
+ }
661
+ const serializedEvent = serializeAgentStreamEvent(event.event);
662
+ if (!serializedEvent) {
663
+ return;
664
+ }
665
+ this.sessionLogger.trace({
666
+ agentId: event.agentId,
667
+ provider: event.event.provider,
668
+ turnId: getAgentStreamEventTurnId(event.event),
669
+ seq: event.seq,
670
+ epoch: event.epoch,
671
+ event: event.event,
672
+ }, "agent.session.forward_stream");
673
+ this.emit({
674
+ type: "agent_stream",
675
+ payload: this.buildAgentStreamPayload(event, serializedEvent),
676
+ });
677
+ if (event.event.type === "permission_requested") {
678
+ this.emit({
679
+ type: "agent_permission_request",
680
+ payload: {
681
+ agentId: event.agentId,
682
+ request: event.event.request,
683
+ },
684
+ });
685
+ }
686
+ else if (event.event.type === "permission_resolved") {
687
+ this.emit({
688
+ type: "agent_permission_resolved",
689
+ payload: {
690
+ agentId: event.agentId,
691
+ requestId: event.event.requestId,
692
+ resolution: event.event.resolution,
693
+ },
694
+ });
695
+ }
696
+ // Title updates may be applied asynchronously after agent creation.
697
+ }, { replayState: false });
698
+ }
699
+ buildAgentStreamPayload(event, serializedEvent) {
700
+ return {
701
+ agentId: event.agentId,
702
+ event: serializedEvent,
703
+ timestamp: event.timestamp ?? new Date().toISOString(),
704
+ ...(typeof event.seq === "number" ? { seq: event.seq } : {}),
705
+ ...(typeof event.epoch === "string" ? { epoch: event.epoch } : {}),
706
+ };
707
+ }
708
+ async buildAgentPayload(agent) {
709
+ const storedRecord = await this.agentStorage.get(agent.id);
710
+ const title = storedRecord?.title ?? null;
711
+ const payload = toAgentPayload(agent, { title });
712
+ const storedUpdatedAt = storedRecord ? resolveStoredAgentPayloadUpdatedAt(storedRecord) : null;
713
+ if (storedUpdatedAt) {
714
+ const liveUpdatedAt = Date.parse(payload.updatedAt);
715
+ const persistedUpdatedAt = Date.parse(storedUpdatedAt);
716
+ if (Number.isNaN(liveUpdatedAt) || persistedUpdatedAt > liveUpdatedAt) {
717
+ payload.updatedAt = storedUpdatedAt;
718
+ }
719
+ }
720
+ payload.archivedAt = storedRecord?.archivedAt ?? null;
721
+ return payload;
722
+ }
723
+ buildStoredAgentPayload(record, registeredProviderIds = new Set(this.providerSnapshotManager.listRegisteredProviderIds())) {
724
+ return buildStoredAgentPayload(record, registeredProviderIds);
725
+ }
726
+ isProviderVisibleToClient(_provider) {
727
+ return true;
728
+ }
729
+ async buildProjectPlacementForWorkspace(workspace, projectRecord) {
730
+ const project = projectRecord ?? (await this.projectRegistry.get(workspace.projectId));
731
+ if (!project) {
732
+ throw new Error(`Project not found for workspace ${workspace.workspaceId}`);
733
+ }
734
+ const liveBranch = this.workspaceGitService.peekSnapshot(workspace.cwd)?.git.currentBranch ?? null;
735
+ const checkout = buildWorkspaceCheckout(workspace, project, liveBranch);
736
+ return {
737
+ projectKey: project.projectId,
738
+ projectName: resolveProjectDisplayName(project),
739
+ workspaceName: resolveWorkspaceDisplayName(workspace),
740
+ checkout,
741
+ };
742
+ }
743
+ async buildProjectPlacementForWorkspaceId(workspaceId) {
744
+ const workspace = await this.workspaceRegistry.get(workspaceId);
745
+ if (!workspace)
746
+ return null;
747
+ const project = await this.projectRegistry.get(workspace.projectId);
748
+ if (!project)
749
+ return null;
750
+ return this.buildProjectPlacementForWorkspace(workspace, project);
751
+ }
752
+ /**
753
+ * Main entry point for processing session messages
754
+ */
755
+ async handleMessage(msg) {
756
+ this.inflightRequests++;
757
+ if (this.inflightRequests > this.peakInflightRequests) {
758
+ this.peakInflightRequests = this.inflightRequests;
759
+ }
760
+ try {
761
+ this.sessionLogger.trace({
762
+ messageType: msg.type,
763
+ payloadBytes: JSON.stringify(msg).length,
764
+ }, "agent.session.inbound");
765
+ try {
766
+ await this.dispatchInboundMessage(msg);
767
+ }
768
+ catch (error) {
769
+ const err = error instanceof Error ? error : new Error(String(error));
770
+ this.sessionLogger.error({ err }, "Error handling message");
771
+ const requestId = "requestId" in msg && typeof msg.requestId === "string" ? msg.requestId : undefined;
772
+ if (typeof requestId === "string") {
773
+ try {
774
+ this.emit({
775
+ type: "rpc_error",
776
+ payload: {
777
+ requestId,
778
+ requestType: msg.type,
779
+ error: `Request failed: ${err.message}`,
780
+ code: "handler_error",
781
+ },
782
+ });
783
+ }
784
+ catch (emitError) {
785
+ this.sessionLogger.error({ err: emitError }, "Failed to emit rpc_error");
786
+ }
787
+ }
788
+ this.emit({
789
+ type: "activity_log",
790
+ payload: {
791
+ id: uuidv4(),
792
+ timestamp: new Date(),
793
+ type: "error",
794
+ content: `Error: ${err.message}`,
795
+ },
796
+ });
797
+ }
798
+ }
799
+ finally {
800
+ this.inflightRequests--;
801
+ }
802
+ }
803
+ async dispatchInboundMessage(msg) {
804
+ const promise = this.dispatchVoiceAndControlMessage(msg) ??
805
+ this.dispatchAgentRewindMessage(msg) ??
806
+ this.dispatchAgentRelationshipMessage(msg) ??
807
+ this.dispatchAgentTimelineMessage(msg) ??
808
+ this.dispatchAgentLifecycleMessage(msg) ??
809
+ this.dispatchAgentConfigMessage(msg) ??
810
+ this.dispatchCheckoutMessage(msg) ??
811
+ this.dispatchWorkspaceAndProjectMessage(msg) ??
812
+ this.dispatchWorkspaceFileMessage(msg) ??
813
+ this.dispatchProviderMessage(msg) ??
814
+ this.dispatchTerminalMessage(msg) ??
815
+ this.dispatchChatScheduleLoopMessage(msg) ??
816
+ this.dispatchMiscMessage(msg);
817
+ if (promise)
818
+ await promise;
819
+ }
820
+ dispatchVoiceAndControlMessage(msg) {
821
+ switch (msg.type) {
822
+ case "voice_audio_chunk":
823
+ return this.voiceSession.handleAudioChunk(msg);
824
+ case "abort_request":
825
+ return this.voiceSession.handleAbort();
826
+ case "audio_played":
827
+ this.voiceSession.handleAudioPlayed(msg.id);
828
+ return undefined;
829
+ case "set_voice_mode":
830
+ return this.voiceSession.handleSetVoiceMode(msg.enabled, msg.agentId, msg.requestId);
831
+ case "dictation_stream_start":
832
+ return this.voiceSession.handleDictationStreamStart(msg);
833
+ case "dictation_stream_chunk":
834
+ return this.voiceSession.handleDictationChunk({
835
+ dictationId: msg.dictationId,
836
+ seq: msg.seq,
837
+ audioBase64: msg.audio,
838
+ format: msg.format,
839
+ });
840
+ case "dictation_stream_finish":
841
+ return this.voiceSession.handleDictationFinish(msg.dictationId, msg.finalSeq);
842
+ case "dictation_stream_cancel":
843
+ this.voiceSession.handleDictationCancel(msg.dictationId);
844
+ return undefined;
845
+ case "restart_server_request":
846
+ return this.handleRestartServerRequest(msg.requestId, msg.reason);
847
+ case "shutdown_server_request":
848
+ return this.handleShutdownServerRequest(msg.requestId);
849
+ case "client_heartbeat":
850
+ this.handleClientHeartbeat(msg);
851
+ return undefined;
852
+ case "ping": {
853
+ const now = Date.now();
854
+ this.emit({
855
+ type: "pong",
856
+ payload: {
857
+ requestId: msg.requestId,
858
+ clientSentAt: msg.clientSentAt,
859
+ serverReceivedAt: now,
860
+ serverSentAt: now,
861
+ },
862
+ });
863
+ return undefined;
864
+ }
865
+ default:
866
+ return undefined;
867
+ }
868
+ }
869
+ dispatchAgentRewindMessage(msg) {
870
+ switch (msg.type) {
871
+ case "agent.rewind.request":
872
+ return this.handleAgentRewindRequest(msg);
873
+ default:
874
+ return undefined;
875
+ }
876
+ }
877
+ dispatchAgentRelationshipMessage(msg) {
878
+ switch (msg.type) {
879
+ case "agent.detach.request":
880
+ return this.handleDetachAgentRequest(msg.agentId, msg.requestId);
881
+ default:
882
+ return undefined;
883
+ }
884
+ }
885
+ dispatchAgentTimelineMessage(msg) {
886
+ switch (msg.type) {
887
+ case "fetch_agent_timeline_request":
888
+ return this.handleFetchAgentTimelineRequest(msg);
889
+ case "agent.provider_subagents.list.request":
890
+ return this.handleProviderSubagentListRequest(msg);
891
+ case "agent.provider_subagents.timeline.get.request":
892
+ return this.handleProviderSubagentTimelineRequest(msg);
893
+ case "agent.fork_context.request":
894
+ return this.handleAgentForkContextRequest(msg);
895
+ default:
896
+ return undefined;
897
+ }
898
+ }
899
+ dispatchAgentLifecycleMessage(msg) {
900
+ switch (msg.type) {
901
+ case "fetch_agents_request":
902
+ return this.handleFetchAgents(msg);
903
+ case "fetch_agent_history_request":
904
+ return this.handleFetchAgentHistory(msg);
905
+ case "fetch_recent_provider_sessions_request":
906
+ return this.handleFetchRecentProviderSessions(msg);
907
+ case "fetch_agent_request":
908
+ return this.handleFetchAgent(msg.agentId, msg.requestId);
909
+ case "delete_agent_request":
910
+ return this.handleDeleteAgentRequest(msg.agentId, msg.requestId);
911
+ case "archive_agent_request":
912
+ return this.handleArchiveAgentRequest(msg.agentId, msg.requestId);
913
+ case "close_items_request":
914
+ return this.handleCloseItemsRequest(msg);
915
+ case "update_agent_request":
916
+ return this.handleUpdateAgentRequest(msg.agentId, msg.name, msg.labels, msg.requestId);
917
+ case "project.rename.request":
918
+ return this.handleProjectRenameRequest(msg.projectId, msg.customName, msg.requestId);
919
+ case "send_agent_message_request":
920
+ return this.handleSendAgentMessageRequest(msg);
921
+ case "wait_for_finish_request":
922
+ return this.handleWaitForFinish(msg.agentId, msg.requestId, msg.timeoutMs);
923
+ case "create_agent_request":
924
+ return this.handleCreateAgentRequest(msg);
925
+ case "resume_agent_request":
926
+ return this.handleResumeAgentRequest(msg);
927
+ case "import_agent_request":
928
+ return this.handleImportAgentRequest(msg);
929
+ case "refresh_agent_request":
930
+ return this.handleRefreshAgentRequest(msg);
931
+ case "cancel_agent_request":
932
+ return this.handleCancelAgentRequest(msg.agentId, msg.requestId);
933
+ case "agent_permission_response":
934
+ return this.handleAgentPermissionResponse(msg.agentId, msg.requestId, msg.response);
935
+ case "clear_agent_attention":
936
+ return this.handleClearAgentAttention(msg.agentId, msg.requestId);
937
+ default:
938
+ return undefined;
939
+ }
940
+ }
941
+ dispatchAgentConfigMessage(msg) {
942
+ switch (msg.type) {
943
+ case "set_agent_mode_request":
944
+ return this.agentConfigSession.handleSetAgentModeRequest(msg);
945
+ case "set_agent_model_request":
946
+ return this.agentConfigSession.handleSetAgentModelRequest(msg);
947
+ case "set_agent_feature_request":
948
+ return this.agentConfigSession.handleSetAgentFeatureRequest(msg);
949
+ case "set_agent_thinking_request":
950
+ return this.agentConfigSession.handleSetAgentThinkingRequest(msg);
951
+ case "get_daemon_config_request":
952
+ this.emit({
953
+ type: "get_daemon_config_response",
954
+ payload: { requestId: msg.requestId, config: this.daemonConfigStore.get() },
955
+ });
956
+ return undefined;
957
+ case "daemon.get_status.request":
958
+ return this.daemonSession.handleGetStatusRequest(msg);
959
+ case "daemon.get_pairing_offer.request":
960
+ return this.daemonSession.handleGetPairingOfferRequest(msg);
961
+ case "diagnostics.request":
962
+ return this.daemonSession.handleDiagnosticsRequest(msg);
963
+ case "daemon.update.request":
964
+ return this.daemonSession.handleUpdateRequest(msg);
965
+ case "set_daemon_config_request":
966
+ this.emit({
967
+ type: "set_daemon_config_response",
968
+ payload: {
969
+ requestId: msg.requestId,
970
+ config: this.daemonConfigStore.patch(msg.config),
971
+ },
972
+ });
973
+ return undefined;
974
+ case "read_project_config_request":
975
+ return this.projectConfigSession.handleReadProjectConfigRequest(msg);
976
+ case "write_project_config_request":
977
+ return this.projectConfigSession.handleWriteProjectConfigRequest(msg);
978
+ default:
979
+ return undefined;
980
+ }
981
+ }
982
+ // eslint-disable-next-line complexity
983
+ dispatchCheckoutMessage(msg) {
984
+ switch (msg.type) {
985
+ case "checkout_status_request":
986
+ return this.checkoutSession.handleStatusRequest(msg);
987
+ case "validate_branch_request":
988
+ return this.checkoutSession.handleValidateBranchRequest(msg);
989
+ case "branch_suggestions_request":
990
+ return this.checkoutSession.handleBranchSuggestionsRequest(msg);
991
+ case "directory_suggestions_request":
992
+ return this.handleDirectorySuggestionsRequest(msg);
993
+ case "subscribe_checkout_diff_request":
994
+ return this.checkoutSession.handleSubscribeDiffRequest(msg);
995
+ case "unsubscribe_checkout_diff_request":
996
+ this.checkoutSession.handleUnsubscribeDiffRequest(msg);
997
+ return undefined;
998
+ case "checkout_switch_branch_request":
999
+ return this.checkoutSession.handleCheckoutSwitchBranchRequest(msg);
1000
+ case "checkout.rename_branch.request":
1001
+ return this.checkoutSession.handleCheckoutRenameBranchRequest(msg);
1002
+ case "checkout_commit_request":
1003
+ return this.checkoutSession.handleCheckoutCommitRequest(msg);
1004
+ case "checkout_merge_request":
1005
+ return this.checkoutSession.handleCheckoutMergeRequest(msg);
1006
+ case "checkout_merge_from_base_request":
1007
+ return this.checkoutSession.handleCheckoutMergeFromBaseRequest(msg);
1008
+ case "checkout_pull_request":
1009
+ return this.checkoutSession.handleCheckoutPullRequest(msg);
1010
+ case "checkout_push_request":
1011
+ return this.checkoutSession.handleCheckoutPushRequest(msg);
1012
+ case "checkout.refresh.request":
1013
+ return this.checkoutSession.handleRefreshRequest(msg);
1014
+ case "checkout_pr_create_request":
1015
+ return this.checkoutSession.handleCheckoutPrCreateRequest(msg);
1016
+ case "checkout_pr_merge_request":
1017
+ return this.checkoutSession.handleCheckoutPrMergeRequest(msg);
1018
+ case "checkout.github.set_auto_merge.request":
1019
+ return this.checkoutSession.handleCheckoutGithubSetAutoMergeRequest(msg);
1020
+ case "checkout.github.get_check_details.request":
1021
+ return this.checkoutSession.handleCheckoutGithubGetCheckDetailsRequest(msg);
1022
+ case "checkout_pr_status_request":
1023
+ return this.checkoutSession.handleCheckoutPrStatusRequest(msg);
1024
+ case "pull_request_timeline_request":
1025
+ return this.checkoutSession.handlePullRequestTimelineRequest(msg);
1026
+ case "github_search_request":
1027
+ return this.checkoutSession.handleGitHubSearchRequest(msg);
1028
+ case "stash_save_request":
1029
+ return this.checkoutSession.handleStashSaveRequest(msg);
1030
+ case "stash_pop_request":
1031
+ return this.checkoutSession.handleStashPopRequest(msg);
1032
+ case "stash_list_request":
1033
+ return this.checkoutSession.handleStashListRequest(msg);
1034
+ default:
1035
+ return undefined;
1036
+ }
1037
+ }
1038
+ dispatchWorkspaceAndProjectMessage(msg) {
1039
+ switch (msg.type) {
1040
+ case "fetch_workspaces_request":
1041
+ return this.handleFetchWorkspacesRequest(msg);
1042
+ case "byspace_worktree_list_request":
1043
+ return this.handleBySpaceWorktreeListRequest(msg);
1044
+ case "byspace_worktree_archive_request":
1045
+ return this.handleBySpaceWorktreeArchiveRequest(msg);
1046
+ case "create_byspace_worktree_request":
1047
+ return this.handleCreateBySpaceWorktreeRequest(msg);
1048
+ case "workspace_setup_status_request":
1049
+ return this.handleWorkspaceSetupStatusRequest(msg);
1050
+ // COMPAT(desktopEditorBridge): added in v0.1.88, remove after 2026-12-03 once old clients no longer call daemon editor RPCs.
1051
+ case "list_available_editors_request":
1052
+ return this.handleLegacyListAvailableEditorsRequest(msg);
1053
+ case "open_in_editor_request":
1054
+ return this.handleLegacyOpenInEditorRequest(msg);
1055
+ case "open_project_request":
1056
+ return this.handleOpenProjectRequest(msg);
1057
+ case "project.add.request":
1058
+ return this.handleProjectAddRequest(msg);
1059
+ case "workspace.github.clone.request":
1060
+ return this.handleWorkspaceGithubCloneRequest(msg);
1061
+ case "archive_workspace_request":
1062
+ return this.handleArchiveWorkspaceRequest(msg);
1063
+ case "project.remove.request":
1064
+ return this.handleProjectRemoveRequest(msg);
1065
+ case "workspace.create.request":
1066
+ return this.handleWorkspaceCreateRequest(msg);
1067
+ case "workspace.clear_attention.request":
1068
+ return this.handleWorkspaceClearAttentionRequest(msg);
1069
+ case "workspace.title.set.request":
1070
+ return this.handleWorkspaceTitleSetRequest(msg.workspaceId, msg.title, msg.requestId);
1071
+ case "workspace.pin.set.request":
1072
+ return this.handleWorkspacePinSetRequest(msg.workspaceId, msg.pinned, msg.requestId);
1073
+ default:
1074
+ return undefined;
1075
+ }
1076
+ }
1077
+ dispatchWorkspaceFileMessage(msg) {
1078
+ switch (msg.type) {
1079
+ case "file_explorer_request":
1080
+ return this.workspaceFilesSession.handleFileExplorerRequest(msg);
1081
+ case "project_icon_request":
1082
+ return this.workspaceFilesSession.handleProjectIconRequest(msg);
1083
+ case "file_download_token_request":
1084
+ return this.workspaceFilesSession.handleFileDownloadTokenRequest(msg);
1085
+ case "file.upload.request":
1086
+ this.workspaceFilesSession.handleFileUploadRequest(msg);
1087
+ return undefined;
1088
+ default:
1089
+ return undefined;
1090
+ }
1091
+ }
1092
+ dispatchProviderMessage(msg) {
1093
+ switch (msg.type) {
1094
+ case "list_provider_models_request":
1095
+ return this.providerCatalogSession.handleListProviderModelsRequest(msg);
1096
+ case "list_provider_modes_request":
1097
+ return this.providerCatalogSession.handleListProviderModesRequest(msg);
1098
+ case "list_provider_features_request":
1099
+ return this.providerCatalogSession.handleListProviderFeaturesRequest(msg);
1100
+ case "list_available_providers_request":
1101
+ return this.providerCatalogSession.handleListAvailableProvidersRequest(msg);
1102
+ case "get_providers_snapshot_request":
1103
+ return this.providerCatalogSession.handleGetProvidersSnapshotRequest(msg);
1104
+ case "refresh_providers_snapshot_request":
1105
+ return this.providerCatalogSession.handleRefreshProvidersSnapshotRequest(msg);
1106
+ case "provider_diagnostic_request":
1107
+ return this.providerCatalogSession.handleProviderDiagnosticRequest(msg);
1108
+ case "provider.usage.list.request":
1109
+ return this.providerCatalogSession.handleProviderUsageListRequest(msg);
1110
+ default:
1111
+ return undefined;
1112
+ }
1113
+ }
1114
+ dispatchTerminalMessage(msg) {
1115
+ if (msg.type === "start_workspace_script_request") {
1116
+ return this.handleStartWorkspaceScriptRequest(msg);
1117
+ }
1118
+ return this.terminalController.dispatch(msg);
1119
+ }
1120
+ // eslint-disable-next-line complexity
1121
+ dispatchChatScheduleLoopMessage(msg) {
1122
+ switch (msg.type) {
1123
+ case "chat/create":
1124
+ return this.chatScheduleLoopSession.handleChatCreateRequest(msg);
1125
+ case "chat/list":
1126
+ return this.chatScheduleLoopSession.handleChatListRequest(msg);
1127
+ case "chat/inspect":
1128
+ return this.chatScheduleLoopSession.handleChatInspectRequest(msg);
1129
+ case "chat/delete":
1130
+ return this.chatScheduleLoopSession.handleChatDeleteRequest(msg);
1131
+ case "chat/post":
1132
+ return this.chatScheduleLoopSession.handleChatPostRequest(msg);
1133
+ case "chat/read":
1134
+ return this.chatScheduleLoopSession.handleChatReadRequest(msg);
1135
+ case "chat/wait":
1136
+ return this.chatScheduleLoopSession.handleChatWaitRequest(msg);
1137
+ case "loop/run":
1138
+ return this.chatScheduleLoopSession.handleLoopRunRequest(msg);
1139
+ case "loop/list":
1140
+ return this.chatScheduleLoopSession.handleLoopListRequest(msg);
1141
+ case "loop/inspect":
1142
+ return this.chatScheduleLoopSession.handleLoopInspectRequest(msg);
1143
+ case "loop/logs":
1144
+ return this.chatScheduleLoopSession.handleLoopLogsRequest(msg);
1145
+ case "loop/stop":
1146
+ return this.chatScheduleLoopSession.handleLoopStopRequest(msg);
1147
+ case "schedule/create":
1148
+ return this.chatScheduleLoopSession.handleScheduleCreateRequest(msg);
1149
+ case "schedule/list":
1150
+ return this.chatScheduleLoopSession.handleScheduleListRequest(msg);
1151
+ case "schedule/inspect":
1152
+ return this.chatScheduleLoopSession.handleScheduleInspectRequest(msg);
1153
+ case "schedule/logs":
1154
+ return this.chatScheduleLoopSession.handleScheduleLogsRequest(msg);
1155
+ case "schedule/pause":
1156
+ return this.chatScheduleLoopSession.handleSchedulePauseRequest(msg);
1157
+ case "schedule/resume":
1158
+ return this.chatScheduleLoopSession.handleScheduleResumeRequest(msg);
1159
+ case "schedule/delete":
1160
+ return this.chatScheduleLoopSession.handleScheduleDeleteRequest(msg);
1161
+ case "schedule/run-once":
1162
+ return this.chatScheduleLoopSession.handleScheduleRunOnceRequest(msg);
1163
+ case "schedule/update":
1164
+ return this.chatScheduleLoopSession.handleScheduleUpdateRequest(msg);
1165
+ default:
1166
+ return undefined;
1167
+ }
1168
+ }
1169
+ async dispatchMiscMessage(msg) {
1170
+ switch (msg.type) {
1171
+ case "list_commands_request":
1172
+ await this.handleListCommandsRequest(msg);
1173
+ return;
1174
+ case "register_push_token":
1175
+ this.handleRegisterPushToken(msg.token);
1176
+ return;
1177
+ }
1178
+ }
1179
+ resetPeakInflight() {
1180
+ this.peakInflightRequests = this.inflightRequests;
1181
+ }
1182
+ getSessionId() {
1183
+ return this.sessionId;
1184
+ }
1185
+ async handleBinaryFrame(binaryFrame) {
1186
+ if (binaryFrame.kind === "file_transfer") {
1187
+ await this.workspaceFilesSession.handleFileTransferFrame(binaryFrame.frame);
1188
+ return;
1189
+ }
1190
+ this.terminalController.handleBinaryFrame(binaryFrame.frame);
1191
+ }
1192
+ async handleRestartServerRequest(requestId, reason) {
1193
+ const lifecycleReason = normalizeClientRestartRpcReason(reason);
1194
+ const payload = {
1195
+ status: "restart_requested",
1196
+ clientId: this.clientId,
1197
+ };
1198
+ if (reason && reason.trim().length > 0) {
1199
+ payload.reason = reason;
1200
+ }
1201
+ payload.requestId = requestId;
1202
+ this.sessionLogger.warn({ reason: lifecycleReason }, "Restart requested via websocket");
1203
+ this.emit({
1204
+ type: "status",
1205
+ payload,
1206
+ });
1207
+ this.emitLifecycleIntent({
1208
+ type: "restart",
1209
+ clientId: this.clientId,
1210
+ requestId,
1211
+ reason: lifecycleReason,
1212
+ });
1213
+ }
1214
+ async handleShutdownServerRequest(requestId) {
1215
+ const reason = CLIENT_SHUTDOWN_RPC_REASON;
1216
+ this.sessionLogger.warn({ reason }, "Shutdown requested via websocket");
1217
+ this.emit({
1218
+ type: "status",
1219
+ payload: {
1220
+ status: "shutdown_requested",
1221
+ clientId: this.clientId,
1222
+ requestId,
1223
+ },
1224
+ });
1225
+ this.emitLifecycleIntent({
1226
+ type: "shutdown",
1227
+ clientId: this.clientId,
1228
+ requestId,
1229
+ reason,
1230
+ });
1231
+ }
1232
+ emitLifecycleIntent(intent) {
1233
+ if (!this.onLifecycleIntent) {
1234
+ return;
1235
+ }
1236
+ try {
1237
+ this.onLifecycleIntent(intent);
1238
+ }
1239
+ catch (error) {
1240
+ this.sessionLogger.error({ err: error, intent }, "Lifecycle intent handler failed");
1241
+ }
1242
+ }
1243
+ async handleDeleteAgentRequest(agentId, requestId) {
1244
+ this.sessionLogger.info({ agentId }, `Deleting agent ${agentId} from registry`);
1245
+ const knownWorkspaceId = this.agentManager.getAgent(agentId)?.workspaceId ??
1246
+ (await this.agentStorage.get(agentId))?.workspaceId ??
1247
+ null;
1248
+ // File-backed storage still needs an early delete fence before closeAgent().
1249
+ beginAgentDeleteIfSupported(this.agentStorage, agentId);
1250
+ try {
1251
+ await closeAgentCommand({ agentManager: this.agentManager }, agentId);
1252
+ }
1253
+ catch (error) {
1254
+ this.sessionLogger.warn({ err: error, agentId }, `Failed to close agent ${agentId} during delete`);
1255
+ }
1256
+ // Drain queued persistence from the just-closed agent before removing its
1257
+ // durable snapshot, otherwise an in-flight background write can recreate it.
1258
+ await this.agentManager.flush();
1259
+ try {
1260
+ await this.agentStorage.remove(agentId);
1261
+ await this.agentManager.deleteCommittedTimeline(agentId);
1262
+ }
1263
+ catch (error) {
1264
+ this.sessionLogger.error({ err: error, agentId }, `Failed to fully delete agent ${agentId}`);
1265
+ }
1266
+ this.emit({
1267
+ type: "agent_deleted",
1268
+ payload: {
1269
+ agentId,
1270
+ requestId,
1271
+ },
1272
+ });
1273
+ this.agentUpdates.removeAgent(agentId);
1274
+ if (knownWorkspaceId) {
1275
+ await this.emitWorkspaceUpdateForWorkspaceId(knownWorkspaceId);
1276
+ }
1277
+ }
1278
+ async handleArchiveAgentRequest(agentId, requestId) {
1279
+ this.sessionLogger.info({ agentId }, `Archiving agent ${agentId}`);
1280
+ const { archivedAt } = await this.archiveAgentForClose(agentId);
1281
+ this.emit({
1282
+ type: "agent_archived",
1283
+ payload: {
1284
+ agentId,
1285
+ archivedAt,
1286
+ requestId,
1287
+ },
1288
+ });
1289
+ }
1290
+ async archiveAgentForClose(agentId) {
1291
+ const { archivedAt, record: archivedRecord } = await archiveAgentCommand({
1292
+ agentManager: this.agentManager,
1293
+ agentStorage: this.agentStorage,
1294
+ logger: this.sessionLogger,
1295
+ }, agentId);
1296
+ if (this.agentUpdates.hasSubscription()) {
1297
+ const payload = await this.agentUpdates.emitStoredRecord(archivedRecord);
1298
+ if (payload.workspaceId) {
1299
+ await this.emitWorkspaceUpdateForWorkspaceId(payload.workspaceId);
1300
+ }
1301
+ }
1302
+ return { agentId, archivedAt };
1303
+ }
1304
+ async handleDetachAgentRequest(agentId, requestId) {
1305
+ this.sessionLogger.info({ agentId, requestId }, "Detaching agent from parent");
1306
+ try {
1307
+ const result = await detachAgentCommand({ agentManager: this.agentManager }, agentId);
1308
+ const affectedWorkspaceIds = new Set();
1309
+ if (!result.live) {
1310
+ const payload = await this.agentUpdates.emitStoredRecord(result.record);
1311
+ if (payload.workspaceId) {
1312
+ affectedWorkspaceIds.add(payload.workspaceId);
1313
+ }
1314
+ }
1315
+ else if (result.record.workspaceId) {
1316
+ affectedWorkspaceIds.add(result.record.workspaceId);
1317
+ }
1318
+ if (result.previousParentAgentId) {
1319
+ const rootWorkspaceId = await this.resolveDelegationRootWorkspaceId(result.previousParentAgentId);
1320
+ if (rootWorkspaceId) {
1321
+ affectedWorkspaceIds.add(rootWorkspaceId);
1322
+ }
1323
+ }
1324
+ await this.emitWorkspaceUpdatesForWorkspaceIds(affectedWorkspaceIds, {
1325
+ skipReconcile: true,
1326
+ });
1327
+ this.emit({
1328
+ type: "agent.detach.response",
1329
+ payload: {
1330
+ requestId,
1331
+ agentId,
1332
+ accepted: true,
1333
+ error: null,
1334
+ },
1335
+ });
1336
+ }
1337
+ catch (error) {
1338
+ const message = getErrorMessageOr(error, "Failed to detach agent");
1339
+ this.sessionLogger.error({ err: error, agentId, requestId }, "Failed to detach agent");
1340
+ this.emit({
1341
+ type: "agent.detach.response",
1342
+ payload: {
1343
+ requestId,
1344
+ agentId,
1345
+ accepted: false,
1346
+ error: message,
1347
+ },
1348
+ });
1349
+ }
1350
+ }
1351
+ async handleCloseItemsRequest(msg) {
1352
+ const archiveResults = await Promise.allSettled(msg.agentIds.map((agentId) => this.archiveAgentForClose(agentId)));
1353
+ const agents = [];
1354
+ for (let i = 0; i < archiveResults.length; i += 1) {
1355
+ const result = archiveResults[i];
1356
+ if (result.status === "fulfilled") {
1357
+ agents.push(result.value);
1358
+ }
1359
+ else {
1360
+ this.sessionLogger.warn({ err: result.reason, agentId: msg.agentIds[i], requestId: msg.requestId }, "Failed to archive agent during close_items batch");
1361
+ }
1362
+ }
1363
+ const terminals = [];
1364
+ for (const terminalId of msg.terminalIds) {
1365
+ try {
1366
+ terminals.push(this.terminalController.killTerminalForClose(terminalId));
1367
+ }
1368
+ catch (error) {
1369
+ this.sessionLogger.warn({ err: error, terminalId, requestId: msg.requestId }, "Failed to kill terminal during close_items batch");
1370
+ terminals.push({
1371
+ terminalId,
1372
+ success: false,
1373
+ });
1374
+ }
1375
+ }
1376
+ this.emit({
1377
+ type: "close_items_response",
1378
+ payload: {
1379
+ agents,
1380
+ terminals,
1381
+ requestId: msg.requestId,
1382
+ },
1383
+ });
1384
+ }
1385
+ async unarchiveAgentByHandle(handle) {
1386
+ const records = await this.agentStorage.list();
1387
+ const matched = records.find((record) => record.persistence?.provider === handle.provider &&
1388
+ record.persistence?.sessionId === handle.sessionId);
1389
+ if (!matched) {
1390
+ return;
1391
+ }
1392
+ await unarchiveAgentState(this.agentStorage, this.agentManager, matched.id);
1393
+ }
1394
+ async handleUpdateAgentRequest(agentId, name, labels, requestId) {
1395
+ this.sessionLogger.info({
1396
+ agentId,
1397
+ requestId,
1398
+ hasName: typeof name === "string",
1399
+ labelCount: labels ? Object.keys(labels).length : 0,
1400
+ }, "session: update_agent_request");
1401
+ try {
1402
+ const result = await updateAgentCommand({ agentManager: this.agentManager }, { agentId, name, labels });
1403
+ if (!result.accepted) {
1404
+ this.emit({
1405
+ type: "update_agent_response",
1406
+ payload: {
1407
+ requestId,
1408
+ agentId,
1409
+ accepted: false,
1410
+ error: result.error,
1411
+ },
1412
+ });
1413
+ return;
1414
+ }
1415
+ this.emit({
1416
+ type: "update_agent_response",
1417
+ payload: { requestId, agentId, accepted: true, error: null },
1418
+ });
1419
+ }
1420
+ catch (error) {
1421
+ this.sessionLogger.error({ err: error, agentId, requestId }, "session: update_agent_request error");
1422
+ this.emit({
1423
+ type: "activity_log",
1424
+ payload: {
1425
+ id: uuidv4(),
1426
+ timestamp: new Date(),
1427
+ type: "error",
1428
+ content: `Failed to update agent: ${getErrorMessage(error)}`,
1429
+ },
1430
+ });
1431
+ this.emit({
1432
+ type: "update_agent_response",
1433
+ payload: {
1434
+ requestId,
1435
+ agentId,
1436
+ accepted: false,
1437
+ error: getErrorMessageOr(error, "Failed to update agent"),
1438
+ },
1439
+ });
1440
+ }
1441
+ }
1442
+ async handleProjectRenameRequest(projectId, customName, requestId) {
1443
+ this.sessionLogger.info({ projectId, requestId, hasCustomName: typeof customName === "string" }, "session: project.rename.request");
1444
+ try {
1445
+ const existing = await this.projectRegistry.get(projectId);
1446
+ if (!existing) {
1447
+ this.emit({
1448
+ type: "project.rename.response",
1449
+ payload: {
1450
+ requestId,
1451
+ projectId,
1452
+ accepted: false,
1453
+ customName: null,
1454
+ error: "Project not found",
1455
+ },
1456
+ });
1457
+ return;
1458
+ }
1459
+ const trimmed = customName?.trim() ?? "";
1460
+ const nextCustomName = trimmed.length === 0 ? null : trimmed;
1461
+ await this.projectRegistry.upsert({
1462
+ ...existing,
1463
+ customName: nextCustomName,
1464
+ updatedAt: new Date().toISOString(),
1465
+ });
1466
+ this.emit({
1467
+ type: "project.rename.response",
1468
+ payload: {
1469
+ requestId,
1470
+ projectId,
1471
+ accepted: true,
1472
+ customName: nextCustomName,
1473
+ error: null,
1474
+ },
1475
+ });
1476
+ // Re-emit descriptors for every workspace under this project so the new
1477
+ // resolved name lands in the UI immediately.
1478
+ const workspaces = await this.workspaceRegistry.list();
1479
+ const affectedWorkspaceIds = workspaces
1480
+ .filter((workspace) => workspace.projectId === projectId)
1481
+ .map((workspace) => workspace.workspaceId);
1482
+ if (affectedWorkspaceIds.length > 0) {
1483
+ await this.emitWorkspaceUpdatesForWorkspaceIds(affectedWorkspaceIds, {
1484
+ skipReconcile: true,
1485
+ });
1486
+ }
1487
+ }
1488
+ catch (error) {
1489
+ this.sessionLogger.error({ err: error, projectId, requestId }, "session: project.rename.request error");
1490
+ this.emit({
1491
+ type: "activity_log",
1492
+ payload: {
1493
+ id: uuidv4(),
1494
+ timestamp: new Date(),
1495
+ type: "error",
1496
+ content: `Failed to rename project: ${getErrorMessage(error)}`,
1497
+ },
1498
+ });
1499
+ this.emit({
1500
+ type: "project.rename.response",
1501
+ payload: {
1502
+ requestId,
1503
+ projectId,
1504
+ accepted: false,
1505
+ customName: null,
1506
+ error: getErrorMessageOr(error, "Failed to rename project"),
1507
+ },
1508
+ });
1509
+ }
1510
+ }
1511
+ async handleProjectRemoveRequest(request) {
1512
+ const { projectId, requestId } = request;
1513
+ this.sessionLogger.info({ projectId, requestId }, "session: project.remove.request");
1514
+ try {
1515
+ const projectWorkspaces = (await this.workspaceRegistry.list()).filter((workspace) => workspace.projectId === projectId);
1516
+ const activeWorkspaceIds = projectWorkspaces
1517
+ .filter((workspace) => !workspace.archivedAt)
1518
+ .map((workspace) => workspace.workspaceId);
1519
+ if (activeWorkspaceIds.length > 0) {
1520
+ this.markWorkspaceArchiving(activeWorkspaceIds, new Date().toISOString());
1521
+ await this.emitWorkspaceUpdatesForWorkspaceIds(activeWorkspaceIds, {
1522
+ skipReconcile: true,
1523
+ });
1524
+ }
1525
+ const removedWorkspaceIds = [];
1526
+ try {
1527
+ for (const workspaceId of activeWorkspaceIds) {
1528
+ await archiveWorkspaceContents({
1529
+ agentManager: this.agentManager,
1530
+ agentStorage: this.agentStorage,
1531
+ killTerminalsForWorkspace: (id) => this.terminalController.killTerminalsForWorkspace(id),
1532
+ sessionLogger: this.sessionLogger,
1533
+ }, workspaceId);
1534
+ await this.archiveWorkspaceRecord(workspaceId);
1535
+ removedWorkspaceIds.push(workspaceId);
1536
+ }
1537
+ await this.projectRegistry.remove(projectId);
1538
+ }
1539
+ finally {
1540
+ if (activeWorkspaceIds.length > 0) {
1541
+ this.clearWorkspaceArchiving(activeWorkspaceIds);
1542
+ }
1543
+ }
1544
+ const updateIds = removedWorkspaceIds.length > 0
1545
+ ? removedWorkspaceIds
1546
+ : [projectWorkspaces[0]?.workspaceId ?? projectId];
1547
+ await this.emitWorkspaceUpdatesForWorkspaceIds(updateIds, {
1548
+ skipReconcile: true,
1549
+ removedProjectId: projectId,
1550
+ });
1551
+ this.emit({
1552
+ type: "project.remove.response",
1553
+ payload: {
1554
+ requestId,
1555
+ projectId,
1556
+ accepted: true,
1557
+ removedWorkspaceIds,
1558
+ error: null,
1559
+ },
1560
+ });
1561
+ }
1562
+ catch (error) {
1563
+ this.sessionLogger.error({ err: error, projectId, requestId }, "session: project.remove.request error");
1564
+ this.emit({
1565
+ type: "activity_log",
1566
+ payload: {
1567
+ id: uuidv4(),
1568
+ timestamp: new Date(),
1569
+ type: "error",
1570
+ content: `Failed to remove project: ${getErrorMessage(error)}`,
1571
+ },
1572
+ });
1573
+ this.emit({
1574
+ type: "project.remove.response",
1575
+ payload: {
1576
+ requestId,
1577
+ projectId,
1578
+ accepted: false,
1579
+ removedWorkspaceIds: [],
1580
+ error: getErrorMessageOr(error, "Failed to remove project"),
1581
+ },
1582
+ });
1583
+ }
1584
+ }
1585
+ async handleWorkspaceTitleSetRequest(workspaceId, title, requestId) {
1586
+ this.sessionLogger.info({ workspaceId, requestId, hasTitle: typeof title === "string" }, "session: workspace.title.set.request");
1587
+ try {
1588
+ const trimmed = title?.trim() ?? "";
1589
+ const nextTitle = trimmed.length === 0 ? null : trimmed;
1590
+ const updatedAt = new Date().toISOString();
1591
+ const updated = await this.workspaceRegistry.update(workspaceId, (existing) => ({
1592
+ ...existing,
1593
+ title: nextTitle,
1594
+ updatedAt,
1595
+ }));
1596
+ if (!updated) {
1597
+ this.emit({
1598
+ type: "workspace.title.set.response",
1599
+ payload: {
1600
+ requestId,
1601
+ workspaceId,
1602
+ accepted: false,
1603
+ title: null,
1604
+ error: "Workspace not found",
1605
+ },
1606
+ });
1607
+ return;
1608
+ }
1609
+ this.emit({
1610
+ type: "workspace.title.set.response",
1611
+ payload: {
1612
+ requestId,
1613
+ workspaceId,
1614
+ accepted: true,
1615
+ title: nextTitle,
1616
+ error: null,
1617
+ },
1618
+ });
1619
+ await this.emitWorkspaceUpdatesForWorkspaceIds([workspaceId], {
1620
+ skipReconcile: true,
1621
+ });
1622
+ }
1623
+ catch (error) {
1624
+ this.sessionLogger.error({ err: error, workspaceId, requestId }, "session: workspace.title.set.request error");
1625
+ this.emit({
1626
+ type: "activity_log",
1627
+ payload: {
1628
+ id: uuidv4(),
1629
+ timestamp: new Date(),
1630
+ type: "error",
1631
+ content: `Failed to set workspace title: ${getErrorMessage(error)}`,
1632
+ },
1633
+ });
1634
+ this.emit({
1635
+ type: "workspace.title.set.response",
1636
+ payload: {
1637
+ requestId,
1638
+ workspaceId,
1639
+ accepted: false,
1640
+ title: null,
1641
+ error: getErrorMessageOr(error, "Failed to set workspace title"),
1642
+ },
1643
+ });
1644
+ }
1645
+ }
1646
+ async handleWorkspacePinSetRequest(workspaceId, pinned, requestId) {
1647
+ const logContext = { workspaceId, pinned, requestId };
1648
+ this.sessionLogger.info(logContext, "session: workspace.pin.set.request");
1649
+ const emitResponse = (accepted, pinnedAt, error) => {
1650
+ this.emit({
1651
+ type: "workspace.pin.set.response",
1652
+ payload: { requestId, workspaceId, accepted, pinnedAt, error },
1653
+ });
1654
+ };
1655
+ try {
1656
+ const nextPinnedAt = pinned ? new Date().toISOString() : null;
1657
+ const updatedAt = new Date().toISOString();
1658
+ const updated = await this.workspaceRegistry.update(workspaceId, (existing) => ({
1659
+ ...existing,
1660
+ pinnedAt: nextPinnedAt,
1661
+ updatedAt,
1662
+ }));
1663
+ if (!updated) {
1664
+ emitResponse(false, null, "Workspace not found");
1665
+ return;
1666
+ }
1667
+ emitResponse(true, nextPinnedAt, null);
1668
+ await this.emitWorkspaceUpdatesForWorkspaceIds([workspaceId], { skipReconcile: true });
1669
+ }
1670
+ catch (error) {
1671
+ this.sessionLogger.error({ ...logContext, err: error }, "session: workspace.pin.set.request error");
1672
+ this.emit({
1673
+ type: "activity_log",
1674
+ payload: {
1675
+ id: uuidv4(),
1676
+ timestamp: new Date(),
1677
+ type: "error",
1678
+ content: `Failed to pin workspace: ${getErrorMessage(error)}`,
1679
+ },
1680
+ });
1681
+ emitResponse(false, null, getErrorMessageOr(error, "Failed to pin workspace"));
1682
+ }
1683
+ }
1684
+ /**
1685
+ * Handle text message to agent (with optional image attachments)
1686
+ */
1687
+ async handleSendAgentMessage(agentId, text, messageId, images, attachments, runOptions, options) {
1688
+ this.sessionLogger.info({
1689
+ agentId,
1690
+ textPreview: text.substring(0, 50),
1691
+ imageCount: images?.length ?? 0,
1692
+ attachmentCount: attachments?.length ?? 0,
1693
+ }, `Sending text to agent ${agentId}${images && images.length > 0 ? ` with ${images.length} image attachment(s)` : ""}${attachments && attachments.length > 0
1694
+ ? ` and ${attachments.length} structured attachment(s)`
1695
+ : ""}`);
1696
+ const promptText = options?.spokenInput ? wrapSpokenInput(text) : text;
1697
+ const prompt = buildAgentPrompt(promptText, images, attachments);
1698
+ try {
1699
+ await sendPromptToAgent({
1700
+ agentManager: this.agentManager,
1701
+ agentStorage: this.agentStorage,
1702
+ agentId,
1703
+ prompt,
1704
+ messageId,
1705
+ runOptions,
1706
+ logger: this.sessionLogger,
1707
+ });
1708
+ return { ok: true };
1709
+ }
1710
+ catch (error) {
1711
+ this.handleAgentRunError(agentId, error, "Failed to send agent message");
1712
+ return {
1713
+ ok: false,
1714
+ error: error instanceof Error ? error.message : String(error),
1715
+ };
1716
+ }
1717
+ }
1718
+ /**
1719
+ * Handle create agent request
1720
+ */
1721
+ async handleCreateAgentRequest(msg) {
1722
+ const { config, worktreeName, requestId, initialPrompt, clientMessageId, outputSchema, git, worktree, autoArchive, images, attachments, labels, env, } = msg;
1723
+ this.sessionLogger.info({ cwd: config.cwd, provider: config.provider, worktreeName }, `Creating agent in ${config.cwd} (${config.provider})${worktreeName ? ` with worktree ${worktreeName}` : ""}`);
1724
+ let createdWorktreeForCleanup = null;
1725
+ let createdAgentId = null;
1726
+ try {
1727
+ const trimmedPrompt = initialPrompt?.trim();
1728
+ const { provisionalTitle } = resolveCreateAgentTitles({
1729
+ configTitle: config.title,
1730
+ initialPrompt: trimmedPrompt,
1731
+ });
1732
+ const firstAgentContext = {
1733
+ ...(trimmedPrompt ? { prompt: trimmedPrompt } : {}),
1734
+ ...(attachments && attachments.length > 0 ? { attachments } : {}),
1735
+ };
1736
+ const workspacePromptTitle = resolveFirstAgentPromptTitle(firstAgentContext);
1737
+ const createdWorktree = await this.createAgentLifecycleDispatch.createWorktreeForRequest({
1738
+ cwd: config.cwd,
1739
+ target: worktree,
1740
+ firstAgentContext,
1741
+ hasLegacyGitOptions: Boolean(git),
1742
+ });
1743
+ createdWorktreeForCleanup = createdWorktree;
1744
+ const createAgentConfig = createdWorktree
1745
+ ? { ...config, cwd: createdWorktree.worktree.worktreePath }
1746
+ : config;
1747
+ const workspaceId = await this.workspaceProvisioning.resolveOrCreateWorkspaceIdForCreateAgent({
1748
+ createdWorktree,
1749
+ requestedWorkspaceId: msg.workspaceId,
1750
+ cwd: createAgentConfig.cwd,
1751
+ initialTitle: workspacePromptTitle,
1752
+ });
1753
+ const createdDirectoryWorkspaceForAgent = !createdWorktree && !msg.workspaceId;
1754
+ const { snapshot, liveSnapshot } = await createAgentCommand({
1755
+ agentManager: this.agentManager,
1756
+ agentStorage: this.agentStorage,
1757
+ logger: this.sessionLogger,
1758
+ byspaceHome: this.byspaceHome,
1759
+ worktreesRoot: this.worktreesRoot,
1760
+ providerSnapshotManager: this.providerSnapshotManager,
1761
+ }, {
1762
+ kind: "session",
1763
+ config: createAgentConfig,
1764
+ workspaceId,
1765
+ worktreeName,
1766
+ initialPrompt,
1767
+ clientMessageId,
1768
+ outputSchema,
1769
+ images,
1770
+ attachments,
1771
+ git,
1772
+ labels,
1773
+ env,
1774
+ provisionalTitle,
1775
+ firstAgentContext,
1776
+ buildSessionConfig: (sessionConfig, gitOptions, legacyWorktreeName, ctx) => this.buildAgentSessionConfig(sessionConfig, gitOptions, legacyWorktreeName, ctx),
1777
+ });
1778
+ createdAgentId = snapshot.id;
1779
+ await this.agentUpdates.forwardLiveAgent(snapshot);
1780
+ if (createdDirectoryWorkspaceForAgent && trimmedPrompt) {
1781
+ this.workspaceAutoName.scheduleForDirectory({
1782
+ workspaceId,
1783
+ cwd: createAgentConfig.cwd,
1784
+ firstAgentContext,
1785
+ }, { currentSelection: this.getFocusedAgentSelectionForCwd(createAgentConfig.cwd) });
1786
+ }
1787
+ this.createAgentLifecycleDispatch.registerAutoArchiveIfRequested({
1788
+ autoArchive,
1789
+ agentId: snapshot.id,
1790
+ createdWorktree,
1791
+ });
1792
+ if (requestId) {
1793
+ const agentPayload = await this.buildAgentPayload(liveSnapshot);
1794
+ this.emit({
1795
+ type: "status",
1796
+ payload: {
1797
+ status: "agent_created",
1798
+ agentId: liveSnapshot.id,
1799
+ requestId,
1800
+ agent: agentPayload,
1801
+ },
1802
+ });
1803
+ }
1804
+ this.sessionLogger.info({ agentId: snapshot.id, provider: snapshot.provider }, `Created agent ${snapshot.id} (${snapshot.provider})`);
1805
+ }
1806
+ catch (error) {
1807
+ await this.createAgentLifecycleDispatch.cleanupCreatedWorktreeAfterFailedAgentCreate({
1808
+ createdWorktree: createdWorktreeForCleanup,
1809
+ createdAgentId,
1810
+ });
1811
+ const wireError = toWorktreeWireError(error);
1812
+ this.sessionLogger.error({ err: error }, "Failed to create agent");
1813
+ if (requestId) {
1814
+ this.emit({
1815
+ type: "status",
1816
+ payload: {
1817
+ status: "agent_create_failed",
1818
+ requestId,
1819
+ error: wireError.message,
1820
+ errorCode: wireError.code,
1821
+ },
1822
+ });
1823
+ }
1824
+ this.emit({
1825
+ type: "activity_log",
1826
+ payload: {
1827
+ id: uuidv4(),
1828
+ timestamp: new Date(),
1829
+ type: "error",
1830
+ content: `Failed to create agent: ${wireError.message}`,
1831
+ },
1832
+ });
1833
+ }
1834
+ }
1835
+ async handleResumeAgentRequest(msg) {
1836
+ const { handle, overrides, requestId } = msg;
1837
+ if (!handle) {
1838
+ this.sessionLogger.warn("Resume request missing persistence handle");
1839
+ if (requestId) {
1840
+ this.emit({
1841
+ type: "rpc_error",
1842
+ payload: {
1843
+ requestId,
1844
+ requestType: msg.type,
1845
+ error: "Unable to resume agent: missing persistence handle",
1846
+ code: "agent_resume_failed",
1847
+ },
1848
+ });
1849
+ }
1850
+ this.emit({
1851
+ type: "activity_log",
1852
+ payload: {
1853
+ id: uuidv4(),
1854
+ timestamp: new Date(),
1855
+ type: "error",
1856
+ content: "Unable to resume agent: missing persistence handle",
1857
+ },
1858
+ });
1859
+ return;
1860
+ }
1861
+ this.sessionLogger.info({ sessionId: handle.sessionId, provider: handle.provider }, `Resuming agent ${handle.sessionId} (${handle.provider})`);
1862
+ try {
1863
+ await this.unarchiveAgentByHandle(handle);
1864
+ const snapshot = await this.agentManager.resumeAgentFromPersistence(handle, overrides);
1865
+ await unarchiveAgentState(this.agentStorage, this.agentManager, snapshot.id);
1866
+ await this.agentManager.hydrateTimelineFromProvider(snapshot.id);
1867
+ await this.agentUpdates.forwardLiveAgent(snapshot);
1868
+ const timelineSize = this.agentManager.getTimeline(snapshot.id).length;
1869
+ if (requestId) {
1870
+ const agentPayload = await this.buildAgentPayload(snapshot);
1871
+ this.emit({
1872
+ type: "status",
1873
+ payload: {
1874
+ status: "agent_resumed",
1875
+ agentId: snapshot.id,
1876
+ requestId,
1877
+ timelineSize,
1878
+ agent: agentPayload,
1879
+ },
1880
+ });
1881
+ }
1882
+ }
1883
+ catch (error) {
1884
+ const message = getErrorMessage(error);
1885
+ this.sessionLogger.error({ err: error }, "Failed to resume agent");
1886
+ if (requestId) {
1887
+ this.emit({
1888
+ type: "rpc_error",
1889
+ payload: {
1890
+ requestId,
1891
+ requestType: msg.type,
1892
+ error: message,
1893
+ code: "agent_resume_failed",
1894
+ },
1895
+ });
1896
+ }
1897
+ this.emit({
1898
+ type: "activity_log",
1899
+ payload: {
1900
+ id: uuidv4(),
1901
+ timestamp: new Date(),
1902
+ type: "error",
1903
+ content: `Failed to resume agent: ${message}`,
1904
+ },
1905
+ });
1906
+ }
1907
+ }
1908
+ async handleImportAgentRequest(msg) {
1909
+ const normalized = normalizeImportAgentRequest(msg);
1910
+ if ("error" in normalized) {
1911
+ this.emit({
1912
+ type: "status",
1913
+ payload: {
1914
+ status: "agent_create_failed",
1915
+ requestId: msg.requestId,
1916
+ error: normalized.error,
1917
+ },
1918
+ });
1919
+ return;
1920
+ }
1921
+ const { provider, providerHandleId, requestId } = normalized;
1922
+ this.sessionLogger.info({ providerHandleId, provider }, `Importing agent ${providerHandleId} (${provider})`);
1923
+ try {
1924
+ if (!normalized.cwd) {
1925
+ throw new Error("Import requires cwd from the selected provider session");
1926
+ }
1927
+ // An imported agent mints its own workspace; ownership is its workspaceId,
1928
+ // never an existing same-cwd workspace resolved by path.
1929
+ const workspace = await this.workspaceProvisioning.createWorkspaceForDirectory(normalized.cwd);
1930
+ const { snapshot, timelineSize } = await importProviderSession({
1931
+ request: normalized,
1932
+ workspaceId: workspace.workspaceId,
1933
+ agentManager: this.agentManager,
1934
+ agentStorage: this.agentStorage,
1935
+ logger: this.sessionLogger,
1936
+ });
1937
+ await this.registerWorkspaceForImportedAgent(workspace);
1938
+ const agentPayload = await this.buildAgentPayload(snapshot);
1939
+ this.emit({
1940
+ type: "status",
1941
+ payload: {
1942
+ status: "agent_resumed",
1943
+ agentId: snapshot.id,
1944
+ requestId,
1945
+ timelineSize,
1946
+ agent: agentPayload,
1947
+ },
1948
+ });
1949
+ }
1950
+ catch (error) {
1951
+ const message = error instanceof Error ? error.message : String(error);
1952
+ this.sessionLogger.error({ err: error }, "Failed to import agent");
1953
+ this.emit({
1954
+ type: "status",
1955
+ payload: {
1956
+ status: "agent_create_failed",
1957
+ requestId,
1958
+ error: message,
1959
+ },
1960
+ });
1961
+ this.emit({
1962
+ type: "activity_log",
1963
+ payload: {
1964
+ id: uuidv4(),
1965
+ timestamp: new Date(),
1966
+ type: "error",
1967
+ content: `Failed to import agent: ${message}`,
1968
+ },
1969
+ });
1970
+ }
1971
+ }
1972
+ async handleRefreshAgentRequest(msg) {
1973
+ const { agentId, requestId } = msg;
1974
+ this.sessionLogger.info({ agentId }, `Refreshing agent ${agentId} from persistence`);
1975
+ try {
1976
+ await unarchiveAgentState(this.agentStorage, this.agentManager, agentId);
1977
+ await this.unarchiveOwningWorkspaceForAgent(agentId);
1978
+ let snapshot;
1979
+ const existing = this.agentManager.getAgent(agentId);
1980
+ if (existing) {
1981
+ await this.interruptAgentIfRunning(agentId);
1982
+ snapshot = await this.agentManager.reloadAgentSession(agentId, undefined, {
1983
+ rehydrateFromDisk: true,
1984
+ });
1985
+ }
1986
+ else {
1987
+ const record = await this.agentStorage.get(agentId);
1988
+ if (!record) {
1989
+ throw new Error(`Agent not found: ${agentId}`);
1990
+ }
1991
+ const registeredProviderIds = this.providerSnapshotManager.listRegisteredProviderIds();
1992
+ if (!isStoredAgentProviderAvailable(record, registeredProviderIds)) {
1993
+ throw new Error(`Agent ${agentId} references unavailable provider '${record.provider}'`);
1994
+ }
1995
+ const handle = toAgentPersistenceHandle(registeredProviderIds, record.persistence);
1996
+ if (!handle) {
1997
+ throw new Error(`Agent ${agentId} cannot be refreshed because it lacks persistence`);
1998
+ }
1999
+ snapshot = await this.agentManager.resumeAgentFromPersistence(handle, buildConfigOverrides(record), agentId, extractTimestamps(record));
2000
+ }
2001
+ await this.agentManager.hydrateTimelineFromProvider(agentId, { broadcast: true });
2002
+ await this.agentUpdates.forwardLiveAgent(snapshot);
2003
+ const timelineSize = this.agentManager.getTimeline(agentId).length;
2004
+ if (requestId) {
2005
+ this.emit({
2006
+ type: "status",
2007
+ payload: {
2008
+ status: "agent_refreshed",
2009
+ agentId,
2010
+ requestId,
2011
+ timelineSize,
2012
+ },
2013
+ });
2014
+ }
2015
+ }
2016
+ catch (error) {
2017
+ const message = getErrorMessage(error);
2018
+ this.sessionLogger.error({ err: error, agentId }, `Failed to refresh agent ${agentId}`);
2019
+ if (requestId) {
2020
+ this.emit({
2021
+ type: "rpc_error",
2022
+ payload: {
2023
+ requestId,
2024
+ requestType: msg.type,
2025
+ error: message,
2026
+ code: error instanceof WorktreeRequestError ? error.code : "agent_refresh_failed",
2027
+ },
2028
+ });
2029
+ }
2030
+ this.emit({
2031
+ type: "activity_log",
2032
+ payload: {
2033
+ id: uuidv4(),
2034
+ timestamp: new Date(),
2035
+ type: "error",
2036
+ content: `Failed to refresh agent: ${message}`,
2037
+ },
2038
+ });
2039
+ }
2040
+ }
2041
+ async handleCancelAgentRequest(agentId, requestId) {
2042
+ this.sessionLogger.info({ agentId }, `Cancel request received for agent ${agentId}`);
2043
+ try {
2044
+ await cancelAgentRunCommand({ agentManager: this.agentManager, logger: this.sessionLogger }, agentId);
2045
+ if (requestId) {
2046
+ const agent = this.agentManager.getAgent(agentId);
2047
+ const payload = agent ? await this.buildAgentPayload(agent) : null;
2048
+ this.emit({
2049
+ type: "cancel_agent_response",
2050
+ payload: {
2051
+ requestId,
2052
+ agentId,
2053
+ agent: payload,
2054
+ error: null,
2055
+ },
2056
+ });
2057
+ }
2058
+ }
2059
+ catch (error) {
2060
+ if (requestId) {
2061
+ this.sessionLogger.error({ err: error, agentId }, `Failed to cancel running agent on request for agent ${agentId}`);
2062
+ const agent = this.agentManager.getAgent(agentId);
2063
+ const payload = agent ? await this.buildAgentPayload(agent) : null;
2064
+ this.emit({
2065
+ type: "cancel_agent_response",
2066
+ payload: {
2067
+ requestId,
2068
+ agentId,
2069
+ agent: payload,
2070
+ error: errorToFriendlyMessage(error),
2071
+ },
2072
+ });
2073
+ }
2074
+ else {
2075
+ this.handleAgentRunError(agentId, error, "Failed to cancel running agent on request");
2076
+ }
2077
+ }
2078
+ }
2079
+ async handleAgentRewindRequest(msg) {
2080
+ try {
2081
+ await this.agentManager.rewind(msg.agentId, msg.messageId, msg.mode);
2082
+ this.emit({
2083
+ type: "agent.rewind.response",
2084
+ payload: {
2085
+ requestId: msg.requestId,
2086
+ agentId: msg.agentId,
2087
+ ok: true,
2088
+ error: null,
2089
+ },
2090
+ });
2091
+ }
2092
+ catch (error) {
2093
+ this.emit({
2094
+ type: "agent.rewind.response",
2095
+ payload: {
2096
+ requestId: msg.requestId,
2097
+ agentId: msg.agentId,
2098
+ ok: false,
2099
+ error: error instanceof Error ? error.message : "Failed to rewind agent",
2100
+ },
2101
+ });
2102
+ }
2103
+ }
2104
+ async buildAgentSessionConfig(config, gitOptions, legacyWorktreeName, firstAgentContext) {
2105
+ return buildWorktreeAgentSessionConfig({
2106
+ byspaceHome: this.byspaceHome,
2107
+ worktreesRoot: this.worktreesRoot,
2108
+ sessionLogger: this.sessionLogger,
2109
+ workspaceGitService: this.workspaceGitService,
2110
+ createBySpaceWorktree: (input, serviceOptions) => this.createBySpaceWorktreeWorkflow(input, {
2111
+ ...serviceOptions,
2112
+ setupContinuation: {
2113
+ kind: "agent",
2114
+ terminalManager: this.terminalManager,
2115
+ appendTimelineItem: ({ agentId, item }) => appendTimelineItemIfAgentKnown({
2116
+ agentManager: this.agentManager,
2117
+ agentId,
2118
+ item,
2119
+ }),
2120
+ emitLiveTimelineItem: ({ agentId, item }) => emitLiveTimelineItemIfAgentKnown({
2121
+ agentManager: this.agentManager,
2122
+ agentId,
2123
+ item,
2124
+ }),
2125
+ logger: this.sessionLogger,
2126
+ },
2127
+ }),
2128
+ checkoutExistingBranch: (cwd, branch) => this.gitMutation.checkoutExistingBranch(cwd, branch),
2129
+ createBranchFromBase: (params) => this.gitMutation.createBranchFromBase(params),
2130
+ github: this.github,
2131
+ }, config, gitOptions, legacyWorktreeName, firstAgentContext);
2132
+ }
2133
+ isPathWithinRoot(rootPath, candidatePath) {
2134
+ const resolvedRoot = resolve(rootPath);
2135
+ const resolvedCandidate = resolve(candidatePath);
2136
+ if (resolvedCandidate === resolvedRoot) {
2137
+ return true;
2138
+ }
2139
+ return resolvedCandidate.startsWith(resolvedRoot + sep);
2140
+ }
2141
+ /**
2142
+ * Handle clearing agent attention flag
2143
+ */
2144
+ async handleClearAgentAttention(agentId, requestId) {
2145
+ const agentIds = Array.isArray(agentId) ? agentId : [agentId];
2146
+ try {
2147
+ await Promise.all(agentIds.map((id) => this.agentManager.clearAgentAttention(id)));
2148
+ if (requestId) {
2149
+ const agents = (await Promise.all(agentIds.map(async (id) => {
2150
+ const agent = this.agentManager.getAgent(id);
2151
+ return agent ? this.buildAgentPayload(agent) : null;
2152
+ }))).filter((payload) => payload !== null);
2153
+ this.emit({
2154
+ type: "clear_agent_attention_response",
2155
+ payload: {
2156
+ requestId,
2157
+ agentId,
2158
+ agents,
2159
+ },
2160
+ });
2161
+ }
2162
+ }
2163
+ catch (error) {
2164
+ this.sessionLogger.error({ err: error, agentIds }, "Failed to clear agent attention");
2165
+ // Don't throw - this is not critical
2166
+ }
2167
+ }
2168
+ /**
2169
+ * Handle client heartbeat for activity tracking
2170
+ */
2171
+ handleClientHeartbeat(msg) {
2172
+ const focusedTerminalId = msg.focusedTerminalId?.trim() || null;
2173
+ const appVisibilityChangedAt = msg.appVisibilityChangedAt
2174
+ ? new Date(msg.appVisibilityChangedAt)
2175
+ : new Date(msg.lastActivityAt);
2176
+ this.clientActivity = {
2177
+ deviceType: msg.deviceType,
2178
+ focusedAgentId: msg.focusedAgentId,
2179
+ focusedTerminalId,
2180
+ lastActivityAt: new Date(msg.lastActivityAt),
2181
+ appVisible: msg.appVisible,
2182
+ appVisibilityChangedAt,
2183
+ };
2184
+ if (msg.appVisible && focusedTerminalId) {
2185
+ void this.clearFocusedTerminalAttention(focusedTerminalId);
2186
+ }
2187
+ }
2188
+ async clearFocusedTerminalAttention(terminalId) {
2189
+ const terminalManager = this.terminalManager;
2190
+ if (!terminalManager) {
2191
+ return;
2192
+ }
2193
+ try {
2194
+ await terminalManager.clearTerminalAttention(terminalId);
2195
+ }
2196
+ catch (error) {
2197
+ this.sessionLogger.warn({ err: error, terminalId }, "Failed to clear terminal attention");
2198
+ }
2199
+ }
2200
+ /**
2201
+ * Handle push token registration
2202
+ */
2203
+ handleRegisterPushToken(token) {
2204
+ this.pushTokenStore.addToken(token);
2205
+ this.sessionLogger.info("Registered push token");
2206
+ }
2207
+ /**
2208
+ * Handle list commands request for an agent
2209
+ */
2210
+ async handleListCommandsRequest(msg) {
2211
+ const { agentId, requestId, draftConfig } = msg;
2212
+ this.sessionLogger.debug({ agentId, draftConfig }, `Handling list commands request for agent ${agentId}`);
2213
+ try {
2214
+ const agents = this.agentManager.listAgents();
2215
+ const agent = agents.find((a) => a.id === agentId);
2216
+ if (agent?.session?.listCommands) {
2217
+ const commands = await agent.session.listCommands();
2218
+ this.emit({
2219
+ type: "list_commands_response",
2220
+ payload: {
2221
+ agentId,
2222
+ commands,
2223
+ error: null,
2224
+ requestId,
2225
+ },
2226
+ });
2227
+ return;
2228
+ }
2229
+ if (!agent && draftConfig) {
2230
+ const sessionConfig = {
2231
+ provider: draftConfig.provider,
2232
+ cwd: expandTilde(draftConfig.cwd),
2233
+ ...(draftConfig.modeId ? { modeId: draftConfig.modeId } : {}),
2234
+ ...(draftConfig.model ? { model: draftConfig.model } : {}),
2235
+ ...(draftConfig.thinkingOptionId
2236
+ ? { thinkingOptionId: draftConfig.thinkingOptionId }
2237
+ : {}),
2238
+ };
2239
+ const commands = await this.agentManager.listDraftCommands(sessionConfig);
2240
+ this.emit({
2241
+ type: "list_commands_response",
2242
+ payload: {
2243
+ agentId,
2244
+ commands,
2245
+ error: null,
2246
+ requestId,
2247
+ },
2248
+ });
2249
+ return;
2250
+ }
2251
+ this.emit({
2252
+ type: "list_commands_response",
2253
+ payload: {
2254
+ agentId,
2255
+ commands: [],
2256
+ error: agent ? `Agent does not support listing commands` : `Agent not found: ${agentId}`,
2257
+ requestId,
2258
+ },
2259
+ });
2260
+ }
2261
+ catch (error) {
2262
+ this.sessionLogger.error({ err: error, agentId, draftConfig }, "Failed to list commands");
2263
+ this.emit({
2264
+ type: "list_commands_response",
2265
+ payload: {
2266
+ agentId,
2267
+ commands: [],
2268
+ error: getErrorMessage(error),
2269
+ requestId,
2270
+ },
2271
+ });
2272
+ }
2273
+ }
2274
+ /**
2275
+ * Handle agent permission response from user
2276
+ */
2277
+ async handleAgentPermissionResponse(agentId, requestId, response) {
2278
+ try {
2279
+ await respondToAgentPermission({
2280
+ agentManager: this.agentManager,
2281
+ agentId,
2282
+ requestId,
2283
+ response,
2284
+ logger: this.sessionLogger,
2285
+ });
2286
+ }
2287
+ catch (error) {
2288
+ this.sessionLogger.error({ err: error, agentId, requestId }, "Failed to respond to permission");
2289
+ this.emit({
2290
+ type: "activity_log",
2291
+ payload: {
2292
+ id: uuidv4(),
2293
+ timestamp: new Date(),
2294
+ type: "error",
2295
+ content: `Failed to respond to permission: ${getErrorMessage(error)}`,
2296
+ },
2297
+ });
2298
+ throw error;
2299
+ }
2300
+ }
2301
+ async handleDirectorySuggestionsRequest(msg) {
2302
+ const { query, limit, requestId, cwd, includeFiles, includeDirectories, matchMode } = msg;
2303
+ try {
2304
+ const workspaceCwd = cwd?.trim();
2305
+ const searchesWorkspace = Boolean(workspaceCwd);
2306
+ const entries = await searchDirectoryEntries({
2307
+ root: workspaceCwd ? expandTilde(workspaceCwd) : (process.env.HOME ?? homedir()),
2308
+ query,
2309
+ pathFormat: searchesWorkspace ? "relative" : "absolute",
2310
+ pathQueryPolicy: searchesWorkspace ? "slashes" : "rooted",
2311
+ blankQueryBehavior: searchesWorkspace ? "children" : "none",
2312
+ rootAliases: searchesWorkspace ? [] : ["~"],
2313
+ traversableHiddenDirectoryNames: searchesWorkspace
2314
+ ? WORKSPACE_SEARCH_HIDDEN_DIRECTORIES
2315
+ : [],
2316
+ confidentResultScanThreshold: searchesWorkspace ? undefined : 5000,
2317
+ includeFiles,
2318
+ includeDirectories,
2319
+ matchMode,
2320
+ limit,
2321
+ });
2322
+ const directories = entries
2323
+ .filter((entry) => entry.kind === "directory")
2324
+ .map((entry) => entry.path);
2325
+ this.emit({
2326
+ type: "directory_suggestions_response",
2327
+ payload: {
2328
+ directories,
2329
+ entries,
2330
+ error: null,
2331
+ requestId,
2332
+ },
2333
+ });
2334
+ }
2335
+ catch (error) {
2336
+ this.emit({
2337
+ type: "directory_suggestions_response",
2338
+ payload: {
2339
+ directories: [],
2340
+ entries: [],
2341
+ error: error instanceof Error ? error.message : String(error),
2342
+ requestId,
2343
+ },
2344
+ });
2345
+ }
2346
+ }
2347
+ async handleBySpaceWorktreeListRequest(msg) {
2348
+ return handleWorktreeListRequest({
2349
+ emit: (message) => this.emit(message),
2350
+ byspaceHome: this.byspaceHome,
2351
+ workspaceGitService: this.workspaceGitService,
2352
+ }, msg);
2353
+ }
2354
+ async handleBySpaceWorktreeArchiveRequest(msg) {
2355
+ return handleWorktreeArchiveRequest({
2356
+ byspaceHome: this.byspaceHome,
2357
+ byspaceWorktreesBaseRoot: this.worktreesRoot,
2358
+ github: this.github,
2359
+ workspaceGitService: this.workspaceGitService,
2360
+ agentManager: this.agentManager,
2361
+ agentStorage: this.agentStorage,
2362
+ findWorkspaceIdForCwd: (cwd) => this.findWorkspaceIdForCwd(cwd),
2363
+ listActiveWorkspaces: () => this.listActiveWorkspaceRefs(),
2364
+ archiveWorkspaceRecord: (workspaceId) => this.archiveWorkspaceRecord(workspaceId),
2365
+ emit: (message) => this.emit(message),
2366
+ emitWorkspaceUpdatesForWorkspaceIds: (workspaceIds) => this.emitWorkspaceUpdatesForWorkspaceIds(workspaceIds),
2367
+ markWorkspaceArchiving: (workspaceIds, archivingAt) => this.markWorkspaceArchiving(workspaceIds, archivingAt),
2368
+ clearWorkspaceArchiving: (workspaceIds) => this.clearWorkspaceArchiving(workspaceIds),
2369
+ killTerminalsForWorkspace: (workspaceId) => this.terminalController.killTerminalsForWorkspace(workspaceId),
2370
+ sessionLogger: this.sessionLogger,
2371
+ }, msg);
2372
+ }
2373
+ async listTerminalActivityContributions() {
2374
+ const terminalManager = this.terminalManager;
2375
+ if (!terminalManager) {
2376
+ return [];
2377
+ }
2378
+ const directories = terminalManager.listDirectories();
2379
+ const terminalsByDirectory = await Promise.all(directories.map((cwd) => terminalManager.getTerminals(cwd)));
2380
+ return terminalsByDirectory.flat().map((session) => {
2381
+ const contribution = {
2382
+ cwd: session.cwd,
2383
+ activity: session.getActivity(),
2384
+ };
2385
+ if (session.workspaceId) {
2386
+ contribution.workspaceId = session.workspaceId;
2387
+ }
2388
+ return contribution;
2389
+ });
2390
+ }
2391
+ /**
2392
+ * Build the current agent list payload (live + persisted), optionally filtered by labels.
2393
+ */
2394
+ async listAgentPayloads(filter) {
2395
+ const includeArchived = filter?.includeArchived === true;
2396
+ const labelEntries = filter?.labels ? Object.entries(filter.labels) : [];
2397
+ // Get live agents with session modes
2398
+ const agentSnapshots = this.agentManager.listAgents();
2399
+ const liveAgents = await Promise.all(agentSnapshots.map((agent) => this.buildAgentPayload(agent)));
2400
+ // Add persisted agents that have not been lazily initialized yet
2401
+ // (excluding internal agents which are for ephemeral system tasks)
2402
+ const registryRecords = await this.agentStorage.list();
2403
+ const liveIds = new Set(agentSnapshots.map((a) => a.id));
2404
+ const registeredProviderIds = new Set(this.providerSnapshotManager.listRegisteredProviderIds());
2405
+ const persistedAgents = registryRecords
2406
+ .filter((record) => !liveIds.has(record.id) && !record.internal)
2407
+ // Keep raw-record filters ahead of projection; seeded homes can carry thousands of archived agents.
2408
+ .filter((record) => includeArchived || !record.archivedAt)
2409
+ .filter((record) => labelEntries.every(([key, value]) => record.labels?.[key] === value))
2410
+ .filter((record) => filter?.includeUnavailablePersisted === true ||
2411
+ isStoredAgentProviderAvailable(record, registeredProviderIds))
2412
+ .map((record) => this.buildStoredAgentPayload(record, registeredProviderIds));
2413
+ let agents = [...liveAgents, ...persistedAgents];
2414
+ agents = agents.filter((agent) => this.isProviderVisibleToClient(agent.provider));
2415
+ if (!includeArchived) {
2416
+ agents = agents.filter((agent) => !agent.archivedAt);
2417
+ }
2418
+ // Filter by labels if filter provided
2419
+ if (labelEntries.length > 0) {
2420
+ agents = agents.filter((agent) => labelEntries.every(([key, value]) => agent.labels[key] === value));
2421
+ }
2422
+ return agents;
2423
+ }
2424
+ async resolveAgentIdentifier(identifier) {
2425
+ const trimmed = identifier.trim();
2426
+ if (!trimmed) {
2427
+ return { ok: false, error: "Agent identifier cannot be empty" };
2428
+ }
2429
+ const stored = await this.agentStorage.list();
2430
+ const storedRecords = stored.filter((record) => !record.internal);
2431
+ const knownIds = new Set();
2432
+ for (const record of storedRecords) {
2433
+ knownIds.add(record.id);
2434
+ }
2435
+ for (const agent of this.agentManager.listAgents()) {
2436
+ knownIds.add(agent.id);
2437
+ }
2438
+ if (knownIds.has(trimmed)) {
2439
+ return { ok: true, agentId: trimmed };
2440
+ }
2441
+ const prefixMatches = Array.from(knownIds).filter((id) => id.startsWith(trimmed));
2442
+ if (prefixMatches.length === 1) {
2443
+ return { ok: true, agentId: prefixMatches[0] };
2444
+ }
2445
+ if (prefixMatches.length > 1) {
2446
+ return {
2447
+ ok: false,
2448
+ error: `Agent identifier "${trimmed}" is ambiguous (${prefixMatches
2449
+ .slice(0, 5)
2450
+ .map((id) => id.slice(0, 8))
2451
+ .join(", ")}${prefixMatches.length > 5 ? ", …" : ""})`,
2452
+ };
2453
+ }
2454
+ const titleMatches = storedRecords.filter((record) => record.title === trimmed);
2455
+ if (titleMatches.length === 1) {
2456
+ return { ok: true, agentId: titleMatches[0].id };
2457
+ }
2458
+ if (titleMatches.length > 1) {
2459
+ return {
2460
+ ok: false,
2461
+ error: `Agent title "${trimmed}" is ambiguous (${titleMatches
2462
+ .slice(0, 5)
2463
+ .map((r) => r.id.slice(0, 8))
2464
+ .join(", ")}${titleMatches.length > 5 ? ", …" : ""})`,
2465
+ };
2466
+ }
2467
+ return { ok: false, error: `Agent not found: ${trimmed}` };
2468
+ }
2469
+ async getAgentPayloadById(agentId) {
2470
+ const live = this.agentManager.getAgent(agentId);
2471
+ if (live) {
2472
+ const payload = await this.buildAgentPayload(live);
2473
+ return this.isProviderVisibleToClient(payload.provider) ? payload : null;
2474
+ }
2475
+ const record = await this.agentStorage.get(agentId);
2476
+ if (!record || record.internal) {
2477
+ return null;
2478
+ }
2479
+ const payload = this.buildStoredAgentPayload(record);
2480
+ return this.isProviderVisibleToClient(payload.provider) ? payload : null;
2481
+ }
2482
+ async resolveDelegationRootWorkspaceId(agentId) {
2483
+ const seen = new Set();
2484
+ let currentAgentId = agentId;
2485
+ while (true) {
2486
+ if (seen.has(currentAgentId)) {
2487
+ return null;
2488
+ }
2489
+ seen.add(currentAgentId);
2490
+ const live = this.agentManager.getAgent(currentAgentId);
2491
+ const source = live ?? (await this.agentStorage.get(currentAgentId));
2492
+ if (!source) {
2493
+ return null;
2494
+ }
2495
+ if ("archivedAt" in source && source.archivedAt) {
2496
+ return null;
2497
+ }
2498
+ const parentAgentId = getParentAgentIdFromLabels(source.labels);
2499
+ if (!parentAgentId) {
2500
+ return source.workspaceId ?? null;
2501
+ }
2502
+ currentAgentId = parentAgentId;
2503
+ }
2504
+ }
2505
+ async buildActiveProjectPlacementsByWorkspaceId() {
2506
+ const [persistedWorkspaces, persistedProjects] = await Promise.all([
2507
+ this.workspaceRegistry.list(),
2508
+ this.projectRegistry.list(),
2509
+ ]);
2510
+ const activeProjects = new Map(persistedProjects
2511
+ .filter((project) => !project.archivedAt)
2512
+ .map((project) => [project.projectId, project]));
2513
+ const placementsByWorkspaceId = new Map();
2514
+ const pairs = persistedWorkspaces.flatMap((workspace) => {
2515
+ if (workspace.archivedAt)
2516
+ return [];
2517
+ const project = activeProjects.get(workspace.projectId);
2518
+ if (!project)
2519
+ return [];
2520
+ return [{ workspace, project }];
2521
+ });
2522
+ const placements = await Promise.all(pairs.map(({ workspace, project }) => this.buildProjectPlacementForWorkspace(workspace, project)));
2523
+ for (let i = 0; i < pairs.length; i += 1) {
2524
+ placementsByWorkspaceId.set(pairs[i].workspace.workspaceId, placements[i]);
2525
+ }
2526
+ return placementsByWorkspaceId;
2527
+ }
2528
+ async collectFetchAgentsEntries(params) {
2529
+ const { candidates, limit, getPlacement, filter } = params;
2530
+ const matchedEntries = [];
2531
+ const batchSize = 25;
2532
+ for (let start = 0; start < candidates.length && matchedEntries.length <= limit; start += batchSize) {
2533
+ const batch = candidates.slice(start, start + batchSize);
2534
+ const batchEntries = await Promise.all(batch.map(async (agent) => {
2535
+ const project = await getPlacement(agent.workspaceId);
2536
+ return project ? { agent, project } : null;
2537
+ }));
2538
+ for (const entry of batchEntries) {
2539
+ if (!entry) {
2540
+ continue;
2541
+ }
2542
+ if (!matchesAgentUpdatesFilter({
2543
+ agent: entry.agent,
2544
+ project: entry.project,
2545
+ filter,
2546
+ })) {
2547
+ continue;
2548
+ }
2549
+ matchedEntries.push(entry);
2550
+ if (matchedEntries.length > limit) {
2551
+ break;
2552
+ }
2553
+ }
2554
+ }
2555
+ return matchedEntries;
2556
+ }
2557
+ async listFetchAgentsEntries(request) {
2558
+ const filter = request.type === "fetch_agent_history_request" &&
2559
+ request.filter?.includeArchived === undefined
2560
+ ? { ...request.filter, includeArchived: true }
2561
+ : request.filter;
2562
+ const scope = request.type === "fetch_agents_request" ? request.scope : undefined;
2563
+ const sort = this.agentsPager.normalizeSort(request.sort);
2564
+ let agents = await this.listAgentPayloads({
2565
+ labels: filter?.labels,
2566
+ includeArchived: filter?.includeArchived,
2567
+ includeUnavailablePersisted: request.type === "fetch_agent_history_request",
2568
+ });
2569
+ const activePlacementsByWorkspaceId = scope === "active" ? await this.buildActiveProjectPlacementsByWorkspaceId() : null;
2570
+ if (activePlacementsByWorkspaceId) {
2571
+ agents = agents.filter((agent) => !agent.archivedAt &&
2572
+ agent.workspaceId != null &&
2573
+ activePlacementsByWorkspaceId.has(agent.workspaceId));
2574
+ }
2575
+ const placementByWorkspaceId = new Map();
2576
+ const getPlacement = (workspaceId) => {
2577
+ if (!workspaceId) {
2578
+ return Promise.resolve(null);
2579
+ }
2580
+ if (activePlacementsByWorkspaceId) {
2581
+ return Promise.resolve(activePlacementsByWorkspaceId.get(workspaceId) ?? null);
2582
+ }
2583
+ const existing = placementByWorkspaceId.get(workspaceId);
2584
+ if (existing) {
2585
+ return existing;
2586
+ }
2587
+ const placementPromise = this.buildProjectPlacementForWorkspaceId(workspaceId);
2588
+ placementByWorkspaceId.set(workspaceId, placementPromise);
2589
+ return placementPromise;
2590
+ };
2591
+ let candidates = [...agents];
2592
+ candidates.sort((left, right) => this.agentsPager.compare(left, right, sort));
2593
+ const cursorToken = request.page?.cursor;
2594
+ if (cursorToken) {
2595
+ const cursor = this.decodeAgentCursor(cursorToken, sort);
2596
+ candidates = candidates.filter((agent) => this.agentsPager.compareWithCursor(agent, cursor, sort) > 0);
2597
+ }
2598
+ const limit = request.page?.limit ?? 200;
2599
+ const matchedEntries = await this.collectFetchAgentsEntries({
2600
+ candidates,
2601
+ limit,
2602
+ getPlacement,
2603
+ filter,
2604
+ });
2605
+ const pagedEntries = matchedEntries.slice(0, limit);
2606
+ const hasMore = matchedEntries.length > limit;
2607
+ const nextCursor = hasMore && pagedEntries.length > 0
2608
+ ? this.agentsPager.encode(pagedEntries[pagedEntries.length - 1].agent, sort)
2609
+ : null;
2610
+ return {
2611
+ entries: pagedEntries,
2612
+ pageInfo: {
2613
+ nextCursor,
2614
+ prevCursor: request.page?.cursor ?? null,
2615
+ hasMore,
2616
+ },
2617
+ };
2618
+ }
2619
+ decodeAgentCursor(token, sort) {
2620
+ try {
2621
+ return this.agentsPager.decode(token, sort);
2622
+ }
2623
+ catch (error) {
2624
+ if (error instanceof CursorError) {
2625
+ throw new SessionRequestError("invalid_cursor", error.message);
2626
+ }
2627
+ throw error;
2628
+ }
2629
+ }
2630
+ async describeWorkspaceRecord(workspace, projectRecord) {
2631
+ const resolvedProjectRecord = projectRecord ?? (await this.projectRegistry.get(workspace.projectId));
2632
+ let diffStat = null;
2633
+ const snapshot = this.workspaceGitService.peekSnapshot(workspace.cwd);
2634
+ if (snapshot?.git.diffStat) {
2635
+ diffStat = snapshot.git.diffStat;
2636
+ }
2637
+ return {
2638
+ id: workspace.workspaceId,
2639
+ projectId: workspace.projectId,
2640
+ projectDisplayName: resolvedProjectRecord
2641
+ ? resolveProjectDisplayName(resolvedProjectRecord)
2642
+ : workspace.projectId,
2643
+ projectCustomName: resolvedProjectRecord?.customName ?? null,
2644
+ projectRootPath: resolvedProjectRecord?.rootPath ?? workspace.cwd,
2645
+ workspaceDirectory: workspace.cwd,
2646
+ projectKind: (resolvedProjectRecord?.kind ?? "directory") === "git" ? "git" : "non_git",
2647
+ workspaceKind: workspace.kind,
2648
+ name: resolveWorkspaceDisplayName(workspace),
2649
+ title: workspace.title,
2650
+ pinnedAt: workspace.pinnedAt,
2651
+ archivingAt: null,
2652
+ status: "done",
2653
+ statusEnteredAt: null,
2654
+ activityAt: null,
2655
+ diffStat,
2656
+ scripts: this.buildWorkspaceScriptPayloadSnapshot(workspace.workspaceId, workspace.cwd),
2657
+ ...(resolvedProjectRecord
2658
+ ? {
2659
+ project: await this.buildProjectPlacementForWorkspace(workspace, resolvedProjectRecord),
2660
+ }
2661
+ : {}),
2662
+ };
2663
+ }
2664
+ buildWorkspaceGitRuntimePayload(snapshot) {
2665
+ if (!snapshot.git.isGit) {
2666
+ return null;
2667
+ }
2668
+ return {
2669
+ currentBranch: snapshot.git.currentBranch,
2670
+ remoteUrl: snapshot.git.remoteUrl,
2671
+ isBySpaceOwnedWorktree: snapshot.git.isBySpaceOwnedWorktree,
2672
+ isDirty: snapshot.git.isDirty,
2673
+ aheadBehind: snapshot.git.aheadBehind,
2674
+ aheadOfOrigin: snapshot.git.aheadOfOrigin,
2675
+ behindOfOrigin: snapshot.git.behindOfOrigin,
2676
+ };
2677
+ }
2678
+ buildWorkspaceGitHubRuntimePayload(snapshot) {
2679
+ return {
2680
+ featuresEnabled: snapshot.github.featuresEnabled,
2681
+ pullRequest: snapshot.github.pullRequest,
2682
+ error: snapshot.github.error,
2683
+ };
2684
+ }
2685
+ async describeWorkspaceRecordWithGitData(workspace, projectRecord) {
2686
+ const base = await this.describeWorkspaceRecord(workspace, projectRecord);
2687
+ const snapshot = this.workspaceGitService.peekSnapshot(workspace.cwd);
2688
+ if (!snapshot) {
2689
+ return base;
2690
+ }
2691
+ const checkout = checkoutLiteFromGitSnapshot(workspace.cwd, snapshot.git);
2692
+ const displayName = deriveWorkspaceDisplayName({ cwd: workspace.cwd, checkout });
2693
+ return {
2694
+ ...base,
2695
+ name: resolveWorkspaceName({ title: workspace.title, derivedDisplayName: displayName }),
2696
+ diffStat: snapshot.git.diffStat ?? null,
2697
+ gitRuntime: this.buildWorkspaceGitRuntimePayload(snapshot) ?? undefined,
2698
+ githubRuntime: this.buildWorkspaceGitHubRuntimePayload(snapshot),
2699
+ };
2700
+ }
2701
+ async describeCreatedWorktreeWorkspace(result) {
2702
+ const projectRecord = await this.projectRegistry.get(result.workspace.projectId);
2703
+ return {
2704
+ id: result.workspace.workspaceId,
2705
+ projectId: result.workspace.projectId,
2706
+ projectDisplayName: projectRecord
2707
+ ? resolveProjectDisplayName(projectRecord)
2708
+ : result.workspace.projectId,
2709
+ projectCustomName: projectRecord?.customName ?? null,
2710
+ projectRootPath: projectRecord?.rootPath ?? result.repoRoot,
2711
+ workspaceDirectory: result.workspace.cwd,
2712
+ projectKind: "git",
2713
+ workspaceKind: result.workspace.kind,
2714
+ name: resolveWorkspaceName({
2715
+ title: result.workspace.title,
2716
+ derivedDisplayName: result.worktree.branchName || result.workspace.displayName,
2717
+ }),
2718
+ title: result.workspace.title,
2719
+ pinnedAt: result.workspace.pinnedAt,
2720
+ archivingAt: null,
2721
+ status: "done",
2722
+ statusEnteredAt: result.workspace.createdAt,
2723
+ activityAt: null,
2724
+ diffStat: { additions: 0, deletions: 0 },
2725
+ scripts: [],
2726
+ gitRuntime: {
2727
+ currentBranch: result.worktree.branchName || null,
2728
+ remoteUrl: null,
2729
+ isBySpaceOwnedWorktree: true,
2730
+ isDirty: false,
2731
+ aheadBehind: null,
2732
+ aheadOfOrigin: null,
2733
+ behindOfOrigin: null,
2734
+ },
2735
+ githubRuntime: null,
2736
+ };
2737
+ }
2738
+ async buildWorkspaceDescriptor(input) {
2739
+ if (input.includeGitData && input.projectRecord?.kind === "git") {
2740
+ return this.describeWorkspaceRecordWithGitData(input.workspace, input.projectRecord);
2741
+ }
2742
+ return this.describeWorkspaceRecord(input.workspace, input.projectRecord);
2743
+ }
2744
+ markWorkspaceArchiving(workspaceIds, archivingAt) {
2745
+ this.workspaceDirectory.markArchiving(workspaceIds, archivingAt);
2746
+ }
2747
+ clearWorkspaceArchiving(workspaceIds) {
2748
+ this.workspaceDirectory.clearArchiving(workspaceIds);
2749
+ }
2750
+ async buildWorkspaceDescriptorMap(options) {
2751
+ return this.workspaceDirectory.buildDescriptorMap(options);
2752
+ }
2753
+ // external path→workspace adapter, not ownership. Used by archive-by-path flows
2754
+ // where the request carries a worktree path (unique to one workspace) rather
2755
+ // than a workspaceId. This is a directory lookup for an archive target, not a
2756
+ // status/ownership attribution.
2757
+ async findWorkspaceIdForCwd(cwd) {
2758
+ const workspaces = await this.workspaceRegistry.list();
2759
+ return resolveWorkspaceIdForPath(cwd, workspaces);
2760
+ }
2761
+ matchesWorkspaceFilter(input) {
2762
+ return this.workspaceDirectory.matchesFilter(input);
2763
+ }
2764
+ async listFetchWorkspacesEntries(request) {
2765
+ try {
2766
+ return await this.workspaceDirectory.listFetchEntries(request);
2767
+ }
2768
+ catch (error) {
2769
+ if (error instanceof CursorError) {
2770
+ throw new SessionRequestError("invalid_cursor", error.message);
2771
+ }
2772
+ throw error;
2773
+ }
2774
+ }
2775
+ bufferOrEmitWorkspaceUpdate(subscription, payload) {
2776
+ if (subscription.isBootstrapping) {
2777
+ const workspaceId = payload.kind === "upsert" ? payload.workspace.id : payload.id;
2778
+ subscription.pendingUpdatesByWorkspaceId.set(workspaceId, payload);
2779
+ return;
2780
+ }
2781
+ const workspaceId = payload.kind === "upsert" ? payload.workspace.id : payload.id;
2782
+ subscription.lastEmittedByWorkspaceId.set(workspaceId, payload);
2783
+ this.emit({
2784
+ type: "workspace_update",
2785
+ payload,
2786
+ });
2787
+ }
2788
+ flushBootstrappedWorkspaceUpdates(options) {
2789
+ const subscription = this.workspaceUpdatesSubscription;
2790
+ if (!subscription || !subscription.isBootstrapping) {
2791
+ return;
2792
+ }
2793
+ subscription.isBootstrapping = false;
2794
+ const pending = Array.from(subscription.pendingUpdatesByWorkspaceId.values());
2795
+ subscription.pendingUpdatesByWorkspaceId.clear();
2796
+ for (const payload of pending) {
2797
+ if (payload.kind === "upsert") {
2798
+ const snapshot = options?.snapshotByWorkspaceId?.get(payload.workspace.id);
2799
+ const updateActivityAtMs = payload.workspace.activityAt
2800
+ ? Date.parse(payload.workspace.activityAt)
2801
+ : null;
2802
+ const shouldEmit = shouldEmitPendingBootstrapUpdate({
2803
+ snapshot: snapshot
2804
+ ? {
2805
+ status: snapshot.status,
2806
+ statusEnteredAt: snapshot.statusEnteredAt,
2807
+ activityAtMs: snapshot.activityAtMs,
2808
+ }
2809
+ : null,
2810
+ update: {
2811
+ status: payload.workspace.status,
2812
+ statusEnteredAt: payload.workspace.statusEnteredAt ?? null,
2813
+ activityAtMs: Number.isNaN(updateActivityAtMs) ? null : updateActivityAtMs,
2814
+ },
2815
+ });
2816
+ if (!shouldEmit) {
2817
+ continue;
2818
+ }
2819
+ }
2820
+ this.emit({
2821
+ type: "workspace_update",
2822
+ payload,
2823
+ });
2824
+ }
2825
+ }
2826
+ buildProjectDescriptor(project) {
2827
+ return {
2828
+ projectId: project.projectId,
2829
+ projectDisplayName: resolveProjectDisplayName(project),
2830
+ projectCustomName: project.customName ?? null,
2831
+ projectRootPath: project.rootPath,
2832
+ projectKind: project.kind,
2833
+ };
2834
+ }
2835
+ async unarchiveOwningWorkspaceForAgent(agentId) {
2836
+ const record = await this.agentStorage.get(agentId);
2837
+ if (!record?.workspaceId) {
2838
+ return;
2839
+ }
2840
+ const workspace = await this.workspaceRegistry.get(record.workspaceId);
2841
+ if (!workspace?.archivedAt) {
2842
+ return;
2843
+ }
2844
+ const directoryExists = await this.filesystem.isDirectory(record.cwd).catch(() => false);
2845
+ if (!directoryExists) {
2846
+ if (workspace.kind !== "worktree" || !workspace.branch) {
2847
+ return;
2848
+ }
2849
+ // Recreate the worktree directory from its kept branch BEFORE clearing
2850
+ // archivedAt — the reconciler re-archives workspaces whose directory is
2851
+ // missing, so the record must point at a real directory first.
2852
+ await this.recreateOwningWorktreeForRestore(workspace, workspace.branch);
2853
+ }
2854
+ await this.workspaceProvisioning.ensureWorkspaceRecordUnarchived(workspace);
2855
+ await this.emitWorkspaceUpdatesForWorkspaceIds([workspace.workspaceId]);
2856
+ }
2857
+ async recreateOwningWorktreeForRestore(workspace, branch) {
2858
+ const project = await this.projectRegistry.get(workspace.projectId);
2859
+ if (!project) {
2860
+ throw new WorktreeRequestError({
2861
+ code: "unknown",
2862
+ message: `Project ${workspace.projectId} not found for workspace ${workspace.workspaceId}`,
2863
+ });
2864
+ }
2865
+ const projectRootExists = await this.filesystem
2866
+ .isDirectory(project.rootPath)
2867
+ .catch(() => false);
2868
+ if (!projectRootExists) {
2869
+ throw new WorktreeRequestError({
2870
+ code: "unknown",
2871
+ message: `Project root is missing for ${workspace.projectId}: ${project.rootPath}`,
2872
+ });
2873
+ }
2874
+ // Archiving through the default path (scope "workspace", worktreePath only)
2875
+ // resolves repoRoot=null, so deleteBySpaceWorktree's `git worktree remove`/
2876
+ // `prune` is skipped and the admin registration survives — pinning the
2877
+ // branch as "already checked out". Prune here frees any stale registration
2878
+ // whose working dir is missing (a no-op for live worktrees) so the recreate
2879
+ // below succeeds regardless of how the worktree was archived.
2880
+ try {
2881
+ await runGitCommand(["worktree", "prune"], { cwd: project.rootPath, timeout: 30000 });
2882
+ }
2883
+ catch {
2884
+ // not critical; git will prune lazily
2885
+ }
2886
+ let result;
2887
+ try {
2888
+ result = await createWorktree({
2889
+ cwd: project.rootPath,
2890
+ worktreeSlug: basename(workspace.cwd),
2891
+ source: { kind: "checkout-branch", branchName: branch },
2892
+ runSetup: false,
2893
+ byspaceHome: this.byspaceHome,
2894
+ worktreesRoot: this.worktreesRoot,
2895
+ });
2896
+ }
2897
+ catch (error) {
2898
+ throw toWorktreeRequestError(error);
2899
+ }
2900
+ if (normalize(result.worktreePath) !== normalize(workspace.cwd)) {
2901
+ throw new WorktreeRequestError({
2902
+ code: "unknown",
2903
+ message: `Recreated worktree diverged from ${workspace.cwd}: ${result.worktreePath}`,
2904
+ });
2905
+ }
2906
+ }
2907
+ async createBySpaceWorktree(input, options) {
2908
+ const result = await createBySpaceWorktree(input, {
2909
+ github: this.github,
2910
+ ...(options?.resolveDefaultBranch
2911
+ ? { resolveDefaultBranch: options.resolveDefaultBranch }
2912
+ : {}),
2913
+ projectRegistry: this.projectRegistry,
2914
+ workspaceRegistry: this.workspaceRegistry,
2915
+ workspaceGitService: this.workspaceGitService,
2916
+ });
2917
+ void Promise.all([
2918
+ this.gitMutation.notifyGitMutation(input.cwd, "create-worktree"),
2919
+ this.gitMutation.notifyGitMutation(result.worktree.worktreePath, "create-worktree"),
2920
+ ]).catch((error) => {
2921
+ this.sessionLogger.warn({ err: error, cwd: input.cwd, worktreePath: result.worktree.worktreePath }, "Failed to warm git snapshots after creating worktree");
2922
+ });
2923
+ return result;
2924
+ }
2925
+ async listActiveWorkspaceRefs() {
2926
+ const workspaces = await this.workspaceRegistry.list();
2927
+ return workspaces
2928
+ .filter((workspace) => !workspace.archivedAt)
2929
+ .map((workspace) => ({
2930
+ workspaceId: workspace.workspaceId,
2931
+ cwd: workspace.cwd,
2932
+ kind: workspace.kind,
2933
+ }));
2934
+ }
2935
+ async archiveWorkspaceRecord(workspaceId, archivedAt) {
2936
+ const archiveTimestamp = archivedAt ?? new Date().toISOString();
2937
+ const existingWorkspace = await archivePersistedWorkspaceRecord({
2938
+ workspaceId,
2939
+ archivedAt: archiveTimestamp,
2940
+ workspaceRegistry: this.workspaceRegistry,
2941
+ });
2942
+ if (!existingWorkspace) {
2943
+ this.workspaceGitObserver.removeForWorkspaceId(workspaceId);
2944
+ return;
2945
+ }
2946
+ if (!existingWorkspace.archivedAt) {
2947
+ const activeSiblings = (await this.workspaceRegistry.list()).filter((workspace) => workspace.projectId === existingWorkspace.projectId && !workspace.archivedAt);
2948
+ this.sessionLogger.info({
2949
+ workspaceId,
2950
+ workspaceCwd: existingWorkspace.cwd,
2951
+ projectId: existingWorkspace.projectId,
2952
+ projectArchived: activeSiblings.length === 0,
2953
+ archivedAt: archiveTimestamp,
2954
+ }, "Workspace archived");
2955
+ }
2956
+ await this.teardownArchivedWorkspace({
2957
+ workspaceId: existingWorkspace.workspaceId,
2958
+ cwd: existingWorkspace.cwd,
2959
+ });
2960
+ }
2961
+ // Git watch and subscription state is keyed by directory; the script runtime
2962
+ // store is keyed by the opaque workspace id. Each cleanup uses its own key so an
2963
+ // opaque id is never resolved as a filesystem path.
2964
+ async teardownArchivedWorkspace(input) {
2965
+ this.workspaceGitObserver.removeForCwd(input.cwd);
2966
+ this.scriptRuntimeStore?.removeForWorkspace(input.workspaceId);
2967
+ }
2968
+ async reconcileAndEmitWorkspaceUpdates() {
2969
+ if (!this.workspaceUpdatesSubscription) {
2970
+ return;
2971
+ }
2972
+ try {
2973
+ const changedWorkspaceIds = await this.reconcileActiveWorkspaceRecords();
2974
+ if (changedWorkspaceIds.size === 0) {
2975
+ return;
2976
+ }
2977
+ await this.emitWorkspaceUpdatesForWorkspaceIds(changedWorkspaceIds, {
2978
+ skipReconcile: true,
2979
+ });
2980
+ }
2981
+ catch (error) {
2982
+ this.sessionLogger.error({ err: error }, "Background workspace reconciliation failed");
2983
+ }
2984
+ }
2985
+ async reconcileActiveWorkspaceRecords() {
2986
+ const service = new WorkspaceReconciliationService({
2987
+ projectRegistry: this.projectRegistry,
2988
+ workspaceRegistry: this.workspaceRegistry,
2989
+ logger: this.sessionLogger,
2990
+ workspaceGitService: this.workspaceGitService,
2991
+ });
2992
+ const result = await service.runOnce();
2993
+ const changedWorkspaceIds = new Set();
2994
+ const changedProjectIds = new Set();
2995
+ await Promise.all(result.changesApplied.map(async (change) => {
2996
+ switch (change.kind) {
2997
+ case "workspace_archived":
2998
+ await this.teardownArchivedWorkspace({
2999
+ workspaceId: change.workspaceId,
3000
+ cwd: change.directory,
3001
+ });
3002
+ changedWorkspaceIds.add(change.workspaceId);
3003
+ break;
3004
+ case "workspace_updated":
3005
+ changedWorkspaceIds.add(change.workspaceId);
3006
+ break;
3007
+ case "project_archived":
3008
+ case "project_updated":
3009
+ changedProjectIds.add(change.projectId);
3010
+ break;
3011
+ }
3012
+ }));
3013
+ if (changedProjectIds.size > 0) {
3014
+ for (const workspace of await this.workspaceRegistry.list()) {
3015
+ if (changedProjectIds.has(workspace.projectId)) {
3016
+ changedWorkspaceIds.add(workspace.workspaceId);
3017
+ }
3018
+ }
3019
+ }
3020
+ return changedWorkspaceIds;
3021
+ }
3022
+ async emitWorkspaceUpdatesForWorkspaceIds(workspaceIds, options) {
3023
+ const subscription = this.workspaceUpdatesSubscription;
3024
+ if (!subscription) {
3025
+ return;
3026
+ }
3027
+ const uniqueWorkspaceIds = new Set(Array.from(workspaceIds));
3028
+ if (uniqueWorkspaceIds.size === 0) {
3029
+ return;
3030
+ }
3031
+ const descriptorsByWorkspaceId = await this.buildWorkspaceDescriptorMap({
3032
+ workspaceIds: uniqueWorkspaceIds,
3033
+ includeGitData: true,
3034
+ });
3035
+ for (const workspaceId of uniqueWorkspaceIds) {
3036
+ const workspace = descriptorsByWorkspaceId.get(workspaceId);
3037
+ const nextWorkspace = workspace && this.matchesWorkspaceFilter({ workspace, filter: subscription.filter })
3038
+ ? workspace
3039
+ : null;
3040
+ if (options?.dedupeGitState &&
3041
+ this.workspaceGitObserver.shouldSkipUpdate(workspaceId, nextWorkspace)) {
3042
+ continue;
3043
+ }
3044
+ this.workspaceGitObserver.recordDescriptorState(workspaceId, nextWorkspace);
3045
+ if (!nextWorkspace) {
3046
+ subscription.lastEmittedByWorkspaceId.delete(workspaceId);
3047
+ this.bufferOrEmitWorkspaceUpdate(subscription, await this.buildWorkspaceRemoveUpdatePayload(workspaceId, options?.removedProjectId));
3048
+ continue;
3049
+ }
3050
+ const nextPayload = {
3051
+ kind: "upsert",
3052
+ workspace: nextWorkspace,
3053
+ };
3054
+ const lastEmitted = subscription.lastEmittedByWorkspaceId.get(workspaceId);
3055
+ if (lastEmitted &&
3056
+ lastEmitted.kind === "upsert" &&
3057
+ equal(lastEmitted.workspace, nextWorkspace)) {
3058
+ continue;
3059
+ }
3060
+ this.bufferOrEmitWorkspaceUpdate(subscription, nextPayload);
3061
+ }
3062
+ if (!options?.skipReconcile) {
3063
+ void this.reconcileAndEmitWorkspaceUpdates();
3064
+ }
3065
+ }
3066
+ async buildWorkspaceRemoveUpdatePayload(workspaceId, removedProjectId) {
3067
+ if (removedProjectId) {
3068
+ return { kind: "remove", id: workspaceId, removedProjectId };
3069
+ }
3070
+ return {
3071
+ kind: "remove",
3072
+ id: workspaceId,
3073
+ ...(await this.resolveProjectWithoutActiveWorkspacesForArchivedWorkspace(workspaceId)),
3074
+ };
3075
+ }
3076
+ // When a workspace is archived its project may have no active workspaces left.
3077
+ // Resolve that project parent so the `remove` update can carry it, keeping the
3078
+ // sidebar in sync without a full re-hydration.
3079
+ async resolveProjectWithoutActiveWorkspacesForArchivedWorkspace(workspaceId) {
3080
+ const archivedWorkspace = await this.workspaceRegistry.get(workspaceId);
3081
+ if (!archivedWorkspace) {
3082
+ return null;
3083
+ }
3084
+ const projectWithoutActiveWorkspaces = (await this.workspaceDirectory.listEmptyProjects()).find((project) => project.projectId === archivedWorkspace.projectId);
3085
+ return projectWithoutActiveWorkspaces ? { emptyProject: projectWithoutActiveWorkspaces } : null;
3086
+ }
3087
+ async emitWorkspaceUpdateForTerminalContribution(event) {
3088
+ // A terminal's activity contributes only to the workspace it carries. A
3089
+ // terminal with no workspaceId attributes to nothing — status is per-id.
3090
+ if (!event.workspaceId) {
3091
+ return;
3092
+ }
3093
+ await this.emitWorkspaceUpdatesForWorkspaceIds([event.workspaceId], {
3094
+ skipReconcile: true,
3095
+ });
3096
+ }
3097
+ // A git fact (branch, diff, dirty, PR) changed at `cwd`. Every workspace whose
3098
+ // OWN cwd is this folder re-derives its git facts from that folder (id → cwd)
3099
+ // and emits its own per-id descriptor. This is a deliberate same-folder fan,
3100
+ // not a cwd → id ownership lookup: git never resolves which workspace owns a
3101
+ // path. See `workspaceIdsOnCheckout`.
3102
+ async emitWorkspaceUpdateForCwd(cwd, options) {
3103
+ const workspaceIds = workspaceIdsOnCheckout(await this.workspaceRegistry.list(), cwd);
3104
+ if (workspaceIds.length === 0) {
3105
+ return;
3106
+ }
3107
+ await this.emitWorkspaceUpdatesForWorkspaceIds(workspaceIds, options);
3108
+ }
3109
+ async handleFetchAgents(request) {
3110
+ const requestedSubscriptionId = request.subscribe?.subscriptionId?.trim();
3111
+ const subscriptionId = resolveSubscriptionId(request.subscribe, requestedSubscriptionId);
3112
+ try {
3113
+ if (subscriptionId) {
3114
+ this.agentUpdates.beginSubscription({
3115
+ subscriptionId,
3116
+ filter: request.filter,
3117
+ });
3118
+ }
3119
+ const payload = await this.listFetchAgentsEntries(request);
3120
+ const snapshotUpdatedAtByAgentId = new Map();
3121
+ for (const entry of payload.entries) {
3122
+ const parsedUpdatedAt = Date.parse(entry.agent.updatedAt);
3123
+ if (!Number.isNaN(parsedUpdatedAt)) {
3124
+ snapshotUpdatedAtByAgentId.set(entry.agent.id, parsedUpdatedAt);
3125
+ }
3126
+ }
3127
+ this.emit({
3128
+ type: "fetch_agents_response",
3129
+ payload: {
3130
+ requestId: request.requestId,
3131
+ ...(subscriptionId ? { subscriptionId } : {}),
3132
+ ...payload,
3133
+ },
3134
+ });
3135
+ if (subscriptionId) {
3136
+ this.agentUpdates.flushBootstrapped(subscriptionId, { snapshotUpdatedAtByAgentId });
3137
+ }
3138
+ }
3139
+ catch (error) {
3140
+ if (subscriptionId) {
3141
+ this.agentUpdates.clearSubscription(subscriptionId);
3142
+ }
3143
+ const code = error instanceof SessionRequestError ? error.code : "fetch_agents_failed";
3144
+ const message = error instanceof Error ? error.message : "Failed to fetch agents";
3145
+ this.sessionLogger.error({ err: error }, "Failed to handle fetch_agents_request");
3146
+ this.emit({
3147
+ type: "rpc_error",
3148
+ payload: {
3149
+ requestId: request.requestId,
3150
+ requestType: request.type,
3151
+ error: message,
3152
+ code,
3153
+ },
3154
+ });
3155
+ }
3156
+ }
3157
+ async handleFetchAgentHistory(request) {
3158
+ try {
3159
+ const payload = await this.listFetchAgentsEntries(request);
3160
+ this.emit({
3161
+ type: "fetch_agent_history_response",
3162
+ payload: {
3163
+ requestId: request.requestId,
3164
+ ...payload,
3165
+ },
3166
+ });
3167
+ }
3168
+ catch (error) {
3169
+ const code = error instanceof SessionRequestError ? error.code : "fetch_agent_history_failed";
3170
+ const message = error instanceof Error ? error.message : "Failed to fetch agent history";
3171
+ this.sessionLogger.error({ err: error }, "Failed to handle fetch_agent_history_request");
3172
+ this.emit({
3173
+ type: "rpc_error",
3174
+ payload: {
3175
+ requestId: request.requestId,
3176
+ requestType: request.type,
3177
+ error: message,
3178
+ code,
3179
+ },
3180
+ });
3181
+ }
3182
+ }
3183
+ async handleFetchRecentProviderSessions(request) {
3184
+ try {
3185
+ const result = await listImportableProviderSessions({
3186
+ request,
3187
+ agentManager: this.agentManager,
3188
+ agentStorage: this.agentStorage,
3189
+ providerSnapshotManager: this.providerSnapshotManager,
3190
+ });
3191
+ this.emit({
3192
+ type: "fetch_recent_provider_sessions_response",
3193
+ payload: {
3194
+ requestId: request.requestId,
3195
+ entries: result.entries,
3196
+ ...(result.filteredAlreadyImportedCount > 0
3197
+ ? { filteredAlreadyImportedCount: result.filteredAlreadyImportedCount }
3198
+ : {}),
3199
+ },
3200
+ });
3201
+ }
3202
+ catch (error) {
3203
+ const code = error instanceof ImportSessionsRequestError
3204
+ ? error.code
3205
+ : "fetch_recent_provider_sessions_failed";
3206
+ const message = error instanceof Error ? error.message : "Failed to fetch recent provider sessions";
3207
+ this.sessionLogger.error({ err: error }, "Failed to handle fetch_recent_provider_sessions_request");
3208
+ this.emit({
3209
+ type: "rpc_error",
3210
+ payload: {
3211
+ requestId: request.requestId,
3212
+ requestType: request.type,
3213
+ error: message,
3214
+ code,
3215
+ },
3216
+ });
3217
+ }
3218
+ }
3219
+ async handleFetchWorkspacesRequest(request) {
3220
+ const requestedSubscriptionId = request.subscribe?.subscriptionId?.trim();
3221
+ const subscriptionId = resolveSubscriptionId(request.subscribe, requestedSubscriptionId);
3222
+ try {
3223
+ this.sessionLogger.debug({
3224
+ requestId: request.requestId,
3225
+ subscribeRequested: Boolean(request.subscribe),
3226
+ filter: request.filter ?? null,
3227
+ sort: request.sort ?? null,
3228
+ page: request.page ?? null,
3229
+ }, "fetch_workspaces_request_received");
3230
+ if (subscriptionId) {
3231
+ this.workspaceUpdatesSubscription = {
3232
+ subscriptionId,
3233
+ filter: request.filter,
3234
+ isBootstrapping: true,
3235
+ pendingUpdatesByWorkspaceId: new Map(),
3236
+ lastEmittedByWorkspaceId: new Map(),
3237
+ };
3238
+ }
3239
+ const payload = await this.listFetchWorkspacesEntries(request);
3240
+ this.workspaceGitObserver.syncObservers(payload.entries);
3241
+ this.sessionLogger.debug({
3242
+ requestId: request.requestId,
3243
+ subscriptionId,
3244
+ pageInfo: payload.pageInfo,
3245
+ payload: summarizeFetchWorkspacesEntries(payload.entries),
3246
+ }, "fetch_workspaces_response_ready");
3247
+ const snapshot = this.buildBootstrapSnapshot(payload.entries);
3248
+ this.emit({
3249
+ type: "fetch_workspaces_response",
3250
+ payload: {
3251
+ requestId: request.requestId,
3252
+ ...(subscriptionId ? { subscriptionId } : {}),
3253
+ ...payload,
3254
+ },
3255
+ });
3256
+ if (subscriptionId && this.workspaceUpdatesSubscription?.subscriptionId === subscriptionId) {
3257
+ this.flushBootstrappedWorkspaceUpdates(snapshot);
3258
+ void this.reconcileAndEmitWorkspaceUpdates();
3259
+ }
3260
+ }
3261
+ catch (error) {
3262
+ if (subscriptionId && this.workspaceUpdatesSubscription?.subscriptionId === subscriptionId) {
3263
+ this.workspaceUpdatesSubscription = null;
3264
+ }
3265
+ const code = error instanceof SessionRequestError ? error.code : "fetch_workspaces_failed";
3266
+ const message = error instanceof Error ? error.message : "Failed to fetch workspaces";
3267
+ this.sessionLogger.error({ err: error }, "Failed to handle fetch_workspaces_request");
3268
+ this.emit({
3269
+ type: "rpc_error",
3270
+ payload: {
3271
+ requestId: request.requestId,
3272
+ requestType: request.type,
3273
+ error: message,
3274
+ code,
3275
+ },
3276
+ });
3277
+ }
3278
+ }
3279
+ // Build the bootstrap snapshot used by `flushBootstrappedWorkspaceUpdates`
3280
+ // to decide which pending updates to drop. Captures the status,
3281
+ // statusEnteredAt, and activityAt (parsed to ms) for each workspace entry
3282
+ // so a status-only change (e.g. the unmask case), a statusEnteredAt-only
3283
+ // change (e.g. a fresh unmask time), AND a fresher activity all still
3284
+ // ship to the client.
3285
+ buildBootstrapSnapshot(entries) {
3286
+ const snapshotByWorkspaceId = new Map();
3287
+ for (const entry of entries) {
3288
+ const parsedActivity = entry.activityAt ? Date.parse(entry.activityAt) : null;
3289
+ snapshotByWorkspaceId.set(entry.id, {
3290
+ status: entry.status,
3291
+ statusEnteredAt: entry.statusEnteredAt ?? null,
3292
+ activityAtMs: Number.isNaN(parsedActivity) ? null : parsedActivity,
3293
+ });
3294
+ }
3295
+ return { snapshotByWorkspaceId };
3296
+ }
3297
+ async registerWorkspaceForImportedAgent(workspace) {
3298
+ try {
3299
+ await this.syncWorkspaceGitObserverForWorkspace(workspace);
3300
+ await this.describeWorkspaceRecord(workspace);
3301
+ await this.emitWorkspaceUpdateForWorkspaceId(workspace.workspaceId);
3302
+ }
3303
+ catch (error) {
3304
+ this.sessionLogger.warn({ err: error, workspaceId: workspace.workspaceId, cwd: workspace.cwd }, "Failed to register workspace for imported agent");
3305
+ }
3306
+ }
3307
+ async handleWorkspaceCreateRequest(request) {
3308
+ try {
3309
+ if (request.source.kind === "directory") {
3310
+ await this.handleWorkspaceCreateLocal(request);
3311
+ return;
3312
+ }
3313
+ await this.handleWorkspaceCreateWorktree(request);
3314
+ }
3315
+ catch (error) {
3316
+ const message = error instanceof Error ? error.message : "Failed to create workspace";
3317
+ this.sessionLogger.error({ err: error, sourceKind: request.source.kind, requestId: request.requestId }, "Failed to create workspace");
3318
+ this.emit({
3319
+ type: "workspace.create.response",
3320
+ payload: {
3321
+ requestId: request.requestId,
3322
+ workspace: null,
3323
+ setupTerminalId: null,
3324
+ error: message,
3325
+ },
3326
+ });
3327
+ }
3328
+ }
3329
+ async handleWorkspaceCreateLocal(request) {
3330
+ if (request.source.kind !== "directory") {
3331
+ return;
3332
+ }
3333
+ const cwd = expandTilde(request.source.path);
3334
+ const directoryExists = await this.filesystem.isDirectory(cwd).catch(() => false);
3335
+ if (!directoryExists) {
3336
+ this.emit({
3337
+ type: "workspace.create.response",
3338
+ payload: {
3339
+ requestId: request.requestId,
3340
+ workspace: null,
3341
+ setupTerminalId: null,
3342
+ error: `Directory not found: ${cwd}`,
3343
+ errorCode: "directory_not_found",
3344
+ },
3345
+ });
3346
+ return;
3347
+ }
3348
+ const explicitTitle = request.title?.trim() || null;
3349
+ const promptTitle = resolveFirstAgentPromptTitle(request.firstAgentContext);
3350
+ const workspace = await createLocalCheckoutWorkspace({ cwd, title: explicitTitle ?? promptTitle }, {
3351
+ projectRegistry: this.projectRegistry,
3352
+ workspaceRegistry: this.workspaceRegistry,
3353
+ workspaceGitService: this.workspaceGitService,
3354
+ });
3355
+ await this.syncWorkspaceGitObserverForWorkspace(workspace);
3356
+ const descriptor = await this.describeWorkspaceRecord(workspace);
3357
+ this.emit({
3358
+ type: "workspace.create.response",
3359
+ payload: {
3360
+ requestId: request.requestId,
3361
+ workspace: descriptor,
3362
+ setupTerminalId: null,
3363
+ error: null,
3364
+ },
3365
+ });
3366
+ await this.emitWorkspaceUpdateForWorkspaceId(workspace.workspaceId);
3367
+ void this.workspaceGitService
3368
+ .getSnapshot(workspace.cwd, { force: true, includeGitHub: true, reason: "open_project" })
3369
+ .catch((error) => {
3370
+ this.sessionLogger.warn({ err: error, cwd: workspace.cwd }, "Background snapshot refresh failed after workspace.create");
3371
+ });
3372
+ if (request.firstAgentContext) {
3373
+ const firstAgentContext = request.firstAgentContext;
3374
+ this.workspaceAutoName.scheduleForDirectory({
3375
+ workspaceId: workspace.workspaceId,
3376
+ cwd: workspace.cwd,
3377
+ firstAgentContext,
3378
+ }, { currentSelection: this.getFocusedAgentSelectionForCwd(workspace.cwd) });
3379
+ }
3380
+ }
3381
+ async handleWorkspaceCreateWorktree(request) {
3382
+ if (request.source.kind !== "worktree") {
3383
+ return;
3384
+ }
3385
+ const source = request.source;
3386
+ if (!source.cwd && !source.projectId) {
3387
+ this.emit({
3388
+ type: "workspace.create.response",
3389
+ payload: {
3390
+ requestId: request.requestId,
3391
+ workspace: null,
3392
+ setupTerminalId: null,
3393
+ error: "cwd or projectId is required for a worktree-backed workspace",
3394
+ errorCode: "source_required",
3395
+ },
3396
+ });
3397
+ return;
3398
+ }
3399
+ const sourceCwd = await this.resolveWorktreeSourceCwd({
3400
+ cwd: source.cwd,
3401
+ projectId: source.projectId,
3402
+ });
3403
+ const result = await this.createBySpaceWorktreeWorkflow({
3404
+ cwd: sourceCwd,
3405
+ projectId: source.projectId,
3406
+ worktreeSlug: source.worktreeSlug,
3407
+ action: source.action,
3408
+ refName: source.refName,
3409
+ githubPrNumber: source.githubPrNumber,
3410
+ firstAgentContext: request.firstAgentContext,
3411
+ }, source.baseBranch
3412
+ ? { resolveDefaultBranch: async () => source.baseBranch }
3413
+ : undefined);
3414
+ if (request.title?.trim()) {
3415
+ await this.workspaceRegistry.upsert({
3416
+ ...result.workspace,
3417
+ title: request.title.trim(),
3418
+ updatedAt: new Date().toISOString(),
3419
+ });
3420
+ result.workspace.title = request.title.trim();
3421
+ }
3422
+ const descriptor = await this.describeCreatedWorktreeWorkspace(result);
3423
+ this.emit({
3424
+ type: "workspace.create.response",
3425
+ payload: {
3426
+ requestId: request.requestId,
3427
+ workspace: descriptor,
3428
+ setupTerminalId: null,
3429
+ error: null,
3430
+ },
3431
+ });
3432
+ this.emit({
3433
+ type: "workspace_update",
3434
+ payload: { kind: "upsert", workspace: descriptor },
3435
+ });
3436
+ }
3437
+ async resolveWorktreeSourceCwd(input) {
3438
+ if (input.cwd) {
3439
+ return expandTilde(input.cwd);
3440
+ }
3441
+ const project = await this.projectRegistry.get(input.projectId);
3442
+ if (!project || project.archivedAt) {
3443
+ throw new Error(`Project not found: ${input.projectId}`);
3444
+ }
3445
+ return project.rootPath;
3446
+ }
3447
+ async handleOpenProjectRequest(request) {
3448
+ const requestedCwd = request.cwd;
3449
+ const cwd = expandTilde(requestedCwd);
3450
+ const directoryExists = await this.filesystem.isDirectory(cwd).catch(() => false);
3451
+ if (!directoryExists) {
3452
+ this.sessionLogger.info({ requestedCwd, resolvedCwd: cwd, reason: "directory_not_found" }, "Open project rejected");
3453
+ this.emit({
3454
+ type: "open_project_response",
3455
+ payload: {
3456
+ requestId: request.requestId,
3457
+ workspace: null,
3458
+ error: `Directory not found: ${cwd}`,
3459
+ errorCode: "directory_not_found",
3460
+ },
3461
+ });
3462
+ return;
3463
+ }
3464
+ try {
3465
+ const projectsBefore = new Map();
3466
+ for (const project of await this.projectRegistry.list()) {
3467
+ projectsBefore.set(project.projectId, project);
3468
+ }
3469
+ const workspacesBefore = new Map();
3470
+ for (const workspaceRecord of await this.workspaceRegistry.list()) {
3471
+ workspacesBefore.set(workspaceRecord.workspaceId, workspaceRecord);
3472
+ }
3473
+ const workspace = await this.workspaceProvisioning.findOrCreateWorkspaceForDirectory(cwd);
3474
+ const project = await this.projectRegistry.get(workspace.projectId);
3475
+ await this.syncWorkspaceGitObserverForWorkspace(workspace);
3476
+ const descriptor = await this.describeWorkspaceRecord(workspace);
3477
+ await this.emitWorkspaceUpdateForWorkspaceId(workspace.workspaceId);
3478
+ this.sessionLogger.info({
3479
+ requestedCwd,
3480
+ resolvedCwd: cwd,
3481
+ workspaceCwd: workspace.cwd,
3482
+ workspaceId: workspace.workspaceId,
3483
+ workspaceKind: workspace.kind,
3484
+ workspaceTransition: describeRegistryTransition(workspacesBefore.get(workspace.workspaceId) ?? null),
3485
+ projectId: workspace.projectId,
3486
+ projectKind: project?.kind ?? null,
3487
+ projectTransition: describeRegistryTransition(projectsBefore.get(workspace.projectId) ?? null),
3488
+ }, "Project opened");
3489
+ this.emit({
3490
+ type: "open_project_response",
3491
+ payload: {
3492
+ requestId: request.requestId,
3493
+ workspace: descriptor,
3494
+ error: null,
3495
+ },
3496
+ });
3497
+ void this.workspaceGitService
3498
+ .getSnapshot(workspace.cwd, {
3499
+ force: true,
3500
+ includeGitHub: true,
3501
+ reason: "open_project",
3502
+ })
3503
+ .catch((error) => {
3504
+ this.sessionLogger.warn({ err: error, cwd: workspace.cwd }, "Background snapshot refresh failed after open_project");
3505
+ });
3506
+ }
3507
+ catch (error) {
3508
+ const message = error instanceof Error ? error.message : "Failed to open project";
3509
+ this.sessionLogger.error({ err: error, cwd }, "Failed to open project");
3510
+ this.emit({
3511
+ type: "open_project_response",
3512
+ payload: {
3513
+ requestId: request.requestId,
3514
+ workspace: null,
3515
+ error: message,
3516
+ },
3517
+ });
3518
+ }
3519
+ }
3520
+ async handleProjectAddRequest(request) {
3521
+ const requestedCwd = request.cwd;
3522
+ const cwd = expandTilde(requestedCwd);
3523
+ const directoryExists = await this.filesystem.isDirectory(cwd).catch(() => false);
3524
+ if (!directoryExists) {
3525
+ this.sessionLogger.info({ requestedCwd, resolvedCwd: cwd, reason: "directory_not_found" }, "Add project rejected");
3526
+ this.emit({
3527
+ type: "project.add.response",
3528
+ payload: {
3529
+ requestId: request.requestId,
3530
+ project: null,
3531
+ error: `Directory not found: ${cwd}`,
3532
+ errorCode: "directory_not_found",
3533
+ },
3534
+ });
3535
+ return;
3536
+ }
3537
+ try {
3538
+ const projectsBefore = new Map();
3539
+ for (const project of await this.projectRegistry.list()) {
3540
+ projectsBefore.set(project.projectId, project);
3541
+ }
3542
+ const project = await this.workspaceProvisioning.findOrCreateProjectForDirectory(cwd);
3543
+ this.sessionLogger.info({
3544
+ requestedCwd,
3545
+ resolvedCwd: cwd,
3546
+ projectId: project.projectId,
3547
+ projectKind: project.kind,
3548
+ projectTransition: describeRegistryTransition(projectsBefore.get(project.projectId) ?? null),
3549
+ }, "Project added");
3550
+ this.emit({
3551
+ type: "project.add.response",
3552
+ payload: {
3553
+ requestId: request.requestId,
3554
+ project: this.buildProjectDescriptor(project),
3555
+ error: null,
3556
+ },
3557
+ });
3558
+ }
3559
+ catch (error) {
3560
+ const message = error instanceof Error ? error.message : "Failed to add project";
3561
+ this.sessionLogger.error({ err: error, cwd }, "Failed to add project");
3562
+ this.emit({
3563
+ type: "project.add.response",
3564
+ payload: {
3565
+ requestId: request.requestId,
3566
+ project: null,
3567
+ error: message,
3568
+ },
3569
+ });
3570
+ }
3571
+ }
3572
+ async handleWorkspaceGithubCloneRequest(request) {
3573
+ let normalizedRepo = request.repo;
3574
+ let checkoutPath = null;
3575
+ try {
3576
+ const repo = normalizeCloneRepository({
3577
+ repo: request.repo,
3578
+ cloneProtocol: request.cloneProtocol,
3579
+ });
3580
+ normalizedRepo = repo.displayName;
3581
+ const targetParent = resolve(expandTilde(request.targetDirectory.trim()));
3582
+ checkoutPath = resolve(targetParent, repo.name);
3583
+ if (!this.isPathWithinRoot(targetParent, checkoutPath)) {
3584
+ throw new Error("Resolved checkout path must stay inside the target directory");
3585
+ }
3586
+ await mkdir(targetParent, { recursive: true });
3587
+ try {
3588
+ await lstat(checkoutPath);
3589
+ throw new Error(`Checkout path already exists: ${checkoutPath}`);
3590
+ }
3591
+ catch (error) {
3592
+ if (error.code !== "ENOENT") {
3593
+ throw error;
3594
+ }
3595
+ }
3596
+ const cloneStagingPath = await mkdtemp(resolve(targetParent, ".byspace-clone-"));
3597
+ try {
3598
+ await runGitCommand(["clone", repo.cloneUrl, cloneStagingPath], {
3599
+ cwd: targetParent,
3600
+ timeout: 5 * 60 * 1000,
3601
+ maxOutputBytes: 1024 * 1024,
3602
+ logger: this.sessionLogger,
3603
+ });
3604
+ await rename(cloneStagingPath, checkoutPath);
3605
+ }
3606
+ catch (error) {
3607
+ await rm(cloneStagingPath, { recursive: true, force: true }).catch((cleanupError) => {
3608
+ this.sessionLogger.warn({ err: cleanupError, cloneStagingPath }, "Failed to clean up partial GitHub clone");
3609
+ });
3610
+ throw error;
3611
+ }
3612
+ const workspace = await this.workspaceProvisioning.findOrCreateWorkspaceForDirectory(checkoutPath);
3613
+ await this.syncWorkspaceGitObserverForWorkspace(workspace);
3614
+ const descriptor = await this.describeWorkspaceRecord(workspace);
3615
+ await this.emitWorkspaceUpdateForWorkspaceId(workspace.workspaceId);
3616
+ void this.workspaceGitService
3617
+ .getSnapshot(workspace.cwd, {
3618
+ force: true,
3619
+ includeGitHub: true,
3620
+ reason: "open_project",
3621
+ })
3622
+ .catch((error) => {
3623
+ this.sessionLogger.warn({ err: error, cwd: workspace.cwd }, "Background snapshot refresh failed after workspace.github.clone");
3624
+ });
3625
+ this.emit({
3626
+ type: "workspace.github.clone.response",
3627
+ payload: {
3628
+ requestId: request.requestId,
3629
+ repo: repo.displayName,
3630
+ checkoutPath,
3631
+ workspace: descriptor,
3632
+ error: null,
3633
+ },
3634
+ });
3635
+ }
3636
+ catch (error) {
3637
+ const message = error instanceof Error ? error.message : "Failed to clone GitHub repo";
3638
+ this.sessionLogger.error({ err: error, repo: request.repo, targetDirectory: request.targetDirectory }, "Failed to clone GitHub workspace");
3639
+ this.emit({
3640
+ type: "workspace.github.clone.response",
3641
+ payload: {
3642
+ requestId: request.requestId,
3643
+ repo: normalizedRepo,
3644
+ checkoutPath,
3645
+ workspace: null,
3646
+ error: message,
3647
+ },
3648
+ });
3649
+ }
3650
+ }
3651
+ // Named accessor: the workspace descriptor builder and the git-watch test both read a workspace's
3652
+ // scripts snapshot through here; the workspace-scripts module owns the payload assembly.
3653
+ buildWorkspaceScriptPayloadSnapshot(workspaceId, workspaceDirectory) {
3654
+ return this.workspaceScripts.buildSnapshot(workspaceId, workspaceDirectory);
3655
+ }
3656
+ handleStartWorkspaceScriptRequest(request) {
3657
+ return this.workspaceScripts.start(request);
3658
+ }
3659
+ // COMPAT(desktopEditorBridge): added in v0.1.88, remove after 2026-12-03 once old clients no longer call daemon editor RPCs.
3660
+ async handleLegacyListAvailableEditorsRequest(request) {
3661
+ this.emit({
3662
+ type: "list_available_editors_response",
3663
+ payload: {
3664
+ requestId: request.requestId,
3665
+ editors: [],
3666
+ error: "Editor opening is not supported by the daemon",
3667
+ },
3668
+ });
3669
+ }
3670
+ async handleLegacyOpenInEditorRequest(request) {
3671
+ this.emit({
3672
+ type: "open_in_editor_response",
3673
+ payload: {
3674
+ requestId: request.requestId,
3675
+ error: "Editor opening is not supported by the daemon",
3676
+ },
3677
+ });
3678
+ }
3679
+ async handleCreateBySpaceWorktreeRequest(request) {
3680
+ return handleCreateWorktreeRequest({
3681
+ byspaceHome: this.byspaceHome,
3682
+ worktreesRoot: this.worktreesRoot,
3683
+ describeWorkspaceRecord: (result) => this.describeCreatedWorktreeWorkspace(result),
3684
+ emit: (message) => this.emit(message),
3685
+ sessionLogger: this.sessionLogger,
3686
+ createBySpaceWorktreeWorkflow: (input) => this.createBySpaceWorktreeWorkflow(input),
3687
+ }, request);
3688
+ }
3689
+ async createBySpaceWorktreeWorkflow(input, options) {
3690
+ return createWorktreeWorkflow({
3691
+ byspaceHome: this.byspaceHome,
3692
+ worktreesRoot: this.worktreesRoot,
3693
+ createBySpaceWorktree: (workflowInput, serviceOptions) => this.createBySpaceWorktree(workflowInput, serviceOptions),
3694
+ warmWorkspaceGitData: (workspace) => this.warmWorkspaceGitDataForWorkspace(workspace),
3695
+ autoNameWorkspaceBranchForFirstAgent: (autoNameInput) => this.workspaceAutoName.scheduleForWorktree(autoNameInput, {
3696
+ currentSelection: this.getFocusedAgentSelectionForCwd(autoNameInput.workspace.cwd),
3697
+ }),
3698
+ emitWorkspaceUpdateForWorkspaceId: (workspaceId) => this.emitWorkspaceUpdateForWorkspaceId(workspaceId),
3699
+ cacheWorkspaceSetupSnapshot: (workspaceId, snapshot) => {
3700
+ this.workspaceSetupSnapshots.set(workspaceId, snapshot);
3701
+ },
3702
+ emit: (message) => this.emit(message),
3703
+ sessionLogger: this.sessionLogger,
3704
+ terminalManager: this.terminalManager,
3705
+ archiveWorkspaceRecord: (workspaceId) => this.archiveWorkspaceRecord(workspaceId),
3706
+ serviceProxy: this.serviceProxy,
3707
+ scriptRuntimeStore: this.scriptRuntimeStore,
3708
+ getDaemonTcpPort: this.getDaemonTcpPort,
3709
+ getDaemonTcpHost: this.getDaemonTcpHost,
3710
+ serviceProxyPublicBaseUrl: this.serviceProxyPublicBaseUrl,
3711
+ onScriptsChanged: (workspaceId, workspaceDirectory) => {
3712
+ this.workspaceScripts.emitStatusUpdate(workspaceId, workspaceDirectory);
3713
+ },
3714
+ }, input, options);
3715
+ }
3716
+ async handleWorkspaceSetupStatusRequest(request) {
3717
+ return handleWorkspaceSetupStatusRequestMessage({
3718
+ emit: (message) => this.emit(message),
3719
+ workspaceSetupSnapshots: this.workspaceSetupSnapshots,
3720
+ }, request);
3721
+ }
3722
+ async handleArchiveWorkspaceRequest(request) {
3723
+ try {
3724
+ const existing = await this.workspaceRegistry.get(request.workspaceId);
3725
+ if (!existing) {
3726
+ throw new Error(`Workspace not found: ${request.workspaceId}`);
3727
+ }
3728
+ const gitSnapshot = await this.workspaceGitService
3729
+ .getSnapshot(existing.cwd)
3730
+ .catch(() => null);
3731
+ const repoRoot = gitSnapshot?.git?.repoRoot ?? null;
3732
+ await archiveByScope({
3733
+ byspaceHome: this.byspaceHome,
3734
+ byspaceWorktreesBaseRoot: this.worktreesRoot,
3735
+ github: this.github,
3736
+ workspaceGitService: this.workspaceGitService,
3737
+ agentManager: this.agentManager,
3738
+ agentStorage: this.agentStorage,
3739
+ findWorkspaceIdForCwd: (cwd) => this.findWorkspaceIdForCwd(cwd),
3740
+ listActiveWorkspaces: () => this.listActiveWorkspaceRefs(),
3741
+ archiveWorkspaceRecord: (workspaceId) => this.archiveWorkspaceRecord(workspaceId),
3742
+ emitWorkspaceUpdatesForWorkspaceIds: (workspaceIds) => this.emitWorkspaceUpdatesForWorkspaceIds(workspaceIds),
3743
+ markWorkspaceArchiving: (workspaceIds, archivingAt) => this.markWorkspaceArchiving(workspaceIds, archivingAt),
3744
+ clearWorkspaceArchiving: (workspaceIds) => this.clearWorkspaceArchiving(workspaceIds),
3745
+ killTerminalsForWorkspace: (workspaceId) => this.terminalController.killTerminalsForWorkspace(workspaceId),
3746
+ sessionLogger: this.sessionLogger,
3747
+ }, {
3748
+ scope: { kind: "workspace", workspaceId: existing.workspaceId },
3749
+ repoRoot,
3750
+ byspaceWorktreesBaseRoot: this.worktreesRoot,
3751
+ requestId: request.requestId,
3752
+ });
3753
+ const archivedWorkspace = await this.workspaceRegistry.get(request.workspaceId);
3754
+ const archivedAt = archivedWorkspace?.archivedAt ?? new Date().toISOString();
3755
+ this.emit({
3756
+ type: "archive_workspace_response",
3757
+ payload: {
3758
+ requestId: request.requestId,
3759
+ workspaceId: request.workspaceId,
3760
+ archivedAt,
3761
+ error: null,
3762
+ },
3763
+ });
3764
+ }
3765
+ catch (error) {
3766
+ const message = error instanceof Error ? error.message : "Failed to archive workspace";
3767
+ this.sessionLogger.error({ err: error, workspaceId: request.workspaceId }, "Failed to archive workspace");
3768
+ this.emit({
3769
+ type: "archive_workspace_response",
3770
+ payload: {
3771
+ requestId: request.requestId,
3772
+ workspaceId: request.workspaceId,
3773
+ archivedAt: null,
3774
+ error: message,
3775
+ },
3776
+ });
3777
+ }
3778
+ }
3779
+ async handleWorkspaceClearAttentionRequest(request) {
3780
+ const { requestId, workspaceId } = request;
3781
+ const requestedWorkspaceIds = Array.isArray(workspaceId) ? workspaceId : [workspaceId];
3782
+ let agents;
3783
+ try {
3784
+ agents = await this.listAgentPayloads();
3785
+ }
3786
+ catch (error) {
3787
+ const message = getErrorMessage(error);
3788
+ const results = requestedWorkspaceIds.map((requestedWorkspaceId) => ({
3789
+ workspaceId: requestedWorkspaceId,
3790
+ clearedAgentIds: [],
3791
+ success: false,
3792
+ error: message,
3793
+ }));
3794
+ this.emit({
3795
+ type: "workspace.clear_attention.response",
3796
+ payload: {
3797
+ requestId,
3798
+ workspaceId,
3799
+ clearedAgentIds: [],
3800
+ results,
3801
+ success: false,
3802
+ error: message,
3803
+ },
3804
+ });
3805
+ return;
3806
+ }
3807
+ const results = [];
3808
+ for (const requestedWorkspaceId of requestedWorkspaceIds) {
3809
+ const clearedAgentIds = [];
3810
+ try {
3811
+ const workspace = await this.workspaceRegistry.get(requestedWorkspaceId);
3812
+ if (!workspace || workspace.archivedAt) {
3813
+ throw new Error(`Workspace not found: ${requestedWorkspaceId}`);
3814
+ }
3815
+ // Clearing attention is scoped to the workspace that OWNS the agent, by
3816
+ // workspaceId — never by comparing cwd strings. A sibling workspace
3817
+ // sharing the same directory keeps its own agents' attention.
3818
+ const clearableAgentIds = agents
3819
+ .filter((agent) => !agent.archivedAt)
3820
+ .filter((agent) => agent.workspaceId === workspace.workspaceId)
3821
+ .filter((agent) => agent.requiresAttention === true)
3822
+ .filter((agent) => (agent.pendingPermissions?.length ?? 0) === 0)
3823
+ .filter((agent) => agent.attentionReason !== "permission")
3824
+ .map((agent) => agent.id);
3825
+ for (const agentId of clearableAgentIds) {
3826
+ const liveAgent = this.agentManager.getAgent(agentId);
3827
+ if (liveAgent) {
3828
+ await this.agentManager.clearAgentAttention(agentId);
3829
+ clearedAgentIds.push(agentId);
3830
+ continue;
3831
+ }
3832
+ const record = await this.agentStorage.get(agentId);
3833
+ if (!record ||
3834
+ record.internal ||
3835
+ record.archivedAt ||
3836
+ record.requiresAttention !== true) {
3837
+ continue;
3838
+ }
3839
+ const nextRecord = {
3840
+ ...record,
3841
+ updatedAt: new Date().toISOString(),
3842
+ requiresAttention: false,
3843
+ attentionReason: null,
3844
+ attentionTimestamp: null,
3845
+ };
3846
+ await this.agentStorage.upsert(nextRecord);
3847
+ const agent = this.buildStoredAgentPayload(nextRecord);
3848
+ const project = await this.buildProjectPlacementForWorkspace(workspace);
3849
+ this.emit({
3850
+ type: "agent_update",
3851
+ payload: {
3852
+ kind: "upsert",
3853
+ agent,
3854
+ project,
3855
+ },
3856
+ });
3857
+ clearedAgentIds.push(agentId);
3858
+ }
3859
+ await this.emitWorkspaceUpdateForWorkspaceId(workspace.workspaceId);
3860
+ results.push({
3861
+ workspaceId: requestedWorkspaceId,
3862
+ clearedAgentIds,
3863
+ success: true,
3864
+ error: null,
3865
+ });
3866
+ }
3867
+ catch (error) {
3868
+ const message = getErrorMessage(error);
3869
+ this.sessionLogger.error({ err: error, workspaceId: requestedWorkspaceId }, "Failed to clear workspace attention");
3870
+ results.push({
3871
+ workspaceId: requestedWorkspaceId,
3872
+ clearedAgentIds,
3873
+ success: false,
3874
+ error: message,
3875
+ });
3876
+ }
3877
+ }
3878
+ const clearedAgentIds = results.flatMap((result) => result.clearedAgentIds);
3879
+ const failedResults = results.filter((result) => !result.success);
3880
+ this.emit({
3881
+ type: "workspace.clear_attention.response",
3882
+ payload: {
3883
+ requestId,
3884
+ workspaceId,
3885
+ clearedAgentIds,
3886
+ results,
3887
+ success: failedResults.length === 0,
3888
+ error: failedResults.length === 0
3889
+ ? null
3890
+ : failedResults
3891
+ .map((result) => result.error)
3892
+ .filter((error) => error !== null)
3893
+ .join("; "),
3894
+ },
3895
+ });
3896
+ }
3897
+ async handleFetchAgent(agentIdOrIdentifier, requestId) {
3898
+ const resolved = await this.resolveAgentIdentifier(agentIdOrIdentifier);
3899
+ if (!resolved.ok) {
3900
+ this.emit({
3901
+ type: "fetch_agent_response",
3902
+ payload: { requestId, agent: null, project: null, error: resolved.error },
3903
+ });
3904
+ return;
3905
+ }
3906
+ const agent = await this.getAgentPayloadById(resolved.agentId);
3907
+ if (!agent) {
3908
+ this.emit({
3909
+ type: "fetch_agent_response",
3910
+ payload: {
3911
+ requestId,
3912
+ agent: null,
3913
+ project: null,
3914
+ error: `Agent not found: ${resolved.agentId}`,
3915
+ },
3916
+ });
3917
+ return;
3918
+ }
3919
+ const project = agent.workspaceId
3920
+ ? await this.buildProjectPlacementForWorkspaceId(agent.workspaceId)
3921
+ : null;
3922
+ this.emit({
3923
+ type: "fetch_agent_response",
3924
+ payload: { requestId, agent, project, error: null },
3925
+ });
3926
+ }
3927
+ shouldUseFullTimelineForProjectedPage(input) {
3928
+ const { timeline } = input;
3929
+ if (timeline.reset || timeline.rows.length === 0 || !timeline.hasOlder) {
3930
+ return false;
3931
+ }
3932
+ const firstRow = timeline.rows[0];
3933
+ if (firstRow?.item.type === "assistant_message" ||
3934
+ firstRow?.item.type === "reasoning" ||
3935
+ firstRow?.item.type === "tool_call") {
3936
+ return true;
3937
+ }
3938
+ return timeline.rows.some((row) => row.item.type === "tool_call");
3939
+ }
3940
+ selectCanonicalTimelineProjection(input) {
3941
+ const entries = projectTimelineRows({ rows: input.timeline.rows, mode: "canonical" });
3942
+ return {
3943
+ timeline: input.timeline,
3944
+ entries,
3945
+ startSeq: entries[0]?.seqStart ?? null,
3946
+ endSeq: entries[entries.length - 1]?.seqEnd ?? null,
3947
+ hasOlder: input.timeline.hasOlder,
3948
+ hasNewer: input.timeline.hasNewer,
3949
+ };
3950
+ }
3951
+ selectProjectedTimelineProjection(input) {
3952
+ const timeline = this.shouldUseFullTimelineForProjectedPage({
3953
+ timeline: input.controlTimeline,
3954
+ })
3955
+ ? this.agentManager.fetchTimeline(input.agentId, { direction: "tail", limit: 0 })
3956
+ : input.controlTimeline;
3957
+ const page = selectProjectedTimelinePage({
3958
+ rows: timeline.rows,
3959
+ bounds: timeline.window,
3960
+ direction: input.controlTimeline.reset ? "tail" : input.direction,
3961
+ ...(input.cursor ? { cursorSeq: input.cursor.seq } : {}),
3962
+ limit: input.pageLimit,
3963
+ });
3964
+ return {
3965
+ timeline,
3966
+ entries: page.entries,
3967
+ startSeq: page.startSeq,
3968
+ endSeq: page.endSeq,
3969
+ hasOlder: page.hasOlder || (page.startSeq !== null && page.startSeq > timeline.window.minSeq),
3970
+ hasNewer: page.hasNewer,
3971
+ };
3972
+ }
3973
+ selectTimelineProjection(input) {
3974
+ if (input.projection === "canonical") {
3975
+ return this.selectCanonicalTimelineProjection({ timeline: input.controlTimeline });
3976
+ }
3977
+ return this.selectProjectedTimelineProjection(input);
3978
+ }
3979
+ async handleFetchAgentTimelineRequest(msg) {
3980
+ const direction = msg.direction ?? (msg.cursor ? "after" : "tail");
3981
+ const projection = msg.projection ?? "projected";
3982
+ const requestedLimit = msg.limit;
3983
+ const pageLimit = requestedLimit ?? (direction === "after" ? 0 : 200);
3984
+ const cursor = msg.cursor
3985
+ ? {
3986
+ epoch: msg.cursor.epoch,
3987
+ seq: msg.cursor.seq,
3988
+ }
3989
+ : undefined;
3990
+ try {
3991
+ const snapshot = await ensureAgentLoaded(msg.agentId, {
3992
+ agentManager: this.agentManager,
3993
+ agentStorage: this.agentStorage,
3994
+ logger: this.sessionLogger,
3995
+ });
3996
+ const agentPayload = await this.buildAgentPayload(snapshot);
3997
+ const controlTimeline = this.agentManager.fetchTimeline(msg.agentId, {
3998
+ direction,
3999
+ cursor,
4000
+ limit: pageLimit,
4001
+ });
4002
+ const selectedTimeline = this.selectTimelineProjection({
4003
+ agentId: msg.agentId,
4004
+ projection,
4005
+ controlTimeline,
4006
+ direction,
4007
+ ...(cursor ? { cursor } : {}),
4008
+ pageLimit,
4009
+ });
4010
+ const startCursor = selectedTimeline.startSeq !== null
4011
+ ? { epoch: selectedTimeline.timeline.epoch, seq: selectedTimeline.startSeq }
4012
+ : null;
4013
+ const endCursor = selectedTimeline.endSeq !== null
4014
+ ? { epoch: selectedTimeline.timeline.epoch, seq: selectedTimeline.endSeq }
4015
+ : null;
4016
+ this.emit({
4017
+ type: "fetch_agent_timeline_response",
4018
+ payload: {
4019
+ requestId: msg.requestId,
4020
+ agentId: msg.agentId,
4021
+ agent: agentPayload,
4022
+ direction,
4023
+ projection,
4024
+ epoch: selectedTimeline.timeline.epoch,
4025
+ reset: controlTimeline.reset,
4026
+ staleCursor: controlTimeline.staleCursor,
4027
+ gap: controlTimeline.gap,
4028
+ window: selectedTimeline.timeline.window,
4029
+ startCursor,
4030
+ endCursor,
4031
+ hasOlder: selectedTimeline.hasOlder,
4032
+ hasNewer: selectedTimeline.hasNewer,
4033
+ entries: selectedTimeline.entries.map((entry) => ({
4034
+ provider: snapshot.provider,
4035
+ item: entry.item,
4036
+ timestamp: entry.timestamp,
4037
+ seqStart: entry.seqStart,
4038
+ seqEnd: entry.seqEnd,
4039
+ sourceSeqRanges: entry.sourceSeqRanges,
4040
+ collapsed: this.supports(CLIENT_CAPS.reasoningMergeEnum)
4041
+ ? entry.collapsed
4042
+ : entry.collapsed.filter((value) => value !== "reasoning_merge"),
4043
+ })),
4044
+ error: null,
4045
+ },
4046
+ });
4047
+ }
4048
+ catch (error) {
4049
+ this.sessionLogger.error({ err: error, agentId: msg.agentId }, "Failed to handle fetch_agent_timeline_request");
4050
+ this.emit({
4051
+ type: "fetch_agent_timeline_response",
4052
+ payload: {
4053
+ requestId: msg.requestId,
4054
+ agentId: msg.agentId,
4055
+ agent: null,
4056
+ direction,
4057
+ projection,
4058
+ epoch: "",
4059
+ reset: false,
4060
+ staleCursor: false,
4061
+ gap: false,
4062
+ window: { minSeq: 0, maxSeq: 0, nextSeq: 0 },
4063
+ startCursor: null,
4064
+ endCursor: null,
4065
+ hasOlder: false,
4066
+ hasNewer: false,
4067
+ entries: [],
4068
+ error: error instanceof Error ? error.message : String(error),
4069
+ },
4070
+ });
4071
+ }
4072
+ }
4073
+ async handleProviderSubagentListRequest(msg) {
4074
+ try {
4075
+ this.emit({
4076
+ type: "agent.provider_subagents.list.response",
4077
+ payload: {
4078
+ requestId: msg.requestId,
4079
+ parentAgentId: msg.parentAgentId,
4080
+ subagents: this.agentManager.listProviderSubagents(msg.parentAgentId),
4081
+ error: null,
4082
+ },
4083
+ });
4084
+ }
4085
+ catch (error) {
4086
+ this.emit({
4087
+ type: "agent.provider_subagents.list.response",
4088
+ payload: {
4089
+ requestId: msg.requestId,
4090
+ parentAgentId: msg.parentAgentId,
4091
+ subagents: [],
4092
+ error: error instanceof Error ? error.message : String(error),
4093
+ },
4094
+ });
4095
+ }
4096
+ }
4097
+ async handleProviderSubagentTimelineRequest(msg) {
4098
+ const direction = msg.direction ?? (msg.cursor ? "after" : "tail");
4099
+ try {
4100
+ const descriptor = this.agentManager.getProviderSubagent(msg.parentAgentId, msg.subagentId);
4101
+ if (!descriptor) {
4102
+ throw new Error("Provider subagent not found");
4103
+ }
4104
+ const timeline = this.agentManager.fetchProviderSubagentTimeline(msg.parentAgentId, msg.subagentId, {
4105
+ direction,
4106
+ cursor: msg.cursor,
4107
+ limit: msg.limit ?? (direction === "after" ? 0 : 200),
4108
+ });
4109
+ this.emit({
4110
+ type: "agent.provider_subagents.timeline.get.response",
4111
+ payload: {
4112
+ requestId: msg.requestId,
4113
+ parentAgentId: msg.parentAgentId,
4114
+ subagentId: msg.subagentId,
4115
+ provider: descriptor.provider,
4116
+ direction,
4117
+ epoch: timeline.epoch,
4118
+ reset: timeline.reset,
4119
+ staleCursor: timeline.staleCursor,
4120
+ gap: timeline.gap,
4121
+ window: timeline.window,
4122
+ hasOlder: timeline.hasOlder,
4123
+ hasNewer: timeline.hasNewer,
4124
+ rows: timeline.rows.map((row) => ({
4125
+ item: row.item,
4126
+ timestamp: row.timestamp,
4127
+ seq: row.seq,
4128
+ })),
4129
+ error: null,
4130
+ },
4131
+ });
4132
+ }
4133
+ catch (error) {
4134
+ this.emit({
4135
+ type: "agent.provider_subagents.timeline.get.response",
4136
+ payload: {
4137
+ requestId: msg.requestId,
4138
+ parentAgentId: msg.parentAgentId,
4139
+ subagentId: msg.subagentId,
4140
+ provider: null,
4141
+ direction,
4142
+ epoch: "",
4143
+ reset: false,
4144
+ staleCursor: false,
4145
+ gap: false,
4146
+ window: { minSeq: 0, maxSeq: 0, nextSeq: 0 },
4147
+ hasOlder: false,
4148
+ hasNewer: false,
4149
+ rows: [],
4150
+ error: error instanceof Error ? error.message : String(error),
4151
+ },
4152
+ });
4153
+ }
4154
+ }
4155
+ async handleAgentForkContextRequest(msg) {
4156
+ try {
4157
+ const snapshot = await ensureAgentLoaded(msg.agentId, {
4158
+ agentManager: this.agentManager,
4159
+ agentStorage: this.agentStorage,
4160
+ logger: this.sessionLogger,
4161
+ });
4162
+ const agentPayload = await this.buildAgentPayload(snapshot);
4163
+ const timeline = this.agentManager.fetchTimeline(msg.agentId, {
4164
+ direction: "tail",
4165
+ limit: 0,
4166
+ });
4167
+ const forkContext = buildAgentForkContextAttachment({
4168
+ rows: timeline.rows,
4169
+ cursorBoundary: msg.boundaryCursor
4170
+ ? { timelineEpoch: timeline.epoch, cursor: msg.boundaryCursor }
4171
+ : null,
4172
+ boundaryMessageId: msg.boundaryMessageId,
4173
+ agentTitle: agentPayload.title,
4174
+ cwd: snapshot.cwd,
4175
+ });
4176
+ this.emit({
4177
+ type: "agent.fork_context.response",
4178
+ payload: {
4179
+ requestId: msg.requestId,
4180
+ agentId: msg.agentId,
4181
+ attachment: forkContext.attachment,
4182
+ itemCount: forkContext.itemCount,
4183
+ boundaryCursor: forkContext.boundaryCursor,
4184
+ boundaryMessageId: forkContext.boundaryMessageId,
4185
+ error: null,
4186
+ },
4187
+ });
4188
+ }
4189
+ catch (error) {
4190
+ this.sessionLogger.error({ err: error, agentId: msg.agentId }, "Failed to handle agent.fork_context.request");
4191
+ this.emit({
4192
+ type: "agent.fork_context.response",
4193
+ payload: {
4194
+ requestId: msg.requestId,
4195
+ agentId: msg.agentId,
4196
+ attachment: null,
4197
+ itemCount: 0,
4198
+ boundaryCursor: msg.boundaryCursor ?? null,
4199
+ boundaryMessageId: msg.boundaryMessageId ?? null,
4200
+ error: error instanceof Error ? error.message : String(error),
4201
+ },
4202
+ });
4203
+ }
4204
+ }
4205
+ async handleSendAgentMessageRequest(msg) {
4206
+ const resolved = await this.resolveAgentIdentifier(msg.agentId);
4207
+ if (!resolved.ok) {
4208
+ this.emit({
4209
+ type: "send_agent_message_response",
4210
+ payload: {
4211
+ requestId: msg.requestId,
4212
+ agentId: msg.agentId,
4213
+ accepted: false,
4214
+ error: resolved.error,
4215
+ },
4216
+ });
4217
+ return;
4218
+ }
4219
+ try {
4220
+ const agentId = resolved.agentId;
4221
+ const prompt = buildAgentPrompt(msg.text, msg.images, msg.attachments);
4222
+ this.sessionLogger.trace({
4223
+ agentId,
4224
+ messageId: msg.messageId,
4225
+ textPrefix: msg.text.slice(0, 80),
4226
+ }, "agent.session.send_agent_message");
4227
+ let dispatchResult;
4228
+ try {
4229
+ dispatchResult = await sendPromptToAgent({
4230
+ agentManager: this.agentManager,
4231
+ agentStorage: this.agentStorage,
4232
+ agentId,
4233
+ prompt,
4234
+ messageId: msg.messageId,
4235
+ logger: this.sessionLogger,
4236
+ });
4237
+ }
4238
+ catch (error) {
4239
+ const message = error instanceof Error ? error.message : String(error);
4240
+ this.handleAgentRunError(agentId, error, "Failed to send agent message");
4241
+ this.emit({
4242
+ type: "send_agent_message_response",
4243
+ payload: {
4244
+ requestId: msg.requestId,
4245
+ agentId,
4246
+ accepted: false,
4247
+ error: message,
4248
+ },
4249
+ });
4250
+ return;
4251
+ }
4252
+ if (dispatchResult.outOfBand) {
4253
+ this.emit({
4254
+ type: "send_agent_message_response",
4255
+ payload: {
4256
+ requestId: msg.requestId,
4257
+ agentId,
4258
+ accepted: true,
4259
+ error: null,
4260
+ },
4261
+ });
4262
+ return;
4263
+ }
4264
+ try {
4265
+ await waitForAgentRunStartWithTimeout(this.agentManager, agentId);
4266
+ }
4267
+ catch (error) {
4268
+ this.emit({
4269
+ type: "send_agent_message_response",
4270
+ payload: {
4271
+ requestId: msg.requestId,
4272
+ agentId,
4273
+ accepted: false,
4274
+ error: errorToFriendlyMessage(error),
4275
+ },
4276
+ });
4277
+ return;
4278
+ }
4279
+ this.emit({
4280
+ type: "send_agent_message_response",
4281
+ payload: {
4282
+ requestId: msg.requestId,
4283
+ agentId,
4284
+ accepted: true,
4285
+ error: null,
4286
+ },
4287
+ });
4288
+ }
4289
+ catch (error) {
4290
+ this.emit({
4291
+ type: "send_agent_message_response",
4292
+ payload: {
4293
+ requestId: msg.requestId,
4294
+ agentId: resolved.agentId,
4295
+ accepted: false,
4296
+ error: errorToFriendlyMessage(error),
4297
+ },
4298
+ });
4299
+ }
4300
+ }
4301
+ async handleWaitForFinish(agentIdOrIdentifier, requestId, timeoutMs) {
4302
+ const resolved = await this.resolveAgentIdentifier(agentIdOrIdentifier);
4303
+ if (!resolved.ok) {
4304
+ this.emit({
4305
+ type: "wait_for_finish_response",
4306
+ payload: {
4307
+ requestId,
4308
+ status: "error",
4309
+ final: null,
4310
+ error: resolved.error,
4311
+ lastMessage: null,
4312
+ },
4313
+ });
4314
+ return;
4315
+ }
4316
+ const agentId = resolved.agentId;
4317
+ const live = this.agentManager.getAgent(agentId);
4318
+ if (!live) {
4319
+ const record = await this.agentStorage.get(agentId);
4320
+ if (!record || record.internal) {
4321
+ this.emit({
4322
+ type: "wait_for_finish_response",
4323
+ payload: {
4324
+ requestId,
4325
+ status: "error",
4326
+ final: null,
4327
+ error: `Agent not found: ${agentId}`,
4328
+ lastMessage: null,
4329
+ },
4330
+ });
4331
+ return;
4332
+ }
4333
+ const final = this.buildStoredAgentPayload(record);
4334
+ let status;
4335
+ if (record.attentionReason === "permission") {
4336
+ status = "permission";
4337
+ }
4338
+ else if (record.lastStatus === "error") {
4339
+ status = "error";
4340
+ }
4341
+ else {
4342
+ status = "idle";
4343
+ }
4344
+ const error = resolveWaitForFinishError({ status, final });
4345
+ this.emit({
4346
+ type: "wait_for_finish_response",
4347
+ payload: { requestId, status, final, error, lastMessage: null },
4348
+ });
4349
+ return;
4350
+ }
4351
+ const abortController = new AbortController();
4352
+ const hasTimeout = typeof timeoutMs === "number" && timeoutMs > 0;
4353
+ const timeoutHandle = hasTimeout
4354
+ ? setTimeout(() => {
4355
+ abortController.abort("timeout");
4356
+ }, timeoutMs)
4357
+ : null;
4358
+ try {
4359
+ let result = await this.agentManager.waitForAgentEvent(agentId, {
4360
+ signal: abortController.signal,
4361
+ waitForActive: true,
4362
+ });
4363
+ let final = await this.getAgentPayloadById(agentId);
4364
+ if (!final) {
4365
+ throw new Error(`Agent ${agentId} disappeared while waiting`);
4366
+ }
4367
+ let status;
4368
+ if (result.permission) {
4369
+ status = "permission";
4370
+ }
4371
+ else if (result.status === "error") {
4372
+ status = "error";
4373
+ }
4374
+ else {
4375
+ status = "idle";
4376
+ }
4377
+ const error = resolveWaitForFinishError({ status, final });
4378
+ this.emit({
4379
+ type: "wait_for_finish_response",
4380
+ payload: { requestId, status, final, error, lastMessage: result.lastMessage },
4381
+ });
4382
+ }
4383
+ catch (error) {
4384
+ const isAbort = error instanceof Error &&
4385
+ (error.name === "AbortError" || error.message.toLowerCase().includes("aborted"));
4386
+ if (!isAbort) {
4387
+ const message = errorToFriendlyMessage(error);
4388
+ this.sessionLogger.error({ err: error, agentId }, "wait_for_finish_request failed");
4389
+ const final = await this.getAgentPayloadById(agentId);
4390
+ this.emit({
4391
+ type: "wait_for_finish_response",
4392
+ payload: {
4393
+ requestId,
4394
+ status: "error",
4395
+ final,
4396
+ error: message,
4397
+ lastMessage: null,
4398
+ },
4399
+ });
4400
+ return;
4401
+ }
4402
+ const final = await this.getAgentPayloadById(agentId);
4403
+ if (!final) {
4404
+ throw new Error(`Agent ${agentId} disappeared while waiting`, { cause: error });
4405
+ }
4406
+ this.emit({
4407
+ type: "wait_for_finish_response",
4408
+ payload: { requestId, status: "timeout", final, error: null, lastMessage: null },
4409
+ });
4410
+ }
4411
+ finally {
4412
+ if (timeoutHandle) {
4413
+ clearTimeout(timeoutHandle);
4414
+ }
4415
+ }
4416
+ }
4417
+ /**
4418
+ * Emit a message to the client
4419
+ */
4420
+ emit(msg) {
4421
+ // JSON.stringify(msg) is only computed when trace is enabled — it runs for
4422
+ // every outbound message otherwise, and trace is disabled by default.
4423
+ // Optional-chained because test logger stubs don't implement isLevelEnabled.
4424
+ if (this.sessionLogger.isLevelEnabled?.("trace")) {
4425
+ this.sessionLogger.trace({
4426
+ messageType: msg.type,
4427
+ payloadBytes: JSON.stringify(msg).length,
4428
+ }, "agent.session.outbound");
4429
+ }
4430
+ this.onMessage(msg);
4431
+ }
4432
+ emitBinary(frame) {
4433
+ if (!this.onBinaryMessage) {
4434
+ return;
4435
+ }
4436
+ try {
4437
+ this.onBinaryMessage(frame);
4438
+ }
4439
+ catch (error) {
4440
+ this.sessionLogger.error({ err: error }, "Failed to emit binary frame");
4441
+ }
4442
+ }
4443
+ /**
4444
+ * Clean up session resources
4445
+ */
4446
+ async cleanup() {
4447
+ this.sessionLogger.trace({}, "agent.session.lifecycle.cleanup");
4448
+ if (this.unsubscribeAgentEvents) {
4449
+ this.unsubscribeAgentEvents();
4450
+ this.unsubscribeAgentEvents = null;
4451
+ }
4452
+ this.agentUpdates.dispose();
4453
+ if (this.unsubscribeTerminalWorkspaceContributionEvents) {
4454
+ this.unsubscribeTerminalWorkspaceContributionEvents();
4455
+ this.unsubscribeTerminalWorkspaceContributionEvents = null;
4456
+ }
4457
+ this.providerCatalogSession.dispose();
4458
+ await this.voiceSession.cleanup();
4459
+ this.terminalController.dispose();
4460
+ this.checkoutSession.cleanup();
4461
+ this.workspaceGitObserver.dispose();
4462
+ }
4463
+ }
4464
+ function normalizeCloneRepository(input) {
4465
+ const trimmed = input.repo.trim();
4466
+ if (!trimmed) {
4467
+ throw new Error("Repository is required");
4468
+ }
4469
+ const remote = parseGitRemoteLocation(trimmed);
4470
+ if (remote) {
4471
+ const segments = remote.path.split("/").filter(Boolean);
4472
+ const name = segments.at(-1);
4473
+ if (!name || !isValidGitHubRepoSegment(name)) {
4474
+ throw new Error("Repository name contains invalid characters");
4475
+ }
4476
+ return { name, displayName: remote.path, cloneUrl: trimmed };
4477
+ }
4478
+ const [owner, rawName, ...extra] = trimmed.split("/");
4479
+ if (!owner || !rawName || extra.length > 0) {
4480
+ throw new Error("Repository must use owner/repo format or a git remote URL");
4481
+ }
4482
+ const name = rawName.endsWith(".git") ? rawName.slice(0, -4) : rawName;
4483
+ if (!isValidGitHubRepoSegment(owner) || !isValidGitHubRepoSegment(name)) {
4484
+ throw new Error("Repository contains invalid characters");
4485
+ }
4486
+ if (!input.cloneProtocol) {
4487
+ throw new Error("Clone protocol is required for owner/repo repository names");
4488
+ }
4489
+ const cloneUrl = input.cloneProtocol === "ssh"
4490
+ ? `git@github.com:${owner}/${name}.git`
4491
+ : `https://github.com/${owner}/${name}.git`;
4492
+ return {
4493
+ name,
4494
+ displayName: `${owner}/${name}`,
4495
+ cloneUrl,
4496
+ };
4497
+ }
4498
+ function isValidGitHubRepoSegment(value) {
4499
+ return /^[A-Za-z0-9._-]+$/u.test(value);
4500
+ }
4501
+ //# sourceMappingURL=session.js.map