devchain-cli 0.24.0 → 0.24.2

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 (432) hide show
  1. package/README.md +1 -4
  2. package/dist/build-info.json +2 -2
  3. package/dist/cli.js +66 -11
  4. package/dist/host-install/devchain-host-bootstrap.tgz +0 -0
  5. package/dist/host-install/pins.json +31 -2
  6. package/dist/lib/exclusive-run.js +51 -3
  7. package/dist/lib/git-owner.js +284 -0
  8. package/dist/lib/host-install.js +19 -151
  9. package/dist/lib/local-api.js +175 -0
  10. package/dist/server/common/config/env.config.d.ts +3 -0
  11. package/dist/server/common/config/env.config.js +1 -0
  12. package/dist/server/common/config/env.config.js.map +1 -1
  13. package/dist/server/common/config/host-image.json +3 -3
  14. package/dist/server/common/constants/syncthing-markers.d.ts +1 -0
  15. package/dist/server/common/constants/syncthing-markers.js +6 -1
  16. package/dist/server/common/constants/syncthing-markers.js.map +1 -1
  17. package/dist/server/common/filesystem/vm-home-path.d.ts +11 -0
  18. package/dist/server/common/filesystem/vm-home-path.js +48 -0
  19. package/dist/server/common/filesystem/vm-home-path.js.map +1 -0
  20. package/dist/server/common/process-ids-env.d.ts +1 -0
  21. package/dist/server/common/process-ids-env.js +13 -0
  22. package/dist/server/common/process-ids-env.js.map +1 -0
  23. package/dist/server/common/test/api-test-app.d.ts +12 -0
  24. package/dist/server/common/test/api-test-app.js +76 -0
  25. package/dist/server/common/test/api-test-app.js.map +1 -0
  26. package/dist/server/common/test/app-bootstrap.helper.js +8 -1
  27. package/dist/server/common/test/app-bootstrap.helper.js.map +1 -1
  28. package/dist/server/common/test/fake-bootstrap.server.js +3 -2
  29. package/dist/server/common/test/fake-bootstrap.server.js.map +1 -1
  30. package/dist/server/common/test/fake-docker-engine.server.d.ts +24 -6
  31. package/dist/server/common/test/fake-docker-engine.server.js +123 -25
  32. package/dist/server/common/test/fake-docker-engine.server.js.map +1 -1
  33. package/dist/server/common/test/fake-proxmox.server.js +4 -4
  34. package/dist/server/common/test/fake-ssh.server.js +6 -6
  35. package/dist/server/common/test/fake-ssh.server.js.map +1 -1
  36. package/dist/server/common/test/test-database.helper.d.ts +6 -0
  37. package/dist/server/common/test/test-database.helper.js +29 -0
  38. package/dist/server/common/test/test-database.helper.js.map +1 -0
  39. package/dist/server/modules/cloud-tunnel/services/mobile-chat-rpc.service.d.ts +1 -0
  40. package/dist/server/modules/cloud-tunnel/services/mobile-chat-rpc.service.js +9 -3
  41. package/dist/server/modules/cloud-tunnel/services/mobile-chat-rpc.service.js.map +1 -1
  42. package/dist/server/modules/cloud-tunnel/services/mobile-transcript-projection.d.ts +6 -0
  43. package/dist/server/modules/cloud-tunnel/services/mobile-transcript-projection.js +88 -0
  44. package/dist/server/modules/cloud-tunnel/services/mobile-transcript-projection.js.map +1 -0
  45. package/dist/server/modules/cloud-tunnel/services/tunnel-event-forwarder.service.js +7 -1
  46. package/dist/server/modules/cloud-tunnel/services/tunnel-event-forwarder.service.js.map +1 -1
  47. package/dist/server/modules/core/controllers/docker-archive.d.ts +9 -2
  48. package/dist/server/modules/core/controllers/docker-archive.js +22 -6
  49. package/dist/server/modules/core/controllers/docker-archive.js.map +1 -1
  50. package/dist/server/modules/core/controllers/docker-engine.client.d.ts +2 -1
  51. package/dist/server/modules/core/controllers/docker-engine.client.js +57 -4
  52. package/dist/server/modules/core/controllers/docker-engine.client.js.map +1 -1
  53. package/dist/server/modules/core/controllers/docker-image-metadata.d.ts +248 -0
  54. package/dist/server/modules/core/controllers/docker-image-metadata.js +161 -0
  55. package/dist/server/modules/core/controllers/docker-image-metadata.js.map +1 -0
  56. package/dist/server/modules/core/controllers/docker-settings.d.ts +13 -2
  57. package/dist/server/modules/core/controllers/docker-settings.js +49 -11
  58. package/dist/server/modules/core/controllers/docker-settings.js.map +1 -1
  59. package/dist/server/modules/core/controllers/host-user-identity.d.ts +34 -0
  60. package/dist/server/modules/core/controllers/host-user-identity.js +23 -0
  61. package/dist/server/modules/core/controllers/host-user-identity.js.map +1 -0
  62. package/dist/server/modules/core/controllers/runtime.controller.d.ts +11 -4
  63. package/dist/server/modules/core/controllers/runtime.controller.js +2 -0
  64. package/dist/server/modules/core/controllers/runtime.controller.js.map +1 -1
  65. package/dist/server/modules/file-sync/build-exclusion-suggestions.d.ts +15 -0
  66. package/dist/server/modules/file-sync/build-exclusion-suggestions.js +402 -0
  67. package/dist/server/modules/file-sync/build-exclusion-suggestions.js.map +1 -0
  68. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.d.ts +102 -0
  69. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.js +22 -0
  70. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.js.map +1 -0
  71. package/dist/server/modules/file-sync/file-sync-auto-fix.store.d.ts +12 -0
  72. package/dist/server/modules/file-sync/file-sync-auto-fix.store.js +73 -0
  73. package/dist/server/modules/file-sync/file-sync-auto-fix.store.js.map +1 -0
  74. package/dist/server/modules/file-sync/file-sync-conflicts.d.ts +3 -0
  75. package/dist/server/modules/file-sync/file-sync-conflicts.js +191 -0
  76. package/dist/server/modules/file-sync/file-sync-conflicts.js.map +1 -0
  77. package/dist/server/modules/file-sync/file-sync-ignores.store.d.ts +5 -1
  78. package/dist/server/modules/file-sync/file-sync-ignores.store.js +39 -8
  79. package/dist/server/modules/file-sync/file-sync-ignores.store.js.map +1 -1
  80. package/dist/server/modules/file-sync/file-sync.controller.d.ts +1 -3
  81. package/dist/server/modules/file-sync/file-sync.controller.js +5 -14
  82. package/dist/server/modules/file-sync/file-sync.controller.js.map +1 -1
  83. package/dist/server/modules/file-sync/file-sync.dto.d.ts +220 -1
  84. package/dist/server/modules/file-sync/file-sync.dto.js +70 -4
  85. package/dist/server/modules/file-sync/file-sync.dto.js.map +1 -1
  86. package/dist/server/modules/file-sync/file-sync.module.js +16 -1
  87. package/dist/server/modules/file-sync/file-sync.module.js.map +1 -1
  88. package/dist/server/modules/file-sync/file-sync.service.d.ts +20 -5
  89. package/dist/server/modules/file-sync/file-sync.service.js +173 -37
  90. package/dist/server/modules/file-sync/file-sync.service.js.map +1 -1
  91. package/dist/server/modules/file-sync/git-guard.dto.d.ts +61 -0
  92. package/dist/server/modules/file-sync/git-guard.dto.js +26 -0
  93. package/dist/server/modules/file-sync/git-guard.dto.js.map +1 -0
  94. package/dist/server/modules/file-sync/home-git-guard.service.d.ts +4 -2
  95. package/dist/server/modules/file-sync/home-git-guard.service.js +50 -25
  96. package/dist/server/modules/file-sync/home-git-guard.service.js.map +1 -1
  97. package/dist/server/modules/file-sync/host-git-guard.controller.d.ts +10 -0
  98. package/dist/server/modules/file-sync/host-git-guard.controller.js +64 -0
  99. package/dist/server/modules/file-sync/host-git-guard.controller.js.map +1 -0
  100. package/dist/server/modules/file-sync/host-git-index.controller.d.ts +9 -0
  101. package/dist/server/modules/file-sync/host-git-index.controller.js +67 -0
  102. package/dist/server/modules/file-sync/host-git-index.controller.js.map +1 -0
  103. package/dist/server/modules/file-sync/host-sync.controller.d.ts +15 -2
  104. package/dist/server/modules/file-sync/host-sync.controller.js +122 -14
  105. package/dist/server/modules/file-sync/host-sync.controller.js.map +1 -1
  106. package/dist/server/modules/file-sync/ignore-pattern-matcher.d.ts +30 -0
  107. package/dist/server/modules/file-sync/ignore-pattern-matcher.js +183 -0
  108. package/dist/server/modules/file-sync/ignore-pattern-matcher.js.map +1 -0
  109. package/dist/server/modules/file-sync/project-repository.d.ts +2 -0
  110. package/dist/server/modules/file-sync/project-repository.js +20 -0
  111. package/dist/server/modules/file-sync/project-repository.js.map +1 -0
  112. package/dist/server/modules/file-sync/sync-chown.dto.d.ts +99 -0
  113. package/dist/server/modules/file-sync/sync-chown.dto.js +46 -0
  114. package/dist/server/modules/file-sync/sync-chown.dto.js.map +1 -0
  115. package/dist/server/modules/file-sync/sync-chown.service.d.ts +12 -0
  116. package/dist/server/modules/file-sync/sync-chown.service.js +230 -0
  117. package/dist/server/modules/file-sync/sync-chown.service.js.map +1 -0
  118. package/dist/server/modules/file-sync/sync-path-inspection.dto.d.ts +626 -0
  119. package/dist/server/modules/file-sync/sync-path-inspection.dto.js +108 -0
  120. package/dist/server/modules/file-sync/sync-path-inspection.dto.js.map +1 -0
  121. package/dist/server/modules/file-sync/sync-path-inspector.d.ts +12 -0
  122. package/dist/server/modules/file-sync/sync-path-inspector.js +413 -0
  123. package/dist/server/modules/file-sync/sync-path-inspector.js.map +1 -0
  124. package/dist/server/modules/file-sync/syncthing-rest.client.d.ts +1 -1
  125. package/dist/server/modules/file-sync/syncthing-rest.client.js +9 -4
  126. package/dist/server/modules/file-sync/syncthing-rest.client.js.map +1 -1
  127. package/dist/server/modules/file-sync/testing/fake-file-sync.service.d.ts +28 -5
  128. package/dist/server/modules/file-sync/testing/fake-file-sync.service.js +68 -5
  129. package/dist/server/modules/file-sync/testing/fake-file-sync.service.js.map +1 -1
  130. package/dist/server/modules/file-sync/translate-git-ignore-rule.d.ts +3 -0
  131. package/dist/server/modules/file-sync/translate-git-ignore-rule.js +30 -0
  132. package/dist/server/modules/file-sync/translate-git-ignore-rule.js.map +1 -0
  133. package/dist/server/modules/hooks/dtos/hook-event.dto.d.ts +86 -0
  134. package/dist/server/modules/hooks/dtos/hook-event.dto.js +15 -1
  135. package/dist/server/modules/hooks/dtos/hook-event.dto.js.map +1 -1
  136. package/dist/server/modules/hooks/services/hooks-config.service.js +29 -0
  137. package/dist/server/modules/hooks/services/hooks-config.service.js.map +1 -1
  138. package/dist/server/modules/hooks/services/hooks.service.d.ts +5 -1
  139. package/dist/server/modules/hooks/services/hooks.service.js +27 -5
  140. package/dist/server/modules/hooks/services/hooks.service.js.map +1 -1
  141. package/dist/server/modules/hooks/services/pending-ask-user-question.service.d.ts +2 -2
  142. package/dist/server/modules/hooks/services/pending-ask-user-question.service.js +9 -12
  143. package/dist/server/modules/hooks/services/pending-ask-user-question.service.js.map +1 -1
  144. package/dist/server/modules/mcp/services/handlers/skill-tools.js +2 -2
  145. package/dist/server/modules/mcp/services/handlers/skill-tools.js.map +1 -1
  146. package/dist/server/modules/metrics/services/metrics.service.js +1 -1
  147. package/dist/server/modules/metrics/services/metrics.service.js.map +1 -1
  148. package/dist/server/modules/providers/adapters/claude.adapter.d.ts +3 -1
  149. package/dist/server/modules/providers/adapters/claude.adapter.js +4 -1
  150. package/dist/server/modules/providers/adapters/claude.adapter.js.map +1 -1
  151. package/dist/server/modules/remotes/connect-choices.controller.d.ts +9 -0
  152. package/dist/server/modules/remotes/connect-choices.controller.js +54 -0
  153. package/dist/server/modules/remotes/connect-choices.controller.js.map +1 -0
  154. package/dist/server/modules/remotes/connect-choices.dto.d.ts +52 -0
  155. package/dist/server/modules/remotes/connect-choices.dto.js +19 -0
  156. package/dist/server/modules/remotes/connect-choices.dto.js.map +1 -0
  157. package/dist/server/modules/remotes/connect-choices.store.d.ts +12 -0
  158. package/dist/server/modules/remotes/connect-choices.store.js +95 -0
  159. package/dist/server/modules/remotes/connect-choices.store.js.map +1 -0
  160. package/dist/server/modules/remotes/controllers/remotes.controller.d.ts +3 -0
  161. package/dist/server/modules/remotes/controllers/remotes.controller.js +9 -1
  162. package/dist/server/modules/remotes/controllers/remotes.controller.js.map +1 -1
  163. package/dist/server/modules/remotes/docker/docker-copy-back.d.ts +1 -0
  164. package/dist/server/modules/remotes/docker/docker-copy-back.js +70 -31
  165. package/dist/server/modules/remotes/docker/docker-copy-back.js.map +1 -1
  166. package/dist/server/modules/remotes/docker/docker-handoff.d.ts +5 -3
  167. package/dist/server/modules/remotes/docker/docker-handoff.js +221 -53
  168. package/dist/server/modules/remotes/docker/docker-handoff.js.map +1 -1
  169. package/dist/server/modules/remotes/docker/docker-handoff.store.d.ts +5 -0
  170. package/dist/server/modules/remotes/docker/docker-handoff.store.js.map +1 -1
  171. package/dist/server/modules/remotes/docker/docker-plan-fit.d.ts +4 -1
  172. package/dist/server/modules/remotes/docker/docker-plan-fit.js +19 -6
  173. package/dist/server/modules/remotes/docker/docker-plan-fit.js.map +1 -1
  174. package/dist/server/modules/remotes/docker/docker-plan-policy.d.ts +6 -2
  175. package/dist/server/modules/remotes/docker/docker-plan-policy.js +191 -38
  176. package/dist/server/modules/remotes/docker/docker-plan-policy.js.map +1 -1
  177. package/dist/server/modules/remotes/docker/docker-plan-source.service.d.ts +55 -6
  178. package/dist/server/modules/remotes/docker/docker-plan-source.service.js +284 -52
  179. package/dist/server/modules/remotes/docker/docker-plan-source.service.js.map +1 -1
  180. package/dist/server/modules/remotes/docker/docker-plan.controller.d.ts +2 -1
  181. package/dist/server/modules/remotes/docker/docker-plan.controller.js +15 -1
  182. package/dist/server/modules/remotes/docker/docker-plan.controller.js.map +1 -1
  183. package/dist/server/modules/remotes/docker/docker-plan.dto.d.ts +47 -1
  184. package/dist/server/modules/remotes/docker/docker-plan.dto.js +1 -0
  185. package/dist/server/modules/remotes/docker/docker-plan.dto.js.map +1 -1
  186. package/dist/server/modules/remotes/docker/docker-plan.service.d.ts +15 -6
  187. package/dist/server/modules/remotes/docker/docker-plan.service.js +83 -20
  188. package/dist/server/modules/remotes/docker/docker-plan.service.js.map +1 -1
  189. package/dist/server/modules/remotes/docker/docker-project-compose.d.ts +7 -0
  190. package/dist/server/modules/remotes/docker/docker-project-compose.js +30 -0
  191. package/dist/server/modules/remotes/docker/docker-project-compose.js.map +1 -0
  192. package/dist/server/modules/remotes/dtos/remote.dto.d.ts +2 -0
  193. package/dist/server/modules/remotes/dtos/remote.dto.js.map +1 -1
  194. package/dist/server/modules/remotes/git-owner.store.d.ts +13 -0
  195. package/dist/server/modules/remotes/git-owner.store.js +69 -0
  196. package/dist/server/modules/remotes/git-owner.store.js.map +1 -0
  197. package/dist/server/modules/remotes/host/host-docker.controller.d.ts +14 -1
  198. package/dist/server/modules/remotes/host/host-docker.controller.js +28 -9
  199. package/dist/server/modules/remotes/host/host-docker.controller.js.map +1 -1
  200. package/dist/server/modules/remotes/host/host-docker.dto.d.ts +640 -3
  201. package/dist/server/modules/remotes/host/host-docker.dto.js +66 -9
  202. package/dist/server/modules/remotes/host/host-docker.dto.js.map +1 -1
  203. package/dist/server/modules/remotes/host/host-docker.service.d.ts +18 -6
  204. package/dist/server/modules/remotes/host/host-docker.service.js +184 -81
  205. package/dist/server/modules/remotes/host/host-docker.service.js.map +1 -1
  206. package/dist/server/modules/remotes/host/host-ipv4-routes.d.ts +4 -0
  207. package/dist/server/modules/remotes/host/host-ipv4-routes.js +43 -0
  208. package/dist/server/modules/remotes/host/host-ipv4-routes.js.map +1 -0
  209. package/dist/server/modules/remotes/host-image.d.ts +1 -1
  210. package/dist/server/modules/remotes/host-image.js +1 -1
  211. package/dist/server/modules/remotes/host-install/host-install-block.d.ts +1 -0
  212. package/dist/server/modules/remotes/host-install/host-install-block.js +76 -2
  213. package/dist/server/modules/remotes/host-install/host-install-block.js.map +1 -1
  214. package/dist/server/modules/remotes/host-install/host-install.service.d.ts +0 -1
  215. package/dist/server/modules/remotes/host-install/host-install.service.js +9 -26
  216. package/dist/server/modules/remotes/host-install/host-install.service.js.map +1 -1
  217. package/dist/server/modules/remotes/operations/attach.operation.d.ts +5 -1
  218. package/dist/server/modules/remotes/operations/attach.operation.js +41 -5
  219. package/dist/server/modules/remotes/operations/attach.operation.js.map +1 -1
  220. package/dist/server/modules/remotes/operations/claim.operation.d.ts +1 -0
  221. package/dist/server/modules/remotes/operations/claim.operation.js +6 -1
  222. package/dist/server/modules/remotes/operations/claim.operation.js.map +1 -1
  223. package/dist/server/modules/remotes/operations/detach.operation.d.ts +4 -1
  224. package/dist/server/modules/remotes/operations/detach.operation.js +10 -2
  225. package/dist/server/modules/remotes/operations/detach.operation.js.map +1 -1
  226. package/dist/server/modules/remotes/operations/docker-import-inventory.store.d.ts +10 -0
  227. package/dist/server/modules/remotes/operations/docker-import-inventory.store.js +17 -0
  228. package/dist/server/modules/remotes/operations/docker-import-inventory.store.js.map +1 -1
  229. package/dist/server/modules/remotes/operations/file-sync-handoff.d.ts +30 -2
  230. package/dist/server/modules/remotes/operations/file-sync-handoff.js +498 -57
  231. package/dist/server/modules/remotes/operations/file-sync-handoff.js.map +1 -1
  232. package/dist/server/modules/remotes/operations/force-sync.operation.d.ts +39 -0
  233. package/dist/server/modules/remotes/operations/force-sync.operation.js +177 -0
  234. package/dist/server/modules/remotes/operations/force-sync.operation.js.map +1 -0
  235. package/dist/server/modules/remotes/operations/git-owner.dto.d.ts +83 -0
  236. package/dist/server/modules/remotes/operations/git-owner.dto.js +25 -0
  237. package/dist/server/modules/remotes/operations/git-owner.dto.js.map +1 -0
  238. package/dist/server/modules/remotes/operations/git-owner.operation.d.ts +35 -0
  239. package/dist/server/modules/remotes/operations/git-owner.operation.js +216 -0
  240. package/dist/server/modules/remotes/operations/git-owner.operation.js.map +1 -0
  241. package/dist/server/modules/remotes/operations/remote-host.client.d.ts +72 -8
  242. package/dist/server/modules/remotes/operations/remote-host.client.js +162 -28
  243. package/dist/server/modules/remotes/operations/remote-host.client.js.map +1 -1
  244. package/dist/server/modules/remotes/operations/remote-operation.dto.d.ts +19 -0
  245. package/dist/server/modules/remotes/operations/remote-operation.dto.js +5 -1
  246. package/dist/server/modules/remotes/operations/remote-operation.dto.js.map +1 -1
  247. package/dist/server/modules/remotes/operations/remote-operation.runner.d.ts +3 -1
  248. package/dist/server/modules/remotes/operations/remote-operation.runner.js +59 -21
  249. package/dist/server/modules/remotes/operations/remote-operation.runner.js.map +1 -1
  250. package/dist/server/modules/remotes/operations/remote-operation.types.d.ts +4 -1
  251. package/dist/server/modules/remotes/operations/remote-operation.types.js +4 -2
  252. package/dist/server/modules/remotes/operations/remote-operation.types.js.map +1 -1
  253. package/dist/server/modules/remotes/operations/remote-operations.controller.d.ts +5 -0
  254. package/dist/server/modules/remotes/operations/remote-operations.controller.js +56 -0
  255. package/dist/server/modules/remotes/operations/remote-operations.controller.js.map +1 -1
  256. package/dist/server/modules/remotes/operations/remote-operations.service.d.ts +16 -1
  257. package/dist/server/modules/remotes/operations/remote-operations.service.js +155 -5
  258. package/dist/server/modules/remotes/operations/remote-operations.service.js.map +1 -1
  259. package/dist/server/modules/remotes/operations/update-logins.operation.d.ts +1 -3
  260. package/dist/server/modules/remotes/operations/update-logins.operation.js +3 -18
  261. package/dist/server/modules/remotes/operations/update-logins.operation.js.map +1 -1
  262. package/dist/server/modules/remotes/ports/remote-health.port.d.ts +2 -0
  263. package/dist/server/modules/remotes/ports/remote-health.port.js.map +1 -1
  264. package/dist/server/modules/remotes/remotes.module.js +18 -0
  265. package/dist/server/modules/remotes/remotes.module.js.map +1 -1
  266. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.d.ts +2 -2
  267. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.js +2 -13
  268. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.js.map +1 -1
  269. package/dist/server/modules/remotes/services/remote-health.service.js +5 -0
  270. package/dist/server/modules/remotes/services/remote-health.service.js.map +1 -1
  271. package/dist/server/modules/remotes/sync/file-sync-failures.service.d.ts +18 -0
  272. package/dist/server/modules/remotes/sync/file-sync-failures.service.js +157 -0
  273. package/dist/server/modules/remotes/sync/file-sync-failures.service.js.map +1 -0
  274. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.d.ts +14 -0
  275. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.js +99 -0
  276. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.js.map +1 -0
  277. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.d.ts +15 -0
  278. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.js +90 -0
  279. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.js.map +1 -0
  280. package/dist/server/modules/remotes/sync/project-file-sync.controller.d.ts +29 -0
  281. package/dist/server/modules/remotes/sync/project-file-sync.controller.js +160 -0
  282. package/dist/server/modules/remotes/sync/project-file-sync.controller.js.map +1 -0
  283. package/dist/server/modules/remotes/sync/remote-file-sync.dto.d.ts +72 -0
  284. package/dist/server/modules/remotes/sync/remote-file-sync.dto.js +16 -0
  285. package/dist/server/modules/remotes/sync/remote-file-sync.dto.js.map +1 -0
  286. package/dist/server/modules/remotes/sync/remote-file-sync.service.d.ts +32 -1
  287. package/dist/server/modules/remotes/sync/remote-file-sync.service.js +499 -38
  288. package/dist/server/modules/remotes/sync/remote-file-sync.service.js.map +1 -1
  289. package/dist/server/modules/remotes/sync/remote-live-sync.service.d.ts +2 -0
  290. package/dist/server/modules/remotes/sync/remote-live-sync.service.js +26 -12
  291. package/dist/server/modules/remotes/sync/remote-live-sync.service.js.map +1 -1
  292. package/dist/server/modules/remotes/vm-user-identity.d.ts +29 -0
  293. package/dist/server/modules/remotes/vm-user-identity.js +45 -0
  294. package/dist/server/modules/remotes/vm-user-identity.js.map +1 -0
  295. package/dist/server/modules/runtime-context-capture/codex-plugin-profile-materializer.service.js +5 -1
  296. package/dist/server/modules/runtime-context-capture/codex-plugin-profile-materializer.service.js.map +1 -1
  297. package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.d.ts +5 -0
  298. package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.js +9 -0
  299. package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.js.map +1 -1
  300. package/dist/server/modules/session-reader/adapters/session-reader-adapter.interface.d.ts +1 -0
  301. package/dist/server/modules/session-reader/adapters/utils/coalesce-turns.js +1 -0
  302. package/dist/server/modules/session-reader/adapters/utils/coalesce-turns.js.map +1 -1
  303. package/dist/server/modules/session-reader/builders/semantic-step-extractor.js +1 -1
  304. package/dist/server/modules/session-reader/builders/semantic-step-extractor.js.map +1 -1
  305. package/dist/server/modules/session-reader/controllers/session-reader.controller.js +1 -1
  306. package/dist/server/modules/session-reader/controllers/session-reader.controller.js.map +1 -1
  307. package/dist/server/modules/session-reader/data/pricing.json +89 -12
  308. package/dist/server/modules/session-reader/dtos/unified-message.types.d.ts +1 -0
  309. package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.d.ts +3 -0
  310. package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.js +10 -1
  311. package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.js.map +1 -1
  312. package/dist/server/modules/session-reader/parsers/claude-turn-evidence.d.ts +11 -0
  313. package/dist/server/modules/session-reader/parsers/claude-turn-evidence.js +50 -0
  314. package/dist/server/modules/session-reader/parsers/claude-turn-evidence.js.map +1 -0
  315. package/dist/server/modules/session-reader/parsers/codex-jsonl.parser.js +8 -2
  316. package/dist/server/modules/session-reader/parsers/codex-jsonl.parser.js.map +1 -1
  317. package/dist/server/modules/session-reader/services/bounded-anchor-proof.d.ts +7 -0
  318. package/dist/server/modules/session-reader/services/bounded-anchor-proof.js +31 -2
  319. package/dist/server/modules/session-reader/services/bounded-anchor-proof.js.map +1 -1
  320. package/dist/server/modules/session-reader/services/session-cache.service.d.ts +8 -2
  321. package/dist/server/modules/session-reader/services/session-cache.service.js +80 -21
  322. package/dist/server/modules/session-reader/services/session-cache.service.js.map +1 -1
  323. package/dist/server/modules/session-reader/services/session-reader.service.d.ts +4 -0
  324. package/dist/server/modules/session-reader/services/session-reader.service.js +40 -8
  325. package/dist/server/modules/session-reader/services/session-reader.service.js.map +1 -1
  326. package/dist/server/modules/session-reader/services/transcript-cursor.d.ts +16 -4
  327. package/dist/server/modules/session-reader/services/transcript-cursor.js +65 -6
  328. package/dist/server/modules/session-reader/services/transcript-cursor.js.map +1 -1
  329. package/dist/server/modules/session-reader/services/transcript-serialization.js +2 -1
  330. package/dist/server/modules/session-reader/services/transcript-serialization.js.map +1 -1
  331. package/dist/server/modules/session-reader/services/transcript-turn-state.d.ts +4 -0
  332. package/dist/server/modules/session-reader/services/transcript-turn-state.js +20 -0
  333. package/dist/server/modules/session-reader/services/transcript-turn-state.js.map +1 -0
  334. package/dist/server/modules/session-reader/services/transcript-watcher.service.d.ts +4 -1
  335. package/dist/server/modules/session-reader/services/transcript-watcher.service.js +43 -18
  336. package/dist/server/modules/session-reader/services/transcript-watcher.service.js.map +1 -1
  337. package/dist/server/modules/sessions/services/provider-launch-config/provider-launch-config.service.js +5 -0
  338. package/dist/server/modules/sessions/services/provider-launch-config/provider-launch-config.service.js.map +1 -1
  339. package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.d.ts +36 -17
  340. package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.js +26 -9
  341. package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.js.map +1 -1
  342. package/dist/server/modules/sessions/services/session-runtime/ensure-mcp-readiness.d.ts +19 -0
  343. package/dist/server/modules/sessions/services/session-runtime/ensure-mcp-readiness.js +26 -0
  344. package/dist/server/modules/sessions/services/session-runtime/ensure-mcp-readiness.js.map +1 -0
  345. package/dist/server/modules/sessions/services/session-runtime/session-launch-pipeline.service.js +10 -18
  346. package/dist/server/modules/sessions/services/session-runtime/session-launch-pipeline.service.js.map +1 -1
  347. package/dist/server/modules/sessions/services/session-runtime/session-restore-pipeline.service.d.ts +5 -1
  348. package/dist/server/modules/sessions/services/session-runtime/session-restore-pipeline.service.js +20 -2
  349. package/dist/server/modules/sessions/services/session-runtime/session-restore-pipeline.service.js.map +1 -1
  350. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.d.ts +6 -0
  351. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.js +26 -0
  352. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.js.map +1 -1
  353. package/dist/server/modules/settings/services/settings.service.d.ts +3 -1
  354. package/dist/server/modules/settings/services/settings.service.js +6 -0
  355. package/dist/server/modules/settings/services/settings.service.js.map +1 -1
  356. package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js +5 -5
  357. package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js.map +1 -1
  358. package/dist/server/modules/skills/adapters/github-directory-skill-source.adapter.js +5 -5
  359. package/dist/server/modules/skills/adapters/github-directory-skill-source.adapter.js.map +1 -1
  360. package/dist/server/modules/skills/adapters/github-skill-source.base.js +4 -3
  361. package/dist/server/modules/skills/adapters/github-skill-source.base.js.map +1 -1
  362. package/dist/server/modules/skills/adapters/local-skill-source.adapter.js +5 -5
  363. package/dist/server/modules/skills/adapters/local-skill-source.adapter.js.map +1 -1
  364. package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js +5 -5
  365. package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js.map +1 -1
  366. package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js +5 -5
  367. package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js.map +1 -1
  368. package/dist/server/modules/skills/adapters/skill-source.adapter.d.ts +5 -0
  369. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.d.ts +5 -0
  370. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.js +75 -0
  371. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.js.map +1 -0
  372. package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js +5 -5
  373. package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js.map +1 -1
  374. package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js +5 -5
  375. package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js.map +1 -1
  376. package/dist/server/modules/skills/controllers/skills.controller.js +2 -2
  377. package/dist/server/modules/skills/controllers/skills.controller.js.map +1 -1
  378. package/dist/server/modules/skills/services/skill-source-lifecycle.service.d.ts +3 -3
  379. package/dist/server/modules/skills/services/skill-source-lifecycle.service.js +9 -4
  380. package/dist/server/modules/skills/services/skill-source-lifecycle.service.js.map +1 -1
  381. package/dist/server/modules/skills/services/skill-sync.service.d.ts +3 -3
  382. package/dist/server/modules/skills/services/skill-sync.service.js +32 -6
  383. package/dist/server/modules/skills/services/skill-sync.service.js.map +1 -1
  384. package/dist/server/modules/skills/services/skill-sync.types.d.ts +3 -0
  385. package/dist/server/modules/storage/db/schema.d.ts +2 -2
  386. package/dist/server/modules/storage/db/schema.js +2 -0
  387. package/dist/server/modules/storage/db/schema.js.map +1 -1
  388. package/dist/server/modules/storage/models/domain.models.d.ts +1 -1
  389. package/dist/server/modules/storage/models/domain.models.js +2 -0
  390. package/dist/server/modules/storage/models/domain.models.js.map +1 -1
  391. package/dist/server/modules/teams/storage/teams.store.d.ts +1 -0
  392. package/dist/server/modules/teams/storage/teams.store.js +19 -3
  393. package/dist/server/modules/teams/storage/teams.store.js.map +1 -1
  394. package/dist/server/modules/terminal/gateways/terminal.gateway.d.ts +3 -1
  395. package/dist/server/modules/terminal/gateways/terminal.gateway.js +9 -4
  396. package/dist/server/modules/terminal/gateways/terminal.gateway.js.map +1 -1
  397. package/dist/server/modules/terminal/services/session-turn-signals.d.ts +18 -0
  398. package/dist/server/modules/terminal/services/session-turn-signals.js +6 -0
  399. package/dist/server/modules/terminal/services/session-turn-signals.js.map +1 -0
  400. package/dist/server/modules/terminal/services/terminal-activity.service.d.ts +32 -5
  401. package/dist/server/modules/terminal/services/terminal-activity.service.js +322 -40
  402. package/dist/server/modules/terminal/services/terminal-activity.service.js.map +1 -1
  403. package/dist/server/modules/terminal/services/terminal-io/lifecycle.js +15 -3
  404. package/dist/server/modules/terminal/services/terminal-io/lifecycle.js.map +1 -1
  405. package/dist/server/modules/terminal/terminal.module.js +2 -0
  406. package/dist/server/modules/terminal/terminal.module.js.map +1 -1
  407. package/dist/server/modules/terminal/utils/ansi-sanitizer.d.ts +0 -1
  408. package/dist/server/modules/terminal/utils/ansi-sanitizer.js +0 -4
  409. package/dist/server/modules/terminal/utils/ansi-sanitizer.js.map +1 -1
  410. package/dist/server/templates/teams-dev.json +14 -14
  411. package/dist/server/test-setup-node.js +4 -3
  412. package/dist/server/test-setup-node.js.map +1 -1
  413. package/dist/server/test-setup.js +7 -0
  414. package/dist/server/test-setup.js.map +1 -1
  415. package/dist/server/tsconfig.tsbuildinfo +1 -1
  416. package/dist/server/ui/assets/{ExternalRichEditor--kNXs-Eb.js → ExternalRichEditor-CIZPhssf.js} +24 -24
  417. package/dist/server/ui/assets/ReviewDetailPage-winyLSQ7.js +6 -0
  418. package/dist/server/ui/assets/ReviewsPage-BYKBReMp.js +6 -0
  419. package/dist/server/ui/assets/index-CiDJX6Hn.js +1191 -0
  420. package/dist/server/ui/assets/index-f1WOAqXB.css +32 -0
  421. package/dist/server/ui/assets/useReviewSubscription-v3Cto0y4.js +69 -0
  422. package/dist/server/ui/index.html +2 -2
  423. package/dist/templates/teams-dev.json +14 -14
  424. package/package.json +15 -1
  425. package/dist/server/modules/reviews/utils/notification-formatter.d.ts +0 -12
  426. package/dist/server/modules/reviews/utils/notification-formatter.js +0 -60
  427. package/dist/server/modules/reviews/utils/notification-formatter.js.map +0 -1
  428. package/dist/server/ui/assets/ReviewDetailPage-DMgP5fKn.js +0 -6
  429. package/dist/server/ui/assets/ReviewsPage-CkyFUJr6.js +0 -6
  430. package/dist/server/ui/assets/index-CVUaAlP4.css +0 -32
  431. package/dist/server/ui/assets/index-CqRufKpA.js +0 -994
  432. package/dist/server/ui/assets/useReviewSubscription-CU70CzwG.js +0 -69
