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,562 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync as realExistsSync, mkdirSync as realMkdirSync, readFileSync as realReadFileSync, rmSync as realRmSync, writeFileSync as realWriteFileSync, } from "node:fs";
3
+ import { homedir, userInfo } from "node:os";
4
+ import { join } from "node:path";
5
+ import { resolveDaemonPaths } from "../pty/host-daemon/paths.js";
6
+ import { waitForDaemonSocket } from "../pty/host-daemon/socket-ready.js";
7
+ export const SERVER_LABEL = "com.parasor";
8
+ export const DAEMON_LABEL = "com.parasor.pty-host";
9
+ export function renderPlist(p) {
10
+ const envXml = Object.entries(p.env)
11
+ .map(([k, v]) => ` <key>${esc(k)}</key>\n <string>${esc(v)}</string>`)
12
+ .join("\n");
13
+ return `<?xml version="1.0" encoding="UTF-8"?>
14
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
15
+ <plist version="1.0">
16
+ <dict>
17
+ <key>Label</key>
18
+ <string>${esc(p.label)}</string>
19
+ <key>ProgramArguments</key>
20
+ <array>
21
+ <string>${esc(p.node)}</string>
22
+ <string>${esc(p.bin)}</string>
23
+ </array>
24
+ <key>RunAtLoad</key>
25
+ <true/>
26
+ <key>KeepAlive</key>
27
+ <dict>
28
+ <key>Crashed</key>
29
+ <true/>
30
+ <key>SuccessfulExit</key>
31
+ <false/>
32
+ </dict>
33
+ <key>StandardOutPath</key>
34
+ <string>${esc(p.stdoutLog)}</string>
35
+ <key>StandardErrorPath</key>
36
+ <string>${esc(p.stderrLog)}</string>
37
+ <key>EnvironmentVariables</key>
38
+ <dict>
39
+ ${envXml}
40
+ </dict>
41
+ <key>ProcessType</key>
42
+ <string>${p.background ? "Background" : "Interactive"}</string>
43
+ </dict>
44
+ </plist>
45
+ `;
46
+ }
47
+ function esc(s) {
48
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
49
+ }
50
+ export function createDarwinAdapter(deps) {
51
+ const home = deps.home ?? homedir();
52
+ const configDir = deps.configDir ?? join(home, ".config", "parasor");
53
+ const uid = deps.uid ?? userInfo().uid;
54
+ const execPath = deps.execPath ?? process.execPath;
55
+ const fs = deps.fs ?? {
56
+ mkdirSync: (p, o) => realMkdirSync(p, { recursive: true, ...o }),
57
+ writeFileSync: realWriteFileSync,
58
+ readFileSync: (p) => realReadFileSync(p, "utf8"),
59
+ rmSync: (p, o) => realRmSync(p, { force: true, ...o }),
60
+ existsSync: realExistsSync,
61
+ };
62
+ const spawn = deps.spawn ??
63
+ ((cmd, args) => {
64
+ const r = spawnSync(cmd, args, { encoding: "utf8" });
65
+ return {
66
+ status: r.status,
67
+ stdout: r.stdout ?? "",
68
+ stderr: r.stderr ?? "",
69
+ };
70
+ });
71
+ const log = deps.log ?? ((m) => console.log(m));
72
+ const daemonPaths = resolveDaemonPaths();
73
+ const daemonPidFile = deps.daemonPidFile ?? daemonPaths.pidFile;
74
+ const killProcess = deps.killProcess ??
75
+ ((pid, signal) => {
76
+ try {
77
+ process.kill(pid, signal);
78
+ return true;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ });
84
+ // R1/R2 -- default to the real poll when no spawn mock is
85
+ // injected (production path). Tests inject both `spawn` and `waitFn`; the
86
+ // `deps.spawn` gate ensures existing tests that supply a mock spawn but omit
87
+ // `waitFn` get a no-op instead of a live 5 s poll against a non-existent socket.
88
+ const waitFn = deps.waitFn ??
89
+ (deps.spawn
90
+ ? (_socketPath) => Promise.resolve()
91
+ : waitForDaemonSocket);
92
+ const sleepFn = deps.sleepFn ??
93
+ ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
94
+ const nowFn = deps.nowFn ?? (() => Date.now());
95
+ const launchAgentDir = join(home, "Library", "LaunchAgents");
96
+ const serverPlistPath = join(launchAgentDir, `${SERVER_LABEL}.plist`);
97
+ const daemonPlistPath = join(launchAgentDir, `${DAEMON_LABEL}.plist`);
98
+ const serverStdoutLog = join(configDir, "service.log");
99
+ const serverStderrLog = join(configDir, "service.err.log");
100
+ const daemonStdoutLog = join(configDir, "pty-host.out.log");
101
+ const daemonStderrLog = join(configDir, "pty-host.err.log");
102
+ const domain = `gui/${uid}`;
103
+ const serverTarget = `${domain}/${SERVER_LABEL}`;
104
+ const daemonTarget = `${domain}/${DAEMON_LABEL}`;
105
+ function basePathEnv() {
106
+ return [
107
+ "/usr/local/bin",
108
+ "/opt/homebrew/bin",
109
+ "/usr/bin",
110
+ "/bin",
111
+ process.env.PATH ?? "",
112
+ ]
113
+ .filter(Boolean)
114
+ .join(":");
115
+ }
116
+ function buildServerPlistBody() {
117
+ /*
118
+ * Service install is the canonical
119
+ * supervisor path, so the server unit is wired for daemon mode by
120
+ * default. PARASOR_PTY_DAEMON=1 makes the server connect to the
121
+ * daemon socket instead of running PTYs in-process;
122
+ * PARASOR_PTY_AUTOSTART=0 stops it from forking a competing daemon
123
+ * because launchd already owns one (com.parasor.pty-host).
124
+ */
125
+ const env = {
126
+ PATH: basePathEnv(),
127
+ HOME: home,
128
+ PARASOR_PTY_DAEMON: "1",
129
+ PARASOR_PTY_AUTOSTART: "0",
130
+ };
131
+ return renderPlist({
132
+ label: SERVER_LABEL,
133
+ node: execPath,
134
+ bin: deps.binPath,
135
+ stdoutLog: serverStdoutLog,
136
+ stderrLog: serverStderrLog,
137
+ env,
138
+ });
139
+ }
140
+ function writeServerPlist() {
141
+ fs.mkdirSync(launchAgentDir, { recursive: true });
142
+ fs.mkdirSync(configDir, { recursive: true });
143
+ fs.writeFileSync(serverPlistPath, buildServerPlistBody());
144
+ }
145
+ function buildDaemonPlistBody() {
146
+ const env = {
147
+ PATH: basePathEnv(),
148
+ HOME: home,
149
+ };
150
+ return renderPlist({
151
+ label: DAEMON_LABEL,
152
+ node: execPath,
153
+ bin: deps.daemonEntryPath,
154
+ stdoutLog: daemonStdoutLog,
155
+ stderrLog: daemonStderrLog,
156
+ env,
157
+ background: true,
158
+ });
159
+ }
160
+ function writeDaemonPlist() {
161
+ fs.mkdirSync(launchAgentDir, { recursive: true });
162
+ fs.mkdirSync(configDir, { recursive: true });
163
+ fs.writeFileSync(daemonPlistPath, buildDaemonPlistBody());
164
+ }
165
+ function bootout(plistPath) {
166
+ // Not an error if nothing was previously bootstrapped; swallow non-zero.
167
+ spawn("launchctl", ["bootout", domain, plistPath]);
168
+ }
169
+ function bootstrap(plistPath) {
170
+ return spawn("launchctl", ["bootstrap", domain, plistPath]);
171
+ }
172
+ /*
173
+ * -- `launchctl print <target>` is the canonical way
174
+ * to check whether a unit is currently loaded into the user's launchd
175
+ * domain. Exit 0 = loaded. Non-zero (typically 113 / 3 / "Could not
176
+ * find service") = unloaded. We use this to gate the "plist unchanged
177
+ * -> skip bootstrap" path: if the user has manually `launchctl bootout`-ed
178
+ * the unit (or it never loaded for any reason), skipping bootstrap
179
+ * leaves them with no daemon. The byte-equality check alone is not
180
+ * sufficient -- we need both "content matches" AND "unit loaded".
181
+ *
182
+ * Best-effort: an unexpected non-zero from `launchctl print` is treated
183
+ * as "not loaded" so we bootstrap. The conservative side here is to
184
+ * over-load (idempotent: bootout-then-bootstrap if it was loaded), not
185
+ * under-load (leave the user without a daemon).
186
+ */
187
+ function isLoaded(target) {
188
+ const r = spawn("launchctl", ["print", target]);
189
+ return r.status === 0;
190
+ }
191
+ function snapshotIfExists(path) {
192
+ if (!fs.existsSync(path))
193
+ return null;
194
+ try {
195
+ return fs.readFileSync(path);
196
+ }
197
+ catch {
198
+ return null;
199
+ }
200
+ }
201
+ function restoreSnapshot(path, content) {
202
+ if (content === null) {
203
+ fs.rmSync(path, { force: true });
204
+ return;
205
+ }
206
+ fs.writeFileSync(path, content);
207
+ }
208
+ /**
209
+ * Detects an "unmanaged daemon" -- a live process holding the canonical
210
+ * daemon socket while launchd is not currently running the unit. This is
211
+ * the inconsistency that triggers the server-only-restart guard and the
212
+ * `restart --all` heal path. Independent of whether the plist exists on
213
+ * disk: a user who ran `parasor` manually before installing the service
214
+ * will hit this with no plist at all.
215
+ */
216
+ function findUnmanagedDaemonPid() {
217
+ const pid = readLiveCanonicalDaemonPid();
218
+ if (pid === null)
219
+ return null;
220
+ if (isPrintRunning(printUnit(daemonTarget)))
221
+ return null;
222
+ return pid;
223
+ }
224
+ /**
225
+ * Stops an unmanaged daemon process so launchd can take over the socket.
226
+ * SIGTERM first (5s grace for clean shutdown of PTY children); SIGKILL
227
+ * as escalation. Throws if the process is still alive after SIGKILL --
228
+ * the caller should abort the heal flow rather than racing launchd
229
+ * against a zombie holding the socket.
230
+ */
231
+ async function stopUnmanagedDaemon(pid) {
232
+ log(`stopping unmanaged daemon (pid ${pid}) so launchd can take over`);
233
+ const SIGTERM_TIMEOUT_MS = 5000;
234
+ const SIGKILL_TIMEOUT_MS = 2000;
235
+ const POLL_MS = 100;
236
+ killProcess(pid, "SIGTERM");
237
+ const termStart = nowFn();
238
+ while (nowFn() - termStart < SIGTERM_TIMEOUT_MS) {
239
+ if (!killProcess(pid, 0))
240
+ return;
241
+ await sleepFn(POLL_MS);
242
+ }
243
+ log(`SIGTERM timed out after ${SIGTERM_TIMEOUT_MS}ms; sending SIGKILL`);
244
+ killProcess(pid, "SIGKILL");
245
+ const killStart = nowFn();
246
+ while (nowFn() - killStart < SIGKILL_TIMEOUT_MS) {
247
+ if (!killProcess(pid, 0))
248
+ return;
249
+ await sleepFn(POLL_MS);
250
+ }
251
+ throw new Error(`failed to stop unmanaged daemon (pid ${pid}); process still alive after SIGKILL`);
252
+ }
253
+ async function install() {
254
+ /*
255
+ * Stop any unmanaged daemon currently holding the canonical socket
256
+ * BEFORE writing/bootstrapping the plist. `parasor` started manually
257
+ * before service install spawns its own daemon child; if we skip
258
+ * this step launchd's bootstrap would race the existing socket
259
+ * owner and the launchd-managed daemon would crash-loop on
260
+ * EADDRINUSE while `launchctl bootstrap` still returns status 0
261
+ * (install looks successful but the service is broken).
262
+ *
263
+ * install is the explicit "set up canonical state" operation, so
264
+ * stopping a manually-spawned daemon is in-scope -- sacrificing the
265
+ * unmanaged PTY children is acceptable here in exchange for a
266
+ * guaranteed-consistent state at exit. Users who need to preserve
267
+ * a running session should connect first; install is opt-in.
268
+ */
269
+ const preInstallUnmanagedPid = findUnmanagedDaemonPid();
270
+ if (preInstallUnmanagedPid !== null) {
271
+ log(`stopping unmanaged daemon (pid ${preInstallUnmanagedPid}) so launchd can take over`);
272
+ await stopUnmanagedDaemon(preInstallUnmanagedPid);
273
+ }
274
+ /*
275
+ * Order matters: bootstrap the daemon first so its socket is
276
+ * available when the server starts. If we bootstrapped server
277
+ * first, it would try to connect to a non-existent daemon socket
278
+ * and (per host.ts) error out because PARASOR_PTY_AUTOSTART=0
279
+ * prevents fallback spawning.
280
+ *
281
+ * Idempotent re-install: when the rendered plist is byte-identical
282
+ * to what is already on disk, skip bootout/bootstrap entirely. This
283
+ * preserves a long-lived daemon process (and the PTY children it
284
+ * owns) across `parasor service install` invocations -- npm-update
285
+ * style reinstalls do not lose sessions when the unit content has
286
+ * not changed. When the plist *does* change (binary path, env), we
287
+ * still need a bootout/bootstrap cycle because launchd does not
288
+ * pick up plist changes in place.
289
+ *
290
+ * Backup-and-restore: snapshot prior plist contents before the
291
+ * bootout/overwrite so a failed reinstall reverts to (and
292
+ * re-bootstraps) the user's last working state instead of leaving
293
+ * the user with no daemon at all. Without this, a botched reinstall
294
+ * (typo'd env value, broken binary path) destroys the user's
295
+ * working supervisor and forces manual recovery.
296
+ */
297
+ const priorDaemonPlist = snapshotIfExists(daemonPlistPath);
298
+ const daemonExisted = priorDaemonPlist !== null;
299
+ const newDaemonPlist = buildDaemonPlistBody();
300
+ const daemonUnchanged = daemonExisted && priorDaemonPlist === newDaemonPlist;
301
+ // byte-equal plist + actually loaded ⇒ safe skip.
302
+ // Plist matches on disk but unit unloaded ⇒ user manually bootouted
303
+ // (or never loaded); we must bootstrap or they end up with no daemon.
304
+ //
305
+ // Exception: when we just stopped an unmanaged daemon above, launchd's
306
+ // unit is likely stuck in KeepAlive backoff (its child was crash-looping
307
+ // on EADDRINUSE while the unmanaged process held the socket). The
308
+ // "skipped reload" path would leave it stuck even though the socket is
309
+ // now free -- kickstart -k forces an immediate restart attempt.
310
+ if (daemonUnchanged &&
311
+ isLoaded(daemonTarget) &&
312
+ preInstallUnmanagedPid === null) {
313
+ log(`unchanged: ${daemonPlistPath} (skipped reload)`);
314
+ }
315
+ else if (daemonUnchanged && isLoaded(daemonTarget)) {
316
+ log(`unchanged: ${daemonPlistPath} (kickstarting after unmanaged stop)`);
317
+ const kr = spawn("launchctl", ["kickstart", "-k", daemonTarget]);
318
+ if (kr.status !== 0) {
319
+ throw new Error(`launchctl kickstart (pty-host) failed (${kr.status}): ${kr.stderr || kr.stdout}`);
320
+ }
321
+ }
322
+ else if (daemonUnchanged) {
323
+ log(`unchanged: ${daemonPlistPath} (loading -- unit was not loaded)`);
324
+ const dr = bootstrap(daemonPlistPath);
325
+ if (dr.status !== 0) {
326
+ throw new Error(`launchctl bootstrap (pty-host) failed (${dr.status}): ${dr.stderr || dr.stdout}`);
327
+ }
328
+ }
329
+ else {
330
+ if (daemonExisted)
331
+ bootout(daemonPlistPath);
332
+ writeDaemonPlist();
333
+ const dr = bootstrap(daemonPlistPath);
334
+ if (dr.status !== 0) {
335
+ // Restore the prior plist (or remove it if there was none) and
336
+ // re-bootstrap so the user's previous working daemon is brought
337
+ // back up. Best-effort: a failed recovery surfaces both errors.
338
+ restoreSnapshot(daemonPlistPath, priorDaemonPlist);
339
+ let recoverNote = "removed freshly-written plist";
340
+ if (daemonExisted) {
341
+ const recover = bootstrap(daemonPlistPath);
342
+ recoverNote =
343
+ recover.status === 0
344
+ ? "rolled back to prior daemon plist"
345
+ : `rollback bootstrap also failed (${recover.status}): ${recover.stderr || recover.stdout}`;
346
+ }
347
+ throw new Error(`launchctl bootstrap (pty-host) failed (${dr.status}): ${dr.stderr || dr.stdout} (${recoverNote})`);
348
+ }
349
+ log(`installed: ${daemonPlistPath}`);
350
+ }
351
+ log(`daemon logs: ${daemonStdoutLog}`);
352
+ // R1 -- wait for the daemon socket to become ready
353
+ // before starting the server. The server requires the daemon socket
354
+ // immediately (PARASOR_PTY_AUTOSTART=0, so no fallback spawn).
355
+ await waitFn(daemonPaths.socketPath);
356
+ const priorServerPlist = snapshotIfExists(serverPlistPath);
357
+ const serverExisted = priorServerPlist !== null;
358
+ const newServerPlist = buildServerPlistBody();
359
+ const serverUnchanged = serverExisted && priorServerPlist === newServerPlist;
360
+ if (serverUnchanged && isLoaded(serverTarget)) {
361
+ log(`unchanged: ${serverPlistPath} (skipped reload)`);
362
+ log(`server logs: ${serverStdoutLog}`);
363
+ return;
364
+ }
365
+ if (serverUnchanged) {
366
+ log(`unchanged: ${serverPlistPath} (loading -- unit was not loaded)`);
367
+ const r = bootstrap(serverPlistPath);
368
+ if (r.status !== 0) {
369
+ throw new Error(`launchctl bootstrap (server) failed (${r.status}): ${r.stderr || r.stdout}`);
370
+ }
371
+ log(`server logs: ${serverStdoutLog}`);
372
+ return;
373
+ }
374
+ if (serverExisted)
375
+ bootout(serverPlistPath);
376
+ writeServerPlist();
377
+ const r = bootstrap(serverPlistPath);
378
+ if (r.status !== 0) {
379
+ // Server bootstrap failed -- restore the server plist (or remove
380
+ // it). Daemon is restored to its prior installed state: if it
381
+ // pre-existed we keep the freshly-bootstrapped one running (it
382
+ // matches the new config and the user already had one), but if
383
+ // it was freshly installed in this call we tear it down so the
384
+ // user is not left with a half-installed pair they did not have
385
+ // before.
386
+ restoreSnapshot(serverPlistPath, priorServerPlist);
387
+ let serverRecover = "removed freshly-written plist";
388
+ if (serverExisted) {
389
+ const recover = bootstrap(serverPlistPath);
390
+ serverRecover =
391
+ recover.status === 0
392
+ ? "rolled back to prior server plist"
393
+ : `rollback bootstrap also failed (${recover.status}): ${recover.stderr || recover.stdout}`;
394
+ }
395
+ let daemonNote = "daemon left in prior installed state";
396
+ if (!daemonExisted) {
397
+ bootout(daemonPlistPath);
398
+ fs.rmSync(daemonPlistPath, { force: true });
399
+ daemonNote = "rolled back daemon unit; nothing remains installed";
400
+ }
401
+ throw new Error(`launchctl bootstrap (server) failed (${r.status}): ${r.stderr || r.stdout}. ` +
402
+ `${serverRecover}; ${daemonNote}.`);
403
+ }
404
+ log(`installed: ${serverPlistPath}`);
405
+ log(`server logs: ${serverStdoutLog}`);
406
+ }
407
+ async function uninstall() {
408
+ let removed = false;
409
+ // Remove server first so it cannot reconnect to a daemon we are
410
+ // about to kill (which would surface as a UI "PTY host disconnected"
411
+ // banner during uninstall).
412
+ if (fs.existsSync(serverPlistPath)) {
413
+ bootout(serverPlistPath);
414
+ fs.rmSync(serverPlistPath, { force: true });
415
+ log(`uninstalled: ${serverPlistPath}`);
416
+ removed = true;
417
+ }
418
+ if (fs.existsSync(daemonPlistPath)) {
419
+ bootout(daemonPlistPath);
420
+ fs.rmSync(daemonPlistPath, { force: true });
421
+ log(`uninstalled: ${daemonPlistPath}`);
422
+ removed = true;
423
+ }
424
+ if (!removed)
425
+ log("not installed; nothing to do");
426
+ }
427
+ function reportUnit(label, plistPath, target) {
428
+ const installed = fs.existsSync(plistPath);
429
+ if (!installed) {
430
+ log(`${label}: not installed`);
431
+ return;
432
+ }
433
+ const r = printUnit(target);
434
+ const running = isPrintRunning(r);
435
+ const pidMatch = /pid = (\d+)/.exec(r.stdout);
436
+ log(`${label}: installed`);
437
+ log(` running: ${running ? "yes" : "no"}`);
438
+ if (pidMatch)
439
+ log(` pid: ${pidMatch[1]}`);
440
+ log(` plist: ${plistPath}`);
441
+ }
442
+ async function status() {
443
+ reportUnit("pty-host", daemonPlistPath, daemonTarget);
444
+ log(`daemon logs: ${daemonStdoutLog}`);
445
+ reportUnit("server", serverPlistPath, serverTarget);
446
+ log(`server logs: ${serverStdoutLog}`);
447
+ }
448
+ function printUnit(target) {
449
+ return spawn("launchctl", ["print", target]);
450
+ }
451
+ function isPrintRunning(r) {
452
+ return r.status === 0 && /state = running/.test(r.stdout);
453
+ }
454
+ function readLiveCanonicalDaemonPid() {
455
+ if (!fs.existsSync(daemonPidFile))
456
+ return null;
457
+ let raw;
458
+ try {
459
+ raw = fs.readFileSync(daemonPidFile).trim();
460
+ }
461
+ catch {
462
+ return null;
463
+ }
464
+ const pid = Number(raw);
465
+ if (!Number.isInteger(pid) || pid <= 0)
466
+ return null;
467
+ return killProcess(pid, 0) ? pid : null;
468
+ }
469
+ function assertDaemonUnitConsistentForServerOnlyRestart() {
470
+ if (!fs.existsSync(daemonPlistPath))
471
+ return;
472
+ if (isPrintRunning(printUnit(daemonTarget)))
473
+ return;
474
+ const pid = readLiveCanonicalDaemonPid();
475
+ if (pid === null)
476
+ return;
477
+ throw new Error(`refusing server-only restart: ${DAEMON_LABEL} is installed but not running under launchd, ` +
478
+ `while the canonical daemon socket is owned by pid ${pid}. ` +
479
+ "This usually happens when `parasor` was started manually before installing the service, " +
480
+ "leaving an unmanaged daemon that launchd cannot supervise. " +
481
+ "Restarting only the server can leave launchd racing the existing daemon and may drop active PTYs. " +
482
+ "Run `parasor service restart --all` when you are ready to restart PTY sessions " +
483
+ "(this stops the unmanaged daemon and hands control to launchd), " +
484
+ "or stop the unmanaged daemon manually and reinstall the service.");
485
+ }
486
+ async function restart(opts) {
487
+ let kicked = false;
488
+ // Daemon kick is opt-in . says PTY lifetime
489
+ // is decoupled from server lifetime so live sessions survive a
490
+ // server restart. Kicking the daemon terminates every PTY, so it
491
+ // is reserved for `--all` (binary upgrade scenarios where the
492
+ // daemon code itself changed). Order: daemon first when both --
493
+ // if the server kicks before the daemon is back up and
494
+ // PARASOR_PTY_AUTOSTART=0 (it is), the server fails to connect
495
+ // and crash-loops until launchd brings the daemon back.
496
+ if (!opts.all) {
497
+ assertDaemonUnitConsistentForServerOnlyRestart();
498
+ }
499
+ if (opts.all && fs.existsSync(daemonPlistPath)) {
500
+ /*
501
+ * Heal an unmanaged-daemon inconsistency before kickstart.
502
+ * `launchctl kickstart -k` only signals launchd-managed processes --
503
+ * a daemon that was spawned manually (e.g. `parasor` run before
504
+ * service install) survives kickstart and continues to hold the
505
+ * canonical socket, leaving the launchd-managed replacement unable
506
+ * to bind. The `--all` contract is "PTYs may be sacrificed to
507
+ * restore a consistent state", so stop the unmanaged process here.
508
+ */
509
+ const unmanagedPid = findUnmanagedDaemonPid();
510
+ if (unmanagedPid !== null) {
511
+ await stopUnmanagedDaemon(unmanagedPid);
512
+ }
513
+ /*
514
+ * If launchd has the unit loaded, kickstart works. If it does not
515
+ * (manual `launchctl bootout`, never loaded, or load aborted after
516
+ * a bind failure), kickstart fails -- `bootstrap` is the right verb.
517
+ */
518
+ if (isLoaded(daemonTarget)) {
519
+ const r = spawn("launchctl", ["kickstart", "-k", daemonTarget]);
520
+ if (r.status !== 0) {
521
+ throw new Error(`launchctl kickstart (pty-host) failed (${r.status}): ${r.stderr || r.stdout}`);
522
+ }
523
+ log(`restarted: ${daemonTarget}`);
524
+ }
525
+ else {
526
+ const br = bootstrap(daemonPlistPath);
527
+ if (br.status !== 0) {
528
+ throw new Error(`launchctl bootstrap (pty-host) failed (${br.status}): ${br.stderr || br.stdout}`);
529
+ }
530
+ log(`restarted: ${daemonTarget} (bootstrapped -- was not loaded)`);
531
+ }
532
+ kicked = true;
533
+ // R2 -- wait for the daemon socket to become ready
534
+ // before kicking the server. Without this the server connects before
535
+ // the daemon socket is bound and crash-loops with ECONNREFUSED.
536
+ await waitFn(daemonPaths.socketPath);
537
+ }
538
+ if (fs.existsSync(serverPlistPath)) {
539
+ const r = spawn("launchctl", ["kickstart", "-k", serverTarget]);
540
+ if (r.status !== 0) {
541
+ throw new Error(`launchctl kickstart (server) failed (${r.status}): ${r.stderr || r.stdout}`);
542
+ }
543
+ log(`restarted: ${serverTarget}`);
544
+ kicked = true;
545
+ }
546
+ if (!kicked)
547
+ log("nothing installed; nothing to restart");
548
+ }
549
+ async function logs(opts) {
550
+ const cmd = opts.follow
551
+ ? ["tail", "-f", serverStdoutLog]
552
+ : ["cat", serverStdoutLog];
553
+ const [command, ...args] = cmd;
554
+ const r = spawn(command, args);
555
+ if (r.stdout)
556
+ process.stdout.write(r.stdout);
557
+ if (r.stderr)
558
+ process.stderr.write(r.stderr);
559
+ }
560
+ return { install, uninstall, status, restart, logs };
561
+ }
562
+ //# sourceMappingURL=service-darwin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-darwin.js","sourceRoot":"","sources":["../../src/cli/service-darwin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { ServiceAdapter } from "./service.js";
2
+ export declare const SERVER_UNIT = "parasor.service";
3
+ export declare const DAEMON_UNIT = "parasor-pty-host.service";
4
+ export interface UnitParams {
5
+ description: string;
6
+ node: string;
7
+ bin: string;
8
+ stdoutLog: string;
9
+ stderrLog: string;
10
+ env: Record<string, string>;
11
+ /**
12
+ * After= target. Server unit uses network.target (it binds a TCP
13
+ * listener); daemon unit uses default.target (it only needs the user
14
+ * session to exist -- no network dependency).
15
+ */
16
+ after?: string;
17
+ /**
18
+ * Server unit uses Type=notify (sd_notify ready signal). The daemon
19
+ * does not implement sd_notify; readiness is observable via its unix
20
+ * socket. Use Type=simple for the daemon and skip the watchdog.
21
+ */
22
+ notify?: boolean;
23
+ /**
24
+ * -- daemon escalation requires KillMode=mixed
25
+ * so SIGKILL reaches the process group, not just the parent. Server
26
+ * unit defaults to Restart=on-failure; daemon uses Restart=always
27
+ * because crashes there should always trigger immediate respawn (the
28
+ * release requirementaxis is "continuous availability", continuous availability).
29
+ */
30
+ restartOnAlways?: boolean;
31
+ killModeMixed?: boolean;
32
+ /**
33
+ * Disable systemd's start-rate limiter for the daemon. With Restart=always
34
+ * and a fast crash loop, the default 5-restarts-per-10s threshold causes
35
+ * the unit to enter `failed` and stop respawning -- exactly the wedge state
36
+ * that breaks "continuous availability". Server keeps default limits.
37
+ */
38
+ unlimitedStartRate?: boolean;
39
+ /**
40
+ * Exit codes that must NOT trigger systemd respawn even under Restart=always.
41
+ * The daemon entry exits with code 2 on DaemonAlreadyRunningError (a guard
42
+ * fired when another instance already holds the lockfile). With
43
+ * Restart=always + StartLimitBurst=0 + this guard, systemd would otherwise
44
+ * loop forever spawning a process that immediately self-aborts.
45
+ */
46
+ restartPreventExitStatus?: number[];
47
+ }
48
+ export declare function renderUnit(p: UnitParams): string;
49
+ export interface LinuxAdapterDeps {
50
+ binPath: string;
51
+ daemonEntryPath: string;
52
+ home?: string;
53
+ configDir?: string;
54
+ execPath?: string;
55
+ fs?: {
56
+ mkdirSync: (p: string, opts?: {
57
+ recursive: boolean;
58
+ }) => void;
59
+ writeFileSync: (p: string, content: string) => void;
60
+ readFileSync: (p: string) => string;
61
+ rmSync: (p: string, opts?: {
62
+ force?: boolean;
63
+ }) => void;
64
+ existsSync: (p: string) => boolean;
65
+ };
66
+ spawn?: (cmd: string, args: string[]) => {
67
+ status: number | null;
68
+ stdout: string;
69
+ stderr: string;
70
+ };
71
+ log?: (msg: string) => void;
72
+ /**
73
+ * R1/R2 -- test injection seam for the daemon
74
+ * socket-ready poll. Production leaves this unset (uses the real
75
+ * `waitForDaemonSocket`). Tests inject a mock to drive
76
+ * timeout-error and immediate-ready branches without real sockets.
77
+ */
78
+ waitFn?: (socketPath: string) => Promise<void>;
79
+ }
80
+ export declare function createLinuxAdapter(deps: LinuxAdapterDeps): ServiceAdapter;
81
+ //# sourceMappingURL=service-linux.d.ts.map