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,335 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { DEFAULT_DROP_SIZE_HARD_MAX_BYTES, DEFAULT_DROP_SIZE_MAX_BYTES, normalizeIdeCommands, normalizePaneCommands, normalizeWorktreeLocalFileAllowlist, } from "@parasor/shared";
5
+ const EMPTY_STATE = {
6
+ version: 1,
7
+ projects: [],
8
+ projectStates: {},
9
+ sessions: [],
10
+ sessionRecords: [],
11
+ ideCommands: [],
12
+ paneCommands: [],
13
+ serviceConfig: {
14
+ preventIdleSleep: false,
15
+ portDetection: "all-interfaces",
16
+ dropSizeMaxBytes: DEFAULT_DROP_SIZE_MAX_BYTES,
17
+ dropSizeHardMaxBytes: DEFAULT_DROP_SIZE_HARD_MAX_BYTES,
18
+ },
19
+ };
20
+ function normalizePortDetection(value) {
21
+ // Legacy "all" mode (every loopback port, retired in local notify-mode cleanup) folds back to
22
+ // "all-interfaces" -- closer to the user's original intent than silently
23
+ // disabling notifications for someone who had explicitly opted in.
24
+ if (value === "all-interfaces" || value === "off")
25
+ return value;
26
+ return "all-interfaces";
27
+ }
28
+ /**
29
+ * Accept either missing fields or non-positive / non-finite junk. The
30
+ * hard cap also bounds the soft cap to guard a hand-edited state.json
31
+ * that set `dropSizeMaxBytes > dropSizeHardMaxBytes`.
32
+ */
33
+ function normalizeDropCap(value, fallback, ceiling) {
34
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
35
+ return fallback;
36
+ }
37
+ return Math.min(value, ceiling);
38
+ }
39
+ /**
40
+ * Backfill fields added after v1 shipped. Existing state.json files
41
+ * predate these fields and would otherwise surface `undefined` to
42
+ * consumers that treat them as required.
43
+ */
44
+ function migrate(raw) {
45
+ const serviceConfig = raw.serviceConfig ?? {};
46
+ const hardMax = normalizeDropCap(serviceConfig.dropSizeHardMaxBytes, DEFAULT_DROP_SIZE_HARD_MAX_BYTES, Number.POSITIVE_INFINITY);
47
+ const softMax = normalizeDropCap(serviceConfig.dropSizeMaxBytes, DEFAULT_DROP_SIZE_MAX_BYTES, hardMax);
48
+ return {
49
+ ...structuredClone(EMPTY_STATE),
50
+ ...raw,
51
+ projects: Array.isArray(raw.projects)
52
+ ? raw.projects.map((project) => {
53
+ const worktreeLocalFileAllowlist = normalizeWorktreeLocalFileAllowlist(project.worktreeLocalFileAllowlist);
54
+ return {
55
+ ...project,
56
+ ...(worktreeLocalFileAllowlist.length > 0 && {
57
+ worktreeLocalFileAllowlist,
58
+ }),
59
+ };
60
+ })
61
+ : [],
62
+ sessionRecords: Array.isArray(raw.sessionRecords) ? raw.sessionRecords : [],
63
+ ideCommands: normalizeIdeCommands(raw.ideCommands),
64
+ paneCommands: normalizePaneCommands(raw.paneCommands),
65
+ serviceConfig: {
66
+ preventIdleSleep: serviceConfig.preventIdleSleep ?? false,
67
+ portDetection: normalizePortDetection(serviceConfig.portDetection),
68
+ dropSizeMaxBytes: softMax,
69
+ dropSizeHardMaxBytes: hardMax,
70
+ },
71
+ };
72
+ }
73
+ export class AppStateReadOnlyError extends Error {
74
+ constructor() {
75
+ super("AppStateStore session domain is read-only in remote daemon mode (daemon owns sessions/sessionRecords); use internalMutate() for daemon-IPC reconciliation, or mutateProjects()/mutateServiceConfig()/mutatePaneCommands()/mutateIdeCommands() for server-owned domains");
76
+ this.name = "AppStateReadOnlyError";
77
+ }
78
+ }
79
+ export class AppStateStore {
80
+ state;
81
+ dir;
82
+ filePath;
83
+ tmpPath;
84
+ debounceMs;
85
+ timer = null;
86
+ destroyed = false;
87
+ /**
88
+ * Daemon-mode mirror guard.
89
+ * When true, only the **session domain** (`sessions`, `sessionRecords`)
90
+ * is read-only -- the daemon owns those writes. Project / projectStates
91
+ * / serviceConfig stay writable in both modes (the daemon never touches
92
+ * them; their only writer is the server). The daemon-IPC reconciler
93
+ * applies session-domain broadcasts via `internalMutate()` to bypass
94
+ * this guard. Default false (in-process mode owns all writes).
95
+ */
96
+ sessionsReadOnly = false;
97
+ /**
98
+ * daemon state ownership -- when set, write() routes the in-memory state through the
99
+ * delegate instead of writing state.json directly. The remote-mode
100
+ * server installs an IPC delegate so the daemon (sole file writer)
101
+ * persists the server-owned domains. Mirror updates (internalMutate)
102
+ * skip the delegate because they reflect domain the writer already
103
+ * persisted.
104
+ */
105
+ persistenceDelegate = null;
106
+ /**
107
+ * Tracks the most recent debounced-write promise. `flush()` awaits
108
+ * it BEFORE issuing its own write so a shutdown-time flush surfaces
109
+ * any in-flight failure (codex MED daemon state ownership/round 2). The promise resolves
110
+ * whether the underlying write succeeded or rejected -- failures are
111
+ * routed through `onPersistError` and then silenced here so awaiting
112
+ * never throws on a shutdown path.
113
+ */
114
+ lastWrite = Promise.resolve();
115
+ onPersistError;
116
+ constructor(opts = {}) {
117
+ const dir = opts.dir ?? join(homedir(), ".config", "parasor");
118
+ this.debounceMs = opts.debounceMs ?? 300;
119
+ this.filePath = join(dir, "state.json");
120
+ this.tmpPath = join(dir, "state.json.tmp");
121
+ this.onPersistError =
122
+ opts.onPersistError === undefined
123
+ ? (err) => console.error("AppStateStore: debounced persist failed (state.json may be stale):", err)
124
+ : (opts.onPersistError ?? (() => undefined));
125
+ mkdirSync(dir, { recursive: true });
126
+ this.dir = dir;
127
+ this.state = this.load();
128
+ }
129
+ /**
130
+ * Directory containing `state.json`. Used by the mode-marker subsystem
131
+ * so the cross-mode mutex collides on the
132
+ * same directory the store persists into, regardless of overrides.
133
+ */
134
+ getDir() {
135
+ return this.dir;
136
+ }
137
+ load() {
138
+ try {
139
+ const raw = readFileSync(this.filePath, "utf-8");
140
+ return migrate(JSON.parse(raw));
141
+ }
142
+ catch (err) {
143
+ if (isNodeError(err) && err.code === "ENOENT") {
144
+ return structuredClone(EMPTY_STATE);
145
+ }
146
+ // Corrupted -- rename and start fresh
147
+ const timestamp = Date.now();
148
+ try {
149
+ renameSync(this.filePath, `${this.filePath}.corrupted-${timestamp}`);
150
+ }
151
+ catch {
152
+ // ignore rename failure (file may not exist)
153
+ }
154
+ return structuredClone(EMPTY_STATE);
155
+ }
156
+ }
157
+ get() {
158
+ return this.state;
159
+ }
160
+ /**
161
+ * Server-owned domain: project records (`projects` array). Always
162
+ * writable, even in remote daemon mode -- the daemon never touches
163
+ * project records, so the server is unconditionally authoritative.
164
+ *
165
+ * The callback may also touch `projectStates` since both fields move
166
+ * together (project create/delete must keep the per-project state map
167
+ * in lock-step). Use `mutateProjectStates` for pure projectStates
168
+ * writes (panes, layout, focus) without project-record changes.
169
+ */
170
+ mutateProjects(fn) {
171
+ if (this.destroyed)
172
+ return;
173
+ fn(this.state);
174
+ this.scheduleFlush();
175
+ }
176
+ /**
177
+ * Server-owned domain: per-project UI state (`projectStates`). Always
178
+ * writable. Pane layout, focus, file-tree state, etc. -- none of which
179
+ * the daemon knows about. `projects` and `sessions` are exposed
180
+ * read-only so reconciliation logic can compute orphan sets without
181
+ * being able to write into either domain.
182
+ */
183
+ mutateProjectStates(fn) {
184
+ if (this.destroyed)
185
+ return;
186
+ fn(this.state);
187
+ this.scheduleFlush();
188
+ }
189
+ /**
190
+ * Server-owned domain: `serviceConfig`. Always writable. Daemon does
191
+ * not consume serviceConfig; only the server reads it.
192
+ */
193
+ mutateServiceConfig(fn) {
194
+ if (this.destroyed)
195
+ return;
196
+ fn(this.state);
197
+ this.scheduleFlush();
198
+ }
199
+ /**
200
+ * Server-owned domain: terminal launcher commands. Always writable; the
201
+ * daemon only owns PTY sessions/sessionRecords.
202
+ */
203
+ mutatePaneCommands(fn) {
204
+ if (this.destroyed)
205
+ return;
206
+ fn(this.state);
207
+ this.scheduleFlush();
208
+ }
209
+ mutateIdeCommands(fn) {
210
+ if (this.destroyed)
211
+ return;
212
+ fn(this.state);
213
+ this.scheduleFlush();
214
+ }
215
+ /**
216
+ * Daemon-owned domain: `sessions` + `sessionRecords`. In remote mode
217
+ * the server is a mirror -- server-side writes throw to surface the
218
+ * ownership violation. The daemon-IPC reconciler uses `internalMutate`
219
+ * to apply broadcasts without tripping this guard. `projects` is
220
+ * exposed read-only for project-membership filters used during
221
+ * startup reconciliation.
222
+ */
223
+ mutateSessions(fn) {
224
+ if (this.destroyed)
225
+ return;
226
+ if (this.sessionsReadOnly) {
227
+ throw new AppStateReadOnlyError();
228
+ }
229
+ fn(this.state);
230
+ this.scheduleFlush();
231
+ }
232
+ /**
233
+ * Bypass the session-domain guard. Reserved for the daemon-IPC
234
+ * reconciler on the server side: SESSION_UPDATE / SESSION_LIST
235
+ * broadcasts apply here without tripping `mutateSessions`. In
236
+ * delegate mode the mutation is mirror-only -- the daemon already
237
+ * persisted these domains before broadcasting, so the server
238
+ * skips the IPC round-trip. Without a delegate (in-process / daemon
239
+ * itself), the call schedules a normal file flush so the local
240
+ * state.json stays coherent for UI reload.
241
+ */
242
+ internalMutate(fn) {
243
+ if (this.destroyed)
244
+ return;
245
+ fn(this.state);
246
+ if (!this.persistenceDelegate) {
247
+ this.scheduleFlush();
248
+ }
249
+ }
250
+ /**
251
+ * Toggle the session-domain guard (narrowed by daemon state ownership). Idempotent.
252
+ * Called once at factory-time after the PtyHost mode is decided
253
+ * (in-process -> false, remote -> true) -- runtime flipping is not
254
+ * supported (by design).
255
+ */
256
+ setSessionsReadOnly(readOnly) {
257
+ this.sessionsReadOnly = readOnly;
258
+ }
259
+ isSessionsReadOnly() {
260
+ return this.sessionsReadOnly;
261
+ }
262
+ /**
263
+ * daemon state ownership -- install/uninstall the IPC persistence delegate. In remote
264
+ * mode the server installs the delegate after RemotePtyHost.connect
265
+ * succeeds. Idempotent; pass null to fall back to direct file writes
266
+ * (e.g. when host factory recreates an in-process host). Setting the
267
+ * delegate does not flush -- callers do that explicitly if the next
268
+ * snapshot needs to land on disk before further work.
269
+ */
270
+ setPersistenceDelegate(delegate) {
271
+ this.persistenceDelegate = delegate;
272
+ }
273
+ /**
274
+ * Force a flush *now* and await the underlying persistence (file
275
+ * write or IPC ACK). Used by shutdown paths that must observe IO
276
+ * errors before deciding whether to write the daemon-graceful
277
+ * marker. Synchronous in spirit (cancels the debounce timer); the
278
+ * Promise reflects the persist step.
279
+ */
280
+ async flush() {
281
+ if (this.timer !== null) {
282
+ clearTimeout(this.timer);
283
+ this.timer = null;
284
+ }
285
+ if (this.destroyed)
286
+ return;
287
+ /*
288
+ * -- first drain any debounce-scheduled
289
+ * write that already fired, so the shutdown path observes its
290
+ * outcome (errors are surfaced through onPersistError; the
291
+ * Promise itself never rejects). Then perform a fresh synchronous-
292
+ * in-spirit write so the in-memory snapshot reaches disk / the
293
+ * IPC peer.
294
+ */
295
+ await this.lastWrite;
296
+ await this.write();
297
+ }
298
+ /** Cancel pending timer and ignore future mutate calls (for test teardown). */
299
+ destroy() {
300
+ if (this.timer !== null) {
301
+ clearTimeout(this.timer);
302
+ this.timer = null;
303
+ }
304
+ this.destroyed = true;
305
+ }
306
+ scheduleFlush() {
307
+ if (this.timer !== null) {
308
+ clearTimeout(this.timer);
309
+ }
310
+ this.timer = setTimeout(() => {
311
+ this.timer = null;
312
+ // Track the chain so flush() can await the latest in-flight
313
+ // write. -- route failures through
314
+ // onPersistError so a debounced delegate.persist() reject (IPC
315
+ // NACK / disk EIO) does not silently lose project / projectStates
316
+ // / serviceConfig changes. The catch returns void so awaiting
317
+ // lastWrite never rejects on shutdown paths.
318
+ this.lastWrite = this.write().catch((err) => {
319
+ this.onPersistError(err);
320
+ });
321
+ }, this.debounceMs);
322
+ }
323
+ async write() {
324
+ if (this.persistenceDelegate) {
325
+ await this.persistenceDelegate.persist(this.state);
326
+ return;
327
+ }
328
+ writeFileSync(this.tmpPath, JSON.stringify(this.state), "utf-8");
329
+ renameSync(this.tmpPath, this.filePath);
330
+ }
331
+ }
332
+ function isNodeError(err) {
333
+ return err instanceof Error && "code" in err;
334
+ }
335
+ //# sourceMappingURL=app-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-state.js","sourceRoot":"","sources":["../../src/state/app-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAEL,gCAAgC,EAChC,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,mCAAmC,GAKpC,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,GAAa;IAC5B,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,EAAE;IACjB,QAAQ,EAAE,EAAE;IACZ,cAAc,EAAE,EAAE;IAClB,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE;QACb,gBAAgB,EAAE,KAAK;QACvB,aAAa,EAAE,gBAAgB;QAC/B,gBAAgB,EAAE,2BAA2B;QAC7C,oBAAoB,EAAE,gCAAgC;KACvD;CACF,CAAC;AAEF,SAAS,sBAAsB,CAAC,KAAc;IAC5C,8FAA8F;IAC9F,yEAAyE;IACzE,mEAAmE;IACnE,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,KAAc,EACd,QAAgB,EAChB,OAAe;IAEf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,GAAsB;IACrC,MAAM,aAAa,GAA2B,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,gBAAgB,CAC9B,aAAa,CAAC,oBAAoB,EAClC,gCAAgC,EAChC,MAAM,CAAC,iBAAiB,CACzB,CAAC;IACF,MAAM,OAAO,GAAG,gBAAgB,CAC9B,aAAa,CAAC,gBAAgB,EAC9B,2BAA2B,EAC3B,OAAO,CACR,CAAC;IACF,OAAO;QACL,GAAG,eAAe,CAAC,WAAW,CAAC;QAC/B,GAAG,GAAG;QACN,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3B,MAAM,0BAA0B,GAC9B,mCAAmC,CACjC,OAAO,CAAC,0BAA0B,CACnC,CAAC;gBACJ,OAAO;oBACL,GAAG,OAAO;oBACV,GAAG,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC,IAAI;wBAC3C,0BAA0B;qBAC3B,CAAC;iBACH,CAAC;YACJ,CAAC,CAAC;YACJ,CAAC,CAAC,EAAE;QACN,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;QAC3E,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC;QAClD,YAAY,EAAE,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC;QACrD,aAAa,EAAE;YACb,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,IAAI,KAAK;YACzD,aAAa,EAAE,sBAAsB,CAAC,aAAa,CAAC,aAAa,CAAC;YAClE,gBAAgB,EAAE,OAAO;YACzB,oBAAoB,EAAE,OAAO;SAC9B;KACF,CAAC;AACJ,CAAC;AA+DD,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C;QACE,KAAK,CACH,wQAAwQ,CACzQ,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IAChB,KAAK,CAAW;IACP,GAAG,CAAS;IACZ,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,UAAU,CAAS;IAC5B,KAAK,GAAyC,IAAI,CAAC;IACnD,SAAS,GAAG,KAAK,CAAC;IAC1B;;;;;;;;OAQG;IACK,gBAAgB,GAAG,KAAK,CAAC;IACjC;;;;;;;OAOG;IACK,mBAAmB,GAAuC,IAAI,CAAC;IACvE;;;;;;;OAOG;IACK,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACpC,cAAc,CAAyB;IAExD,YAAY,OAA0B,EAAE;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc;YACjB,IAAI,CAAC,cAAc,KAAK,SAAS;gBAC/B,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CACN,OAAO,CAAC,KAAK,CACX,oEAAoE,EACpE,GAAG,CACJ;gBACL,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QAEjD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAEO,IAAI;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9C,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;YACtC,CAAC;YACD,sCAAsC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,cAAc,SAAS,EAAE,CAAC,CAAC;YACvE,CAAC;YAAC,MAAM,CAAC;gBACP,6CAA6C;YAC/C,CAAC;YACD,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAuC;QACpD,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACH,mBAAmB,CAAC,EAA4C;QAC9D,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,EAA4C;QAC9D,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,EAA2C;QAC5D,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,iBAAiB,CAAC,EAA0C;QAC1D,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,EAAuC;QACpD,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,IAAI,qBAAqB,EAAE,CAAC;QACpC,CAAC;QACD,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,cAAc,CAAC,EAA6B;QAC1C,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,QAAiB;QACnC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;IACnC,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB,CAAC,QAA4C;QACjE,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IACtC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B;;;;;;;WAOG;QACH,MAAM,IAAI,CAAC,SAAS,CAAC;QACrB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,+EAA+E;IAC/E,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,4DAA4D;YAC5D,mCAAmC;YACnC,+DAA+D;YAC/D,kEAAkE;YAClE,8DAA8D;YAC9D,6CAA6C;YAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACjE,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,OAAO,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type Project, type Session } from "@parasor/shared";
2
+ import type { AppStateStore } from "./app-state.js";
3
+ export interface CreateProjectOpts {
4
+ path: string;
5
+ name?: string;
6
+ }
7
+ export interface UpdateProjectOpts {
8
+ name?: string;
9
+ pinned?: boolean;
10
+ readOnly?: boolean;
11
+ worktreeLocalFileAllowlist?: string[];
12
+ }
13
+ export declare class ProjectManager {
14
+ private readonly store;
15
+ constructor(store: AppStateStore);
16
+ create(opts: CreateProjectOpts): Project;
17
+ list(): Project[];
18
+ get(id: string): Project | undefined;
19
+ update(id: string, opts: UpdateProjectOpts): Project | undefined;
20
+ delete(id: string, force?: boolean): boolean;
21
+ getProjectSessions(projectId: string): Session[];
22
+ touchProject(id: string): void;
23
+ /**
24
+ * Apply a manual sort order via DnD reorder. `ids` must contain every
25
+ * existing project id exactly once. Assigns `order` = index for each.
26
+ * Returns the new project list, or `undefined` when the id set mismatches.
27
+ */
28
+ reorder(ids: string[]): Project[] | undefined;
29
+ }
30
+ //# sourceMappingURL=project-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-manager.d.ts","sourceRoot":"","sources":["../../src/state/project-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,OAAO,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;CACvC;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,aAAa;IAEjD,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO;IA8BxC,IAAI,IAAI,OAAO,EAAE;IAIjB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS;IAsBhE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO;IAuB1C,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAIhD,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAU9B;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS;CAkB9C"}
@@ -0,0 +1,128 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { basename } from "node:path";
3
+ import { normalizeWorktreeLocalFileAllowlist, } from "@parasor/shared";
4
+ import { expandUserHome } from "../lib/path.js";
5
+ export class ProjectManager {
6
+ store;
7
+ constructor(store) {
8
+ this.store = store;
9
+ }
10
+ create(opts) {
11
+ const path = expandUserHome(opts.path);
12
+ const existing = this.store.get().projects.find((p) => p.path === path);
13
+ if (existing)
14
+ return existing;
15
+ const now = Date.now();
16
+ const project = {
17
+ id: randomUUID(),
18
+ name: opts.name ?? basename(path),
19
+ path,
20
+ createdAt: now,
21
+ lastAccessedAt: now,
22
+ };
23
+ this.store.mutateProjects((s) => {
24
+ s.projects.push(project);
25
+ s.projectStates[project.id] = {
26
+ projectId: project.id,
27
+ layout: null,
28
+ worktrees: [],
29
+ openFiles: [],
30
+ lastFocusedPaneId: null,
31
+ focusedPaneId: null,
32
+ lastAccessedAt: now,
33
+ };
34
+ });
35
+ return project;
36
+ }
37
+ list() {
38
+ return [...this.store.get().projects];
39
+ }
40
+ get(id) {
41
+ return this.store.get().projects.find((p) => p.id === id);
42
+ }
43
+ update(id, opts) {
44
+ let result;
45
+ this.store.mutateProjects((s) => {
46
+ const idx = s.projects.findIndex((p) => p.id === id);
47
+ if (idx === -1)
48
+ return;
49
+ const project = s.projects[idx];
50
+ if (opts.name !== undefined)
51
+ project.name = opts.name;
52
+ if (opts.pinned !== undefined)
53
+ project.pinned = opts.pinned;
54
+ if (opts.readOnly !== undefined)
55
+ project.readOnly = opts.readOnly;
56
+ if (opts.worktreeLocalFileAllowlist !== undefined) {
57
+ project.worktreeLocalFileAllowlist =
58
+ normalizeWorktreeLocalFileAllowlist(opts.worktreeLocalFileAllowlist);
59
+ }
60
+ result = project;
61
+ });
62
+ return result;
63
+ }
64
+ delete(id, force = false) {
65
+ const project = this.get(id);
66
+ if (!project)
67
+ return false;
68
+ if (project.pinned && !force)
69
+ return false;
70
+ this.store.mutateProjects((s) => {
71
+ s.projects = s.projects.filter((p) => p.id !== id);
72
+ delete s.projectStates[id];
73
+ });
74
+ /*
75
+ * daemon state ownership -- orphan-session cleanup is cross-domain (sessions are
76
+ * daemon-owned in remote mode). Use internalMutate so the call
77
+ * succeeds in both modes: in-process flushes the filtered list,
78
+ * remote applies mirror-only (daemon's own SESSION_LIST broadcast
79
+ * is the source of truth there).
80
+ */
81
+ this.store.internalMutate((s) => {
82
+ s.sessions = s.sessions.filter((sess) => sess.projectId !== id);
83
+ });
84
+ return true;
85
+ }
86
+ getProjectSessions(projectId) {
87
+ return this.store.get().sessions.filter((s) => s.projectId === projectId);
88
+ }
89
+ touchProject(id) {
90
+ const now = Date.now();
91
+ this.store.mutateProjects((s) => {
92
+ const project = s.projects.find((p) => p.id === id);
93
+ if (project)
94
+ project.lastAccessedAt = now;
95
+ const ps = s.projectStates[id];
96
+ if (ps)
97
+ ps.lastAccessedAt = now;
98
+ });
99
+ }
100
+ /**
101
+ * Apply a manual sort order via DnD reorder. `ids` must contain every
102
+ * existing project id exactly once. Assigns `order` = index for each.
103
+ * Returns the new project list, or `undefined` when the id set mismatches.
104
+ */
105
+ reorder(ids) {
106
+ const current = this.store.get().projects;
107
+ if (ids.length !== current.length)
108
+ return undefined;
109
+ const idSet = new Set(ids);
110
+ if (idSet.size !== ids.length)
111
+ return undefined;
112
+ for (const p of current)
113
+ if (!idSet.has(p.id))
114
+ return undefined;
115
+ let result = [];
116
+ this.store.mutateProjects((s) => {
117
+ const byId = new Map(s.projects.map((p) => [p.id, p]));
118
+ ids.forEach((id, idx) => {
119
+ const project = byId.get(id);
120
+ if (project)
121
+ project.order = idx;
122
+ });
123
+ result = [...s.projects];
124
+ });
125
+ return result;
126
+ }
127
+ }
128
+ //# sourceMappingURL=project-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-manager.js","sourceRoot":"","sources":["../../src/state/project-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ServerNotice, ServerNoticeKind } from "@parasor/shared";
2
+ export declare class ServerNoticesStore {
3
+ private byKind;
4
+ recordDaemonAutoRestarted(detail: {
5
+ serverProtocolVersion?: string;
6
+ daemonProtocolVersion?: string;
7
+ }): void;
8
+ list(): ServerNotice[];
9
+ has(kind: ServerNoticeKind): boolean;
10
+ dismiss(kind: ServerNoticeKind): boolean;
11
+ }
12
+ //# sourceMappingURL=server-notices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-notices.d.ts","sourceRoot":"","sources":["../../src/state/server-notices.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAA6C;IAE3D,yBAAyB,CAAC,MAAM,EAAE;QAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;KAChC,GAAG,IAAI;IASR,IAAI,IAAI,YAAY,EAAE;IAItB,GAAG,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO;IAIpC,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO;CAGzC"}
@@ -0,0 +1,32 @@
1
+ /*
2
+ * daemon protocol mismatch recovery -- in-memory store for server-lifetime notices surfaced to the web
3
+ * UI. Currently records `daemon-auto-restarted` events from the
4
+ * createPtyHost recovery path so the web banner can explain why the
5
+ * session list is empty after a daemon-protocol upgrade.
6
+ *
7
+ * Lifecycle: instance lives on the running server only; notices are not
8
+ * persisted across server restarts. Web dismisses per-kind via
9
+ * `DELETE /api/notices/:kind`. Re-occurrence (a second auto-restart in
10
+ * the same lifetime) overwrites -- at most one entry per kind.
11
+ */
12
+ export class ServerNoticesStore {
13
+ byKind = new Map();
14
+ recordDaemonAutoRestarted(detail) {
15
+ this.byKind.set("daemon-auto-restarted", {
16
+ kind: "daemon-auto-restarted",
17
+ occurredAt: new Date().toISOString(),
18
+ serverProtocolVersion: detail.serverProtocolVersion,
19
+ daemonProtocolVersion: detail.daemonProtocolVersion,
20
+ });
21
+ }
22
+ list() {
23
+ return [...this.byKind.values()];
24
+ }
25
+ has(kind) {
26
+ return this.byKind.has(kind);
27
+ }
28
+ dismiss(kind) {
29
+ return this.byKind.delete(kind);
30
+ }
31
+ }
32
+ //# sourceMappingURL=server-notices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-notices.js","sourceRoot":"","sources":["../../src/state/server-notices.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;IAE3D,yBAAyB,CAAC,MAGzB;QACC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE;YACvC,IAAI,EAAE,uBAAuB;YAC7B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;YACnD,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;SACpD,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,IAAsB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,IAAsB;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { Worktree } from "@parasor/shared";
2
+ /**
3
+ * In-memory cache of per-project worktrees, kept in sync by the
4
+ * runtime broadcast wrapper. Used to keep `EventBus.addClient` fully
5
+ * synchronous so the snapshot/seq capture stays atomic with the
6
+ * broadcast stream.
7
+ */
8
+ export declare class WorktreeCache {
9
+ private cache;
10
+ get(): Record<string, Worktree[]>;
11
+ setAll(initial: Record<string, Worktree[]>): void;
12
+ setProject(projectId: string, worktrees: Worktree[]): void;
13
+ removeProject(projectId: string): void;
14
+ /**
15
+ * Idempotent upsert by `path`. A snapshot+broadcast race (cache primed
16
+ * AFTER worktree-created fires) must not double-count, but a re-broadcast
17
+ * carrying refreshed counters (ahead/behind/dirtyCount) MUST update the
18
+ * cached entry -- otherwise a worktree-created emitted before counter
19
+ * enrichment finishes leaves the entry stuck at 0 forever (no other
20
+ * code path updates this cache).
21
+ */
22
+ appendWorktree(projectId: string, worktree: Worktree): void;
23
+ removeWorktree(projectId: string, worktreePath: string): void;
24
+ }
25
+ //# sourceMappingURL=worktree-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-cache.d.ts","sourceRoot":"","sources":["../../src/state/worktree-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAkC;IAE/C,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAIjC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IAIjD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IAI1D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMtC;;;;;;;OAOG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAY3D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;CAO9D"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * In-memory cache of per-project worktrees, kept in sync by the
3
+ * runtime broadcast wrapper. Used to keep `EventBus.addClient` fully
4
+ * synchronous so the snapshot/seq capture stays atomic with the
5
+ * broadcast stream.
6
+ */
7
+ export class WorktreeCache {
8
+ cache = {};
9
+ get() {
10
+ return this.cache;
11
+ }
12
+ setAll(initial) {
13
+ this.cache = { ...initial };
14
+ }
15
+ setProject(projectId, worktrees) {
16
+ this.cache = { ...this.cache, [projectId]: worktrees };
17
+ }
18
+ removeProject(projectId) {
19
+ if (!(projectId in this.cache))
20
+ return;
21
+ const { [projectId]: _drop, ...rest } = this.cache;
22
+ this.cache = rest;
23
+ }
24
+ /**
25
+ * Idempotent upsert by `path`. A snapshot+broadcast race (cache primed
26
+ * AFTER worktree-created fires) must not double-count, but a re-broadcast
27
+ * carrying refreshed counters (ahead/behind/dirtyCount) MUST update the
28
+ * cached entry -- otherwise a worktree-created emitted before counter
29
+ * enrichment finishes leaves the entry stuck at 0 forever (no other
30
+ * code path updates this cache).
31
+ */
32
+ appendWorktree(projectId, worktree) {
33
+ const list = this.cache[projectId] ?? [];
34
+ const idx = list.findIndex((w) => w.path === worktree.path);
35
+ if (idx === -1) {
36
+ this.cache = { ...this.cache, [projectId]: [...list, worktree] };
37
+ return;
38
+ }
39
+ const next = [...list];
40
+ next[idx] = { ...list[idx], ...worktree };
41
+ this.cache = { ...this.cache, [projectId]: next };
42
+ }
43
+ removeWorktree(projectId, worktreePath) {
44
+ const list = this.cache[projectId];
45
+ if (!list)
46
+ return;
47
+ const next = list.filter((w) => w.path !== worktreePath);
48
+ if (next.length === list.length)
49
+ return;
50
+ this.cache = { ...this.cache, [projectId]: next };
51
+ }
52
+ }
53
+ //# sourceMappingURL=worktree-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-cache.js","sourceRoot":"","sources":["../../src/state/worktree-cache.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,GAA+B,EAAE,CAAC;IAE/C,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,OAAmC;QACxC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,UAAU,CAAC,SAAiB,EAAE,SAAqB;QACjD,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IACzD,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QACvC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,SAAiB,EAAE,QAAkB;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,YAAoB;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO;QACxC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;CACF"}