@@ -13,15 +13,18 @@ exports.DockerHandoff = void 0;
13
13
  exports.dockerSelection = dockerSelection;
14
14
  exports.buildRecord = buildRecord;
15
15
  exports.captureSettings = captureSettings;
16
+ const docker_project_compose_1 = require("./docker-project-compose");
16
17
  const docker_data_groups_1 = require("./docker-data-groups");
17
18
  const common_1 = require("@nestjs/common");
18
19
  const node_crypto_1 = require("node:crypto");
20
+ const promises_1 = require("node:fs/promises");
19
21
  const node_stream_1 = require("node:stream");
20
- const promises_1 = require("node:stream/promises");
22
+ const promises_2 = require("node:stream/promises");
21
23
  const error_types_1 = require("../../../common/errors/error-types");
22
24
  const logger_1 = require("../../../common/logging/logger");
23
25
  const docker_archive_journal_1 = require("../../core/controllers/docker-archive-journal");
24
26
  const docker_archive_1 = require("../../core/controllers/docker-archive");
27
+ const docker_image_metadata_1 = require("../../core/controllers/docker-image-metadata");
25
28
  const docker_engine_client_1 = require("../../core/controllers/docker-engine.client");
26
29
  const docker_settings_1 = require("../../core/controllers/docker-settings");
