@multiplayer-app/agent 0.1.19 → 0.1.21

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 (308) hide show
  1. package/README.md +14 -7
  2. package/dist/agent/definition.d.ts +13 -0
  3. package/dist/agent/definition.d.ts.map +1 -1
  4. package/dist/agent/definition.test.js +8 -3
  5. package/dist/agent/definition.test.js.map +1 -1
  6. package/dist/agent/profiles/coding.d.ts +1 -1
  7. package/dist/agent/profiles/coding.d.ts.map +1 -1
  8. package/dist/agent/profiles/coding.js +21 -4
  9. package/dist/agent/profiles/coding.js.map +1 -1
  10. package/dist/agent/profiles/index.js +1 -1
  11. package/dist/agent/profiles/index.js.map +1 -1
  12. package/dist/agent/profiles/research.d.ts.map +1 -1
  13. package/dist/agent/profiles/research.js +23 -1
  14. package/dist/agent/profiles/research.js.map +1 -1
  15. package/dist/agent/turn-history.d.ts +40 -0
  16. package/dist/agent/turn-history.d.ts.map +1 -0
  17. package/dist/agent/turn-history.js +167 -0
  18. package/dist/agent/turn-history.js.map +1 -0
  19. package/dist/agent/turn-runner.d.ts +22 -1
  20. package/dist/agent/turn-runner.d.ts.map +1 -1
  21. package/dist/agent/turn-runner.js +162 -79
  22. package/dist/agent/turn-runner.js.map +1 -1
  23. package/dist/app/app-host.d.ts +57 -0
  24. package/dist/app/app-host.d.ts.map +1 -0
  25. package/dist/app/app-host.js +252 -0
  26. package/dist/app/app-host.js.map +1 -0
  27. package/dist/app/app-host.test.d.ts +2 -0
  28. package/dist/app/app-host.test.d.ts.map +1 -0
  29. package/dist/app/app-host.test.js +639 -0
  30. package/dist/app/app-host.test.js.map +1 -0
  31. package/dist/app/config.d.ts +196 -0
  32. package/dist/app/config.d.ts.map +1 -0
  33. package/dist/app/config.js +362 -0
  34. package/dist/app/config.js.map +1 -0
  35. package/dist/app/config.test.d.ts +2 -0
  36. package/dist/app/config.test.d.ts.map +1 -0
  37. package/dist/app/config.test.js +224 -0
  38. package/dist/app/config.test.js.map +1 -0
  39. package/dist/app/detect.d.ts +68 -0
  40. package/dist/app/detect.d.ts.map +1 -0
  41. package/dist/app/detect.js +449 -0
  42. package/dist/app/detect.js.map +1 -0
  43. package/dist/app/detect.test.d.ts +2 -0
  44. package/dist/app/detect.test.d.ts.map +1 -0
  45. package/dist/app/detect.test.js +267 -0
  46. package/dist/app/detect.test.js.map +1 -0
  47. package/dist/app/env.d.ts +5 -0
  48. package/dist/app/env.d.ts.map +1 -0
  49. package/dist/app/env.js +22 -0
  50. package/dist/app/env.js.map +1 -0
  51. package/dist/app/functions-cli.d.ts +3 -0
  52. package/dist/app/functions-cli.d.ts.map +1 -0
  53. package/dist/app/functions-cli.js +27 -0
  54. package/dist/app/functions-cli.js.map +1 -0
  55. package/dist/app/functions-host.d.ts +15 -0
  56. package/dist/app/functions-host.d.ts.map +1 -0
  57. package/dist/app/functions-host.js +276 -0
  58. package/dist/app/functions-host.js.map +1 -0
  59. package/dist/app/functions-host.test.d.ts +2 -0
  60. package/dist/app/functions-host.test.d.ts.map +1 -0
  61. package/dist/app/functions-host.test.js +117 -0
  62. package/dist/app/functions-host.test.js.map +1 -0
  63. package/dist/app/functions-routes.d.ts +23 -0
  64. package/dist/app/functions-routes.d.ts.map +1 -0
  65. package/dist/app/functions-routes.js +85 -0
  66. package/dist/app/functions-routes.js.map +1 -0
  67. package/dist/app/functions-routes.test.d.ts +2 -0
  68. package/dist/app/functions-routes.test.d.ts.map +1 -0
  69. package/dist/app/functions-routes.test.js +40 -0
  70. package/dist/app/functions-routes.test.js.map +1 -0
  71. package/dist/app/manifest.d.ts +17 -0
  72. package/dist/app/manifest.d.ts.map +1 -0
  73. package/dist/app/manifest.js +64 -0
  74. package/dist/app/manifest.js.map +1 -0
  75. package/dist/app/manifest.test.d.ts +2 -0
  76. package/dist/app/manifest.test.d.ts.map +1 -0
  77. package/dist/app/manifest.test.js +173 -0
  78. package/dist/app/manifest.test.js.map +1 -0
  79. package/dist/app/release-artifacts.d.ts +39 -0
  80. package/dist/app/release-artifacts.d.ts.map +1 -0
  81. package/dist/app/release-artifacts.js +229 -0
  82. package/dist/app/release-artifacts.js.map +1 -0
  83. package/dist/app/release-artifacts.test.d.ts +2 -0
  84. package/dist/app/release-artifacts.test.d.ts.map +1 -0
  85. package/dist/app/release-artifacts.test.js +295 -0
  86. package/dist/app/release-artifacts.test.js.map +1 -0
  87. package/dist/app/route-pattern.d.ts +23 -0
  88. package/dist/app/route-pattern.d.ts.map +1 -0
  89. package/dist/app/route-pattern.js +339 -0
  90. package/dist/app/route-pattern.js.map +1 -0
  91. package/dist/app/route-pattern.test.d.ts +2 -0
  92. package/dist/app/route-pattern.test.d.ts.map +1 -0
  93. package/dist/app/route-pattern.test.js +187 -0
  94. package/dist/app/route-pattern.test.js.map +1 -0
  95. package/dist/app/rules.d.ts +61 -0
  96. package/dist/app/rules.d.ts.map +1 -0
  97. package/dist/app/rules.js +90 -0
  98. package/dist/app/rules.js.map +1 -0
  99. package/dist/app/rules.test.d.ts +2 -0
  100. package/dist/app/rules.test.d.ts.map +1 -0
  101. package/dist/app/rules.test.js +69 -0
  102. package/dist/app/rules.test.js.map +1 -0
  103. package/dist/app/runner.d.ts +109 -0
  104. package/dist/app/runner.d.ts.map +1 -0
  105. package/dist/app/runner.js +429 -0
  106. package/dist/app/runner.js.map +1 -0
  107. package/dist/app/site.d.ts +73 -0
  108. package/dist/app/site.d.ts.map +1 -0
  109. package/dist/app/site.js +161 -0
  110. package/dist/app/site.js.map +1 -0
  111. package/dist/app/site.test.d.ts +2 -0
  112. package/dist/app/site.test.d.ts.map +1 -0
  113. package/dist/app/site.test.js +291 -0
  114. package/dist/app/site.test.js.map +1 -0
  115. package/dist/app/static-server.d.ts +20 -0
  116. package/dist/app/static-server.d.ts.map +1 -0
  117. package/dist/app/static-server.js +145 -0
  118. package/dist/app/static-server.js.map +1 -0
  119. package/dist/context-pruning.d.ts +2 -0
  120. package/dist/context-pruning.d.ts.map +1 -1
  121. package/dist/context-pruning.js +3 -2
  122. package/dist/context-pruning.js.map +1 -1
  123. package/dist/models/usage.d.ts +6 -0
  124. package/dist/models/usage.d.ts.map +1 -1
  125. package/dist/models/usage.js +13 -0
  126. package/dist/models/usage.js.map +1 -1
  127. package/dist/persistence/conversation-store.d.ts +21 -0
  128. package/dist/persistence/conversation-store.d.ts.map +1 -0
  129. package/dist/persistence/conversation-store.js +59 -0
  130. package/dist/persistence/conversation-store.js.map +1 -0
  131. package/dist/persistence/conversation-store.test.d.ts +2 -0
  132. package/dist/persistence/conversation-store.test.d.ts.map +1 -0
  133. package/dist/persistence/conversation-store.test.js +98 -0
  134. package/dist/persistence/conversation-store.test.js.map +1 -0
  135. package/dist/persistence/git-sync.d.ts +14 -1
  136. package/dist/persistence/git-sync.d.ts.map +1 -1
  137. package/dist/persistence/git-sync.js +73 -17
  138. package/dist/persistence/git-sync.js.map +1 -1
  139. package/dist/persistence/git-sync.test.js +155 -6
  140. package/dist/persistence/git-sync.test.js.map +1 -1
  141. package/dist/persistence/snapshot-sync.d.ts +19 -2
  142. package/dist/persistence/snapshot-sync.d.ts.map +1 -1
  143. package/dist/persistence/snapshot-sync.js +194 -83
  144. package/dist/persistence/snapshot-sync.js.map +1 -1
  145. package/dist/persistence/snapshot-sync.test.js +145 -27
  146. package/dist/persistence/snapshot-sync.test.js.map +1 -1
  147. package/dist/persistence/workspace.d.ts +3 -0
  148. package/dist/persistence/workspace.d.ts.map +1 -1
  149. package/dist/persistence/workspace.js +1 -0
  150. package/dist/persistence/workspace.js.map +1 -1
  151. package/dist/research/extract-texts.d.ts.map +1 -1
  152. package/dist/research/extract-texts.js +34 -16
  153. package/dist/research/extract-texts.js.map +1 -1
  154. package/dist/research/filingramp/attachment-tools.d.ts.map +1 -1
  155. package/dist/research/filingramp/attachment-tools.js +7 -4
  156. package/dist/research/filingramp/attachment-tools.js.map +1 -1
  157. package/dist/research/filingramp/shared.d.ts.map +1 -1
  158. package/dist/research/filingramp/shared.js +5 -5
  159. package/dist/research/filingramp/shared.js.map +1 -1
  160. package/dist/research/prompt.d.ts.map +1 -1
  161. package/dist/research/prompt.js +2 -1
  162. package/dist/research/prompt.js.map +1 -1
  163. package/dist/runtime/app-mode.d.ts +10 -0
  164. package/dist/runtime/app-mode.d.ts.map +1 -0
  165. package/dist/runtime/app-mode.js +172 -0
  166. package/dist/runtime/app-mode.js.map +1 -0
  167. package/dist/runtime/app-mode.test.d.ts +2 -0
  168. package/dist/runtime/app-mode.test.d.ts.map +1 -0
  169. package/dist/runtime/app-mode.test.js +130 -0
  170. package/dist/runtime/app-mode.test.js.map +1 -0
  171. package/dist/runtime/app-rehearsal.d.ts +2 -0
  172. package/dist/runtime/app-rehearsal.d.ts.map +1 -0
  173. package/dist/runtime/app-rehearsal.js +56 -0
  174. package/dist/runtime/app-rehearsal.js.map +1 -0
  175. package/dist/runtime/build-mode.d.ts +12 -0
  176. package/dist/runtime/build-mode.d.ts.map +1 -0
  177. package/dist/runtime/build-mode.js +116 -0
  178. package/dist/runtime/build-mode.js.map +1 -0
  179. package/dist/runtime/build-mode.test.d.ts +2 -0
  180. package/dist/runtime/build-mode.test.d.ts.map +1 -0
  181. package/dist/runtime/build-mode.test.js +121 -0
  182. package/dist/runtime/build-mode.test.js.map +1 -0
  183. package/dist/runtime/cli.js +7 -2
  184. package/dist/runtime/cli.js.map +1 -1
  185. package/dist/runtime/config.d.ts +4 -0
  186. package/dist/runtime/config.d.ts.map +1 -1
  187. package/dist/runtime/config.js +13 -2
  188. package/dist/runtime/config.js.map +1 -1
  189. package/dist/runtime/guest-server.d.ts +3 -0
  190. package/dist/runtime/guest-server.d.ts.map +1 -0
  191. package/dist/runtime/{lambda-microvm.js → guest-server.js} +49 -18
  192. package/dist/runtime/guest-server.js.map +1 -0
  193. package/dist/runtime/image-hooks.d.ts +5 -0
  194. package/dist/runtime/image-hooks.d.ts.map +1 -0
  195. package/dist/runtime/image-hooks.js +68 -0
  196. package/dist/runtime/image-hooks.js.map +1 -0
  197. package/dist/runtime/image-hooks.test.d.ts +2 -0
  198. package/dist/runtime/image-hooks.test.d.ts.map +1 -0
  199. package/dist/runtime/image-hooks.test.js +74 -0
  200. package/dist/runtime/image-hooks.test.js.map +1 -0
  201. package/dist/runtime/index.d.ts +8 -3
  202. package/dist/runtime/index.d.ts.map +1 -1
  203. package/dist/runtime/index.js +53 -35
  204. package/dist/runtime/index.js.map +1 -1
  205. package/dist/runtime/listening-ports.d.ts +13 -0
  206. package/dist/runtime/listening-ports.d.ts.map +1 -0
  207. package/dist/runtime/listening-ports.js +78 -0
  208. package/dist/runtime/listening-ports.js.map +1 -0
  209. package/dist/runtime/listening-ports.test.d.ts +2 -0
  210. package/dist/runtime/listening-ports.test.d.ts.map +1 -0
  211. package/dist/runtime/listening-ports.test.js +39 -0
  212. package/dist/runtime/listening-ports.test.js.map +1 -0
  213. package/dist/runtime/preview-proxy.d.ts +56 -0
  214. package/dist/runtime/preview-proxy.d.ts.map +1 -0
  215. package/dist/runtime/preview-proxy.js +302 -0
  216. package/dist/runtime/preview-proxy.js.map +1 -0
  217. package/dist/runtime/preview-proxy.test.d.ts +2 -0
  218. package/dist/runtime/preview-proxy.test.d.ts.map +1 -0
  219. package/dist/runtime/preview-proxy.test.js +122 -0
  220. package/dist/runtime/preview-proxy.test.js.map +1 -0
  221. package/dist/runtime/session-mode.d.ts +3 -0
  222. package/dist/runtime/session-mode.d.ts.map +1 -0
  223. package/dist/runtime/session-mode.js +60 -0
  224. package/dist/runtime/session-mode.js.map +1 -0
  225. package/dist/runtime/workload.d.ts +44 -0
  226. package/dist/runtime/workload.d.ts.map +1 -0
  227. package/dist/runtime/workload.js +222 -0
  228. package/dist/runtime/workload.js.map +1 -0
  229. package/dist/runtime/workload.test.d.ts +2 -0
  230. package/dist/runtime/workload.test.d.ts.map +1 -0
  231. package/dist/runtime/workload.test.js +235 -0
  232. package/dist/runtime/workload.test.js.map +1 -0
  233. package/dist/session/conversation.d.ts +10 -2
  234. package/dist/session/conversation.d.ts.map +1 -1
  235. package/dist/session/conversation.js +40 -12
  236. package/dist/session/conversation.js.map +1 -1
  237. package/dist/session/conversation.test.js +2 -3
  238. package/dist/session/conversation.test.js.map +1 -1
  239. package/dist/session/index.d.ts +1 -1
  240. package/dist/session/index.d.ts.map +1 -1
  241. package/dist/session/index.js +2 -1
  242. package/dist/session/index.js.map +1 -1
  243. package/dist/session/runtime.d.ts +20 -3
  244. package/dist/session/runtime.d.ts.map +1 -1
  245. package/dist/session/runtime.js +97 -16
  246. package/dist/session/runtime.js.map +1 -1
  247. package/dist/session/runtime.test.js +18 -7
  248. package/dist/session/runtime.test.js.map +1 -1
  249. package/dist/session/tools.d.ts.map +1 -1
  250. package/dist/session/tools.js +5 -4
  251. package/dist/session/tools.js.map +1 -1
  252. package/dist/task/loop.d.ts.map +1 -1
  253. package/dist/task/loop.js +6 -4
  254. package/dist/task/loop.js.map +1 -1
  255. package/dist/tools/exec-tools.d.ts +12 -0
  256. package/dist/tools/exec-tools.d.ts.map +1 -1
  257. package/dist/tools/exec-tools.js +46 -3
  258. package/dist/tools/exec-tools.js.map +1 -1
  259. package/dist/tools/exec-tools.test.d.ts +2 -0
  260. package/dist/tools/exec-tools.test.d.ts.map +1 -0
  261. package/dist/tools/exec-tools.test.js +48 -0
  262. package/dist/tools/exec-tools.test.js.map +1 -0
  263. package/dist/tools/fs-tools.d.ts.map +1 -1
  264. package/dist/tools/fs-tools.js +5 -5
  265. package/dist/tools/fs-tools.js.map +1 -1
  266. package/dist/transport/link.d.ts.map +1 -1
  267. package/dist/transport/link.js +16 -5
  268. package/dist/transport/link.js.map +1 -1
  269. package/dist/transport/link.test.js +24 -0
  270. package/dist/transport/link.test.js.map +1 -1
  271. package/dist/transport/protocol.d.ts +190 -3
  272. package/dist/transport/protocol.d.ts.map +1 -1
  273. package/dist/transport/protocol.js +147 -7
  274. package/dist/transport/protocol.js.map +1 -1
  275. package/dist/transport/protocol.test.js +41 -0
  276. package/dist/transport/protocol.test.js.map +1 -1
  277. package/dist/workspace-sync/eligibility.d.ts +14 -0
  278. package/dist/workspace-sync/eligibility.d.ts.map +1 -0
  279. package/dist/workspace-sync/eligibility.js +53 -0
  280. package/dist/workspace-sync/eligibility.js.map +1 -0
  281. package/dist/workspace-sync/merge.d.ts +15 -0
  282. package/dist/workspace-sync/merge.d.ts.map +1 -0
  283. package/dist/workspace-sync/merge.js +66 -0
  284. package/dist/workspace-sync/merge.js.map +1 -0
  285. package/dist/workspace-sync/merge.test.d.ts +2 -0
  286. package/dist/workspace-sync/merge.test.d.ts.map +1 -0
  287. package/dist/workspace-sync/merge.test.js +28 -0
  288. package/dist/workspace-sync/merge.test.js.map +1 -0
  289. package/dist/workspace-sync/workspace-sync.d.ts +48 -0
  290. package/dist/workspace-sync/workspace-sync.d.ts.map +1 -0
  291. package/dist/workspace-sync/workspace-sync.js +308 -0
  292. package/dist/workspace-sync/workspace-sync.js.map +1 -0
  293. package/dist/workspace-sync/workspace-sync.test.d.ts +2 -0
  294. package/dist/workspace-sync/workspace-sync.test.d.ts.map +1 -0
  295. package/dist/workspace-sync/workspace-sync.test.js +111 -0
  296. package/dist/workspace-sync/workspace-sync.test.js.map +1 -0
  297. package/dist/workspace-sync/write-drafts.d.ts +24 -0
  298. package/dist/workspace-sync/write-drafts.d.ts.map +1 -0
  299. package/dist/workspace-sync/write-drafts.js +87 -0
  300. package/dist/workspace-sync/write-drafts.js.map +1 -0
  301. package/dist/workspace-sync/write-drafts.test.d.ts +2 -0
  302. package/dist/workspace-sync/write-drafts.test.d.ts.map +1 -0
  303. package/dist/workspace-sync/write-drafts.test.js +36 -0
  304. package/dist/workspace-sync/write-drafts.test.js.map +1 -0
  305. package/package.json +12 -2
  306. package/dist/runtime/lambda-microvm.d.ts +0 -3
  307. package/dist/runtime/lambda-microvm.d.ts.map +0 -1
  308. package/dist/runtime/lambda-microvm.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eligibility.js","sourceRoot":"","sources":["../../src/workspace-sync/eligibility.ts"],"names":[],"mappings":";;;AAkBA,8CAEC;AAGD,kDAIC;AAGD,gDAGC;AAED,wCAMC;AAGD,oCAGC;AA/CD,4FAA4F;AAC5F,6FAA6F;AAC7F,0DAA0D;AAC1D,yCAAiC;AACjC,oDAAwF;AAExF,wEAAwE;AACxE,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS,CAAC,0BAAe,CAAC,CAAC,CAAA;AAE/D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,0CAA+B,CAAC,CAAC,CAAA;AAC9F,MAAM,cAAc,GAAG,0CAA0C,CAAA;AAEjE,+FAA+F;AAClF,QAAA,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAA;AAC/C,2DAA2D;AAC9C,QAAA,gBAAgB,GAAG,IAAK,CAAA;AAErC,kEAAkE;AAClE,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAClF,CAAC;AAED,kGAAkG;AAClG,SAAgB,mBAAmB,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACxC,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,KAAK,CAAA;IACrF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACxE,CAAC;AAED,8GAA8G;AAC9G,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACxC,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;AAC5G,CAAC;AAED,SAAgB,cAAc,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IACzD,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;AAC3G,CAAC;AAED,gGAAgG;AAChG,SAAgB,YAAY,CAAC,MAAc;IACzC,IAAI,MAAM,CAAC,UAAU,GAAG,6BAAqB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACrF,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAChC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** Replace base[start, end) with text. A pure insertion has start === end. */
