parasor 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 (633) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -0
  3. package/THIRD-PARTY-NOTICES.md +138 -0
  4. package/bin/parasor.mjs +3 -0
  5. package/node_modules/@parasor/shared/dist/client.d.ts +8 -0
  6. package/node_modules/@parasor/shared/dist/client.d.ts.map +1 -0
  7. package/node_modules/@parasor/shared/dist/client.js +2 -0
  8. package/node_modules/@parasor/shared/dist/client.js.map +1 -0
  9. package/node_modules/@parasor/shared/dist/drops.d.ts +24 -0
  10. package/node_modules/@parasor/shared/dist/drops.d.ts.map +1 -0
  11. package/node_modules/@parasor/shared/dist/drops.js +2 -0
  12. package/node_modules/@parasor/shared/dist/drops.js.map +1 -0
  13. package/node_modules/@parasor/shared/dist/file-uploads.d.ts +56 -0
  14. package/node_modules/@parasor/shared/dist/file-uploads.d.ts.map +1 -0
  15. package/node_modules/@parasor/shared/dist/file-uploads.js +13 -0
  16. package/node_modules/@parasor/shared/dist/file-uploads.js.map +1 -0
  17. package/node_modules/@parasor/shared/dist/ide-commands.d.ts +8 -0
  18. package/node_modules/@parasor/shared/dist/ide-commands.d.ts.map +1 -0
  19. package/node_modules/@parasor/shared/dist/ide-commands.js +59 -0
  20. package/node_modules/@parasor/shared/dist/ide-commands.js.map +1 -0
  21. package/node_modules/@parasor/shared/dist/pane-commands.d.ts +7 -0
  22. package/node_modules/@parasor/shared/dist/pane-commands.d.ts.map +1 -0
  23. package/node_modules/@parasor/shared/dist/pane-commands.js +47 -0
  24. package/node_modules/@parasor/shared/dist/pane-commands.js.map +1 -0
  25. package/node_modules/@parasor/shared/dist/pane-model.d.ts +63 -0
  26. package/node_modules/@parasor/shared/dist/pane-model.d.ts.map +1 -0
  27. package/node_modules/@parasor/shared/dist/pane-model.js +89 -0
  28. package/node_modules/@parasor/shared/dist/pane-model.js.map +1 -0
  29. package/node_modules/@parasor/shared/dist/panes.d.ts +33 -0
  30. package/node_modules/@parasor/shared/dist/panes.d.ts.map +1 -0
  31. package/node_modules/@parasor/shared/dist/panes.js +2 -0
  32. package/node_modules/@parasor/shared/dist/panes.js.map +1 -0
  33. package/node_modules/@parasor/shared/dist/runtime.d.ts +180 -0
  34. package/node_modules/@parasor/shared/dist/runtime.d.ts.map +1 -0
  35. package/node_modules/@parasor/shared/dist/runtime.js +2 -0
  36. package/node_modules/@parasor/shared/dist/runtime.js.map +1 -0
  37. package/node_modules/@parasor/shared/dist/state.d.ts +192 -0
  38. package/node_modules/@parasor/shared/dist/state.d.ts.map +1 -0
  39. package/node_modules/@parasor/shared/dist/state.js +10 -0
  40. package/node_modules/@parasor/shared/dist/state.js.map +1 -0
  41. package/node_modules/@parasor/shared/dist/terminal.d.ts +191 -0
  42. package/node_modules/@parasor/shared/dist/terminal.d.ts.map +1 -0
  43. package/node_modules/@parasor/shared/dist/terminal.js +174 -0
  44. package/node_modules/@parasor/shared/dist/terminal.js.map +1 -0
  45. package/node_modules/@parasor/shared/dist/types.d.ts +13 -0
  46. package/node_modules/@parasor/shared/dist/types.d.ts.map +1 -0
  47. package/node_modules/@parasor/shared/dist/types.js +13 -0
  48. package/node_modules/@parasor/shared/dist/types.js.map +1 -0
  49. package/node_modules/@parasor/shared/dist/worktree-local-files.d.ts +14 -0
  50. package/node_modules/@parasor/shared/dist/worktree-local-files.d.ts.map +1 -0
  51. package/node_modules/@parasor/shared/dist/worktree-local-files.js +41 -0
  52. package/node_modules/@parasor/shared/dist/worktree-local-files.js.map +1 -0
  53. package/node_modules/@parasor/shared/dist/ws-events.d.ts +152 -0
  54. package/node_modules/@parasor/shared/dist/ws-events.d.ts.map +1 -0
  55. package/node_modules/@parasor/shared/dist/ws-events.js +2 -0
  56. package/node_modules/@parasor/shared/dist/ws-events.js.map +1 -0
  57. package/node_modules/@parasor/shared/package.json +13 -0
  58. package/package.json +61 -0
  59. package/server/agent-detector/agent-state-store.d.ts +23 -0
  60. package/server/agent-detector/agent-state-store.d.ts.map +1 -0
  61. package/server/agent-detector/agent-state-store.js +110 -0
  62. package/server/agent-detector/agent-state-store.js.map +1 -0
  63. package/server/agent-detector/detector.d.ts +80 -0
  64. package/server/agent-detector/detector.d.ts.map +1 -0
  65. package/server/agent-detector/detector.js +219 -0
  66. package/server/agent-detector/detector.js.map +1 -0
  67. package/server/agent-detector/event-map.d.ts +25 -0
  68. package/server/agent-detector/event-map.d.ts.map +1 -0
  69. package/server/agent-detector/event-map.js +136 -0
  70. package/server/agent-detector/event-map.js.map +1 -0
  71. package/server/agent-detector/manual-agent-tracker.d.ts +19 -0
  72. package/server/agent-detector/manual-agent-tracker.d.ts.map +1 -0
  73. package/server/agent-detector/manual-agent-tracker.js +123 -0
  74. package/server/agent-detector/manual-agent-tracker.js.map +1 -0
  75. package/server/agent-detector/output-eligibility.d.ts +3 -0
  76. package/server/agent-detector/output-eligibility.d.ts.map +1 -0
  77. package/server/agent-detector/output-eligibility.js +39 -0
  78. package/server/agent-detector/output-eligibility.js.map +1 -0
  79. package/server/application/files/errors.d.ts +28 -0
  80. package/server/application/files/errors.d.ts.map +1 -0
  81. package/server/application/files/errors.js +55 -0
  82. package/server/application/files/errors.js.map +1 -0
  83. package/server/application/files/local-filesystem.d.ts +36 -0
  84. package/server/application/files/local-filesystem.d.ts.map +1 -0
  85. package/server/application/files/local-filesystem.js +171 -0
  86. package/server/application/files/local-filesystem.js.map +1 -0
  87. package/server/application/files/project-file-queries.d.ts +16 -0
  88. package/server/application/files/project-file-queries.d.ts.map +1 -0
  89. package/server/application/files/project-file-queries.js +126 -0
  90. package/server/application/files/project-file-queries.js.map +1 -0
  91. package/server/application/integrations/errors.d.ts +16 -0
  92. package/server/application/integrations/errors.d.ts.map +1 -0
  93. package/server/application/integrations/errors.js +31 -0
  94. package/server/application/integrations/errors.js.map +1 -0
  95. package/server/application/integrations/hook-notify.d.ts +32 -0
  96. package/server/application/integrations/hook-notify.d.ts.map +1 -0
  97. package/server/application/integrations/hook-notify.js +118 -0
  98. package/server/application/integrations/hook-notify.js.map +1 -0
  99. package/server/application/integrations/open-url.d.ts +11 -0
  100. package/server/application/integrations/open-url.d.ts.map +1 -0
  101. package/server/application/integrations/open-url.js +23 -0
  102. package/server/application/integrations/open-url.js.map +1 -0
  103. package/server/application/ports.d.ts +11 -0
  104. package/server/application/ports.d.ts.map +1 -0
  105. package/server/application/ports.js +2 -0
  106. package/server/application/ports.js.map +1 -0
  107. package/server/application/workspace/errors.d.ts +21 -0
  108. package/server/application/workspace/errors.d.ts.map +1 -0
  109. package/server/application/workspace/errors.js +21 -0
  110. package/server/application/workspace/errors.js.map +1 -0
  111. package/server/application/workspace/pane-commands.d.ts +47 -0
  112. package/server/application/workspace/pane-commands.d.ts.map +1 -0
  113. package/server/application/workspace/pane-commands.js +193 -0
  114. package/server/application/workspace/pane-commands.js.map +1 -0
  115. package/server/application/workspace/project-commands.d.ts +34 -0
  116. package/server/application/workspace/project-commands.d.ts.map +1 -0
  117. package/server/application/workspace/project-commands.js +81 -0
  118. package/server/application/workspace/project-commands.js.map +1 -0
  119. package/server/application/workspace/project-queries.d.ts +21 -0
  120. package/server/application/workspace/project-queries.d.ts.map +1 -0
  121. package/server/application/workspace/project-queries.js +216 -0
  122. package/server/application/workspace/project-queries.js.map +1 -0
  123. package/server/application/workspace/session-commands.d.ts +24 -0
  124. package/server/application/workspace/session-commands.d.ts.map +1 -0
  125. package/server/application/workspace/session-commands.js +123 -0
  126. package/server/application/workspace/session-commands.js.map +1 -0
  127. package/server/application/workspace/session-queries.d.ts +14 -0
  128. package/server/application/workspace/session-queries.d.ts.map +1 -0
  129. package/server/application/workspace/session-queries.js +47 -0
  130. package/server/application/workspace/session-queries.js.map +1 -0
  131. package/server/application/workspace/worktree-commands.d.ts +98 -0
  132. package/server/application/workspace/worktree-commands.d.ts.map +1 -0
  133. package/server/application/workspace/worktree-commands.js +323 -0
  134. package/server/application/workspace/worktree-commands.js.map +1 -0
  135. package/server/application/workspace/worktree-local-files.d.ts +11 -0
  136. package/server/application/workspace/worktree-local-files.d.ts.map +1 -0
  137. package/server/application/workspace/worktree-local-files.js +223 -0
  138. package/server/application/workspace/worktree-local-files.js.map +1 -0
  139. package/server/application/workspace/worktree-reconcile.d.ts +21 -0
  140. package/server/application/workspace/worktree-reconcile.d.ts.map +1 -0
  141. package/server/application/workspace/worktree-reconcile.js +49 -0
  142. package/server/application/workspace/worktree-reconcile.js.map +1 -0
  143. package/server/auth/origin.d.ts +17 -0
  144. package/server/auth/origin.d.ts.map +1 -0
  145. package/server/auth/origin.js +93 -0
  146. package/server/auth/origin.js.map +1 -0
  147. package/server/auth/pairing-token.d.ts +28 -0
  148. package/server/auth/pairing-token.d.ts.map +1 -0
  149. package/server/auth/pairing-token.js +46 -0
  150. package/server/auth/pairing-token.js.map +1 -0
  151. package/server/auth/token-exchange.d.ts +11 -0
  152. package/server/auth/token-exchange.d.ts.map +1 -0
  153. package/server/auth/token-exchange.js +27 -0
  154. package/server/auth/token-exchange.js.map +1 -0
  155. package/server/auth/token.d.ts +18 -0
  156. package/server/auth/token.d.ts.map +1 -0
  157. package/server/auth/token.js +115 -0
  158. package/server/auth/token.js.map +1 -0
  159. package/server/bootstrap/create-app-server.d.ts +49 -0
  160. package/server/bootstrap/create-app-server.d.ts.map +1 -0
  161. package/server/bootstrap/create-app-server.js +154 -0
  162. package/server/bootstrap/create-app-server.js.map +1 -0
  163. package/server/bootstrap/project-runtime.d.ts +29 -0
  164. package/server/bootstrap/project-runtime.d.ts.map +1 -0
  165. package/server/bootstrap/project-runtime.js +253 -0
  166. package/server/bootstrap/project-runtime.js.map +1 -0
  167. package/server/bootstrap/pty-env.d.ts +3 -0
  168. package/server/bootstrap/pty-env.d.ts.map +1 -0
  169. package/server/bootstrap/pty-env.js +15 -0
  170. package/server/bootstrap/pty-env.js.map +1 -0
  171. package/server/bootstrap/reconcile-state.d.ts +16 -0
  172. package/server/bootstrap/reconcile-state.d.ts.map +1 -0
  173. package/server/bootstrap/reconcile-state.js +73 -0
  174. package/server/bootstrap/reconcile-state.js.map +1 -0
  175. package/server/bootstrap/runtime-loops.d.ts +51 -0
  176. package/server/bootstrap/runtime-loops.d.ts.map +1 -0
  177. package/server/bootstrap/runtime-loops.js +189 -0
  178. package/server/bootstrap/runtime-loops.js.map +1 -0
  179. package/server/bootstrap/runtime-port.d.ts +4 -0
  180. package/server/bootstrap/runtime-port.d.ts.map +1 -0
  181. package/server/bootstrap/runtime-port.js +52 -0
  182. package/server/bootstrap/runtime-port.js.map +1 -0
  183. package/server/bootstrap/safety-gate.d.ts +22 -0
  184. package/server/bootstrap/safety-gate.d.ts.map +1 -0
  185. package/server/bootstrap/safety-gate.js +43 -0
  186. package/server/bootstrap/safety-gate.js.map +1 -0
  187. package/server/bootstrap/shutdown-marker.d.ts +35 -0
  188. package/server/bootstrap/shutdown-marker.d.ts.map +1 -0
  189. package/server/bootstrap/shutdown-marker.js +100 -0
  190. package/server/bootstrap/shutdown-marker.js.map +1 -0
  191. package/server/bootstrap/shutdown-runtime.d.ts +62 -0
  192. package/server/bootstrap/shutdown-runtime.d.ts.map +1 -0
  193. package/server/bootstrap/shutdown-runtime.js +66 -0
  194. package/server/bootstrap/shutdown-runtime.js.map +1 -0
  195. package/server/bootstrap/startup-banner.d.ts +34 -0
  196. package/server/bootstrap/startup-banner.d.ts.map +1 -0
  197. package/server/bootstrap/startup-banner.js +114 -0
  198. package/server/bootstrap/startup-banner.js.map +1 -0
  199. package/server/bootstrap/wire-runtime.d.ts +42 -0
  200. package/server/bootstrap/wire-runtime.d.ts.map +1 -0
  201. package/server/bootstrap/wire-runtime.js +205 -0
  202. package/server/bootstrap/wire-runtime.js.map +1 -0
  203. package/server/cli/help.d.ts +3 -0
  204. package/server/cli/help.d.ts.map +1 -0
  205. package/server/cli/help.js +39 -0
  206. package/server/cli/help.js.map +1 -0
  207. package/server/cli/hook-client.d.ts +12 -0
  208. package/server/cli/hook-client.d.ts.map +1 -0
  209. package/server/cli/hook-client.js +81 -0
  210. package/server/cli/hook-client.js.map +1 -0
  211. package/server/cli/hook.d.ts +3 -0
  212. package/server/cli/hook.d.ts.map +1 -0
  213. package/server/cli/hook.js +152 -0
  214. package/server/cli/hook.js.map +1 -0
  215. package/server/cli/main.d.ts +2 -0
  216. package/server/cli/main.d.ts.map +1 -0
  217. package/server/cli/main.js +133 -0
  218. package/server/cli/main.js.map +1 -0
  219. package/server/cli/notify.d.ts +19 -0
  220. package/server/cli/notify.d.ts.map +1 -0
  221. package/server/cli/notify.js +77 -0
  222. package/server/cli/notify.js.map +1 -0
  223. package/server/cli/open.d.ts +2 -0
  224. package/server/cli/open.d.ts.map +1 -0
  225. package/server/cli/open.js +47 -0
  226. package/server/cli/open.js.map +1 -0
  227. package/server/cli/probe-daemon-version.d.ts +46 -0
  228. package/server/cli/probe-daemon-version.d.ts.map +1 -0
  229. package/server/cli/probe-daemon-version.js +167 -0
  230. package/server/cli/probe-daemon-version.js.map +1 -0
  231. package/server/cli/pty-host.d.ts +36 -0
  232. package/server/cli/pty-host.d.ts.map +1 -0
  233. package/server/cli/pty-host.js +390 -0
  234. package/server/cli/pty-host.js.map +1 -0
  235. package/server/cli/qr.d.ts +2 -0
  236. package/server/cli/qr.d.ts.map +1 -0
  237. package/server/cli/qr.js +70 -0
  238. package/server/cli/qr.js.map +1 -0
  239. package/server/cli/restart-confirm.d.ts +33 -0
  240. package/server/cli/restart-confirm.d.ts.map +1 -0
  241. package/server/cli/restart-confirm.js +107 -0
  242. package/server/cli/restart-confirm.js.map +1 -0
  243. package/server/cli/restart.d.ts +17 -0
  244. package/server/cli/restart.d.ts.map +1 -0
  245. package/server/cli/restart.js +145 -0
  246. package/server/cli/restart.js.map +1 -0
  247. package/server/cli/service-darwin.d.ts +70 -0
  248. package/server/cli/service-darwin.d.ts.map +1 -0
  249. package/server/cli/service-darwin.js +562 -0
  250. package/server/cli/service-darwin.js.map +1 -0
  251. package/server/cli/service-linux.d.ts +81 -0
  252. package/server/cli/service-linux.d.ts.map +1 -0
  253. package/server/cli/service-linux.js +412 -0
  254. package/server/cli/service-linux.js.map +1 -0
  255. package/server/cli/service.d.ts +33 -0
  256. package/server/cli/service.d.ts.map +1 -0
  257. package/server/cli/service.js +133 -0
  258. package/server/cli/service.js.map +1 -0
  259. package/server/cli/shim-installer.d.ts +35 -0
  260. package/server/cli/shim-installer.d.ts.map +1 -0
  261. package/server/cli/shim-installer.js +662 -0
  262. package/server/cli/shim-installer.js.map +1 -0
  263. package/server/cli/shim-open.d.ts +2 -0
  264. package/server/cli/shim-open.d.ts.map +1 -0
  265. package/server/cli/shim-open.js +128 -0
  266. package/server/cli/shim-open.js.map +1 -0
  267. package/server/cli/shutdown-deps.d.ts +41 -0
  268. package/server/cli/shutdown-deps.d.ts.map +1 -0
  269. package/server/cli/shutdown-deps.js +158 -0
  270. package/server/cli/shutdown-deps.js.map +1 -0
  271. package/server/cli/stop.d.ts +11 -0
  272. package/server/cli/stop.d.ts.map +1 -0
  273. package/server/cli/stop.js +123 -0
  274. package/server/cli/stop.js.map +1 -0
  275. package/server/cli/unknown-command.d.ts +8 -0
  276. package/server/cli/unknown-command.d.ts.map +1 -0
  277. package/server/cli/unknown-command.js +14 -0
  278. package/server/cli/unknown-command.js.map +1 -0
  279. package/server/debug/agent-status-recorder.d.ts +57 -0
  280. package/server/debug/agent-status-recorder.d.ts.map +1 -0
  281. package/server/debug/agent-status-recorder.js +209 -0
  282. package/server/debug/agent-status-recorder.js.map +1 -0
  283. package/server/debug/terminal-trace-recorder.d.ts +41 -0
  284. package/server/debug/terminal-trace-recorder.d.ts.map +1 -0
  285. package/server/debug/terminal-trace-recorder.js +112 -0
  286. package/server/debug/terminal-trace-recorder.js.map +1 -0
  287. package/server/fonts/catalog.d.ts +35 -0
  288. package/server/fonts/catalog.d.ts.map +1 -0
  289. package/server/fonts/catalog.js +76 -0
  290. package/server/fonts/catalog.js.map +1 -0
  291. package/server/fonts/installer.d.ts +45 -0
  292. package/server/fonts/installer.d.ts.map +1 -0
  293. package/server/fonts/installer.js +201 -0
  294. package/server/fonts/installer.js.map +1 -0
  295. package/server/fonts/routes.d.ts +4 -0
  296. package/server/fonts/routes.d.ts.map +1 -0
  297. package/server/fonts/routes.js +91 -0
  298. package/server/fonts/routes.js.map +1 -0
  299. package/server/fs/drops.d.ts +50 -0
  300. package/server/fs/drops.d.ts.map +1 -0
  301. package/server/fs/drops.js +137 -0
  302. package/server/fs/drops.js.map +1 -0
  303. package/server/fs/file-uploads.d.ts +57 -0
  304. package/server/fs/file-uploads.d.ts.map +1 -0
  305. package/server/fs/file-uploads.js +214 -0
  306. package/server/fs/file-uploads.js.map +1 -0
  307. package/server/fs/file-watcher.d.ts +22 -0
  308. package/server/fs/file-watcher.d.ts.map +1 -0
  309. package/server/fs/file-watcher.js +105 -0
  310. package/server/fs/file-watcher.js.map +1 -0
  311. package/server/fs/git-watcher.d.ts +76 -0
  312. package/server/fs/git-watcher.d.ts.map +1 -0
  313. package/server/fs/git-watcher.js +356 -0
  314. package/server/fs/git-watcher.js.map +1 -0
  315. package/server/fs/media.d.ts +35 -0
  316. package/server/fs/media.d.ts.map +1 -0
  317. package/server/fs/media.js +271 -0
  318. package/server/fs/media.js.map +1 -0
  319. package/server/fs/service.d.ts +97 -0
  320. package/server/fs/service.d.ts.map +1 -0
  321. package/server/fs/service.js +306 -0
  322. package/server/fs/service.js.map +1 -0
  323. package/server/fs/upload-staging.d.ts +76 -0
  324. package/server/fs/upload-staging.d.ts.map +1 -0
  325. package/server/fs/upload-staging.js +283 -0
  326. package/server/fs/upload-staging.js.map +1 -0
  327. package/server/fs/watcher-lifecycle.d.ts +24 -0
  328. package/server/fs/watcher-lifecycle.d.ts.map +1 -0
  329. package/server/fs/watcher-lifecycle.js +105 -0
  330. package/server/fs/watcher-lifecycle.js.map +1 -0
  331. package/server/index.d.ts +17 -0
  332. package/server/index.d.ts.map +1 -0
  333. package/server/index.js +510 -0
  334. package/server/index.js.map +1 -0
  335. package/server/ipc/socket-server.d.ts +28 -0
  336. package/server/ipc/socket-server.d.ts.map +1 -0
  337. package/server/ipc/socket-server.js +206 -0
  338. package/server/ipc/socket-server.js.map +1 -0
  339. package/server/lib/git-exec.d.ts +38 -0
  340. package/server/lib/git-exec.d.ts.map +1 -0
  341. package/server/lib/git-exec.js +96 -0
  342. package/server/lib/git-exec.js.map +1 -0
  343. package/server/lib/open-in-ide.d.ts +22 -0
  344. package/server/lib/open-in-ide.d.ts.map +1 -0
  345. package/server/lib/open-in-ide.js +90 -0
  346. package/server/lib/open-in-ide.js.map +1 -0
  347. package/server/lib/open-in-os.d.ts +20 -0
  348. package/server/lib/open-in-os.d.ts.map +1 -0
  349. package/server/lib/open-in-os.js +51 -0
  350. package/server/lib/open-in-os.js.map +1 -0
  351. package/server/lib/path.d.ts +2 -0
  352. package/server/lib/path.d.ts.map +1 -0
  353. package/server/lib/path.js +10 -0
  354. package/server/lib/path.js.map +1 -0
  355. package/server/lib/promise-mutex.d.ts +7 -0
  356. package/server/lib/promise-mutex.d.ts.map +1 -0
  357. package/server/lib/promise-mutex.js +26 -0
  358. package/server/lib/promise-mutex.js.map +1 -0
  359. package/server/lib/sd-notify.d.ts +8 -0
  360. package/server/lib/sd-notify.d.ts.map +1 -0
  361. package/server/lib/sd-notify.js +27 -0
  362. package/server/lib/sd-notify.js.map +1 -0
  363. package/server/net/local-machine.d.ts +7 -0
  364. package/server/net/local-machine.d.ts.map +1 -0
  365. package/server/net/local-machine.js +79 -0
  366. package/server/net/local-machine.js.map +1 -0
  367. package/server/net/reachable-host.d.ts +12 -0
  368. package/server/net/reachable-host.d.ts.map +1 -0
  369. package/server/net/reachable-host.js +25 -0
  370. package/server/net/reachable-host.js.map +1 -0
  371. package/server/network/endpoints.d.ts +14 -0
  372. package/server/network/endpoints.d.ts.map +1 -0
  373. package/server/network/endpoints.js +104 -0
  374. package/server/network/endpoints.js.map +1 -0
  375. package/server/network/qr.d.ts +16 -0
  376. package/server/network/qr.d.ts.map +1 -0
  377. package/server/network/qr.js +89 -0
  378. package/server/network/qr.js.map +1 -0
  379. package/server/port-forwarder/forwarder.d.ts +47 -0
  380. package/server/port-forwarder/forwarder.d.ts.map +1 -0
  381. package/server/port-forwarder/forwarder.js +159 -0
  382. package/server/port-forwarder/forwarder.js.map +1 -0
  383. package/server/port-scanner/scanner.d.ts +24 -0
  384. package/server/port-scanner/scanner.d.ts.map +1 -0
  385. package/server/port-scanner/scanner.js +193 -0
  386. package/server/port-scanner/scanner.js.map +1 -0
  387. package/server/pty/connection-lifecycle.d.ts +50 -0
  388. package/server/pty/connection-lifecycle.d.ts.map +1 -0
  389. package/server/pty/connection-lifecycle.js +113 -0
  390. package/server/pty/connection-lifecycle.js.map +1 -0
  391. package/server/pty/daemon-connect.d.ts +52 -0
  392. package/server/pty/daemon-connect.d.ts.map +1 -0
  393. package/server/pty/daemon-connect.js +62 -0
  394. package/server/pty/daemon-connect.js.map +1 -0
  395. package/server/pty/handshake-timeout-race.d.ts +22 -0
  396. package/server/pty/handshake-timeout-race.d.ts.map +1 -0
  397. package/server/pty/handshake-timeout-race.js +23 -0
  398. package/server/pty/handshake-timeout-race.js.map +1 -0
  399. package/server/pty/headless-replay-snapshot.d.ts +28 -0
  400. package/server/pty/headless-replay-snapshot.d.ts.map +1 -0
  401. package/server/pty/headless-replay-snapshot.js +285 -0
  402. package/server/pty/headless-replay-snapshot.js.map +1 -0
  403. package/server/pty/headless-terminal-state-cache.d.ts +31 -0
  404. package/server/pty/headless-terminal-state-cache.d.ts.map +1 -0
  405. package/server/pty/headless-terminal-state-cache.js +119 -0
  406. package/server/pty/headless-terminal-state-cache.js.map +1 -0
  407. package/server/pty/hello-ack-validator.d.ts +15 -0
  408. package/server/pty/hello-ack-validator.d.ts.map +1 -0
  409. package/server/pty/hello-ack-validator.js +30 -0
  410. package/server/pty/hello-ack-validator.js.map +1 -0
  411. package/server/pty/host-daemon/bootstrap.d.ts +100 -0
  412. package/server/pty/host-daemon/bootstrap.d.ts.map +1 -0
  413. package/server/pty/host-daemon/bootstrap.js +611 -0
  414. package/server/pty/host-daemon/bootstrap.js.map +1 -0
  415. package/server/pty/host-daemon/daemon.d.ts +111 -0
  416. package/server/pty/host-daemon/daemon.d.ts.map +1 -0
  417. package/server/pty/host-daemon/daemon.js +648 -0
  418. package/server/pty/host-daemon/daemon.js.map +1 -0
  419. package/server/pty/host-daemon/entry.d.ts +3 -0
  420. package/server/pty/host-daemon/entry.d.ts.map +1 -0
  421. package/server/pty/host-daemon/entry.js +72 -0
  422. package/server/pty/host-daemon/entry.js.map +1 -0
  423. package/server/pty/host-daemon/lockfile.d.ts +12 -0
  424. package/server/pty/host-daemon/lockfile.d.ts.map +1 -0
  425. package/server/pty/host-daemon/lockfile.js +120 -0
  426. package/server/pty/host-daemon/lockfile.js.map +1 -0
  427. package/server/pty/host-daemon/mode-marker.d.ts +77 -0
  428. package/server/pty/host-daemon/mode-marker.d.ts.map +1 -0
  429. package/server/pty/host-daemon/mode-marker.js +228 -0
  430. package/server/pty/host-daemon/mode-marker.js.map +1 -0
  431. package/server/pty/host-daemon/orphan-cleanup.d.ts +42 -0
  432. package/server/pty/host-daemon/orphan-cleanup.d.ts.map +1 -0
  433. package/server/pty/host-daemon/orphan-cleanup.js +84 -0
  434. package/server/pty/host-daemon/orphan-cleanup.js.map +1 -0
  435. package/server/pty/host-daemon/paths.d.ts +10 -0
  436. package/server/pty/host-daemon/paths.d.ts.map +1 -0
  437. package/server/pty/host-daemon/paths.js +56 -0
  438. package/server/pty/host-daemon/paths.js.map +1 -0
  439. package/server/pty/host-daemon/server-connection.d.ts +44 -0
  440. package/server/pty/host-daemon/server-connection.d.ts.map +1 -0
  441. package/server/pty/host-daemon/server-connection.js +100 -0
  442. package/server/pty/host-daemon/server-connection.js.map +1 -0
  443. package/server/pty/host-daemon/service-detection.d.ts +24 -0
  444. package/server/pty/host-daemon/service-detection.d.ts.map +1 -0
  445. package/server/pty/host-daemon/service-detection.js +16 -0
  446. package/server/pty/host-daemon/service-detection.js.map +1 -0
  447. package/server/pty/host-daemon/socket-ready.d.ts +22 -0
  448. package/server/pty/host-daemon/socket-ready.d.ts.map +1 -0
  449. package/server/pty/host-daemon/socket-ready.js +33 -0
  450. package/server/pty/host-daemon/socket-ready.js.map +1 -0
  451. package/server/pty/host-daemon/spawn-daemon.d.ts +45 -0
  452. package/server/pty/host-daemon/spawn-daemon.d.ts.map +1 -0
  453. package/server/pty/host-daemon/spawn-daemon.js +155 -0
  454. package/server/pty/host-daemon/spawn-daemon.js.map +1 -0
  455. package/server/pty/host-daemon/terminate-daemon.d.ts +16 -0
  456. package/server/pty/host-daemon/terminate-daemon.d.ts.map +1 -0
  457. package/server/pty/host-daemon/terminate-daemon.js +128 -0
  458. package/server/pty/host-daemon/terminate-daemon.js.map +1 -0
  459. package/server/pty/host-protocol/frames.d.ts +110 -0
  460. package/server/pty/host-protocol/frames.d.ts.map +1 -0
  461. package/server/pty/host-protocol/frames.js +255 -0
  462. package/server/pty/host-protocol/frames.js.map +1 -0
  463. package/server/pty/host-protocol/messages.d.ts +140 -0
  464. package/server/pty/host-protocol/messages.d.ts.map +1 -0
  465. package/server/pty/host-protocol/messages.js +117 -0
  466. package/server/pty/host-protocol/messages.js.map +1 -0
  467. package/server/pty/host.d.ts +273 -0
  468. package/server/pty/host.d.ts.map +1 -0
  469. package/server/pty/host.js +184 -0
  470. package/server/pty/host.js.map +1 -0
  471. package/server/pty/in-process-host.d.ts +224 -0
  472. package/server/pty/in-process-host.d.ts.map +1 -0
  473. package/server/pty/in-process-host.js +1183 -0
  474. package/server/pty/in-process-host.js.map +1 -0
  475. package/server/pty/osc7-lifecycle.d.ts +8 -0
  476. package/server/pty/osc7-lifecycle.d.ts.map +1 -0
  477. package/server/pty/osc7-lifecycle.js +22 -0
  478. package/server/pty/osc7-lifecycle.js.map +1 -0
  479. package/server/pty/osc7-parser.d.ts +23 -0
  480. package/server/pty/osc7-parser.d.ts.map +1 -0
  481. package/server/pty/osc7-parser.js +91 -0
  482. package/server/pty/osc7-parser.js.map +1 -0
  483. package/server/pty/remote-host.d.ts +188 -0
  484. package/server/pty/remote-host.d.ts.map +1 -0
  485. package/server/pty/remote-host.js +810 -0
  486. package/server/pty/remote-host.js.map +1 -0
  487. package/server/pty/request-correlator.d.ts +59 -0
  488. package/server/pty/request-correlator.d.ts.map +1 -0
  489. package/server/pty/request-correlator.js +75 -0
  490. package/server/pty/request-correlator.js.map +1 -0
  491. package/server/pty/scrollback-log.d.ts +130 -0
  492. package/server/pty/scrollback-log.d.ts.map +1 -0
  493. package/server/pty/scrollback-log.js +344 -0
  494. package/server/pty/scrollback-log.js.map +1 -0
  495. package/server/pty/scrollback-sanitize.d.ts +2 -0
  496. package/server/pty/scrollback-sanitize.d.ts.map +1 -0
  497. package/server/pty/scrollback-sanitize.js +54 -0
  498. package/server/pty/scrollback-sanitize.js.map +1 -0
  499. package/server/pty/session-mirror.d.ts +67 -0
  500. package/server/pty/session-mirror.d.ts.map +1 -0
  501. package/server/pty/session-mirror.js +112 -0
  502. package/server/pty/session-mirror.js.map +1 -0
  503. package/server/pty/session-policy.d.ts +85 -0
  504. package/server/pty/session-policy.d.ts.map +1 -0
  505. package/server/pty/session-policy.js +186 -0
  506. package/server/pty/session-policy.js.map +1 -0
  507. package/server/pty/version-mismatch-recovery.d.ts +71 -0
  508. package/server/pty/version-mismatch-recovery.d.ts.map +1 -0
  509. package/server/pty/version-mismatch-recovery.js +63 -0
  510. package/server/pty/version-mismatch-recovery.js.map +1 -0
  511. package/server/routes/debug-agent-status.d.ts +5 -0
  512. package/server/routes/debug-agent-status.d.ts.map +1 -0
  513. package/server/routes/debug-agent-status.js +22 -0
  514. package/server/routes/debug-agent-status.js.map +1 -0
  515. package/server/routes/debug-diagnostics.d.ts +8 -0
  516. package/server/routes/debug-diagnostics.d.ts.map +1 -0
  517. package/server/routes/debug-diagnostics.js +34 -0
  518. package/server/routes/debug-diagnostics.js.map +1 -0
  519. package/server/routes/debug-terminal-trace.d.ts +16 -0
  520. package/server/routes/debug-terminal-trace.d.ts.map +1 -0
  521. package/server/routes/debug-terminal-trace.js +545 -0
  522. package/server/routes/debug-terminal-trace.js.map +1 -0
  523. package/server/routes/drops.d.ts +13 -0
  524. package/server/routes/drops.d.ts.map +1 -0
  525. package/server/routes/drops.js +126 -0
  526. package/server/routes/drops.js.map +1 -0
  527. package/server/routes/file-uploads.d.ts +9 -0
  528. package/server/routes/file-uploads.d.ts.map +1 -0
  529. package/server/routes/file-uploads.js +119 -0
  530. package/server/routes/file-uploads.js.map +1 -0
  531. package/server/routes/files.d.ts +9 -0
  532. package/server/routes/files.d.ts.map +1 -0
  533. package/server/routes/files.js +441 -0
  534. package/server/routes/files.js.map +1 -0
  535. package/server/routes/filesystem.d.ts +6 -0
  536. package/server/routes/filesystem.d.ts.map +1 -0
  537. package/server/routes/filesystem.js +76 -0
  538. package/server/routes/filesystem.js.map +1 -0
  539. package/server/routes/git.d.ts +38 -0
  540. package/server/routes/git.d.ts.map +1 -0
  541. package/server/routes/git.js +585 -0
  542. package/server/routes/git.js.map +1 -0
  543. package/server/routes/healthz.d.ts +8 -0
  544. package/server/routes/healthz.d.ts.map +1 -0
  545. package/server/routes/healthz.js +24 -0
  546. package/server/routes/healthz.js.map +1 -0
  547. package/server/routes/hook.d.ts +14 -0
  548. package/server/routes/hook.d.ts.map +1 -0
  549. package/server/routes/hook.js +86 -0
  550. package/server/routes/hook.js.map +1 -0
  551. package/server/routes/ide-commands.d.ts +9 -0
  552. package/server/routes/ide-commands.d.ts.map +1 -0
  553. package/server/routes/ide-commands.js +23 -0
  554. package/server/routes/ide-commands.js.map +1 -0
  555. package/server/routes/lib/resolve-worktree.d.ts +30 -0
  556. package/server/routes/lib/resolve-worktree.d.ts.map +1 -0
  557. package/server/routes/lib/resolve-worktree.js +35 -0
  558. package/server/routes/lib/resolve-worktree.js.map +1 -0
  559. package/server/routes/open.d.ts +4 -0
  560. package/server/routes/open.d.ts.map +1 -0
  561. package/server/routes/open.js +21 -0
  562. package/server/routes/open.js.map +1 -0
  563. package/server/routes/pane-commands.d.ts +9 -0
  564. package/server/routes/pane-commands.d.ts.map +1 -0
  565. package/server/routes/pane-commands.js +23 -0
  566. package/server/routes/pane-commands.js.map +1 -0
  567. package/server/routes/projects.d.ts +15 -0
  568. package/server/routes/projects.d.ts.map +1 -0
  569. package/server/routes/projects.js +363 -0
  570. package/server/routes/projects.js.map +1 -0
  571. package/server/routes/server-notices.d.ts +4 -0
  572. package/server/routes/server-notices.d.ts.map +1 -0
  573. package/server/routes/server-notices.js +29 -0
  574. package/server/routes/server-notices.js.map +1 -0
  575. package/server/routes/service-config.d.ts +11 -0
  576. package/server/routes/service-config.d.ts.map +1 -0
  577. package/server/routes/service-config.js +64 -0
  578. package/server/routes/service-config.js.map +1 -0
  579. package/server/routes/sessions.d.ts +7 -0
  580. package/server/routes/sessions.d.ts.map +1 -0
  581. package/server/routes/sessions.js +218 -0
  582. package/server/routes/sessions.js.map +1 -0
  583. package/server/service/caffeinate.d.ts +33 -0
  584. package/server/service/caffeinate.d.ts.map +1 -0
  585. package/server/service/caffeinate.js +72 -0
  586. package/server/service/caffeinate.js.map +1 -0
  587. package/server/state/app-state.d.ts +167 -0
  588. package/server/state/app-state.d.ts.map +1 -0
  589. package/server/state/app-state.js +335 -0
  590. package/server/state/app-state.js.map +1 -0
  591. package/server/state/project-manager.d.ts +30 -0
  592. package/server/state/project-manager.d.ts.map +1 -0
  593. package/server/state/project-manager.js +128 -0
  594. package/server/state/project-manager.js.map +1 -0
  595. package/server/state/server-notices.d.ts +12 -0
  596. package/server/state/server-notices.d.ts.map +1 -0
  597. package/server/state/server-notices.js +32 -0
  598. package/server/state/server-notices.js.map +1 -0
  599. package/server/state/worktree-cache.d.ts +25 -0
  600. package/server/state/worktree-cache.d.ts.map +1 -0
  601. package/server/state/worktree-cache.js +53 -0
  602. package/server/state/worktree-cache.js.map +1 -0
  603. package/server/ws/events.d.ts +45 -0
  604. package/server/ws/events.d.ts.map +1 -0
  605. package/server/ws/events.js +134 -0
  606. package/server/ws/events.js.map +1 -0
  607. package/server/ws/keepalive.d.ts +27 -0
  608. package/server/ws/keepalive.d.ts.map +1 -0
  609. package/server/ws/keepalive.js +63 -0
  610. package/server/ws/keepalive.js.map +1 -0
  611. package/server/ws/terminal-attach.d.ts +13 -0
  612. package/server/ws/terminal-attach.d.ts.map +1 -0
  613. package/server/ws/terminal-attach.js +233 -0
  614. package/server/ws/terminal-attach.js.map +1 -0
  615. package/server/ws/terminal-flow.d.ts +17 -0
  616. package/server/ws/terminal-flow.d.ts.map +1 -0
  617. package/server/ws/terminal-flow.js +64 -0
  618. package/server/ws/terminal-flow.js.map +1 -0
  619. package/server/ws/terminal.d.ts +69 -0
  620. package/server/ws/terminal.d.ts.map +1 -0
  621. package/server/ws/terminal.js +311 -0
  622. package/server/ws/terminal.js.map +1 -0
  623. package/web/assets/EditorPane-CzzT3iYY.js +123 -0
  624. package/web/assets/SymbolsNerdFontMono-Regular-CwEZqMeU.woff2 +0 -0
  625. package/web/assets/TerminalPane-CjbYzePr.js +68 -0
  626. package/web/assets/TerminalPane-DkTCHfhq.css +1 -0
  627. package/web/assets/file-icons-JBi09j0r.js +6 -0
  628. package/web/assets/index-CTTkRpnn.css +2 -0
  629. package/web/assets/index-CmhewzMp.js +34 -0
  630. package/web/assets/session-resume-7f-tB-ZU.js +2 -0
  631. package/web/assets/terminal-trace-PuuFRybC.js +2803 -0
  632. package/web/assets/useVirtualKeyboard-DgJb9u9d.js +1 -0
  633. package/web/index.html +52 -0