27
30
  const file_sync_dto_1 = require("../../file-sync/file-sync.dto");
@@ -30,16 +33,17 @@ const docker_import_inventory_store_1 = require("../operations/docker-import-inv
30
33
  const remote_host_client_1 = require("../operations/remote-host.client");
31
34
  const remote_operation_errors_1 = require("../operations/remote-operation.errors");
32
35
  const remote_operation_types_1 = require("../operations/remote-operation.types");
36
+ const host_docker_dto_1 = require("../host/host-docker.dto");
33
37
  const docker_plan_fit_1 = require("./docker-plan-fit");
34
38
  const docker_plan_files_1 = require("./docker-plan-files");
35
39
  const docker_plan_dto_1 = require("./docker-plan.dto");
36
40
  const docker_plan_policy_1 = require("./docker-plan-policy");
37
41
  const docker_plan_service_1 = require("./docker-plan.service");
42
+ const connect_choices_store_1 = require("../connect-choices.store");
38
43
  const docker_plan_source_service_1 = require("./docker-plan-source.service");
39
44
  const docker_handoff_store_1 = require("./docker-handoff.store");
40
45
  const logger = (0, logger_1.createLogger)('DockerHandoff');
41
46
  const RATE_WARMUP_MS = 5_000;
42
- const DEFAULT_NETWORKS = new Set(['bridge', 'host', 'none', 'default']);
43
47
  function dockerSelection(details) {
44
48
  const selection = details.dockerSelection;
45
49
  return selection?.items?.length ? selection : null;
@@ -69,9 +73,10 @@ let DockerHandoff = class DockerHandoff {
69
73
  journal;
70
74
  exclusions;
71
75
  inventory;
76
+ choices;
72
77
  active = new Map();
73
78
  rollbackLimits = { vmCleanupMs: 10 * 60_000, homeConnectMs: 30_000, homeStartMs: 60_000 };
74
- constructor(plans, source, host, store, journal, exclusions, inventory) {
79
+ constructor(plans, source, host, store, journal, exclusions, inventory, choices) {
75
80
  this.plans = plans;
76
81
  this.source = source;
77
82
  this.host = host;
@@ -79,6 +84,7 @@ let DockerHandoff = class DockerHandoff {
79
84
  this.journal = journal;
80
85
  this.exclusions = exclusions;
81
86
  this.inventory = inventory;
87
+ this.choices = choices;
82
88
  }
83
89
  interrupt(operationId) {
84
90
  this.active.get(operationId)?.abort();
@@ -92,6 +98,7 @@ let DockerHandoff = class DockerHandoff {
92
98
  const plan = await this.plans.plan(projectId, { remoteId: run.operation.remoteId, items: selection.items }, signal, { estimate: false });
93
99
  if (!plan.availability.available || !plan.apiVersion)
94
100
  throw new remote_operation_errors_1.RemoteOperationStepRefusedError('DOCKER_PLAN_REFUSED', plan.availability.reason?.message ?? 'Docker is unavailable.', { reason: plan.availability.reason?.code ?? null });
101
+ this.choices.recordPlan(projectId, run.operation.remoteId, plan.items);
95
102
  const selected = plan.items.filter((item) => item.selectedMode);
96
103
  if (!plan.canConnect) {
97
104
  const reasons = [
@@ -104,20 +111,18 @@ let DockerHandoff = class DockerHandoff {
104
111
  ];
105
112
  throw new remote_operation_errors_1.RemoteOperationStepRefusedError('DOCKER_PLAN_REFUSED', reasons.join(' ') || 'The Docker import cannot proceed.', { fit: plan.fit });
106
113
  }
107
- const record = buildRecord(plan.items, selected, plan.apiVersion, await this.plans.projectRoot(projectId));
114
+ const record = buildRecord(plan.items, selected, plan.apiVersion, await this.plans.projectRoot(projectId), plan.networks);
108
115
  const previousRecord = await this.store.read(run.operation.id);
109
116
  record.inventoryBefore =
110
117
  previousRecord?.inventoryBefore !== undefined
111
118
  ? previousRecord.inventoryBefore
112
119
  : this.inventory.get(projectId, run.operation.remoteId);
113
- const managed = [
114
- ...new Set([
115
- ...plan.managedExclusions,
116
- ...(this.inventory
117
- .get(projectId, run.operation.remoteId)
118
- ?.items.flatMap((item) => item.bindPaths) ?? []),
119
- ]),
120
- ];
120
+ for (const kept of record.keptInventory ?? []) {
121
+ const prior = record.inventoryBefore?.items.find((item) => item.name === kept.name);
122
+ if (prior?.vmImageId && prior.imageId === kept.imageId)
123
+ kept.vmImageId = prior.vmImageId;
124
+ }
125
+ const managed = (0, docker_import_inventory_store_1.connectExclusions)(plan, this.inventory.get(projectId, run.operation.remoteId));
121
126
  if (managed.length > file_sync_dto_1.IGNORE_PATTERNS_MAX)
122
127
  throw new remote_operation_errors_1.RemoteOperationStepRefusedError('DOCKER_TOO_MANY_DATA_FOLDERS', `The Docker data folders need ${managed.length} file-sync exclusions; at most ${file_sync_dto_1.IGNORE_PATTERNS_MAX} are supported.`, { count: managed.length });
123
128
  await this.store.write(run.operation.id, record);
@@ -187,20 +192,69 @@ let DockerHandoff = class DockerHandoff {
187
192
  const progress = new TransferProgress(run, record);
188
193
  await this.journal.reconcile(client, signal);
189
194
  const pendingImages = record.images.filter((i) => !record.verified.images.includes(i.id));
195
+ const candidates = new Map(pendingImages.map((image) => [
196
+ image.id,
197
+ (0, docker_import_inventory_store_1.vmImageCandidates)(record.inventoryBefore, image.id),
198
+ ]));
190
199
  const present = pendingImages.length
191
- ? (await this.host.dockerImagesPresent(remoteId, pendingImages.map((i) => i.id), options)).ids
200
+ ? (await this.host.dockerImagesPresent(remoteId, [...new Set([...candidates.values()].flat())], options)).ids
192
201
  : [];
202
+ const verify = async (image, vmId) => {
203
+ image.vmId = vmId;
204
+ record.verified.images.push(image.id);
205
+ await this.store.write(run.operation.id, record);
206
+ };
207
+ let matchUnsupported = false;
208
+ const missing = [];
193
209
  for (const image of pendingImages) {
210
+ let vmId = candidates.get(image.id).find((id) => present.includes(id));
211
+ if (!vmId) {
212
+ const inspect = await client.json('GET', `/images/${encodeURIComponent(image.id)}/json`, undefined, { signal });
213
+ const tags = inspect.RepoTags;
214
+ if (tags?.length && !matchUnsupported) {
215
+ try {
216
+ const { images } = await this.host.dockerMatchImages(remoteId, tags, options);
217
+ vmId = (0, docker_image_metadata_1.vmImageIdForTags)(inspect, tags, images);
218
+ }
219
+ catch (error) {
220
+ if (!(error instanceof remote_host_client_1.RemoteHostRequestError && error.status === 404))
221
+ throw error;
222
+ matchUnsupported = true;
223
+ }
224
+ }
225
+ if (!vmId) {
226
+ missing.push({ image, tags: tags ?? [], layers: inspect.RootFS?.Layers ?? null });
227
+ continue;
228
+ }
229
+ }
194
230
  progress.item(image.id, 'image', image.sizeBytes);
195
- if (!present.includes(image.id)) {
231
+ await verify(image, vmId);
232
+ progress.complete();
233
+ }
234
+ let supportsReferences = true;
235
+ for (const group of groupImages(missing)) {
236
+ progress.item(group.length === 1 ? group[0].image.id : `${group.length} images`, 'image', group.reduce((total, entry) => total + entry.image.sizeBytes, 0));
237
+ if (group.length > 1 && supportsReferences) {
238
+ const archive = await saveImages(client, group.flatMap((entry) => entry.tags), signal);
239
+ const loaded = await this.host.dockerLoadImage(remoteId, progress.count(archive), options);
240
+ supportsReferences = hasReferences(loaded);
241
+ if (supportsReferences) {
242
+ const vmIds = group.map((entry) => loadedVmId(entry.image.id, entry.layers, loaded.images, entry.tags));
243
+ for (const [index, entry] of group.entries()) {
244
+ entry.image.vmId = vmIds[index];
245
+ record.verified.images.push(entry.image.id);
246
+ }
247
+ await this.store.write(run.operation.id, record);
248
+ progress.complete();
249
+ continue;
250
+ }
251
+ }
252
+ for (const { image } of group) {
196
253
  const saved = await saveImage(client, image.id, signal);
197
- await this.host.dockerLoadImage(remoteId, progress.count(saved), options);
198
- const loaded = await this.host.dockerImagesPresent(remoteId, [image.id], options);
199
- if (!loaded.ids.includes(image.id))
200
- throw new DockerHandoffError('The VM did not load an image with the expected ID.');
254
+ const loaded = await this.host.dockerLoadImage(remoteId, progress.count(saved.archive), options);
255
+ supportsReferences &&= hasReferences(loaded);
256
+ await verify(image, loadedVmId(image.id, saved.layers, loaded.images));
201
257
  }
202
- record.verified.images.push(image.id);
203
- await this.store.write(run.operation.id, record);
204
258
  progress.complete();
205
259
  }
206
260
  const presentKeptVolumes = record.ensureVolumes?.length
@@ -239,7 +293,7 @@ let DockerHandoff = class DockerHandoff {
239
293
  await this.store.write(run.operation.id, record);
240
294
  await this.host.dockerCreateVolume(remoteId, { projectId, name: volume.name, labels }, options);
241
295
  if (restore) {
242
- await this.copy(client, progress, remoteId, { projectId, image: volume.helperImage, mountType: 'volume', source: volume.name }, options);
296
+ await this.copy(client, progress, remoteId, { projectId, image: volume.helperImage, mountType: 'volume', source: volume.name }, vmImageId(record, volume.helperImage), options);
243
297
  (record.copiedData ??= { volumes: [], binds: [] }).volumes.push(volume.name);
244
298
  }
245
299
  record.verified.volumes.push(volume.name);
@@ -265,17 +319,42 @@ let DockerHandoff = class DockerHandoff {
265
319
  .map((path) => ({ path, replace: false })),
266
320
  }, options);
267
321
  const binds = record.binds.filter((b) => !record.verified.binds.includes(b.path));
322
+ const files = new Set();
323
+ for (const bind of binds)
324
+ if (await isFile(bind.path))
325
+ files.add(bind.path);
326
+ const fileFlag = (path) => (files.has(path) ? { file: true } : {});
268
327
  const created = binds.filter((b) => !b.replace);
269
328
  for (let offset = 0; offset < created.length; offset += 64)
270
329
  await this.host.dockerPrepareBinds(remoteId, {
271
330
  projectId,
272
331
  paths: created
273
332
  .slice(offset, offset + 64)
274
- .map((b) => ({ path: b.path, replace: false })),
333
+ .map((b) => ({ path: b.path, replace: false, ...fileFlag(b.path) })),
275
334
  }, options);
276
335
  for (const bind of binds.filter((b) => b.replace)) {
277
336
  try {
278
- await this.host.dockerPrepareBinds(remoteId, { projectId, paths: [{ path: bind.path, replace: true, image: bind.helperImage }] }, options);
337
+ const vm = await this.host.dockerScan(remoteId, [bind.path], options, []);
338
+ for (const holder of vm.containers)
339
+ if ((0, docker_data_groups_1.overlapsData)((0, docker_data_groups_1.mountedData)(holder.mounts), { volumes: [], bindPaths: [bind.path] }) &&
340
+ (holder.labels[host_docker_dto_1.DOCKER_PROJECT_LABEL] === projectId ||
341
+ (0, docker_project_compose_1.projectCompose)(holder.labels, record.projectRoot, projectId)) &&
342
+ holder.metadata?.running !== false)
343
+ await this.host.dockerStopContainer(remoteId, holder.id, projectId, {
344
+ ...options,
345
+ projectRoot: record.projectRoot,
346
+ });
347
+ await this.host.dockerPrepareBinds(remoteId, {
348
+ projectId,
349
+ paths: [
350
+ {
351
+ path: bind.path,
352
+ replace: true,
353
+ image: vmImageId(record, bind.helperImage),
354
+ ...fileFlag(bind.path),
355
+ },
356
+ ],
357
+ }, options);
279
358
  }
280
359
  catch (error) {
281
360
  if (!(error instanceof remote_host_client_1.RemoteHostRequestError) || error.status !== 422)
@@ -285,28 +364,51 @@ let DockerHandoff = class DockerHandoff {
285
364
  }
286
365
  for (const bind of binds) {
287
366
  progress.item(bind.path, 'bind', bind.sizeBytes);
288
- await this.copy(client, progress, remoteId, { projectId, image: bind.helperImage, mountType: 'bind', source: bind.path }, options);
367
+ await this.copy(client, progress, remoteId, {
368
+ projectId,
369
+ image: bind.helperImage,
370
+ mountType: files.has(bind.path) ? 'file' : 'bind',
371
+ source: bind.path,
372
+ }, vmImageId(record, bind.helperImage), options);
289
373
  (record.copiedData ??= { volumes: [], binds: [] }).binds.push(bind.path);
290
374
  record.verified.binds.push(bind.path);
291
375
  await this.store.write(run.operation.id, record);
292
376
  progress.complete();
293
377
  }
294
- for (const network of record.networks) {
378
+ const settings = await this.store.readSettings(run.operation.id);
379
+ const automaticNetworks = new Set(record.automaticRangeNetworks);
380
+ const networks = record.networks
381
+ .map((network) => ({
382
+ ...network,
383
+ ipam: automaticNetworks.has(network.name) ? undefined : network.ipam,
384
+ }))
385
+ .sort((a, b) => Number(!!b.ipam) - Number(!!a.ipam));
386
+ for (const network of networks) {
295
387
  progress.item(network.name, 'network');
296
- const { created } = await this.host.dockerCreateNetwork(remoteId, {
297
- projectId,
298
- name: network.name,
299
- labels: network.labels,
300
- internal: network.internal,
301
- attachable: network.attachable,
302
- options: network.options,
303
- }, options);
304
- if (created && !record.created.networks.includes(network.name)) {
388
+ const shared = !network.labels[host_docker_dto_1.COMPOSE_PROJECT_LABEL];
389
+ let created;
390
+ try {
391
+ ({ created } = await this.host.dockerCreateNetwork(remoteId, {
392
+ projectId,
393
+ name: network.name,
394
+ labels: network.labels,
395
+ internal: network.internal,
396
+ attachable: network.attachable,
397
+ options: network.options,
398
+ ...(network.ipam ? { ipam: network.ipam } : {}),
399
+ ...(shared ? { shared: true } : {}),
400
+ }, options));
401
+ }
402
+ catch (error) {
403
+ if (!(error instanceof error_types_1.AppError))
404
+ throw error;
405
+ throw new DockerHandoffError(`Network ${network.name}: ${error.message}`, error.code);
406
+ }
407
+ if (created && !shared && !record.created.networks.includes(network.name)) {
305
408
  record.created.networks.push(network.name);
306
409
  await this.store.write(run.operation.id, record);
307
410
  }
308
411
  }
309
- const settings = await this.store.readSettings(run.operation.id);
310
412
  for (const item of record.items.filter((i) => i.createsContainer)) {
311
413
  if (record.verified.containers.includes(item.name))
312
414
  continue;
@@ -315,20 +417,35 @@ let DockerHandoff = class DockerHandoff {
315
417
  throw new DockerHandoffError(`The captured settings of ${item.name} are missing.`);
316
418
  progress.item(item.name, 'container');
317
419
  if (item.targetAction === 'replace' || record.created.containers.includes(item.name))
318
- await this.deleteIfPresent(remoteId, 'containers', item.name, projectId, options);
420
+ await this.deleteIfPresent(remoteId, 'containers', item.name, projectId, {
421
+ ...options,
422
+ projectRoot: record.projectRoot,
423
+ });
319
424
  record.created.containers.push(item.name);
320
425
  await this.store.write(run.operation.id, record);
321
- await this.host.dockerCreateContainer(remoteId, { projectId, name: item.name, config: captured.config }, options);
426
+ await this.host.dockerCreateContainer(remoteId, {
427
+ projectId,
428
+ name: item.name,
429
+ config: {
430
+ ...captured.config,
431
+ Image: vmImageId(record, String(captured.config.Image)),
432
+ },
433
+ }, options);
322
434
  record.verified.containers.push(item.name);
323
435
  await this.store.write(run.operation.id, record);
324
436
  }
325
437
  await progress.finish();
438
+ const vmPair = (imageId, carried) => {
439
+ const vmId = record.images.find((i) => i.id === imageId)?.vmId ?? carried;
440
+ return vmId && vmId !== imageId ? { vmImageId: vmId } : {};
441
+ };
326
442
  const imported = record.items
327
443
  .filter((item) => item.targetAction !== 'leave-as-is' &&
328
444
  !record.keptInventory?.some((kept) => kept.name === item.name))
329
445
  .map((item) => ({
330
446
  name: item.name,
331
447
  imageId: item.imageIds[0] ?? item.id,
448
+ ...vmPair(item.imageIds[0] ?? item.id),
332
449
  volumes: item.volumes.map((name) => ({
333
450
  name,
334
451
  sizeBytes: record.volumes.find((v) => v.name === name)?.sizeBytes ?? null,
@@ -338,7 +455,10 @@ let DockerHandoff = class DockerHandoff {
338
455
  .map((path) => (0, docker_plan_files_1.projectAnchoredPath)(record.projectRoot, path)),
339
456
  sizeBytes: item.sizeBytes,
340
457
  }));
341
- imported.push(...(record.keptInventory ?? []));
458
+ imported.push(...(record.keptInventory ?? []).map(({ vmImageId: carried, ...item }) => ({
459
+ ...item,
460
+ ...vmPair(item.imageId, carried),
461
+ })));
342
462
  const kept = (this.inventory.get(projectId, remoteId)?.items ?? []).filter((prior) => !imported.some((item) => item.name === prior.name));
343
463
  record.inventoryStampedAt ??= new Date().toISOString();
344
464
  if (record.inventoryBefore === undefined)
@@ -487,7 +607,10 @@ let DockerHandoff = class DockerHandoff {
487
607
  const { holders } = await this.host.dockerVolumeHolders(remoteId, volume.name, options);
488
608
  for (const holder of holders) {
489
609
  try {
490
- await this.host.dockerDelete(remoteId, 'containers', holder.id, projectId, options);
610
+ await this.host.dockerDelete(remoteId, 'containers', holder.id, projectId, {
611
+ ...options,
612
+ projectRoot: record.projectRoot,
613
+ });
491
614
  }
492
615
  catch (error) {
493
616
  if (notFound(error))
@@ -516,13 +639,14 @@ let DockerHandoff = class DockerHandoff {
516
639
  return false;
517
640
  }
518
641
  }
519
- async copy(client, progress, remoteId, request, options) {
520
- const helper = await this.journal.create(client, request.image, [{ Type: request.mountType, Source: request.source, Target: '/data', ReadOnly: true }], options.signal);
642
+ async copy(client, progress, remoteId, request, vmImage, options) {
643
+ const layout = (0, docker_archive_1.dockerArchiveLayout)(request.mountType, request.source);
644
+ const helper = await this.journal.create(client, request.image, [{ ...layout.mount, ReadOnly: true }], options.signal);
521
645
  try {
522
- const archive = await (0, docker_archive_1.readDockerArchive)(client, helper.id, options.signal);
646
+ const archive = await (0, docker_archive_1.readDockerArchive)(client, helper.id, options.signal, layout.readPath);
523
647
  const hash = (0, node_crypto_1.createHash)('sha256');
524
648
  const body = progress.count(archive, (chunk) => hash.update(chunk));
525
- const { sha256 } = await this.host.dockerWriteArchive(remoteId, request, body, options);
649
+ const { sha256 } = await this.host.dockerWriteArchive(remoteId, { ...request, image: vmImage }, body, options);
526
650
  if (sha256 !== hash.digest('hex'))
527
651
  throw new DockerHandoffError('The copied data did not match on the VM; retry the copy.');
528
652
  }
@@ -540,12 +664,16 @@ exports.DockerHandoff = DockerHandoff = __decorate([
540
664
  docker_handoff_store_1.DockerHandoffStore,
541
665
  docker_archive_journal_1.DockerArchiveJournal,
542
666
  file_sync_managed_exclusions_store_1.FileSyncManagedExclusionsStore,
543
- docker_import_inventory_store_1.DockerImportInventoryStore])
667
+ docker_import_inventory_store_1.DockerImportInventoryStore,
668
+ connect_choices_store_1.ConnectChoicesStore])
544
669
  ], DockerHandoff);
545
- function buildRecord(all, selected, apiVersion, projectRoot) {
670
+ function buildRecord(all, selected, apiVersion, projectRoot, networks = []) {
546
671
  const moving = selected.filter(docker_plan_fit_1.movesToVm);
672
+ const copiedImages = selected
673
+ .filter((item) => (0, docker_plan_fit_1.copiesImages)(item, projectRoot))
674
+ .flatMap((item) => item.images);
547
675
  const helperImage = (item) => {
548
- const image = item.images[0]?.id ?? moving.flatMap((i) => i.images)[0]?.id;
676
+ const image = item.images[0]?.id ?? copiedImages[0]?.id;
549
677
  if (!image)
550
678
  throw new remote_operation_errors_1.RemoteOperationStepRefusedError('DOCKER_PLAN_REFUSED', `${item.name}: no local image is available to copy its data.`);
551
679
  return image;
@@ -572,7 +700,10 @@ function buildRecord(all, selected, apiVersion, projectRoot) {
572
700
  for (const name of emptyVolumes(item))
573
701
  if (!volumes.some((v) => v.name === name))
574
702
  volumes.push({ name, helperImage: helperImage(item), sizeBytes: 0 });
575
- const images = [...new Map(moving.flatMap((i) => i.images).map((i) => [i.id, i])).values()].map((image) => ({ id: image.id, sizeBytes: image.size.bytes }));
703
+ const images = [...new Map(copiedImages.map((i) => [i.id, i])).values()].map((image) => ({
704
+ id: image.id,
705
+ sizeBytes: image.size.bytes,
706
+ }));
576
707
  const containerIds = new Set(all.filter((i) => i.kind === 'container').map((i) => i.id));
577
708
  const stopIds = new Set();
578
709
  for (const item of moving) {
@@ -644,6 +775,9 @@ function buildRecord(all, selected, apiVersion, projectRoot) {
644
775
  stopIds: [...stopIds],
645
776
  stopped: [],
646
777
  networks: [],
778
+ automaticRangeNetworks: networks
779
+ .filter((network) => network.kind === 'automatic-range')
780
+ .map((network) => network.name),
647
781
  verified: { images: [], volumes: [], binds: [], containers: [] },
648
782
  created: { volumes: [], networks: [], containers: [] },
649
783
  replaced: [],
@@ -702,32 +836,66 @@ function captureSettings(inspect, name, socketPath) {
702
836
  host.Mounts = mounts;
703
837
  return { name, config };
704
838
  }
839
+ function endpoints(config) {
840
+ return (config?.NetworkingConfig
841
+ ?.EndpointsConfig ?? {});
842
+ }
705
843
  function networkNames(config) {
706
- const endpoints = config.NetworkingConfig
707
- ?.EndpointsConfig;
708
- return Object.keys(endpoints ?? {}).filter((name) => !DEFAULT_NETWORKS.has(name));
844
+ return Object.keys(endpoints(config)).filter((name) => !docker_settings_1.DEFAULT_NETWORKS.has(name));
709
845
  }
710
846
  async function homeNetwork(client, name, signal) {
711
847
  const network = await client.json('GET', `/networks/${encodeURIComponent(name)}`, undefined, { signal });
712
848
  if (network.Driver !== 'bridge')
713
849
  throw new remote_operation_errors_1.RemoteOperationStepRefusedError('DOCKER_PLAN_REFUSED', `Network ${name} uses the ${network.Driver} driver; only bridge networks move.`);
850
+ const ranges = (0, docker_settings_1.ipv4Ranges)(network.IPAM?.Config);
714
851
  return {
715
852
  name,
716
853
  labels: network.Labels ?? {},
717
854
  internal: network.Internal === true,
718
855
  attachable: network.Attachable === true,
719
856
  options: network.Options ?? {},
857
+ ...(ranges.length ? { ipam: { Config: ranges } } : {}),
720
858
  };
721
859
  }
722
860
  async function homeVolumeLabels(client, name, signal) {
723
861
  const volume = await client.json('GET', `/volumes/${encodeURIComponent(name)}`, undefined, { signal });
724
862
  return volume.Labels ?? {};
725
863
  }
864
+ function groupImages(images) {
865
+ const groups = new Map();
866
+ for (const image of images) {
867
+ const key = image.tags.length && image.layers ? JSON.stringify(image.layers) : image.image.id;
868
+ groups.set(key, [...(groups.get(key) ?? []), image]);
869
+ }
870
+ return [...groups.values()];
871
+ }
872
+ const hasReferences = (loaded) => loaded.images.every((image) => image.references !== undefined);
873
+ function saveImages(client, names, signal) {
874
+ const query = [...new Set(names)].map((name) => `names=${encodeURIComponent(name)}`).join('&');
875
+ return client.stream('GET', `/images/get?${query}`, { signal });
876
+ }
726
877
  async function saveImage(client, id, signal) {
727
878
  const image = await client.json('GET', `/images/${encodeURIComponent(id)}/json`, undefined, { signal });
728
879
  const names = image.RepoTags?.length ? image.RepoTags : [id];
729
- const query = names.map((n) => `names=${encodeURIComponent(n)}`).join('&');
730
- return client.stream('GET', `/images/get?${query}`, { signal });
880
+ return {
881
+ archive: await saveImages(client, names, signal),
882
+ layers: image.RootFS?.Layers ?? [],
883
+ };
884
+ }
885
+ function loadedVmId(homeId, homeLayers, reported, tags) {
886
+ const matches = reported.filter((image) => (tags === undefined || image.references?.some((reference) => tags.includes(reference))) &&
887
+ image.layers.length === homeLayers.length &&
888
+ image.layers.every((layer, index) => layer === homeLayers[index]));
889
+ const match = matches.find((image) => image.id === homeId) ?? matches[0];
890
+ if (!match)
891
+ throw new DockerHandoffError(`The VM loaded image ${homeId}, but none of the images it reported (${reported.map((i) => i.id).join(', ') || 'none'}) has the same layers. The VM engine can store images under its own IDs. Retry the copy.`);
892
+ return match.id;
893
+ }
894
+ function isFile(path) {
895
+ return (0, promises_1.stat)(path).then((stats) => stats.isFile(), () => false);
896
+ }
897
+ function vmImageId(record, homeId) {
898
+ return record.images.find((image) => image.id === homeId)?.vmId ?? homeId;
731
899
  }
732
900
  class TransferProgress {
733
901
  run;
@@ -770,7 +938,7 @@ class TransferProgress {
770
938
  callback(null, chunk);
771
939
  },
772
940
  });
773
- (0, promises_1.pipeline)(source, counter).catch(() => undefined);
941
+ (0, promises_2.pipeline)(source, counter).catch(() => undefined);
774
942
  return counter;
775
943
  }
776
944
  async finish() {