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,611 @@
1
+ /*
2
+ * -- `parasor-pty-host` daemon bootstrap.
3
+ *
4
+ * `bootstrapDaemon` wires the runtime path layer (paths.ts), the
5
+ * single-instance lock layer (lockfile.ts), the IPC accept loop, and the
6
+ * `PtyHostDaemon` core into one start/stop lifecycle. It does *not* parse
7
+ * argv / write logs / fork to background -- those are the entry-point's
8
+ * job (entry.ts) so tests can drive bootstrap without touching the host
9
+ * process state.
10
+ *
11
+ * Design notes:
12
+ * - `acceptUnix` (default true) listens on `paths.socketPath`. Tests
13
+ * pass `acceptUnix: false` + `acceptTcpPort: 0` to avoid macOS
14
+ * sandbox-exec restrictions on Unix-socket bind() (Mach lookup).
15
+ * - SIGTERM/SIGINT trigger graceful shutdown: dispose daemon (drops
16
+ * current server, leaves underlying PTYs alone -- that's the daemon-mode
17
+ * contract), close listening socket, dispose host, drop
18
+ * lockfile/socket. Idempotent -- repeated signals are a no-op.
19
+ * - Caller-supplied `host` overrides the default in-process host.
20
+ * Useful for tests that bring their own `PtyHost` mock.
21
+ */
22
+ import { existsSync, unlinkSync } from "node:fs";
23
+ import * as net from "node:net";
24
+ import { homedir } from "node:os";
25
+ import { join as pathJoin } from "node:path";
26
+ import { readAndClearDaemonShutdownMarker, writeDaemonShutdownMarker, } from "../../bootstrap/shutdown-marker.js";
27
+ import { InProcessPtyHost } from "../in-process-host.js";
28
+ import { PtyHostDaemon } from "./daemon.js";
29
+ import { acquireDaemonLock, DaemonAlreadyRunningError, } from "./lockfile.js";
30
+ import { acquireAppStateOwnership, markerFileFor, } from "./mode-marker.js";
31
+ import { reconcileSessionRecords } from "./orphan-cleanup.js";
32
+ import { ensureRuntimeDir, resolveDaemonPaths, } from "./paths.js";
33
+ function defaultAppStateDir(env = process.env) {
34
+ return env.PARASOR_CONFIG_DIR ?? pathJoin(homedir(), ".config", "parasor");
35
+ }
36
+ const DEFAULT_SIGNALS = ["SIGTERM", "SIGINT"];
37
+ export async function bootstrapDaemon(opts = {}) {
38
+ const paths = opts.paths ?? resolveDaemonPaths();
39
+ const log = opts.log ?? (() => { });
40
+ const acceptUnix = opts.acceptUnix ?? true;
41
+ const acquire = opts.acquireLock ?? true;
42
+ ensureRuntimeDir(paths.runtimeDir);
43
+ /*
44
+ * refuse to start if a live in-process server already
45
+ * owns the AppStateStore. The check is done *after* the daemon lock
46
+ * is acquired so two daemons racing on the same runtime dir cannot
47
+ * both write the marker and then have the loser's lock-failure path
48
+ * unlink the winner's marker (reviewed for correctness). Lock acquisition
49
+ * is the actual mutex; marker reads/writes piggy-back its serialisation.
50
+ *
51
+ * The marker file lives in the AppState dir (`paths.appStateDir`),
52
+ * not the daemon runtime dir -- it must collide with whatever path
53
+ * the in-process server uses for state.json, regardless of the
54
+ * daemon's `XDG_RUNTIME_DIR` / `PARASOR_PTY_SOCK` overrides
55
+ * (reviewed for correctness).
56
+ */
57
+ let lock = null;
58
+ if (acquire) {
59
+ lock = await acquireDaemonLock(paths);
60
+ }
61
+ /*
62
+ * Design contract: the marker file lives next to
63
+ * whichever `state.json` *this* store will open. We derive the dir
64
+ * without instantiating the store (creating it triggers
65
+ * `mkdir`/`load` side effects we want sequenced after the conflict
66
+ * check):
67
+ * 1) explicit `opts.appStateDir` (tests / custom layouts)
68
+ * 2) `opts.store.getDir()` if a store was supplied
69
+ * 3) `PARASOR_CONFIG_DIR` env or `~/.config/parasor` (matches
70
+ * `AppStateStore`'s own default)
71
+ * `acquireAppStateOwnership` holds a proper-lockfile advisory lock
72
+ * on the marker file for the daemon's lifetime -- the same primitive
73
+ * we use for the daemon-runtime lockfile. The lock is the mutex; the
74
+ * marker body is informational diagnostics for `parasor doctor`.
75
+ */
76
+ const enforceMarker = opts.enforceModeMarker ?? true;
77
+ const appStateDir = opts.appStateDir ??
78
+ (opts.store && typeof opts.store.getDir === "function"
79
+ ? opts.store.getDir()
80
+ : defaultAppStateDir());
81
+ const markerFile = markerFileFor(appStateDir);
82
+ let appStateOwner = null;
83
+ if (enforceMarker) {
84
+ try {
85
+ appStateOwner = await acquireAppStateOwnership(markerFile, "daemon");
86
+ }
87
+ catch (err) {
88
+ if (lock)
89
+ await lock.release();
90
+ throw err;
91
+ }
92
+ }
93
+ /*
94
+ * Socket probe -- defensive layer over `proper-lockfile`.
95
+ *
96
+ * proper-lockfile is mtime + stale-timeout based, not kernel flock. A
97
+ * live daemon whose event loop is stalled, whose host machine slept, or
98
+ * whose lockfile mtime got skewed by a clock jump can have its lock
99
+ * declared stale even though it is still bound to `paths.socketPath`
100
+ * and still accepting connections. Without this probe two daemons
101
+ * could end up sharing the runtime dir (split-brain).
102
+ *
103
+ * The probe is the *only* signal we trust here: kernel-bound sockets
104
+ * survive sleep, so an alive `connect()` is unambiguous proof that a
105
+ * daemon is listening. Conversely ECONNREFUSED / ENOENT prove the file
106
+ * is a leftover with no listener -- exactly the recycled-PID and
107
+ * crash-restart paths we want to allow.
108
+ */
109
+ if (acceptUnix && existsSync(paths.socketPath)) {
110
+ if (await isSocketActive(paths.socketPath, 200)) {
111
+ if (lock)
112
+ await lock.release();
113
+ if (appStateOwner)
114
+ await appStateOwner.release();
115
+ throw new DaemonAlreadyRunningError(-1, paths.pidFile);
116
+ }
117
+ try {
118
+ unlinkSync(paths.socketPath);
119
+ }
120
+ catch (err) {
121
+ if (lock)
122
+ await lock.release();
123
+ if (appStateOwner)
124
+ await appStateOwner.release();
125
+ throw err;
126
+ }
127
+ }
128
+ const ownsHost = opts.host === undefined;
129
+ let store = opts.store;
130
+ let host;
131
+ let daemonStartedAt = null;
132
+ if (opts.host) {
133
+ host = opts.host;
134
+ }
135
+ else {
136
+ if (!store) {
137
+ // Default store path matches AppStateStore's own default. We pass
138
+ // the default explicitly so tests can override paths.host without
139
+ // also having to plumb a store.
140
+ const { AppStateStore: AppStateStoreCtor } = await import("../../state/app-state.js");
141
+ store = new AppStateStoreCtor({ dir: appStateDir });
142
+ }
143
+ /*
144
+ * -- every SessionRecord written by this
145
+ * daemon carries our (pid, startedAt) tuple. orphan-cleanup uses
146
+ * the tuple at next-boot to distinguish records this generation
147
+ * just created from records inherited from a previous daemon. The
148
+ * timestamp is captured *here* (lock acquired, before any record
149
+ * mutation) so it is a stable identifier for the daemon's lifetime.
150
+ * Reused by reconcileSessionRecords below so both the writer-side
151
+ * stamp and the boot-time orphan check see the exact same string --
152
+ * a sub-ms gap between two `new Date()` calls could otherwise mark
153
+ * this daemon's own freshly-written records as orphans.
154
+ */
155
+ daemonStartedAt = new Date().toISOString();
156
+ host = new InProcessPtyHost(store, null, {
157
+ pid: process.pid,
158
+ startedAt: daemonStartedAt,
159
+ }, opts.uploadsDir ?? null);
160
+ }
161
+ /*
162
+ * orphan reconciliation runs *before* we accept any IPC
163
+ * connections. Records left behind by a previous daemon generation
164
+ * (different (pid, startedAt) tuple) get marked "orphaned" if their
165
+ * underlying PTY is still alive, "lost" otherwise. The daemon owns
166
+ * the writer side, so we go through `internalMutate` to bypass the
167
+ * read-only mirror guard set by createPtyHost("remote").
168
+ *
169
+ * The reconcile only runs in the default ownsHost path: a caller-
170
+ * supplied `host` (test fixture, mock) brings its own state model
171
+ * and we don't presume access to its sessionRecords array.
172
+ */
173
+ if (ownsHost && store) {
174
+ const before = store.get().sessionRecords;
175
+ const result = reconcileSessionRecords(before, {
176
+ currentDaemonPid: process.pid,
177
+ currentDaemonStartedAt: daemonStartedAt ?? new Date().toISOString(),
178
+ });
179
+ if (result.transitions.some((t) => t.type === "orphaned" || t.type === "lost")) {
180
+ store.internalMutate((s) => {
181
+ s.sessionRecords = result.records;
182
+ });
183
+ for (const t of result.transitions) {
184
+ if (t.type === "orphaned") {
185
+ log(`orphan-reconcile: session=${t.id} -> orphaned (previous daemon pid=${t.previousDaemonPid})`);
186
+ }
187
+ else if (t.type === "lost") {
188
+ log(`orphan-reconcile: session=${t.id} -> lost (${t.reason})`);
189
+ }
190
+ }
191
+ }
192
+ }
193
+ /*
194
+ * -- daemon-side session continuity. The daemon
195
+ * persists sessions (state.json) so a kill-and-relaunch cycle preserves
196
+ * the user's tab list. The marker file at `<appStateDir>/daemon-shutdown.marker`
197
+ * lets us distinguish a clean SIGTERM (graceful) from an abrupt SIGKILL/OOM
198
+ * (crash); sessions that already carry an `endReason` (process exited
199
+ * before shutdown, or `shutdownAll` already stamped daemon-graceful)
200
+ * keep theirs untouched. Mirrors the index.ts:220 server-side path.
201
+ */
202
+ if (ownsHost && store) {
203
+ const wasGracefulShutdown = readAndClearDaemonShutdownMarker(appStateDir);
204
+ for (const session of store.get().sessions) {
205
+ host.loadPersistedSession(session, wasGracefulShutdown);
206
+ }
207
+ }
208
+ const daemon = new PtyHostDaemon({ host, store });
209
+ const servers = [];
210
+ let tcpPort = null;
211
+ /*
212
+ * Track every accepted socket so shutdown can force-close them. Without
213
+ * this, a peer that connects but never sends HELLO is invisible to
214
+ * `daemon.dispose()` (which only knows about the *current* peer) and
215
+ * keeps `net.Server.close()` waiting forever -- a single idle probe
216
+ * pins SIGTERM and prevents lockfile/socket cleanup. See the shutdown-safety guard
217
+ * "Daemon shutdown can hang forever on idle pre-HELLO sockets".
218
+ */
219
+ const accepted = new Set();
220
+ const trackSocket = (socket) => {
221
+ accepted.add(socket);
222
+ socket.once("close", () => accepted.delete(socket));
223
+ };
224
+ const onConnection = (socket) => {
225
+ trackSocket(socket);
226
+ try {
227
+ daemon.acceptConnection(socket);
228
+ }
229
+ catch (err) {
230
+ log(`accept error: ${err.message}`);
231
+ socket.destroy();
232
+ }
233
+ };
234
+ /*
235
+ * listen() can fail (EADDRINUSE on the TCP port,
236
+ * EACCES on the Unix path, ENOSPC, …) AFTER we've taken the lockfile
237
+ * and the AppState owner marker. Without explicit cleanup, a failed
238
+ * boot leaves the lockfile pinning the runtime dir for ~60s
239
+ * (proper-lockfile's stale window) and the marker preventing any
240
+ * server-side reconcile. Wrap the listen path so any reject runs the
241
+ * full release sequence before rethrowing.
242
+ */
243
+ const releaseAcquiredResources = async () => {
244
+ for (const s of servers) {
245
+ try {
246
+ await new Promise((resolve) => s.close(() => resolve()));
247
+ }
248
+ catch {
249
+ /* best-effort */
250
+ }
251
+ }
252
+ if (acceptUnix && existsSync(paths.socketPath)) {
253
+ try {
254
+ unlinkSync(paths.socketPath);
255
+ }
256
+ catch {
257
+ /* file may have been unlinked by failing listen() itself */
258
+ }
259
+ }
260
+ if (appStateOwner) {
261
+ try {
262
+ await appStateOwner.release();
263
+ }
264
+ catch {
265
+ /* best-effort */
266
+ }
267
+ }
268
+ if (lock) {
269
+ try {
270
+ await lock.release();
271
+ }
272
+ catch {
273
+ /* best-effort */
274
+ }
275
+ }
276
+ };
277
+ try {
278
+ if (acceptUnix) {
279
+ const unixServer = net.createServer(onConnection);
280
+ await new Promise((resolve, reject) => {
281
+ unixServer.once("error", reject);
282
+ unixServer.listen(paths.socketPath, () => {
283
+ unixServer.removeListener("error", reject);
284
+ resolve();
285
+ });
286
+ });
287
+ servers.push(unixServer);
288
+ }
289
+ if (typeof opts.acceptTcpPort === "number" && opts.acceptTcpPort >= 0) {
290
+ const tcpServer = net.createServer(onConnection);
291
+ await new Promise((resolve, reject) => {
292
+ tcpServer.once("error", reject);
293
+ tcpServer.listen(opts.acceptTcpPort, "127.0.0.1", () => {
294
+ tcpServer.removeListener("error", reject);
295
+ resolve();
296
+ });
297
+ });
298
+ const addr = tcpServer.address();
299
+ if (addr && typeof addr === "object")
300
+ tcpPort = addr.port;
301
+ servers.push(tcpServer);
302
+ }
303
+ }
304
+ catch (listenErr) {
305
+ await releaseAcquiredResources();
306
+ throw listenErr;
307
+ }
308
+ let stopped = false;
309
+ const shutdown = async (reason = "external") => {
310
+ if (stopped)
311
+ return;
312
+ stopped = true;
313
+ log(`shutdown reason=${reason}`);
314
+ daemon.dispose();
315
+ /*
316
+ * Destroy every accepted socket *before* awaiting server.close().
317
+ * Pre-HELLO probes that never became `currentServer` are invisible
318
+ * to daemon.dispose() -- without explicit destroy here, server.close()
319
+ * would block until those sockets close themselves and our shutdown
320
+ * could hang indefinitely (idle probe = no FIN). daemon.dispose()
321
+ * already FIN'd `currentServer`'s socket via evict(), so destroying
322
+ * it again is idempotent.
323
+ */
324
+ for (const sock of accepted) {
325
+ try {
326
+ sock.destroy();
327
+ }
328
+ catch {
329
+ /* socket already in error state */
330
+ }
331
+ }
332
+ accepted.clear();
333
+ await Promise.all(servers.map((s) => new Promise((resolve) => {
334
+ s.close(() => resolve());
335
+ })));
336
+ if (acceptUnix && existsSync(paths.socketPath)) {
337
+ try {
338
+ unlinkSync(paths.socketPath);
339
+ }
340
+ catch {
341
+ /* best-effort */
342
+ }
343
+ }
344
+ /*
345
+ * -- drain in-flight host-call chains before
346
+ * tearing the host down. By this point `daemon.dispose()` has
347
+ * flagged shutdown and evicted the current peer, and every accepted
348
+ * socket is destroyed, so no new requests can be handled. The
349
+ * remaining in-flight Promises (CREATE/RESTART/DISPOSE/INIT_CLIENT
350
+ * that were already mid-await on the host) still need to settle:
351
+ * their `.then` handlers persist sessions to state.json. Without
352
+ * this drain a CREATE that won the race against SIGTERM would
353
+ * spawn its PTY *after* shutdownAll iterated `this.sessions`,
354
+ * leaving an orphan child the next boot cannot reclaim.
355
+ */
356
+ let drained = true;
357
+ try {
358
+ drained = await daemon.drain(opts.drainTimeoutMs);
359
+ if (!drained) {
360
+ log("daemon drain timeout -- proceeding with shutdownAll, in-flight host calls may leak");
361
+ }
362
+ }
363
+ catch (err) {
364
+ drained = false;
365
+ log(`daemon drain error: ${err.message}`);
366
+ }
367
+ /*
368
+ * Daemon graceful shutdown terminates every
369
+ * owned PTY using a deterministic SIGTERM -> 5s grace -> SIGKILL
370
+ * escalation. This is *not* the server-side `detach()` semantic
371
+ * used when the server process shuts down and sessions stay alive inside
372
+ * the daemon. Here we are the daemon process exiting -- once we go the
373
+ * master fds close and PTY children receive SIGHUP at unpredictable
374
+ * timing, so we terminate the process groups ourselves first.
375
+ *
376
+ * Algorithm:
377
+ * 1. Snapshot every (pid, pgid) we have written to AppState.
378
+ * 2. Call host.shutdownAll({type:"daemon-graceful"}) -- this
379
+ * issues node-pty's default SIGHUP via `proc.kill()` for each
380
+ * live session AND stamps every session in state.json with
381
+ * state="ended" + endReason="daemon-graceful" so the next
382
+ * daemon boot can restore them as terminated tabs (with
383
+ * scrollback) instead of losing them. Distinct from
384
+ * `disposeAll()` which destructively removes sessions.
385
+ * 3. Poll `kill(pid, 0)` every 250ms for 5s. Any pid still alive
386
+ * at the deadline gets `kill(-pgid, "SIGKILL")` -- process-
387
+ * group kill so foreground children inherit the death.
388
+ * 4. Write the daemon-shutdown marker so the next boot knows the
389
+ * previous exit was graceful (sessions without an existing
390
+ * endReason get `daemon-graceful` instead of `daemon-crash`).
391
+ * 5. Best-effort logging only; we never fail shutdown over a
392
+ * stuck child (the lockfile/socket cleanup must still run).
393
+ */
394
+ if (ownsHost && "shutdownAll" in host) {
395
+ const survivors = [];
396
+ if (store) {
397
+ for (const r of store.get().sessionRecords) {
398
+ if (r.state === "running" && r.pid !== null && r.pgid !== null) {
399
+ survivors.push({ pid: r.pid, pgid: r.pgid, id: r.id });
400
+ }
401
+ }
402
+ }
403
+ try {
404
+ await host.shutdownAll({
405
+ type: "daemon-graceful",
406
+ });
407
+ }
408
+ catch (err) {
409
+ log(`host shutdownAll error: ${err.message}`);
410
+ }
411
+ /*
412
+ * -- `shutdownAll` mutates every session's
413
+ * `state` and `endReason` via `store.mutateSessions()`, which schedules a
414
+ * debounced flush (300ms by default). The marker write below is
415
+ * the post-condition users observe after SIGTERM; if `store.destroy()`
416
+ * runs before the timer fires, the cancellation drops every "ended
417
+ * + daemon-graceful" mutation and the next boot reads stale
418
+ * "running" sessions stamped with `daemon-crash` on absent marker --
419
+ * a clean shutdown gets misread as a crash. Force the writes through
420
+ * synchronously here so state.json reflects daemon-graceful before
421
+ * we touch the marker or the store. Track success: on flush failure
422
+ * (ENOSPC/EIO) we MUST skip the marker so the next boot does not
423
+ * see stale "running" rows beside a graceful marker. The conservative
424
+ * side is "treat as crash".
425
+ */
426
+ let stateFlushed = true;
427
+ if (store && typeof store.flush === "function") {
428
+ try {
429
+ await store.flush();
430
+ }
431
+ catch (err) {
432
+ stateFlushed = false;
433
+ log(`store flush error: ${err.message}`);
434
+ }
435
+ }
436
+ // Poll-then-SIGKILL escalation. Skip entirely when no survivors.
437
+ if (survivors.length > 0) {
438
+ const graceMs = opts.shutdownGraceMs ?? 5000;
439
+ const pollMs = 250;
440
+ const polls = Math.max(1, Math.ceil(graceMs / pollMs));
441
+ const sleep = opts.sleep ??
442
+ ((ms) => new Promise((r) => setTimeout(r, ms)));
443
+ const kill = opts.killProcess ?? defaultKill;
444
+ for (let i = 0; i < polls; i++) {
445
+ if (!survivors.some((s) => kill(s.pid, 0)))
446
+ break;
447
+ if (i < polls - 1)
448
+ await sleep(pollMs);
449
+ }
450
+ for (const s of survivors) {
451
+ if (!kill(s.pid, 0))
452
+ continue;
453
+ // kill(-pgid, SIGKILL) -- negative pid signals the whole
454
+ // process group, catching foreground children that survive
455
+ // the shell exit (long-running grep, vim, …).
456
+ const ok = kill(-s.pgid, "SIGKILL");
457
+ log(`host SIGKILL pid=${s.pid} pgid=${s.pgid} session=${s.id} ${ok ? "ok" : "failed"}`);
458
+ }
459
+ }
460
+ /*
461
+ * Write the marker AFTER PTY teardown completes. The marker is
462
+ * the post-condition of "graceful exit was reached"; if we'd
463
+ * crashed mid-shutdownAll the marker would not be written and
464
+ * the next boot would correctly treat orphan-risk sessions as
465
+ * `daemon-crash`. Skip when:
466
+ * - state flush failed: in-memory "ended" mutation never reached
467
+ * state.json, so the next boot would pair `running` rows with a
468
+ * graceful marker.
469
+ * - drain timed out: an in-flight
470
+ * CREATE / INIT_CLIENT can settle *after* shutdownAll snapshotted
471
+ * `this.sessions`, potentially writing a fresh "running" row that
472
+ * shutdownAll never saw -- the same orphan race the drain was
473
+ * supposed to close, just shifted to the timeout window. Treat
474
+ * as crash so the orphan-cleanup reconciler runs on next boot.
475
+ * Best-effort otherwise -- a write failure is logged but never
476
+ * blocks shutdown (worst case: graceful is misread as crash,
477
+ * conservative side).
478
+ */
479
+ if (!stateFlushed) {
480
+ log("daemon-shutdown marker skipped -- state flush failed");
481
+ }
482
+ else if (!drained) {
483
+ log("daemon-shutdown marker skipped -- drain timeout");
484
+ }
485
+ else {
486
+ try {
487
+ writeDaemonShutdownMarker(appStateDir);
488
+ }
489
+ catch (err) {
490
+ log(`daemon-shutdown marker write error: ${err.message}`);
491
+ }
492
+ }
493
+ }
494
+ if (ownsHost && store && "destroy" in store) {
495
+ try {
496
+ store.destroy();
497
+ }
498
+ catch (err) {
499
+ log(`store destroy error: ${err.message}`);
500
+ }
501
+ }
502
+ if (lock) {
503
+ try {
504
+ await lock.release();
505
+ }
506
+ catch (err) {
507
+ log(`lock release error: ${err.message}`);
508
+ }
509
+ }
510
+ if (appStateOwner) {
511
+ try {
512
+ await appStateOwner.release();
513
+ }
514
+ catch (err) {
515
+ log(`appstate owner release error: ${err.message}`);
516
+ }
517
+ }
518
+ for (const sig of installedSignals) {
519
+ process.removeListener(sig, signalHandler);
520
+ }
521
+ };
522
+ const signals = opts.signals ?? DEFAULT_SIGNALS;
523
+ const installedSignals = [];
524
+ const signalHandler = (signal) => {
525
+ void shutdown(signal);
526
+ };
527
+ for (const sig of signals) {
528
+ process.on(sig, signalHandler);
529
+ installedSignals.push(sig);
530
+ }
531
+ return { daemon, paths, tcpPort, shutdown };
532
+ }
533
+ /**
534
+ * Default `kill(pid, signal)` for the SIGTERM->SIGKILL escalation.
535
+ * Returns true when the process exists (or `EPERM` -- process exists,
536
+ * but we lack permission, which is still "alive" for our purposes),
537
+ * false on `ESRCH` / unknown pid. Test seam injects a deterministic
538
+ * spy in place of this so escalation can be driven without a real
539
+ * child process under sandbox.
540
+ */
541
+ function defaultKill(pid, signal) {
542
+ try {
543
+ process.kill(pid, signal);
544
+ return true;
545
+ }
546
+ catch (err) {
547
+ return err.code === "EPERM";
548
+ }
549
+ }
550
+ /**
551
+ * Probes a Unix-domain socket path with a non-blocking connect.
552
+ *
553
+ * - `connect` event -> true (= a daemon is listening and accepted SYN)
554
+ * - `error` event -> false (ECONNREFUSED / ENOENT / etc. -- file is
555
+ * a stale leftover, kernel decides instantly)
556
+ * - timeout exceeded -> true (treated as "live but stalled", *not*
557
+ * "dead". Fail-closed for split-brain
558
+ * defense -- see reviewed for correctness 5th pass.)
559
+ *
560
+ * Why timeout = alive: when no listener owns `socketPath` the kernel
561
+ * synchronously returns ECONNREFUSED (file exists, no socket) or ENOENT
562
+ * (file gone), so a probe that takes longer than `timeoutMs` is almost
563
+ * certainly hitting a daemon whose accept loop is blocked (event loop
564
+ * stall, GC pause, kernel listen-backlog full). Treating that as "dead"
565
+ * would unlink the active socket and let a second daemon take over --
566
+ * exactly the split-brain scenario this probe exists to prevent. The
567
+ * priority axis here is stability > startup latency, so we err on the
568
+ * side of "another daemon is alive, refuse to boot".
569
+ *
570
+ * We open the socket and IMMEDIATELY destroy it without sending HELLO --
571
+ * the daemon's connection-tracking layer drops idle pre-HELLO sockets
572
+ * cleanly so this leaves no observable state behind.
573
+ *
574
+ * Exported only for unit testing -- the alive-detection path is also
575
+ * exercised end-to-end by manual smoke tests (Unix-socket bind is
576
+ * blocked under macOS sandbox-exec so we can't drive a real listener
577
+ * from Vitest).
578
+ */
579
+ export async function isSocketActive(socketPath, timeoutMs,
580
+ // Test seam -- production callers always use net.connect. Vitest cannot
581
+ // spy on the ESM `node:net` namespace, so we accept the connector here
582
+ // to drive the timeout-as-alive branch from a unit test.
583
+ connectFn = net.connect) {
584
+ return new Promise((resolve) => {
585
+ const socket = connectFn(socketPath);
586
+ let settled = false;
587
+ const finish = (alive) => {
588
+ if (settled)
589
+ return;
590
+ settled = true;
591
+ try {
592
+ socket.destroy();
593
+ }
594
+ catch {
595
+ /* ignore */
596
+ }
597
+ resolve(alive);
598
+ };
599
+ // Timeout = "live but stalled" -> fail-closed (true). See doc comment.
600
+ const timer = setTimeout(() => finish(true), timeoutMs);
601
+ socket.once("connect", () => {
602
+ clearTimeout(timer);
603
+ finish(true);
604
+ });
605
+ socket.once("error", () => {
606
+ clearTimeout(timer);
607
+ finish(false);
608
+ });
609
+ });
610
+ }
611
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/pty/host-daemon/bootstrap.ts"],"names":[],"mappings":"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"}