@@ -0,0 +1,123 @@
1
+ import { expandUserHome } from "../../lib/path.js";
2
+ import { WorkspaceConflictError, WorkspaceNotFoundError } from "./errors.js";
3
+ function removePaneBySessionId(node, sessionId) {
4
+ if (node.type === "terminal") {
5
+ return node.sessionId === sessionId ? null : node;
6
+ }
7
+ if (node.type === "split") {
8
+ const children = [];
9
+ const sizes = [];
10
+ for (let index = 0; index < node.children.length; index++) {
11
+ const child = removePaneBySessionId(node.children[index], sessionId);
12
+ if (child !== null) {
13
+ children.push(child);
14
+ sizes.push(node.sizes[index]);
15
+ }
16
+ }
17
+ if (children.length === 0)
18
+ return null;
19
+ if (children.length === 1)
20
+ return children[0];
21
+ return { ...node, children, sizes };
22
+ }
23
+ return node;
24
+ }
25
+ export function createSessionCommands({ appStateStore, eventBus, ptyManager, }) {
26
+ return {
27
+ async createSession(input) {
28
+ const project = appStateStore
29
+ .get()
30
+ .projects.find((entry) => entry.id === input.projectId);
31
+ if (!project) {
32
+ throw new WorkspaceNotFoundError("Project not found");
33
+ }
34
+ const session = await ptyManager.create({
35
+ projectId: input.projectId,
36
+ command: input.command ?? { type: "shell" },
37
+ cwd: expandUserHome(input.cwd ?? project.path),
38
+ ...(input.title !== undefined && { title: input.title }),
39
+ ...(input.bootstrapInput !== undefined && {
40
+ bootstrapInput: input.bootstrapInput,
41
+ }),
42
+ });
43
+ eventBus.broadcast({ type: "session-created", session });
44
+ return session;
45
+ },
46
+ async setSessionPinned(id, pinned) {
47
+ const session = ptyManager.get(id);
48
+ if (!session) {
49
+ throw new WorkspaceNotFoundError();
50
+ }
51
+ const changed = ptyManager.setPinned(id, pinned);
52
+ if (changed) {
53
+ eventBus.broadcast({
54
+ type: "session-pin-changed",
55
+ sessionId: id,
56
+ pinned,
57
+ });
58
+ }
59
+ const latest = ptyManager.get(id);
60
+ return latest ?? session;
61
+ },
62
+ async setSessionTitle(id, rawTitle) {
63
+ const session = ptyManager.get(id);
64
+ if (!session) {
65
+ throw new WorkspaceNotFoundError();
66
+ }
67
+ const title = rawTitle.trim();
68
+ const titleManual = title.length > 0;
69
+ const changed = ptyManager.setTitle(id, title, titleManual);
70
+ if (changed) {
71
+ eventBus.broadcast({
72
+ type: "session-title-changed",
73
+ sessionId: id,
74
+ title,
75
+ titleManual,
76
+ });
77
+ }
78
+ const latest = ptyManager.get(id);
79
+ return latest ?? session;
80
+ },
81
+ async restartSession(id) {
82
+ const session = ptyManager.get(id);
83
+ if (!session) {
84
+ throw new WorkspaceNotFoundError();
85
+ }
86
+ if (session.state !== "ended") {
87
+ throw new WorkspaceConflictError("Session is not ended");
88
+ }
89
+ const restarted = await ptyManager.restart(id);
90
+ eventBus.broadcast({
91
+ type: "session-restarted",
92
+ session: restarted,
93
+ generation: restarted.generation,
94
+ });
95
+ return restarted;
96
+ },
97
+ async deleteSession(id) {
98
+ const session = ptyManager.get(id);
99
+ if (!session) {
100
+ throw new WorkspaceNotFoundError();
101
+ }
102
+ await ptyManager.dispose(id);
103
+ appStateStore.mutateProjectStates((state) => {
104
+ const projectState = state.projectStates[session.projectId];
105
+ if (!projectState?.layout)
106
+ return;
107
+ const layout = removePaneBySessionId(projectState.layout, id);
108
+ projectState.layout = layout;
109
+ eventBus.broadcast({
110
+ type: "layout-updated",
111
+ projectId: session.projectId,
112
+ layout,
113
+ });
114
+ });
115
+ eventBus.broadcast({
116
+ type: "session-closed",
117
+ sessionId: id,
118
+ projectId: session.projectId,
119
+ });
120
+ },
121
+ };
122
+ }
123
+ //# sourceMappingURL=session-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-commands.js","sourceRoot":"","sources":["../../../src/application/workspace/session-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PtyHost } from "../../pty/host.js";
2
+ interface CreateSessionQueriesDeps {
3
+ ptyManager: PtyHost;
4
+ platform?: NodeJS.Platform;
5
+ readProcessCwd?: (pid: number, fallback: string) => Promise<string>;
6
+ }
7
+ export declare function createSessionQueries({ ptyManager, platform, readProcessCwd, }: CreateSessionQueriesDeps): {
8
+ listSessions(projectId?: string): import("@parasor/shared").Session[];
9
+ getSessionCwd(id: string): Promise<{
10
+ cwd: string;
11
+ }>;
12
+ };
13
+ export {};
14
+ //# sourceMappingURL=session-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-queries.d.ts","sourceRoot":"","sources":["../../../src/application/workspace/session-queries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjD,UAAU,wBAAwB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACrE;AA+BD,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,QAA2B,EAC3B,cACgD,GACjD,EAAE,wBAAwB;6BAEE,MAAM;sBAMP,MAAM;;;EAYjC"}
@@ -0,0 +1,47 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readlink } from "node:fs/promises";
3
+ import { promisify } from "node:util";
4
+ import { WorkspaceConflictError, WorkspaceNotFoundError } from "./errors.js";
5
+ const execFileAsync = promisify(execFile);
6
+ async function defaultReadProcessCwd(pid, fallback, platform = process.platform) {
7
+ try {
8
+ if (platform === "darwin") {
9
+ const { stdout } = await execFileAsync("lsof", [
10
+ "-a",
11
+ "-d",
12
+ "cwd",
13
+ "-p",
14
+ String(pid),
15
+ "-F",
16
+ "n",
17
+ ]);
18
+ const lines = stdout.trim().split("\n");
19
+ const cwdLine = lines.findLast((line) => line.startsWith("n") && line !== "ncwd");
20
+ return cwdLine?.slice(1) || fallback;
21
+ }
22
+ return (await readlink(`/proc/${pid}/cwd`)) || fallback;
23
+ }
24
+ catch {
25
+ return fallback;
26
+ }
27
+ }
28
+ export function createSessionQueries({ ptyManager, platform = process.platform, readProcessCwd = (pid, fallback) => defaultReadProcessCwd(pid, fallback, platform), }) {
29
+ return {
30
+ listSessions(projectId) {
31
+ return projectId
32
+ ? ptyManager.listByProject(projectId)
33
+ : ptyManager.list();
34
+ },
35
+ async getSessionCwd(id) {
36
+ const session = ptyManager.get(id);
37
+ if (!session) {
38
+ throw new WorkspaceNotFoundError();
39
+ }
40
+ if (session.state !== "running" || session.pid === null) {
41
+ throw new WorkspaceConflictError("Session not running");
42
+ }
43
+ return { cwd: await readProcessCwd(session.pid, session.cwd) };
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=session-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-queries.js","sourceRoot":"","sources":["../../../src/application/workspace/session-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,KAAK,UAAU,qBAAqB,CAClC,GAAW,EACX,QAAgB,EAChB,QAAQ,GAAG,OAAO,CAAC,QAAQ;IAE3B,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;gBAC7C,IAAI;gBACJ,IAAI;gBACJ,KAAK;gBACL,IAAI;gBACJ,MAAM,CAAC,GAAG,CAAC;gBACX,IAAI;gBACJ,GAAG;aACJ,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAC5B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,MAAM,CAClD,CAAC;YACF,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QACvC,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EACnC,UAAU,EACV,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAC3B,cAAc,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CACjC,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,GACvB;IACzB,OAAO;QACL,YAAY,CAAC,SAAkB;YAC7B,OAAO,SAAS;gBACd,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC;gBACrC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,EAAU;YAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,sBAAsB,EAAE,CAAC;YACrC,CAAC;YACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;gBACxD,MAAM,IAAI,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,98 @@
1
+ import type { Worktree, WorktreeLocalFileCopyResult } from "@parasor/shared";
2
+ import type { ProjectManager } from "../../state/project-manager.js";
3
+ import type { EventPublisher } from "../ports.js";
4
+ export interface CreateWorktreeInput {
5
+ branch: string;
6
+ base?: string;
7
+ copyLocalFiles?: unknown;
8
+ }
9
+ export interface CreateWorktreeResult {
10
+ path: string;
11
+ head: string;
12
+ branch: string;
13
+ localFileCopies?: WorktreeLocalFileCopyResult[];
14
+ }
15
+ interface CreateWorktreeCommandsDeps {
16
+ projectManager: ProjectManager;
17
+ eventBus: EventPublisher;
18
+ /**
19
+ * Returns the registered worktrees for a project. Used to fence client-supplied
20
+ * `worktreePath` against arbitrary local paths before running git. The empty
21
+ * array is a valid result for projects that have not yet been hydrated.
22
+ */
23
+ getProjectWorktrees: (projectId: string) => Worktree[];
24
+ runGit?: (projectPath: string, args: string[]) => Promise<{
25
+ stdout: string;
26
+ stderr: string;
27
+ }>;
28
+ pathExists?: (target: string) => Promise<boolean>;
29
+ /**
30
+ * Probe whether `projectPath` lives inside a git work tree. Defaults to
31
+ * `git rev-parse --is-inside-work-tree`; tests inject a stub so they can
32
+ * keep using the simple non-arg-aware `runGit` mock.
33
+ */
34
+ isInsideGitRepo?: (projectPath: string) => Promise<boolean>;
35
+ /**
36
+ * Override the realpath-based fence helper. Provided for tests that operate
37
+ * on synthetic paths; production code uses {@link resolveWorktreePath}.
38
+ */
39
+ resolveWorktree?: (projectPath: string, worktreePath: string, registered: Worktree[]) => Promise<string>;
40
+ copyLocalFiles?: (projectPath: string, worktreePath: string, selectedPaths: unknown) => Promise<WorktreeLocalFileCopyResult[]>;
41
+ }
42
+ /**
43
+ * Best-effort branch name validation matching common `git check-ref-format`
44
+ * rules. Server still relies on git itself to surface the final error;
45
+ * this only filters obvious shell hazards.
46
+ */
47
+ export declare function validateBranchName(branch: string): string | null;
48
+ /**
49
+ * Default worktree placement: sibling directory `{projectPath}.worktrees/{branch}`.
50
+ * Matches the convention used by GitLens, editor worktree extensions, and
51
+ * JetBrains IDEs.
52
+ */
53
+ export declare function defaultWorktreePath(projectPath: string, branch: string): string;
54
+ export interface FenceWorktreePathDeps {
55
+ projectManager: ProjectManager;
56
+ /** Registered worktrees for a project -- see CreateWorktreeCommandsDeps. */
57
+ getProjectWorktrees: (projectId: string) => Worktree[];
58
+ /** Realpath-based fence; defaults to {@link resolveWorktreePath}. */
59
+ resolveWorktree?: (projectPath: string, worktreePath: string, registered: Worktree[]) => Promise<string>;
60
+ }
61
+ /**
62
+ * Fence a client-supplied path against the project's registered worktrees
63
+ * (project root + each `git worktree list` entry). Returns the realpath-
64
+ * resolved canonical path that callers MUST pass to git, so symlink and
65
+ * case-insensitive filesystem aliases reach the same on-disk repo.
66
+ *
67
+ * Single source for both the worktree-command closure and the route helpers.
68
+ * Throws `WorkspaceNotFoundError`:
69
+ * - `kind === "project"` (default) when the project id is unknown
70
+ * - `kind === "worktree"` when the path is not a registered worktree
71
+ */
72
+ export declare function fenceWorktreePathWith(deps: FenceWorktreePathDeps, projectId: string, worktreePath: string): Promise<{
73
+ projectPath: string;
74
+ resolved: string;
75
+ }>;
76
+ export declare function createWorktreeCommands({ projectManager, eventBus, getProjectWorktrees, runGit, pathExists, isInsideGitRepo, resolveWorktree, copyLocalFiles, }: CreateWorktreeCommandsDeps): {
77
+ fenceWorktreePath: (projectId: string, worktreePath: string) => Promise<{
78
+ projectPath: string;
79
+ resolved: string;
80
+ }>;
81
+ createProjectWorktree(projectId: string, input: CreateWorktreeInput): Promise<CreateWorktreeResult>;
82
+ /**
83
+ * Rename the worktree's branch via `git branch -m old new`. The on-disk
84
+ * worktree directory keeps its original path -- `git worktree move` is
85
+ * intentionally out of scope here so the operation stays a single,
86
+ * cheap ref rename. Sidebar / topbar consumers display `branch`, so the
87
+ * UX still updates cleanly even though `path` lags the convention.
88
+ */
89
+ renameProjectWorktree(projectId: string, worktreePath: string, newBranch: string): Promise<{
90
+ oldBranch: string;
91
+ newBranch: string;
92
+ }>;
93
+ removeProjectWorktree(projectId: string, worktreePath: string, opts?: {
94
+ force?: boolean;
95
+ }): Promise<void>;
96
+ };
97
+ export {};
98
+ //# sourceMappingURL=worktree-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-commands.d.ts","sourceRoot":"","sources":["../../../src/application/workspace/worktree-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,323 @@
1
+ import { execFile } from "node:child_process";
2
+ import { access } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { promisify } from "node:util";
5
+ import { parseGitStatusV2 } from "../../fs/git-watcher.js";
6
+ import { resolveWorktreePath, WorktreeNotRegisteredError, } from "../../lib/git-exec.js";
7
+ import { WorkspaceConflictError, WorkspaceNotFoundError, WorkspaceValidationError, } from "./errors.js";
8
+ import { copyWorktreeLocalFiles } from "./worktree-local-files.js";
9
+ const execFileAsync = promisify(execFile);
10
+ async function defaultRunGit(projectPath, args) {
11
+ const { stdout, stderr } = await execFileAsync("git", ["-C", projectPath, ...args], { timeout: 15_000, maxBuffer: 16 * 1024 * 1024 });
12
+ return { stdout, stderr };
13
+ }
14
+ /**
15
+ * Hard ceiling on counter enrichment for a freshly created worktree. Set
16
+ * tighter than the underlying `runGit` 15s timeout so a locked / pathological
17
+ * repo cannot delay the `worktree-created` broadcast or the HTTP response.
18
+ */
19
+ const ENRICH_DEADLINE_MS = 3000;
20
+ async function raceWithDeadline(task, deadlineMs) {
21
+ let timer;
22
+ const timeout = new Promise((resolve) => {
23
+ timer = setTimeout(() => resolve(undefined), deadlineMs);
24
+ });
25
+ try {
26
+ return await Promise.race([task, timeout]);
27
+ }
28
+ finally {
29
+ if (timer)
30
+ clearTimeout(timer);
31
+ }
32
+ }
33
+ async function defaultPathExists(target) {
34
+ try {
35
+ await access(target);
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: git branch validation must reject C0/DEL control bytes.
43
+ const BRANCH_INVALID_CHARS = /[\s\x00-\x1f\x7f~^:?*[\\@]/;
44
+ /**
45
+ * Best-effort branch name validation matching common `git check-ref-format`
46
+ * rules. Server still relies on git itself to surface the final error;
47
+ * this only filters obvious shell hazards.
48
+ */
49
+ export function validateBranchName(branch) {
50
+ if (!branch || branch.length > 200)
51
+ return "Branch name is required";
52
+ if (BRANCH_INVALID_CHARS.test(branch)) {
53
+ return "Branch name contains invalid characters";
54
+ }
55
+ if (branch.includes("..") || branch.includes("@{")) {
56
+ return "Branch name contains invalid sequence";
57
+ }
58
+ if (branch.startsWith("-") ||
59
+ branch.startsWith("/") ||
60
+ branch.startsWith(".") ||
61
+ branch.endsWith("/") ||
62
+ branch.endsWith(".") ||
63
+ branch.endsWith(".lock")) {
64
+ return "Branch name starts or ends with a reserved character";
65
+ }
66
+ for (const segment of branch.split("/")) {
67
+ if (segment.length === 0)
68
+ return "Branch name has empty path segment";
69
+ if (segment.startsWith(".") || segment.endsWith(".lock")) {
70
+ return "Branch name has invalid path segment";
71
+ }
72
+ }
73
+ return null;
74
+ }
75
+ /**
76
+ * Default worktree placement: sibling directory `{projectPath}.worktrees/{branch}`.
77
+ * Matches the convention used by GitLens, editor worktree extensions, and
78
+ * JetBrains IDEs.
79
+ */
80
+ export function defaultWorktreePath(projectPath, branch) {
81
+ const trimmed = projectPath.replace(/\/+$/, "");
82
+ return path.join(`${trimmed}.worktrees`, branch);
83
+ }
84
+ /**
85
+ * Fence a client-supplied path against the project's registered worktrees
86
+ * (project root + each `git worktree list` entry). Returns the realpath-
87
+ * resolved canonical path that callers MUST pass to git, so symlink and
88
+ * case-insensitive filesystem aliases reach the same on-disk repo.
89
+ *
90
+ * Single source for both the worktree-command closure and the route helpers.
91
+ * Throws `WorkspaceNotFoundError`:
92
+ * - `kind === "project"` (default) when the project id is unknown
93
+ * - `kind === "worktree"` when the path is not a registered worktree
94
+ */
95
+ export async function fenceWorktreePathWith(deps, projectId, worktreePath) {
96
+ const { projectManager, getProjectWorktrees } = deps;
97
+ const resolveWorktree = deps.resolveWorktree ?? resolveWorktreePath;
98
+ const project = projectManager.get(projectId);
99
+ if (!project)
100
+ throw new WorkspaceNotFoundError();
101
+ try {
102
+ const resolved = await resolveWorktree(project.path, worktreePath, getProjectWorktrees(projectId));
103
+ return { projectPath: project.path, resolved };
104
+ }
105
+ catch (err) {
106
+ if (err instanceof WorktreeNotRegisteredError) {
107
+ // Tag as "worktree" so the route layer preserves the original
108
+ // WorktreeNotRegisteredError message distinctly from the
109
+ // project-missing "Project not found" body.
110
+ throw new WorkspaceNotFoundError(err.message, "worktree");
111
+ }
112
+ throw err;
113
+ }
114
+ }
115
+ export function createWorktreeCommands({ projectManager, eventBus, getProjectWorktrees, runGit = defaultRunGit, pathExists = defaultPathExists, isInsideGitRepo = (projectPath) => defaultIsInsideGitRepo(projectPath, runGit), resolveWorktree = resolveWorktreePath, copyLocalFiles = copyWorktreeLocalFiles, }) {
116
+ const fenceWorktreePath = (projectId, worktreePath) => fenceWorktreePathWith({ projectManager, getProjectWorktrees, resolveWorktree }, projectId, worktreePath);
117
+ return {
118
+ fenceWorktreePath,
119
+ async createProjectWorktree(projectId, input) {
120
+ const project = projectManager.get(projectId);
121
+ if (!project)
122
+ throw new WorkspaceNotFoundError();
123
+ const branch = input.branch.trim();
124
+ const validation = validateBranchName(branch);
125
+ if (validation)
126
+ throw new WorkspaceValidationError(validation);
127
+ const base = input.base?.trim();
128
+ if (base) {
129
+ const baseValidation = validateBranchName(base);
130
+ if (baseValidation) {
131
+ throw new WorkspaceValidationError(`base: ${baseValidation}`);
132
+ }
133
+ }
134
+ if (!(await isInsideGitRepo(project.path))) {
135
+ throw new WorkspaceValidationError("Not a git repository");
136
+ }
137
+ const worktreePath = defaultWorktreePath(project.path, branch);
138
+ if (await pathExists(worktreePath)) {
139
+ throw new WorkspaceConflictError(`Path already exists: ${worktreePath}`);
140
+ }
141
+ const branchExists = await branchRefExists(project.path, branch, runGit);
142
+ const args = branchExists
143
+ ? ["worktree", "add", worktreePath, branch]
144
+ : [
145
+ "worktree",
146
+ "add",
147
+ "-b",
148
+ branch,
149
+ worktreePath,
150
+ base && base.length > 0 ? base : "HEAD",
151
+ ];
152
+ try {
153
+ await runGit(project.path, args);
154
+ }
155
+ catch (error) {
156
+ const message = error instanceof Error ? error.message : "git worktree add failed";
157
+ throw new WorkspaceConflictError(message);
158
+ }
159
+ let head = "";
160
+ try {
161
+ const { stdout } = await runGit(project.path, [
162
+ "rev-parse",
163
+ `refs/heads/${branch}`,
164
+ ]);
165
+ head = stdout.trim();
166
+ }
167
+ catch {
168
+ /* ignore -- head stays empty if rev-parse cannot resolve */
169
+ }
170
+ const result = {
171
+ path: worktreePath,
172
+ head,
173
+ branch,
174
+ };
175
+ const localFileCopies = await copyLocalFiles(project.path, worktreePath, input.copyLocalFiles);
176
+ if (localFileCopies.length > 0) {
177
+ result.localFileCopies = localFileCopies;
178
+ }
179
+ // Best-effort counter enrichment for the freshly created worktree.
180
+ // Bounded by ENRICH_DEADLINE_MS so a slow / locked repo cannot stall the
181
+ // HTTP response and the sidebar broadcast. On timeout we broadcast
182
+ // without counters; the sidebar will fill in zeros and the next
183
+ // git-state poll covers this path.
184
+ const counters = await raceWithDeadline((async () => {
185
+ try {
186
+ const { stdout } = await runGit(worktreePath, [
187
+ "status",
188
+ "--porcelain=v2",
189
+ "-b",
190
+ ]);
191
+ return parseGitStatusV2(stdout);
192
+ }
193
+ catch {
194
+ return undefined;
195
+ }
196
+ })(), ENRICH_DEADLINE_MS);
197
+ eventBus.broadcast({
198
+ type: "worktree-created",
199
+ projectId,
200
+ worktree: { ...result, ...(counters ?? {}) },
201
+ });
202
+ return result;
203
+ },
204
+ /**
205
+ * Rename the worktree's branch via `git branch -m old new`. The on-disk
206
+ * worktree directory keeps its original path -- `git worktree move` is
207
+ * intentionally out of scope here so the operation stays a single,
208
+ * cheap ref rename. Sidebar / topbar consumers display `branch`, so the
209
+ * UX still updates cleanly even though `path` lags the convention.
210
+ */
211
+ async renameProjectWorktree(projectId, worktreePath, newBranch) {
212
+ const trimmedNew = newBranch.trim();
213
+ const validation = validateBranchName(trimmedNew);
214
+ if (validation)
215
+ throw new WorkspaceValidationError(validation);
216
+ const { resolved } = await fenceWorktreePath(projectId, worktreePath);
217
+ let oldBranch = "";
218
+ try {
219
+ const { stdout } = await runGit(resolved, [
220
+ "rev-parse",
221
+ "--abbrev-ref",
222
+ "HEAD",
223
+ ]);
224
+ oldBranch = stdout.trim();
225
+ }
226
+ catch (err) {
227
+ const message = err instanceof Error ? err.message : "rev-parse HEAD failed";
228
+ throw new WorkspaceConflictError(message);
229
+ }
230
+ if (!oldBranch || oldBranch === "HEAD") {
231
+ throw new WorkspaceConflictError("Cannot rename a detached HEAD worktree");
232
+ }
233
+ if (oldBranch === trimmedNew) {
234
+ return { oldBranch, newBranch: trimmedNew };
235
+ }
236
+ try {
237
+ await runGit(resolved, ["branch", "-m", oldBranch, trimmedNew]);
238
+ }
239
+ catch (err) {
240
+ const message = err instanceof Error ? err.message : "git branch -m failed";
241
+ throw new WorkspaceConflictError(message);
242
+ }
243
+ eventBus.broadcast({
244
+ type: "worktree-renamed",
245
+ projectId,
246
+ worktreePath: resolved,
247
+ oldBranch,
248
+ newBranch: trimmedNew,
249
+ });
250
+ return { oldBranch, newBranch: trimmedNew };
251
+ },
252
+ async removeProjectWorktree(projectId, worktreePath, opts = {}) {
253
+ const project = projectManager.get(projectId);
254
+ if (!project)
255
+ throw new WorkspaceNotFoundError();
256
+ // Orphan path: on-disk dir gone -> `git worktree remove` and the realpath fence both throw ENOENT, so prune by exact-string match instead.
257
+ const registered = getProjectWorktrees(projectId);
258
+ const cachedHit = registered.find((w) => w.path === worktreePath);
259
+ if (cachedHit && !(await pathExists(worktreePath))) {
260
+ try {
261
+ await runGit(project.path, ["worktree", "prune"]);
262
+ }
263
+ catch (err) {
264
+ const message = err instanceof Error ? err.message : "git worktree prune failed";
265
+ throw new WorkspaceConflictError(message);
266
+ }
267
+ eventBus.broadcast({
268
+ type: "worktree-removed",
269
+ projectId,
270
+ worktreePath: cachedHit.path,
271
+ });
272
+ return;
273
+ }
274
+ const { projectPath, resolved } = await fenceWorktreePath(projectId, worktreePath);
275
+ // `--` separator before the path keeps git from interpreting an unusual
276
+ // realpath (e.g. starting with `-`) as an option, even though the fence
277
+ // already restricts it to a registered worktree.
278
+ const args = ["worktree", "remove"];
279
+ if (opts.force === true)
280
+ args.push("--force");
281
+ args.push("--", resolved);
282
+ try {
283
+ await runGit(projectPath, args);
284
+ }
285
+ catch (err) {
286
+ const message = err instanceof Error ? err.message : "git worktree remove failed";
287
+ throw new WorkspaceConflictError(message);
288
+ }
289
+ eventBus.broadcast({
290
+ type: "worktree-removed",
291
+ projectId,
292
+ worktreePath: resolved,
293
+ });
294
+ },
295
+ };
296
+ }
297
+ async function branchRefExists(projectPath, branch, runGit) {
298
+ try {
299
+ await runGit(projectPath, [
300
+ "show-ref",
301
+ "--verify",
302
+ "--quiet",
303
+ `refs/heads/${branch}`,
304
+ ]);
305
+ return true;
306
+ }
307
+ catch {
308
+ return false;
309
+ }
310
+ }
311
+ async function defaultIsInsideGitRepo(projectPath, runGit) {
312
+ try {
313
+ const { stdout } = await runGit(projectPath, [
314
+ "rev-parse",
315
+ "--is-inside-work-tree",
316
+ ]);
317
+ return stdout.trim() === "true";
318
+ }
319
+ catch {
320
+ return false;
321
+ }
322
+ }
323
+ //# sourceMappingURL=worktree-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-commands.js","sourceRoot":"","sources":["../../../src/application/workspace/worktree-commands.ts"],"names":[],"mappings":"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"}