2
+ interface Edit {
3
+ start: number;
4
+ end: number;
5
+ text: string;
6
+ }
7
+ /** The changes from `base` to `next`, as replacements of base ranges, in order. */
8
+ export declare function editsBetween(base: string, next: string): Edit[];
9
+ /**
10
+ * `ours` and `theirs` both changed `base`: the result has both sets of changes. Where they touch
11
+ * the same text, `theirs` (the session's copy, which people see and type into) wins.
12
+ */
13
+ export declare function merge3(base: string, ours: string, theirs: string): string;
14
+ export {};
15
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/workspace-sync/merge.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,UAAU,IAAI;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAsB/D;AAOD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBzE"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.editsBetween = editsBetween;
7
+ exports.merge3 = merge3;
8
+ // Three-way text merge for workspace live sync: when the guest changed a file while people edited
9
+ // the session's copy of it, both changes are kept, the way two editors' changes are in a shared doc.
10
+ const fast_diff_1 = __importDefault(require("fast-diff"));
11
+ /** The changes from `base` to `next`, as replacements of base ranges, in order. */
12
+ function editsBetween(base, next) {
13
+ const edits = [];
14
+ let position = 0;
15
+ for (const [op, text] of (0, fast_diff_1.default)(base, next, undefined, true)) {
16
+ if (op === fast_diff_1.default.EQUAL) {
17
+ position += text.length;
18
+ continue;
19
+ }
20
+ // A replacement comes as a delete and an insert at the same place: one edit.
21
+ const last = edits[edits.length - 1];
22
+ const current = last && last.end === position ? last : undefined;
23
+ if (op === fast_diff_1.default.DELETE) {
24
+ if (current)
25
+ current.end += text.length;
26
+ else
27
+ edits.push({ start: position, end: position + text.length, text: '' });
28
+ position += text.length;
29
+ }
30
+ else if (current) {
31
+ current.text += text;
32
+ }
33
+ else {
34
+ edits.push({ start: position, end: position, text });
35
+ }
36
+ }
37
+ return edits;
38
+ }
39
+ /** Edits that touch the same base text. Two insertions at one point don't: both are kept. */
40
+ function overlapping(a, b) {
41
+ return a.start < b.end && b.start < a.end;
42
+ }
43
+ /**
44
+ * `ours` and `theirs` both changed `base`: the result has both sets of changes. Where they touch
45
+ * the same text, `theirs` (the session's copy, which people see and type into) wins.
46
+ */
47
+ function merge3(base, ours, theirs) {
48
+ if (ours === base || ours === theirs)
49
+ return theirs;
50
+ if (theirs === base)
51
+ return ours;
52
+ const their = editsBetween(base, theirs);
53
+ const mine = editsBetween(base, ours).filter((edit) => !their.some((other) => overlapping(edit, other)));
54
+ const edits = [
55
+ ...their.map((edit) => ({ ...edit, order: 0 })),
56
+ ...mine.map((edit) => ({ ...edit, order: 1 })),
57
+ ].sort((a, b) => a.start - b.start || a.end - b.end || a.order - b.order);
58
+ let result = '';
59
+ let position = 0;
60
+ for (const edit of edits) {
61
+ result += base.slice(position, edit.start) + edit.text;
62
+ position = edit.end;
63
+ }
64
+ return result + base.slice(position);
65
+ }
66
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/workspace-sync/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=merge.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.d.ts","sourceRoot":"","sources":["../../src/workspace-sync/merge.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = require("node:test");
8
+ const merge_1 = require("./merge");
9
+ const BASE = 'function greet() {\n return "hi"\n}\n\nexport default greet\n';
10
+ (0, node_test_1.it)('keeps both sides\' changes to different parts of a file', () => {
11
+ const ours = BASE.replace('"hi"', '"hello"');
12
+ const theirs = BASE.replace('export default greet', 'export { greet }');
13
+ strict_1.default.equal((0, merge_1.merge3)(BASE, ours, theirs), 'function greet() {\n return "hello"\n}\n\nexport { greet }\n');
14
+ });
15
+ (0, node_test_1.it)('lets the session\'s copy win where both changed the same text', () => {
16
+ const ours = BASE.replace('"hi"', '"hello"');
17
+ const theirs = BASE.replace('"hi"', '"hey"');
18
+ strict_1.default.equal((0, merge_1.merge3)(BASE, ours, theirs), theirs);
19
+ });
20
+ (0, node_test_1.it)('keeps two insertions at the same point, the session\'s first', () => {
21
+ strict_1.default.equal((0, merge_1.merge3)('ab', 'aXb', 'aYb'), 'aYXb');
22
+ });
23
+ (0, node_test_1.it)('takes whichever side changed when only one did', () => {
24
+ strict_1.default.equal((0, merge_1.merge3)(BASE, BASE, 'new'), 'new');
25
+ strict_1.default.equal((0, merge_1.merge3)(BASE, 'mine', BASE), 'mine');
26
+ strict_1.default.equal((0, merge_1.merge3)(BASE, 'same', 'same'), 'same');
27
+ });
28
+ //# sourceMappingURL=merge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.test.js","sourceRoot":"","sources":["../../src/workspace-sync/merge.test.ts"],"names":[],"mappings":";;;;;AAAA,gEAAuC;AACvC,yCAA8B;AAC9B,mCAAgC;AAEhC,MAAM,IAAI,GAAG,gEAAgE,CAAA;AAE7E,IAAA,cAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;IACjE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAA;IACvE,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,+DAA+D,CAAC,CAAA;AAC3G,CAAC,CAAC,CAAA;AAEF,IAAA,cAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5C,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA;AAEF,IAAA,cAAE,EAAC,8DAA8D,EAAE,GAAG,EAAE;IACtE,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA;AAEF,IAAA,cAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;IACxD,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;IAC9C,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAChD,gBAAM,CAAC,KAAK,CAAC,IAAA,cAAM,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AACpD,CAAC,CAAC,CAAA"}
@@ -0,0 +1,48 @@
1
+ import type { OutboundEvent } from '../transport/link';
2
+ export declare class WorkspaceSync {
3
+ private readonly dir;
4
+ private readonly send;
5
+ private readonly files;
6
+ private readonly timers;
7
+ private readonly watchers;
8
+ private readonly queues;
9
+ private rescanTimer?;
10
+ private stopped;
11
+ constructor(dir: string, send: (event: OutboundEvent) => void);
12
+ /** Mirrors every file there is now, then follows changes until stop(). */
13
+ start(): Promise<void>;
14
+ stop(): void;
15
+ /** Whether the session has confirmed exactly this version of `file`, so storage already holds it. */
16
+ isConfirmed(file: string, content: Buffer): boolean;
17
+ /** Sends what the model has written so far of a file it is still writing (see WriteDraftTracker). */
18
+ draft(file: string, content: string): void;
19
+ /** Ends drafts: the session's copy becomes whatever is on disk now (or goes, if nothing is). */
20
+ settle(files: string[]): Promise<void>;
21
+ /** Mirrors these files now, without waiting for their watch events (publish_results). */
22
+ flush(files: string[]): Promise<void>;
23
+ /** file_state: people changed the session's copy (content), or it took the guest's version (none). */
24
+ applyState(command: {
25
+ path: string;
26
+ hash: string;
27
+ content?: string;
28
+ }): Promise<void>;
29
+ /** file_delete: someone deleted the session's copy. */
30
+ applyDelete(file: string): Promise<void>;
31
+ private rescan;
32
+ private scan;
33
+ /** One watcher per directory, not one recursive watch: excluded trees (node_modules) are never watched. */
34
+ private watchDirectory;
35
+ private unwatch;
36
+ private onWatchEvent;
37
+ private schedule;
38
+ /** One operation at a time per file, in the order they were asked for. */
39
+ private enqueue;
40
+ /** Sends the file's current state, if it is new to the session. `final` sends it regardless (ends a draft). */
41
+ private syncPath;
42
+ /** The file's text; `unchanged` when its size and modification time still match `statKey`. */
43
+ private read;
44
+ private write;
45
+ /** The absolute path of a workspace file, or undefined when it would escape the workspace. */
46
+ private resolve;
47
+ }
48
+ //# sourceMappingURL=workspace-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-sync.d.ts","sourceRoot":"","sources":["../../src/workspace-sync/workspace-sync.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAmCtD,qBAAa,aAAa;IAStB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IATvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,OAAO,CAAQ;gBAGJ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI;IAGvD,0EAA0E;IACpE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,IAAI,IAAI,IAAI;IASZ,qGAAqG;IACrG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAKnD,qGAAqG;IACrG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAO1C,gGAAgG;IAC1F,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,yFAAyF;IACnF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,sGAAsG;IACtG,UAAU,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BpF,uDAAuD;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAS1B,MAAM;YAON,IAAI;IAoBlB,2GAA2G;IAC3G,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,QAAQ;IAWhB,0EAA0E;IAC1E,OAAO,CAAC,OAAO;IAUf,+GAA+G;YACjG,QAAQ;IA8BtB,8FAA8F;YAChF,IAAI;YAiBJ,KAAK;IAMnB,8FAA8F;IAC9F,OAAO,CAAC,OAAO;CAKhB"}
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WorkspaceSync = void 0;
7
+ // Workspace live sync, the guest's half: every text file in the workspace is mirrored into the
8
+ // session as it changes, however it changed (the agent's tools, a shell command, an SSH user), and
9
+ // people's edits to the session's copy come back into the file. The platform holds the session's
10
+ // copy as a collaborative document (services/api/src/services/sessions/workspace-sync.service.ts)
11
+ // and applies each change as a character diff, so open editors update in place.
12
+ //
13
+ // Each file has a version both sides agreed on, named by its workspaceFileHash. A change is sent
14
+ // with the hash it was built on; the platform applies it when its copy is still that version,
15
+ // and otherwise sends its copy back (file_state), which is merged here, where the agreed text is
16
+ // known, and sent again. The platform keeps no file text of its own, only the agreed hash.
17
+ const fs_1 = require("fs");
18
+ const path_1 = __importDefault(require("path"));
19
+ const workload_1 = require("../runtime/workload");
20
+ const protocol_1 = require("../transport/protocol");
21
+ const eligibility_1 = require("./eligibility");
22
+ const merge_1 = require("./merge");
23
+ // A save is often several writes (truncate, write, rename): wait for the last one.
24
+ const CHANGE_DEBOUNCE_MS = 120;
25
+ // Watch events can be missed (a directory filled before its watcher started, an overflowing
26
+ // inotify queue): a full rescan now and then catches up.
27
+ const RESCAN_INTERVAL_MS = 30000;
28
+ const MAX_UNCONFIRMED_VERSIONS = 8;
29
+ function remember(sent, hash, content) {
30
+ sent.delete(hash);
31
+ sent.set(hash, content);
32
+ while (sent.size > MAX_UNCONFIRMED_VERSIONS)
33
+ sent.delete(sent.keys().next().value);
34
+ }
35
+ class WorkspaceSync {
36
+ constructor(dir, send) {
37
+ this.dir = dir;
38
+ this.send = send;
39
+ this.files = new Map();
40
+ this.timers = new Map();
41
+ this.watchers = new Map();
42
+ this.queues = new Map();
43
+ this.stopped = false;
44
+ }
45
+ /** Mirrors every file there is now, then follows changes until stop(). */
46
+ async start() {
47
+ await this.rescan();
48
+ this.rescanTimer = setInterval(() => {
49
+ this.rescan().catch((error) => console.error('[sync] rescan failed:', error));
50
+ }, RESCAN_INTERVAL_MS);
51
+ this.rescanTimer.unref();
52
+ }
53
+ stop() {
54
+ this.stopped = true;
55
+ if (this.rescanTimer)
56
+ clearInterval(this.rescanTimer);
57
+ for (const timer of this.timers.values())
58
+ clearTimeout(timer);
59
+ this.timers.clear();
60
+ for (const watcher of this.watchers.values())
61
+ watcher.close();
62
+ this.watchers.clear();
63
+ }
64
+ /** Whether the session has confirmed exactly this version of `file`, so storage already holds it. */
65
+ isConfirmed(file, content) {
66
+ var _a;
67
+ const confirmed = (_a = this.files.get((0, eligibility_1.normalizeSyncPath)(file))) === null || _a === void 0 ? void 0 : _a.confirmed;
68
+ return confirmed !== undefined && confirmed === content.toString('utf8');
69
+ }
70
+ /** Sends what the model has written so far of a file it is still writing (see WriteDraftTracker). */
71
+ draft(file, content) {
72
+ const relative = (0, eligibility_1.normalizeSyncPath)(file);
73
+ if (this.stopped || !(0, eligibility_1.isSyncablePath)(relative) || !this.resolve(relative))
74
+ return;
75
+ if (Buffer.byteLength(content, 'utf8') > eligibility_1.MAX_SYNCED_FILE_BYTES)
76
+ return;
77
+ this.send({ type: 'file_draft', path: relative, content });
78
+ }
79
+ /** Ends drafts: the session's copy becomes whatever is on disk now (or goes, if nothing is). */
80
+ async settle(files) {
81
+ await Promise.all(files.map((file) => {
82
+ const relative = (0, eligibility_1.normalizeSyncPath)(file);
83
+ return this.enqueue(relative, () => this.syncPath(relative, { final: true }));
84
+ }));
85
+ }
86
+ /** Mirrors these files now, without waiting for their watch events (publish_results). */
87
+ async flush(files) {
88
+ await Promise.all(files.map((file) => {
89
+ const relative = (0, eligibility_1.normalizeSyncPath)(file);
90
+ return this.enqueue(relative, () => this.syncPath(relative));
91
+ }));
92
+ }
93
+ /** file_state: people changed the session's copy (content), or it took the guest's version (none). */
94
+ applyState(command) {
95
+ const relative = (0, eligibility_1.normalizeSyncPath)(command.path);
96
+ return this.enqueue(relative, async () => {
97
+ const state = this.files.get(relative);
98
+ const { content } = command;
99
+ if (content === undefined) {
100
+ const text = state === null || state === void 0 ? void 0 : state.sent.get(command.hash);
101
+ if (state && text !== undefined) {
102
+ state.confirmed = text;
103
+ state.sent.delete(command.hash);
104
+ }
105
+ return;
106
+ }
107
+ if (!(0, eligibility_1.isSyncablePath)(relative))
108
+ return;
109
+ const read = await this.read(relative);
110
+ if (read.kind === 'unsyncable' || read.kind === 'unchanged')
111
+ return;
112
+ const disk = read.kind === 'text' ? read.content : undefined;
113
+ // Without an agreed version (a restart, a file new to the guest), the platform already decided
114
+ // its copy is the newer one.
115
+ const base = state === null || state === void 0 ? void 0 : state.confirmed;
116
+ const merged = disk === undefined || base === undefined || disk === base ? content : (0, merge_1.merge3)(base, disk, content);
117
+ if (merged !== disk)
118
+ await this.write(relative, merged);
119
+ const hash = (0, protocol_1.workspaceFileHash)(content);
120
+ this.files.set(relative, { confirmed: content, reported: hash, sent: new Map() });
121
+ // A merge kept a change of the guest's own: that goes up as a change built on the session's copy.
122
+ if (merged === content)
123
+ this.send({ type: 'file_synced', path: relative, hash });
124
+ else
125
+ await this.syncPath(relative);
126
+ });
127
+ }
128
+ /** file_delete: someone deleted the session's copy. */
129
+ applyDelete(file) {
130
+ const relative = (0, eligibility_1.normalizeSyncPath)(file);
131
+ return this.enqueue(relative, async () => {
132
+ this.files.delete(relative);
133
+ const target = (0, eligibility_1.isSyncablePath)(relative) ? this.resolve(relative) : undefined;
134
+ if (target)
135
+ await (0, workload_1.removeWorkloadFile)(target);
136
+ });
137
+ }
138
+ async rescan() {
139
+ const seen = new Set();
140
+ await this.scan('', seen);
141
+ // A file gone without a watch event (its directory removed at once, say).
142
+ for (const relative of this.files.keys())
143
+ if (!seen.has(relative))
144
+ this.schedule(relative);
145
+ }
146
+ async scan(relativeDir, seen) {
147
+ if (this.stopped || !(0, eligibility_1.isWatchedDirectory)(relativeDir))
148
+ return;
149
+ this.watchDirectory(relativeDir);
150
+ let entries;
151
+ try {
152
+ entries = await fs_1.promises.readdir(path_1.default.join(this.dir, relativeDir), { withFileTypes: true });
153
+ }
154
+ catch (_a) {
155
+ return;
156
+ }
157
+ for (const entry of entries) {
158
+ const relative = (0, eligibility_1.normalizeSyncPath)(path_1.default.posix.join(relativeDir, entry.name));
159
+ if (entry.isDirectory()) {
160
+ await this.scan(relative, seen);
161
+ }
162
+ else if (entry.isFile() && (0, eligibility_1.isSyncablePath)(relative)) {
163
+ seen === null || seen === void 0 ? void 0 : seen.add(relative);
164
+ this.schedule(relative);
165
+ }
166
+ }
167
+ }
168
+ /** One watcher per directory, not one recursive watch: excluded trees (node_modules) are never watched. */
169
+ watchDirectory(relativeDir) {
170
+ if (this.stopped || this.watchers.has(relativeDir))
171
+ return;
172
+ try {
173
+ const watcher = (0, fs_1.watch)(path_1.default.join(this.dir, relativeDir), (_event, name) => {
174
+ if (name)
175
+ this.onWatchEvent((0, eligibility_1.normalizeSyncPath)(path_1.default.posix.join(relativeDir, name.toString())));
176
+ });
177
+ watcher.on('error', () => this.unwatch(relativeDir));
178
+ watcher.unref();
179
+ this.watchers.set(relativeDir, watcher);
180
+ }
181
+ catch (_a) {
182
+ // Removed before it could be watched; its parent's event covers it.
183
+ }
184
+ }
185
+ unwatch(relativeDir) {
186
+ for (const [dir, watcher] of this.watchers) {
187
+ if (dir === relativeDir || dir.startsWith(`${relativeDir}/`)) {
188
+ watcher.close();
189
+ this.watchers.delete(dir);
190
+ }
191
+ }
192
+ }
193
+ onWatchEvent(relative) {
194
+ const target = this.resolve(relative);
195
+ if (!target || this.stopped)
196
+ return;
197
+ fs_1.promises.lstat(target).then((stat) => {
198
+ if (stat.isDirectory()) {
199
+ if (!this.watchers.has(relative))
200
+ void this.scan(relative);
201
+ }
202
+ else if (stat.isFile()) {
203
+ this.schedule(relative);
204
+ }
205
+ }, () => {
206
+ // Gone: a file, or a directory and every file in it.
207
+ this.unwatch(relative);
208
+ for (const tracked of [...this.files.keys()]) {
209
+ if (tracked === relative || tracked.startsWith(`${relative}/`))
210
+ this.schedule(tracked);
211
+ }
212
+ });
213
+ }
214
+ schedule(relative) {
215
+ if (this.stopped || !(0, eligibility_1.isSyncablePath)(relative))
216
+ return;
217
+ clearTimeout(this.timers.get(relative));
218
+ this.timers.set(relative, setTimeout(() => {
219
+ this.timers.delete(relative);
220
+ this.enqueue(relative, () => this.syncPath(relative)).catch((error) => {
221
+ console.error(`[sync] ${relative}:`, error instanceof Error ? error.message : error);
222
+ });
223
+ }, CHANGE_DEBOUNCE_MS));
224
+ }
225
+ /** One operation at a time per file, in the order they were asked for. */
226
+ enqueue(relative, work) {
227
+ var _a;
228
+ const next = ((_a = this.queues.get(relative)) !== null && _a !== void 0 ? _a : Promise.resolve()).then(work, work);
229
+ const settled = next.catch(() => undefined);
230
+ this.queues.set(relative, settled);
231
+ void settled.then(() => {
232
+ if (this.queues.get(relative) === settled)
233
+ this.queues.delete(relative);
234
+ });
235
+ return next;
236
+ }
237
+ /** Sends the file's current state, if it is new to the session. `final` sends it regardless (ends a draft). */
238
+ async syncPath(relative, options = {}) {
239
+ if (this.stopped)
240
+ return;
241
+ const state = this.files.get(relative);
242
+ const read = await this.read(relative, options.final ? undefined : state === null || state === void 0 ? void 0 : state.statKey);
243
+ if (read.kind === 'unsyncable' || read.kind === 'unchanged')
244
+ return;
245
+ if (read.kind === 'missing') {
246
+ if (state || options.final) {
247
+ this.files.delete(relative);
248
+ this.send({ type: 'file_deleted', path: relative });
249
+ }
250
+ return;
251
+ }
252
+ const hash = (0, protocol_1.workspaceFileHash)(read.content);
253
+ if (state)
254
+ state.statKey = read.statKey;
255
+ if (hash === (state === null || state === void 0 ? void 0 : state.reported) && !options.final)
256
+ return;
257
+ if (!state && this.files.size >= eligibility_1.MAX_SYNCED_FILES)
258
+ return;
259
+ const next = state !== null && state !== void 0 ? state : { sent: new Map(), statKey: read.statKey };
260
+ const base = next.reported;
261
+ next.reported = hash;
262
+ remember(next.sent, hash, read.content);
263
+ this.files.set(relative, next);
264
+ this.send({
265
+ type: 'file_changed',
266
+ path: relative,
267
+ content: read.content,
268
+ ...(base ? { base } : {}),
269
+ ...(options.final ? { final: true } : {}),
270
+ });
271
+ }
272
+ /** The file's text; `unchanged` when its size and modification time still match `statKey`. */
273
+ async read(relative, statKey) {
274
+ const target = this.resolve(relative);
275
+ if (!target)
276
+ return { kind: 'unsyncable' };
277
+ try {
278
+ const stat = await fs_1.promises.lstat(target);
279
+ if (stat.isSymbolicLink())
280
+ return { kind: 'unsyncable' };
281
+ if (!stat.isFile())
282
+ return { kind: 'missing' };
283
+ const key = `${stat.size}:${stat.mtimeMs}`;
284
+ if (key === statKey)
285
+ return { kind: 'unchanged' };
286
+ const content = (0, eligibility_1.syncableText)(await (0, workload_1.readInside)(this.dir, target));
287
+ return content === undefined ? { kind: 'unsyncable' } : { kind: 'text', content, statKey: key };
288
+ }
289
+ catch (error) {
290
+ const code = error.code;
291
+ return code === 'ENOENT' || code === 'ENOTDIR' ? { kind: 'missing' } : { kind: 'unsyncable' };
292
+ }
293
+ }
294
+ async write(relative, content) {
295
+ const target = this.resolve(relative);
296
+ if (!target)
297
+ return;
298
+ await (0, workload_1.writeWorkloadFile)(target, content);
299
+ }
300
+ /** The absolute path of a workspace file, or undefined when it would escape the workspace. */
301
+ resolve(relative) {
302
+ const root = path_1.default.resolve(this.dir);
303
+ const target = path_1.default.resolve(root, relative);
304
+ return target !== root && (0, workload_1.isInsideDir)(root, target) ? target : undefined;
305
+ }
306
+ }
307
+ exports.WorkspaceSync = WorkspaceSync;
308
+ //# sourceMappingURL=workspace-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-sync.js","sourceRoot":"","sources":["../../src/workspace-sync/workspace-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workspace-sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-sync.test.d.ts","sourceRoot":"","sources":["../../src/workspace-sync/workspace-sync.test.ts"],"names":[],"mappings":""}