devchain-cli 0.24.1 → 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 (343) hide show
  1. package/dist/build-info.json +2 -2
  2. package/dist/cli.js +40 -10
  3. package/dist/host-install/devchain-host-bootstrap.tgz +0 -0
  4. package/dist/host-install/pins.json +31 -2
  5. package/dist/lib/exclusive-run.js +51 -3
  6. package/dist/lib/git-owner.js +284 -0
  7. package/dist/lib/host-install.js +19 -151
  8. package/dist/lib/local-api.js +175 -0
  9. package/dist/server/common/config/env.config.d.ts +3 -0
  10. package/dist/server/common/config/env.config.js +1 -0
  11. package/dist/server/common/config/env.config.js.map +1 -1
  12. package/dist/server/common/config/host-image.json +3 -3
  13. package/dist/server/common/constants/syncthing-markers.d.ts +1 -0
  14. package/dist/server/common/constants/syncthing-markers.js +6 -1
  15. package/dist/server/common/constants/syncthing-markers.js.map +1 -1
  16. package/dist/server/common/filesystem/vm-home-path.d.ts +11 -0
  17. package/dist/server/common/filesystem/vm-home-path.js +48 -0
  18. package/dist/server/common/filesystem/vm-home-path.js.map +1 -0
  19. package/dist/server/common/process-ids-env.d.ts +1 -0
  20. package/dist/server/common/process-ids-env.js +13 -0
  21. package/dist/server/common/process-ids-env.js.map +1 -0
  22. package/dist/server/common/test/api-test-app.d.ts +12 -0
  23. package/dist/server/common/test/api-test-app.js +76 -0
  24. package/dist/server/common/test/api-test-app.js.map +1 -0
  25. package/dist/server/common/test/app-bootstrap.helper.js +8 -1
  26. package/dist/server/common/test/app-bootstrap.helper.js.map +1 -1
  27. package/dist/server/common/test/fake-bootstrap.server.js +3 -2
  28. package/dist/server/common/test/fake-bootstrap.server.js.map +1 -1
  29. package/dist/server/common/test/fake-docker-engine.server.d.ts +17 -6
  30. package/dist/server/common/test/fake-docker-engine.server.js +77 -33
  31. package/dist/server/common/test/fake-docker-engine.server.js.map +1 -1
  32. package/dist/server/common/test/fake-proxmox.server.js +4 -4
  33. package/dist/server/common/test/fake-ssh.server.js +6 -6
  34. package/dist/server/common/test/fake-ssh.server.js.map +1 -1
  35. package/dist/server/common/test/test-database.helper.d.ts +6 -0
  36. package/dist/server/common/test/test-database.helper.js +29 -0
  37. package/dist/server/common/test/test-database.helper.js.map +1 -0
  38. package/dist/server/modules/core/controllers/docker-archive.js +1 -1
  39. package/dist/server/modules/core/controllers/docker-archive.js.map +1 -1
  40. package/dist/server/modules/core/controllers/docker-engine.client.d.ts +2 -1
  41. package/dist/server/modules/core/controllers/docker-engine.client.js +8 -4
  42. package/dist/server/modules/core/controllers/docker-engine.client.js.map +1 -1
  43. package/dist/server/modules/core/controllers/docker-image-metadata.d.ts +248 -0
  44. package/dist/server/modules/core/controllers/docker-image-metadata.js +161 -0
  45. package/dist/server/modules/core/controllers/docker-image-metadata.js.map +1 -0
  46. package/dist/server/modules/core/controllers/docker-settings.d.ts +13 -2
  47. package/dist/server/modules/core/controllers/docker-settings.js +49 -11
  48. package/dist/server/modules/core/controllers/docker-settings.js.map +1 -1
  49. package/dist/server/modules/core/controllers/host-user-identity.d.ts +34 -0
  50. package/dist/server/modules/core/controllers/host-user-identity.js +23 -0
  51. package/dist/server/modules/core/controllers/host-user-identity.js.map +1 -0
  52. package/dist/server/modules/core/controllers/runtime.controller.d.ts +11 -4
  53. package/dist/server/modules/core/controllers/runtime.controller.js +2 -0
  54. package/dist/server/modules/core/controllers/runtime.controller.js.map +1 -1
  55. package/dist/server/modules/file-sync/build-exclusion-suggestions.d.ts +15 -0
  56. package/dist/server/modules/file-sync/build-exclusion-suggestions.js +402 -0
  57. package/dist/server/modules/file-sync/build-exclusion-suggestions.js.map +1 -0
  58. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.d.ts +102 -0
  59. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.js +22 -0
  60. package/dist/server/modules/file-sync/file-sync-auto-fix.dto.js.map +1 -0
  61. package/dist/server/modules/file-sync/file-sync-auto-fix.store.d.ts +12 -0
  62. package/dist/server/modules/file-sync/file-sync-auto-fix.store.js +73 -0
  63. package/dist/server/modules/file-sync/file-sync-auto-fix.store.js.map +1 -0
  64. package/dist/server/modules/file-sync/file-sync-conflicts.d.ts +3 -0
  65. package/dist/server/modules/file-sync/file-sync-conflicts.js +191 -0
  66. package/dist/server/modules/file-sync/file-sync-conflicts.js.map +1 -0
  67. package/dist/server/modules/file-sync/file-sync-ignores.store.d.ts +5 -1
  68. package/dist/server/modules/file-sync/file-sync-ignores.store.js +39 -8
  69. package/dist/server/modules/file-sync/file-sync-ignores.store.js.map +1 -1
  70. package/dist/server/modules/file-sync/file-sync.controller.d.ts +1 -3
  71. package/dist/server/modules/file-sync/file-sync.controller.js +5 -14
  72. package/dist/server/modules/file-sync/file-sync.controller.js.map +1 -1
  73. package/dist/server/modules/file-sync/file-sync.dto.d.ts +220 -1
  74. package/dist/server/modules/file-sync/file-sync.dto.js +70 -4
  75. package/dist/server/modules/file-sync/file-sync.dto.js.map +1 -1
  76. package/dist/server/modules/file-sync/file-sync.module.js +16 -1
  77. package/dist/server/modules/file-sync/file-sync.module.js.map +1 -1
  78. package/dist/server/modules/file-sync/file-sync.service.d.ts +18 -4
  79. package/dist/server/modules/file-sync/file-sync.service.js +166 -34
  80. package/dist/server/modules/file-sync/file-sync.service.js.map +1 -1
  81. package/dist/server/modules/file-sync/git-guard.dto.d.ts +61 -0
  82. package/dist/server/modules/file-sync/git-guard.dto.js +26 -0
  83. package/dist/server/modules/file-sync/git-guard.dto.js.map +1 -0
  84. package/dist/server/modules/file-sync/home-git-guard.service.d.ts +4 -2
  85. package/dist/server/modules/file-sync/home-git-guard.service.js +50 -25
  86. package/dist/server/modules/file-sync/home-git-guard.service.js.map +1 -1
  87. package/dist/server/modules/file-sync/host-git-guard.controller.d.ts +10 -0
  88. package/dist/server/modules/file-sync/host-git-guard.controller.js +64 -0
  89. package/dist/server/modules/file-sync/host-git-guard.controller.js.map +1 -0
  90. package/dist/server/modules/file-sync/host-git-index.controller.d.ts +9 -0
  91. package/dist/server/modules/file-sync/host-git-index.controller.js +67 -0
  92. package/dist/server/modules/file-sync/host-git-index.controller.js.map +1 -0
  93. package/dist/server/modules/file-sync/host-sync.controller.d.ts +15 -2
  94. package/dist/server/modules/file-sync/host-sync.controller.js +122 -14
  95. package/dist/server/modules/file-sync/host-sync.controller.js.map +1 -1
  96. package/dist/server/modules/file-sync/ignore-pattern-matcher.d.ts +30 -0
  97. package/dist/server/modules/file-sync/ignore-pattern-matcher.js +183 -0
  98. package/dist/server/modules/file-sync/ignore-pattern-matcher.js.map +1 -0
  99. package/dist/server/modules/file-sync/project-repository.d.ts +2 -0
  100. package/dist/server/modules/file-sync/project-repository.js +20 -0
  101. package/dist/server/modules/file-sync/project-repository.js.map +1 -0
  102. package/dist/server/modules/file-sync/sync-chown.dto.d.ts +99 -0
  103. package/dist/server/modules/file-sync/sync-chown.dto.js +46 -0
  104. package/dist/server/modules/file-sync/sync-chown.dto.js.map +1 -0
  105. package/dist/server/modules/file-sync/sync-chown.service.d.ts +12 -0
  106. package/dist/server/modules/file-sync/sync-chown.service.js +230 -0
  107. package/dist/server/modules/file-sync/sync-chown.service.js.map +1 -0
  108. package/dist/server/modules/file-sync/sync-path-inspection.dto.d.ts +626 -0
  109. package/dist/server/modules/file-sync/sync-path-inspection.dto.js +108 -0
  110. package/dist/server/modules/file-sync/sync-path-inspection.dto.js.map +1 -0
  111. package/dist/server/modules/file-sync/sync-path-inspector.d.ts +12 -0
  112. package/dist/server/modules/file-sync/sync-path-inspector.js +413 -0
  113. package/dist/server/modules/file-sync/sync-path-inspector.js.map +1 -0
  114. package/dist/server/modules/file-sync/testing/fake-file-sync.service.d.ts +27 -4
  115. package/dist/server/modules/file-sync/testing/fake-file-sync.service.js +66 -4
  116. package/dist/server/modules/file-sync/testing/fake-file-sync.service.js.map +1 -1
  117. package/dist/server/modules/file-sync/translate-git-ignore-rule.d.ts +3 -0
  118. package/dist/server/modules/file-sync/translate-git-ignore-rule.js +30 -0
  119. package/dist/server/modules/file-sync/translate-git-ignore-rule.js.map +1 -0
  120. package/dist/server/modules/mcp/services/handlers/skill-tools.js +2 -2
  121. package/dist/server/modules/mcp/services/handlers/skill-tools.js.map +1 -1
  122. package/dist/server/modules/remotes/connect-choices.controller.d.ts +9 -0
  123. package/dist/server/modules/remotes/connect-choices.controller.js +54 -0
  124. package/dist/server/modules/remotes/connect-choices.controller.js.map +1 -0
  125. package/dist/server/modules/remotes/connect-choices.dto.d.ts +52 -0
  126. package/dist/server/modules/remotes/connect-choices.dto.js +19 -0
  127. package/dist/server/modules/remotes/connect-choices.dto.js.map +1 -0
  128. package/dist/server/modules/remotes/connect-choices.store.d.ts +12 -0
  129. package/dist/server/modules/remotes/connect-choices.store.js +95 -0
  130. package/dist/server/modules/remotes/connect-choices.store.js.map +1 -0
  131. package/dist/server/modules/remotes/controllers/remotes.controller.d.ts +3 -0
  132. package/dist/server/modules/remotes/controllers/remotes.controller.js +9 -1
  133. package/dist/server/modules/remotes/controllers/remotes.controller.js.map +1 -1
  134. package/dist/server/modules/remotes/docker/docker-copy-back.js +40 -16
  135. package/dist/server/modules/remotes/docker/docker-copy-back.js.map +1 -1
  136. package/dist/server/modules/remotes/docker/docker-handoff.d.ts +5 -3
  137. package/dist/server/modules/remotes/docker/docker-handoff.js +146 -42
  138. package/dist/server/modules/remotes/docker/docker-handoff.js.map +1 -1
  139. package/dist/server/modules/remotes/docker/docker-handoff.store.d.ts +3 -0
  140. package/dist/server/modules/remotes/docker/docker-handoff.store.js.map +1 -1
  141. package/dist/server/modules/remotes/docker/docker-plan-fit.d.ts +4 -1
  142. package/dist/server/modules/remotes/docker/docker-plan-fit.js +19 -6
  143. package/dist/server/modules/remotes/docker/docker-plan-fit.js.map +1 -1
  144. package/dist/server/modules/remotes/docker/docker-plan-policy.d.ts +6 -2
  145. package/dist/server/modules/remotes/docker/docker-plan-policy.js +191 -38
  146. package/dist/server/modules/remotes/docker/docker-plan-policy.js.map +1 -1
  147. package/dist/server/modules/remotes/docker/docker-plan-source.service.d.ts +52 -8
  148. package/dist/server/modules/remotes/docker/docker-plan-source.service.js +273 -50
  149. package/dist/server/modules/remotes/docker/docker-plan-source.service.js.map +1 -1
  150. package/dist/server/modules/remotes/docker/docker-plan.controller.d.ts +2 -1
  151. package/dist/server/modules/remotes/docker/docker-plan.controller.js +14 -0
  152. package/dist/server/modules/remotes/docker/docker-plan.controller.js.map +1 -1
  153. package/dist/server/modules/remotes/docker/docker-plan.dto.d.ts +46 -1
  154. package/dist/server/modules/remotes/docker/docker-plan.dto.js +1 -0
  155. package/dist/server/modules/remotes/docker/docker-plan.dto.js.map +1 -1
  156. package/dist/server/modules/remotes/docker/docker-plan.service.d.ts +13 -7
  157. package/dist/server/modules/remotes/docker/docker-plan.service.js +57 -13
  158. package/dist/server/modules/remotes/docker/docker-plan.service.js.map +1 -1
  159. package/dist/server/modules/remotes/docker/docker-project-compose.d.ts +7 -0
  160. package/dist/server/modules/remotes/docker/docker-project-compose.js +30 -0
  161. package/dist/server/modules/remotes/docker/docker-project-compose.js.map +1 -0
  162. package/dist/server/modules/remotes/dtos/remote.dto.d.ts +2 -0
  163. package/dist/server/modules/remotes/dtos/remote.dto.js.map +1 -1
  164. package/dist/server/modules/remotes/git-owner.store.d.ts +13 -0
  165. package/dist/server/modules/remotes/git-owner.store.js +69 -0
  166. package/dist/server/modules/remotes/git-owner.store.js.map +1 -0
  167. package/dist/server/modules/remotes/host/host-docker.controller.d.ts +8 -0
  168. package/dist/server/modules/remotes/host/host-docker.controller.js +22 -6
  169. package/dist/server/modules/remotes/host/host-docker.controller.js.map +1 -1
  170. package/dist/server/modules/remotes/host/host-docker.dto.d.ts +606 -0
  171. package/dist/server/modules/remotes/host/host-docker.dto.js +47 -7
  172. package/dist/server/modules/remotes/host/host-docker.dto.js.map +1 -1
  173. package/dist/server/modules/remotes/host/host-docker.service.d.ts +16 -4
  174. package/dist/server/modules/remotes/host/host-docker.service.js +157 -82
  175. package/dist/server/modules/remotes/host/host-docker.service.js.map +1 -1
  176. package/dist/server/modules/remotes/host/host-ipv4-routes.d.ts +4 -0
  177. package/dist/server/modules/remotes/host/host-ipv4-routes.js +43 -0
  178. package/dist/server/modules/remotes/host/host-ipv4-routes.js.map +1 -0
  179. package/dist/server/modules/remotes/host-image.d.ts +1 -1
  180. package/dist/server/modules/remotes/host-image.js +1 -1
  181. package/dist/server/modules/remotes/host-install/host-install-block.d.ts +1 -0
  182. package/dist/server/modules/remotes/host-install/host-install-block.js +76 -2
  183. package/dist/server/modules/remotes/host-install/host-install-block.js.map +1 -1
  184. package/dist/server/modules/remotes/host-install/host-install.service.d.ts +0 -1
  185. package/dist/server/modules/remotes/host-install/host-install.service.js +9 -26
  186. package/dist/server/modules/remotes/host-install/host-install.service.js.map +1 -1
  187. package/dist/server/modules/remotes/operations/attach.operation.d.ts +5 -1
  188. package/dist/server/modules/remotes/operations/attach.operation.js +40 -5
  189. package/dist/server/modules/remotes/operations/attach.operation.js.map +1 -1
  190. package/dist/server/modules/remotes/operations/claim.operation.d.ts +1 -0
  191. package/dist/server/modules/remotes/operations/claim.operation.js +6 -1
  192. package/dist/server/modules/remotes/operations/claim.operation.js.map +1 -1
  193. package/dist/server/modules/remotes/operations/detach.operation.d.ts +4 -1
  194. package/dist/server/modules/remotes/operations/detach.operation.js +10 -2
  195. package/dist/server/modules/remotes/operations/detach.operation.js.map +1 -1
  196. package/dist/server/modules/remotes/operations/docker-import-inventory.store.d.ts +4 -0
  197. package/dist/server/modules/remotes/operations/docker-import-inventory.store.js +11 -0
  198. package/dist/server/modules/remotes/operations/docker-import-inventory.store.js.map +1 -1
  199. package/dist/server/modules/remotes/operations/file-sync-handoff.d.ts +29 -3
  200. package/dist/server/modules/remotes/operations/file-sync-handoff.js +477 -50
  201. package/dist/server/modules/remotes/operations/file-sync-handoff.js.map +1 -1
  202. package/dist/server/modules/remotes/operations/force-sync.operation.d.ts +39 -0
  203. package/dist/server/modules/remotes/operations/force-sync.operation.js +177 -0
  204. package/dist/server/modules/remotes/operations/force-sync.operation.js.map +1 -0
  205. package/dist/server/modules/remotes/operations/git-owner.dto.d.ts +83 -0
  206. package/dist/server/modules/remotes/operations/git-owner.dto.js +25 -0
  207. package/dist/server/modules/remotes/operations/git-owner.dto.js.map +1 -0
  208. package/dist/server/modules/remotes/operations/git-owner.operation.d.ts +35 -0
  209. package/dist/server/modules/remotes/operations/git-owner.operation.js +216 -0
  210. package/dist/server/modules/remotes/operations/git-owner.operation.js.map +1 -0
  211. package/dist/server/modules/remotes/operations/remote-host.client.d.ts +71 -7
  212. package/dist/server/modules/remotes/operations/remote-host.client.js +141 -11
  213. package/dist/server/modules/remotes/operations/remote-host.client.js.map +1 -1
  214. package/dist/server/modules/remotes/operations/remote-operation.dto.d.ts +19 -0
  215. package/dist/server/modules/remotes/operations/remote-operation.dto.js +5 -1
  216. package/dist/server/modules/remotes/operations/remote-operation.dto.js.map +1 -1
  217. package/dist/server/modules/remotes/operations/remote-operation.runner.d.ts +3 -1
  218. package/dist/server/modules/remotes/operations/remote-operation.runner.js +52 -21
  219. package/dist/server/modules/remotes/operations/remote-operation.runner.js.map +1 -1
  220. package/dist/server/modules/remotes/operations/remote-operation.types.d.ts +4 -1
  221. package/dist/server/modules/remotes/operations/remote-operation.types.js.map +1 -1
  222. package/dist/server/modules/remotes/operations/remote-operations.controller.d.ts +5 -0
  223. package/dist/server/modules/remotes/operations/remote-operations.controller.js +56 -0
  224. package/dist/server/modules/remotes/operations/remote-operations.controller.js.map +1 -1
  225. package/dist/server/modules/remotes/operations/remote-operations.service.d.ts +16 -1
  226. package/dist/server/modules/remotes/operations/remote-operations.service.js +155 -5
  227. package/dist/server/modules/remotes/operations/remote-operations.service.js.map +1 -1
  228. package/dist/server/modules/remotes/operations/update-logins.operation.d.ts +1 -3
  229. package/dist/server/modules/remotes/operations/update-logins.operation.js +3 -18
  230. package/dist/server/modules/remotes/operations/update-logins.operation.js.map +1 -1
  231. package/dist/server/modules/remotes/ports/remote-health.port.d.ts +2 -0
  232. package/dist/server/modules/remotes/ports/remote-health.port.js.map +1 -1
  233. package/dist/server/modules/remotes/remotes.module.js +18 -0
  234. package/dist/server/modules/remotes/remotes.module.js.map +1 -1
  235. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.d.ts +2 -2
  236. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.js +2 -13
  237. package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.js.map +1 -1
  238. package/dist/server/modules/remotes/services/remote-health.service.js +5 -0
  239. package/dist/server/modules/remotes/services/remote-health.service.js.map +1 -1
  240. package/dist/server/modules/remotes/sync/file-sync-failures.service.d.ts +18 -0
  241. package/dist/server/modules/remotes/sync/file-sync-failures.service.js +157 -0
  242. package/dist/server/modules/remotes/sync/file-sync-failures.service.js.map +1 -0
  243. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.d.ts +14 -0
  244. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.js +99 -0
  245. package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.js.map +1 -0
  246. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.d.ts +15 -0
  247. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.js +90 -0
  248. package/dist/server/modules/remotes/sync/file-sync-suggestions.service.js.map +1 -0
  249. package/dist/server/modules/remotes/sync/project-file-sync.controller.d.ts +29 -0
  250. package/dist/server/modules/remotes/sync/project-file-sync.controller.js +160 -0
  251. package/dist/server/modules/remotes/sync/project-file-sync.controller.js.map +1 -0
  252. package/dist/server/modules/remotes/sync/remote-file-sync.dto.d.ts +72 -0
  253. package/dist/server/modules/remotes/sync/remote-file-sync.dto.js +16 -0
  254. package/dist/server/modules/remotes/sync/remote-file-sync.dto.js.map +1 -0
  255. package/dist/server/modules/remotes/sync/remote-file-sync.service.d.ts +32 -1
  256. package/dist/server/modules/remotes/sync/remote-file-sync.service.js +499 -38
  257. package/dist/server/modules/remotes/sync/remote-file-sync.service.js.map +1 -1
  258. package/dist/server/modules/remotes/sync/remote-live-sync.service.d.ts +2 -0
  259. package/dist/server/modules/remotes/sync/remote-live-sync.service.js +26 -12
  260. package/dist/server/modules/remotes/sync/remote-live-sync.service.js.map +1 -1
  261. package/dist/server/modules/remotes/vm-user-identity.d.ts +29 -0
  262. package/dist/server/modules/remotes/vm-user-identity.js +45 -0
  263. package/dist/server/modules/remotes/vm-user-identity.js.map +1 -0
  264. package/dist/server/modules/runtime-context-capture/codex-plugin-profile-materializer.service.js +5 -1
  265. package/dist/server/modules/runtime-context-capture/codex-plugin-profile-materializer.service.js.map +1 -1
  266. package/dist/server/modules/session-reader/data/pricing.json +55 -7
  267. package/dist/server/modules/sessions/services/provider-launch-config/provider-launch-config.service.js +5 -0
  268. package/dist/server/modules/sessions/services/provider-launch-config/provider-launch-config.service.js.map +1 -1
  269. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.d.ts +6 -0
  270. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.js +26 -0
  271. package/dist/server/modules/settings/local/delegates/skills-settings.delegate.js.map +1 -1
  272. package/dist/server/modules/settings/services/settings.service.d.ts +3 -1
  273. package/dist/server/modules/settings/services/settings.service.js +6 -0
  274. package/dist/server/modules/settings/services/settings.service.js.map +1 -1
  275. package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js +5 -5
  276. package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js.map +1 -1
  277. package/dist/server/modules/skills/adapters/github-directory-skill-source.adapter.js +5 -5
  278. package/dist/server/modules/skills/adapters/github-directory-skill-source.adapter.js.map +1 -1
  279. package/dist/server/modules/skills/adapters/github-skill-source.base.js +4 -3
  280. package/dist/server/modules/skills/adapters/github-skill-source.base.js.map +1 -1
  281. package/dist/server/modules/skills/adapters/local-skill-source.adapter.js +5 -5
  282. package/dist/server/modules/skills/adapters/local-skill-source.adapter.js.map +1 -1
  283. package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js +5 -5
  284. package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js.map +1 -1
  285. package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js +5 -5
  286. package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js.map +1 -1
  287. package/dist/server/modules/skills/adapters/skill-source.adapter.d.ts +5 -0
  288. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.d.ts +5 -0
  289. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.js +75 -0
  290. package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.js.map +1 -0
  291. package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js +5 -5
  292. package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js.map +1 -1
  293. package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js +5 -5
  294. package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js.map +1 -1
  295. package/dist/server/modules/skills/controllers/skills.controller.js +2 -2
  296. package/dist/server/modules/skills/controllers/skills.controller.js.map +1 -1
  297. package/dist/server/modules/skills/services/skill-source-lifecycle.service.d.ts +3 -3
  298. package/dist/server/modules/skills/services/skill-source-lifecycle.service.js +9 -4
  299. package/dist/server/modules/skills/services/skill-source-lifecycle.service.js.map +1 -1
  300. package/dist/server/modules/skills/services/skill-sync.service.d.ts +3 -3
  301. package/dist/server/modules/skills/services/skill-sync.service.js +32 -6
  302. package/dist/server/modules/skills/services/skill-sync.service.js.map +1 -1
  303. package/dist/server/modules/skills/services/skill-sync.types.d.ts +3 -0
  304. package/dist/server/modules/storage/db/schema.d.ts +2 -2
  305. package/dist/server/modules/storage/db/schema.js +2 -0
  306. package/dist/server/modules/storage/db/schema.js.map +1 -1
  307. package/dist/server/modules/storage/models/domain.models.d.ts +1 -1
  308. package/dist/server/modules/storage/models/domain.models.js +2 -0
  309. package/dist/server/modules/storage/models/domain.models.js.map +1 -1
  310. package/dist/server/modules/terminal/gateways/terminal.gateway.d.ts +3 -1
  311. package/dist/server/modules/terminal/gateways/terminal.gateway.js +9 -4
  312. package/dist/server/modules/terminal/gateways/terminal.gateway.js.map +1 -1
  313. package/dist/server/modules/terminal/services/terminal-activity.service.d.ts +0 -1
  314. package/dist/server/modules/terminal/services/terminal-activity.service.js +0 -3
  315. package/dist/server/modules/terminal/services/terminal-activity.service.js.map +1 -1
  316. package/dist/server/modules/terminal/services/terminal-io/lifecycle.js +15 -3
  317. package/dist/server/modules/terminal/services/terminal-io/lifecycle.js.map +1 -1
  318. package/dist/server/modules/terminal/utils/ansi-sanitizer.d.ts +0 -1
  319. package/dist/server/modules/terminal/utils/ansi-sanitizer.js +0 -4
  320. package/dist/server/modules/terminal/utils/ansi-sanitizer.js.map +1 -1
  321. package/dist/server/templates/teams-dev.json +11 -11
  322. package/dist/server/test-setup-node.js +4 -3
  323. package/dist/server/test-setup-node.js.map +1 -1
  324. package/dist/server/test-setup.js +7 -0
  325. package/dist/server/test-setup.js.map +1 -1
  326. package/dist/server/tsconfig.tsbuildinfo +1 -1
  327. package/dist/server/ui/assets/{ExternalRichEditor-DtNvrV0F.js → ExternalRichEditor-CIZPhssf.js} +24 -24
  328. package/dist/server/ui/assets/ReviewDetailPage-winyLSQ7.js +6 -0
  329. package/dist/server/ui/assets/ReviewsPage-BYKBReMp.js +6 -0
  330. package/dist/server/ui/assets/index-CiDJX6Hn.js +1191 -0
  331. package/dist/server/ui/assets/index-f1WOAqXB.css +32 -0
  332. package/dist/server/ui/assets/useReviewSubscription-v3Cto0y4.js +69 -0
  333. package/dist/server/ui/index.html +2 -2
  334. package/dist/templates/teams-dev.json +11 -11
  335. package/package.json +8 -1
  336. package/dist/server/modules/reviews/utils/notification-formatter.d.ts +0 -12
  337. package/dist/server/modules/reviews/utils/notification-formatter.js +0 -60
  338. package/dist/server/modules/reviews/utils/notification-formatter.js.map +0 -1
  339. package/dist/server/ui/assets/ReviewDetailPage-DJzEoM0x.js +0 -6
  340. package/dist/server/ui/assets/ReviewsPage-z2O8MNEw.js +0 -6
  341. package/dist/server/ui/assets/index-CC4P3V8L.js +0 -994
  342. package/dist/server/ui/assets/index-LsJe1ZTS.css +0 -32
  343. package/dist/server/ui/assets/useReviewSubscription-B7AdJBO2.js +0 -69
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DockerScanRequestSchema = exports.DockerImageLoadResultSchema = exports.DockerArchiveWriteResultSchema = exports.DockerBindPrepareSchema = exports.DockerCapacityRequestSchema = exports.DOCKER_ARCHIVE_SHA256_TRAILER = exports.DOCKER_API_VERSION_HEADER = exports.COMPOSE_PROJECT_LABEL = exports.DOCKER_PROJECT_LABEL = exports.DockerResourceIdSchema = exports.DockerArchiveRequestSchema = exports.DockerContainerCreateSchema = exports.DockerNetworkCreateSchema = exports.DockerVolumeCreateSchema = exports.DockerIdsSchema = exports.DockerOwnerSchema = void 0;
3
+ exports.DockerScanRequestSchema = exports.DockerImageLoadResultSchema = exports.DockerArchiveWriteResultSchema = exports.DockerBindPrepareSchema = exports.DockerCapacityRequestSchema = exports.DOCKER_ARCHIVE_SHA256_TRAILER = exports.DOCKER_API_VERSION_HEADER = exports.COMPOSE_SERVICE_LABEL = exports.COMPOSE_PROJECT_LABEL = exports.DOCKER_PROJECT_LABEL = exports.DockerResourceIdSchema = exports.DockerArchiveRequestSchema = exports.DockerContainerCreateSchema = exports.DockerNetworkCreateSchema = exports.DockerVolumeCreateSchema = exports.DockerImageMatchResultSchema = exports.DockerImageMatchRequestSchema = exports.DockerIdsSchema = exports.DockerOwnerSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const node_path_1 = require("node:path");
6
+ const docker_image_metadata_1 = require("../../core/controllers/docker-image-metadata");
6
7
  const identifier = zod_1.z
7
8
  .string()
8
9
  .min(1)
@@ -10,8 +11,34 @@ const identifier = zod_1.z
10
11
  .regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/);
11
12
  const projectId = zod_1.z.string().uuid();
12
13
  const labels = zod_1.z.record(zod_1.z.string()).default({});
13
- exports.DockerOwnerSchema = zod_1.z.object({ projectId }).strict();
14
+ const scanPath = zod_1.z
15
+ .string()
16
+ .min(1)
17
+ .max(4096)
18
+ .refine((path) => (0, node_path_1.isAbsolute)(path) && (0, node_path_1.normalize)(path) === path && !path.includes('\0'));
19
+ exports.DockerOwnerSchema = zod_1.z.object({ projectId, projectRoot: scanPath.optional() }).strict();
14
20
  exports.DockerIdsSchema = zod_1.z.object({ ids: zod_1.z.array(identifier).max(10000) }).strict();
21
+ const imageReference = zod_1.z
22
+ .string()
23
+ .min(1)
24
+ .max(4096)
25
+ .regex(/^(?:\[[0-9a-fA-F:]+\]|[a-zA-Z0-9])[a-zA-Z0-9_.:/@-]*$/);
26
+ exports.DockerImageMatchRequestSchema = zod_1.z
27
+ .object({ refs: zod_1.z.array(imageReference).max(10000) })
28
+ .strict();
29
+ exports.DockerImageMatchResultSchema = zod_1.z
30
+ .object({
31
+ images: zod_1.z
32
+ .array(zod_1.z
33
+ .object({
34
+ ref: imageReference,
35
+ id: identifier,
36
+ metadata: docker_image_metadata_1.DockerImageMetadataSchema,
37
+ })
38
+ .strict())
39
+ .max(10000),
40
+ })
41
+ .strict();
15
42
  exports.DockerVolumeCreateSchema = zod_1.z.object({ projectId, name: identifier, labels }).strict();
16
43
  exports.DockerNetworkCreateSchema = zod_1.z
17
44
  .object({
@@ -21,6 +48,21 @@ exports.DockerNetworkCreateSchema = zod_1.z
21
48
  internal: zod_1.z.boolean().default(false),
22
49
  attachable: zod_1.z.boolean().default(false),
23
50
  options: zod_1.z.record(zod_1.z.string()).default({}),
51
+ ipam: zod_1.z
52
+ .object({
53
+ Config: zod_1.z
54
+ .array(zod_1.z
55
+ .object({
56
+ Subnet: zod_1.z.string().min(1).max(64),
57
+ Gateway: zod_1.z.string().ip({ version: 'v4' }).optional(),
58
+ IPRange: zod_1.z.string().min(1).max(64).optional(),
59
+ })
60
+ .strict())
61
+ .min(1),
62
+ })
63
+ .strict()
64
+ .optional(),
65
+ shared: zod_1.z.literal(true).optional(),
24
66
  })
25
67
  .strict();
26
68
  exports.DockerContainerCreateSchema = zod_1.z
@@ -41,16 +83,12 @@ exports.DockerArchiveRequestSchema = zod_1.z
41
83
  exports.DockerResourceIdSchema = identifier;
42
84
  exports.DOCKER_PROJECT_LABEL = 'dev.devchain.project';
43
85
  exports.COMPOSE_PROJECT_LABEL = 'com.docker.compose.project';
86
+ exports.COMPOSE_SERVICE_LABEL = 'com.docker.compose.service';
44
87
  exports.DOCKER_API_VERSION_HEADER = 'x-devchain-docker-api-version';
45
88
  exports.DOCKER_ARCHIVE_SHA256_TRAILER = 'x-devchain-archive-sha256';
46
89
  exports.DockerCapacityRequestSchema = zod_1.z
47
90
  .object({ paths: zod_1.z.array(zod_1.z.string().min(1).max(4096)).max(64) })
48
91
  .strict();
49
- const scanPath = zod_1.z
50
- .string()
51
- .min(1)
52
- .max(4096)
53
- .refine((path) => (0, node_path_1.isAbsolute)(path) && (0, node_path_1.normalize)(path) === path && !path.includes('\0'));
54
92
  exports.DockerBindPrepareSchema = zod_1.z
55
93
  .object({
56
94
  projectId,
@@ -78,6 +116,7 @@ exports.DockerImageLoadResultSchema = zod_1.z
78
116
  .object({
79
117
  id: zod_1.z.string().min(1).max(256),
80
118
  layers: zod_1.z.array(zod_1.z.string().min(1).max(256)).max(10000),
119
+ references: zod_1.z.array(zod_1.z.string().min(1).max(256)).max(10000).optional(),
81
120
  })
82
121
  .strict())
83
122
  .max(10000),
@@ -87,6 +126,7 @@ exports.DockerScanRequestSchema = zod_1.z
87
126
  .object({
88
127
  paths: zod_1.z.array(scanPath).max(64).default([]),
89
128
  volumes: zod_1.z.array(identifier).max(10000).optional(),
129
+ networks: zod_1.z.array(identifier).max(10000).optional(),
90
130
  })
91
131
  .strict();
92
132
  //# sourceMappingURL=host-docker.dto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host-docker.dto.js","sourceRoot":"","sources":["../../../../src/modules/remotes/host/host-docker.dto.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host-docker.dto.js","sourceRoot":"","sources":["../../../../src/modules/remotes/host/host-docker.dto.ts"],"names":[],"mappings":"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"}
@@ -2,22 +2,33 @@ import { DockerArchiveJournal } from '../../core/controllers/docker-archive-jour
2
2
  import { Readable } from 'node:stream';
3
3
  import { DockerVersion } from '../../core/controllers/docker-engine.client';
4
4
  import { DockerArchiveRequest, DockerContainerCreate, DockerNetworkCreate, DockerVolumeCreate, DockerVolumeHolder, DockerCapacityResult, DockerScanResult, DockerArchiveWriteResult, DockerBindPrepare, DockerImageLoadResult } from './host-docker.dto';
5
+ import { type HostIPv4RouteReader } from './host-ipv4-routes';
5
6
  type Labels = Record<string, string>;
6
7
  type Volume = {
7
8
  Name: string;
8
9
  Labels?: Labels;
9
10
  };
11
+ type MatchedImage = {
12
+ ref: string;
13
+ id: string;
14
+ metadata: Record<string, unknown>;
15
+ };
10
16
  export declare class HostDockerService {
11
17
  private readonly archives;
12
- constructor(archives: DockerArchiveJournal);
18
+ private readonly routes;
19
+ constructor(archives: DockerArchiveJournal, routes?: HostIPv4RouteReader);
13
20
  version(signal?: AbortSignal): Promise<DockerVersion>;
14
21
  private engine;
15
- scan(paths: string[], signal?: AbortSignal, apiVersion?: string, holderVolumes?: string[]): Promise<DockerScanResult>;
22
+ scan(paths: string[], signal?: AbortSignal, apiVersion?: string, holderVolumes?: string[], networkNames?: string[]): Promise<DockerScanResult>;
16
23
  capacity(paths: string[], signal?: AbortSignal): Promise<DockerCapacityResult>;
17
24
  imagesPresent(ids: string[], signal?: AbortSignal, apiVersion?: string): Promise<{
18
25
  ids: string[];
19
26
  }>;
27
+ matchImages(refs: string[], signal?: AbortSignal, apiVersion?: string): Promise<{
28
+ images: MatchedImage[];
29
+ }>;
20
30
  loadImage(body: Readable, signal?: AbortSignal, apiVersion?: string): Promise<DockerImageLoadResult>;
31
+ private loadReferences;
21
32
  saveImage(id: string, signal?: AbortSignal, apiVersion?: string): Promise<Readable>;
22
33
  createVolume(input: DockerVolumeCreate, signal?: AbortSignal, apiVersion?: string): Promise<Volume>;
23
34
  createNetwork(input: DockerNetworkCreate, signal?: AbortSignal, apiVersion?: string): Promise<{
@@ -30,15 +41,16 @@ export declare class HostDockerService {
30
41
  holders(name: string, signal?: AbortSignal, apiVersion?: string): Promise<{
31
42
  holders: DockerVolumeHolder[];
32
43
  }>;
33
- remove(kind: 'volumes' | 'containers' | 'networks', id: string, projectId: string, signal?: AbortSignal, apiVersion?: string): Promise<void>;
44
+ remove(kind: 'volumes' | 'containers' | 'networks', id: string, projectId: string, signal?: AbortSignal, apiVersion?: string, projectRoot?: string): Promise<void>;
34
45
  writeArchive(input: DockerArchiveRequest, body: Readable, signal?: AbortSignal, apiVersion?: string): Promise<DockerArchiveWriteResult>;
35
46
  prepareBinds(input: DockerBindPrepare, signal?: AbortSignal, apiVersion?: string): Promise<void>;
36
47
  private clearBind;
37
48
  stopProject(projectId: string, signal?: AbortSignal, apiVersion?: string): Promise<{
38
49
  stopped: string[];
39
50
  }>;
40
- stopContainer(id: string, projectId: string, signal?: AbortSignal, apiVersion?: string): Promise<void>;
51
+ stopContainer(id: string, projectId: string, signal?: AbortSignal, apiVersion?: string, projectRoot?: string): Promise<void>;
41
52
  readArchive(input: DockerArchiveRequest, signal?: AbortSignal, apiVersion?: string): Promise<Readable>;
53
+ private validateProjectRoot;
42
54
  private requireOwner;
43
55
  private composeOwnsProjectVolume;
44
56
  private composeHolder;
@@ -8,26 +8,36 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.HostDockerService = void 0;
16
+ const docker_project_compose_1 = require("../docker/docker-project-compose");
13
17
  const docker_archive_journal_1 = require("../../core/controllers/docker-archive-journal");
14
18
  const common_1 = require("@nestjs/common");
15
19
  const node_crypto_1 = require("node:crypto");
16
20
  const promises_1 = require("node:fs/promises");
17
21
  const node_os_1 = require("node:os");
22
+ const node_net_1 = require("node:net");
18
23
  const node_path_1 = require("node:path");
19
24
  const node_stream_1 = require("node:stream");
20
25
  const promises_2 = require("node:stream/promises");
21
26
  const error_types_1 = require("../../../common/errors/error-types");
27
+ const vm_home_path_1 = require("../../../common/filesystem/vm-home-path");
22
28
  const docker_engine_client_1 = require("../../core/controllers/docker-engine.client");
23
29
  const docker_archive_1 = require("../../core/controllers/docker-archive");
24
30
  const docker_runtime_1 = require("../../core/controllers/docker-runtime");
31
+ const docker_image_metadata_1 = require("../../core/controllers/docker-image-metadata");
25
32
  const docker_settings_1 = require("../../core/controllers/docker-settings");
26
33
  const host_docker_dto_1 = require("./host-docker.dto");
34
+ const host_ipv4_routes_1 = require("./host-ipv4-routes");
27
35
  let HostDockerService = class HostDockerService {
28
36
  archives;
29
- constructor(archives) {
37
+ routes;
38
+ constructor(archives, routes = host_ipv4_routes_1.readHostIPv4Routes) {
30
39
  this.archives = archives;
40
+ this.routes = routes;
31
41
  }
32
42
  async version(signal) {
33
43
  return (await docker_engine_client_1.DockerEngineClient.connect(signal)).version(signal);
@@ -41,13 +51,32 @@ let HostDockerService = class HostDockerService {
41
51
  });
42
52
  return client;
43
53
  }
44
- async scan(paths, signal, apiVersion, holderVolumes) {
54
+ async scan(paths, signal, apiVersion, holderVolumes, networkNames) {
45
55
  const client = await this.engine(signal, apiVersion);
46
56
  const info = client.connectedInfo ?? (await client.info(signal));
47
57
  if (!info.Architecture)
48
58
  throw new docker_engine_client_1.DockerEngineError('invalid-response', 'Docker architecture is unavailable');
49
59
  const containers = await client.json('GET', '/containers/json?all=true', undefined, { signal });
50
60
  const volumes = await client.json('GET', '/volumes', undefined, { signal });
61
+ let networks;
62
+ let routes;
63
+ if (networkNames) {
64
+ const listed = await client.json('GET', '/networks', undefined, { signal });
65
+ networks = await Promise.all(listed.map(async (network) => {
66
+ const subnets = (0, docker_settings_1.ipv4Ranges)(network.IPAM?.Config).map((range) => range.Subnet);
67
+ if (!networkNames.includes(network.Name))
68
+ return { name: network.Name, subnets };
69
+ const inspect = await client.json('GET', `/networks/${encodeURIComponent(network.Name)}`, undefined, { signal });
70
+ const addresses = Object.entries(inspect.Containers ?? {}).flatMap(([containerId, endpoint]) => {
71
+ const address = endpoint.IPv4Address?.split('/')[0];
72
+ return address && (0, node_net_1.isIPv4)(address)
73
+ ? [{ address, containerId, containerName: endpoint.Name.replace(/^\//, '') }]
74
+ : [];
75
+ });
76
+ return { name: network.Name, subnets, addresses };
77
+ }));
78
+ routes = await this.routes(signal);
79
+ }
51
80
  const existence = [];
52
81
  for (const path of paths) {
53
82
  signal?.throwIfAborted();
@@ -66,7 +95,7 @@ let HostDockerService = class HostDockerService {
66
95
  const holders = containers.filter((container) => container.Mounts?.some((m) => (m.Type === 'volume' && m.Name && holderVolumes.includes(m.Name)) ||
67
96
  (m.Type === 'bind' &&
68
97
  m.Source &&
69
- paths.some((p) => inside(p, m.Source) || inside(m.Source, p)))));
98
+ paths.some((p) => (0, vm_home_path_1.inside)(p, m.Source) || (0, vm_home_path_1.inside)(m.Source, p)))));
70
99
  await Promise.all(holders.map(async (container) => {
71
100
  try {
72
101
  const inspect = await client.json('GET', `/containers/${encodeURIComponent(container.Id)}/json`, undefined, { signal });
@@ -87,6 +116,7 @@ let HostDockerService = class HostDockerService {
87
116
  architecture: info.Architecture,
88
117
  containers: containers.map((container) => ({
89
118
  id: container.Id,
119
+ ...(container.ImageID ? { image: container.ImageID } : {}),
90
120
  ...(metadata.has(container.Id) && { metadata: metadata.get(container.Id) }),
91
121
  name: container.Names[0]?.replace(/^\//, '') ?? container.Id,
92
122
  labels: container.Labels ?? {},
@@ -103,6 +133,7 @@ let HostDockerService = class HostDockerService {
103
133
  labels: volume.Labels ?? {},
104
134
  })),
105
135
  paths: existence,
136
+ ...(networks ? { networks, routes } : {}),
106
137
  };
107
138
  }
108
139
  async capacity(paths, signal) {
@@ -110,7 +141,7 @@ let HostDockerService = class HostDockerService {
110
141
  if (paths.some((path) => !(0, node_path_1.isAbsolute)(path) ||
111
142
  (0, node_path_1.normalize)(path) !== path ||
112
143
  path.includes('\0') ||
113
- !inside(path, home)))
144
+ !(0, vm_home_path_1.inside)(path, home)))
114
145
  throw new error_types_1.AppError('Capacity paths must be absolute normalized paths under VM home', 'DOCKER_BIND_OUTSIDE_HOME', 403);
115
146
  const results = [];
116
147
  const canonicalHome = await (0, promises_1.realpath)(home).catch(() => null);
@@ -119,8 +150,8 @@ let HostDockerService = class HostDockerService {
119
150
  try {
120
151
  if (canonicalHome === null)
121
152
  throw new Error();
122
- const resolved = await (0, promises_1.realpath)(await nearestExisting(path, home));
123
- if (!inside(resolved, canonicalHome))
153
+ const resolved = await (0, promises_1.realpath)(await (0, vm_home_path_1.nearestExisting)(path, home));
154
+ if (!(0, vm_home_path_1.inside)(resolved, canonicalHome))
124
155
  throw new Error();
125
156
  const sample = await (0, docker_runtime_1.dockerFilesystem)(resolved);
126
157
  if (!sample || !Number.isFinite(sample.freeBytes) || sample.freeBytes < 0)
@@ -149,10 +180,38 @@ let HostDockerService = class HostDockerService {
149
180
  }
150
181
  return { ids: present };
151
182
  }
183
+ async matchImages(refs, signal, apiVersion) {
184
+ const client = await this.engine(signal, apiVersion);
185
+ const images = [];
186
+ for (const ref of new Set(refs)) {
187
+ const image = await (0, docker_engine_client_1.optionalDockerJson)(client, `/images/${encodeURIComponent(ref)}/json`, signal);
188
+ if (image)
189
+ images.push({ ref, id: image.Id, metadata: (0, docker_image_metadata_1.dockerImageMetadata)(image) });
190
+ }
191
+ return { images };
192
+ }
152
193
  async loadImage(body, signal, apiVersion) {
153
194
  const client = await this.engine(signal, apiVersion);
195
+ const references = await uploadToEngine(body, (toEngine) => this.loadReferences(client, toEngine, signal));
196
+ const images = new Map();
197
+ for (const reference of references) {
198
+ const inspect = await (0, docker_engine_client_1.optionalDockerJson)(client, `/images/${encodeURIComponent(reference)}/json`, signal);
199
+ if (!inspect?.Id)
200
+ continue;
201
+ const image = images.get(inspect.Id) ?? {
202
+ id: inspect.Id,
203
+ layers: inspect.RootFS?.Layers ?? [],
204
+ references: [],
205
+ };
206
+ if (!image.references.includes(reference))
207
+ image.references.push(reference);
208
+ images.set(inspect.Id, image);
209
+ }
210
+ return { images: [...images.values()] };
211
+ }
212
+ async loadReferences(client, archive, signal) {
154
213
  const response = await client.stream('POST', '/images/load?quiet=1', {
155
- body,
214
+ body: archive,
156
215
  headers: { 'Content-Type': 'application/x-tar' },
157
216
  signal,
158
217
  });
@@ -196,16 +255,7 @@ let HostDockerService = class HostDockerService {
196
255
  finally {
197
256
  response.destroy();
198
257
  }
199
- const images = [];
200
- const seen = new Set();
201
- for (const reference of references) {
202
- const inspect = await (0, docker_engine_client_1.optionalDockerJson)(client, `/images/${encodeURIComponent(reference)}/json`, signal);
203
- if (!inspect?.Id || seen.has(inspect.Id))
204
- continue;
205
- seen.add(inspect.Id);
206
- images.push({ id: inspect.Id, layers: inspect.RootFS?.Layers ?? [] });
207
- }
208
- return { images };
258
+ return references;
209
259
  }
210
260
  async saveImage(id, signal, apiVersion) {
211
261
  const client = await this.engine(signal, apiVersion);
@@ -226,16 +276,25 @@ let HostDockerService = class HostDockerService {
226
276
  const client = await this.engine(signal, apiVersion);
227
277
  const old = await (0, docker_engine_client_1.optionalDockerJson)(client, `/networks/${encodeURIComponent(input.name)}`, signal);
228
278
  if (old) {
229
- this.requireOwner(old.Labels, input.projectId, true);
279
+ if (!input.shared)
280
+ this.requireOwner(old.Labels, input.projectId, true);
230
281
  return { Id: old.Id, created: false };
231
282
  }
283
+ if (input.ipam) {
284
+ const overlap = (0, docker_settings_1.overlappingIPv4Range)(input.ipam.Config.map((range) => range.Subnet), await this.routes(signal));
285
+ if (overlap)
286
+ throw new error_types_1.AppError(`Network ${input.name} home range overlaps VM on-link route ${overlap}. Change the network range on the PC, then connect again.`, 'DOCKER_NETWORK_ROUTE_OVERLAP', 409);
287
+ }
232
288
  const created = await client.json('POST', '/networks/create', {
233
289
  Name: input.name,
234
290
  Driver: 'bridge',
235
291
  Internal: input.internal,
236
292
  Attachable: input.attachable,
237
293
  Options: input.options,
238
- Labels: { ...input.labels, [host_docker_dto_1.DOCKER_PROJECT_LABEL]: input.projectId },
294
+ ...(input.ipam ? { IPAM: input.ipam } : {}),
295
+ Labels: input.shared
296
+ ? input.labels
297
+ : { ...input.labels, [host_docker_dto_1.DOCKER_PROJECT_LABEL]: input.projectId },
239
298
  }, { signal });
240
299
  return { Id: created.Id, created: true };
241
300
  }
@@ -268,14 +327,15 @@ let HostDockerService = class HostDockerService {
268
327
  .map((container) => ({ id: container.Id, labels: container.Labels ?? {} })),
269
328
  };
270
329
  }
271
- async remove(kind, id, projectId, signal, apiVersion) {
330
+ async remove(kind, id, projectId, signal, apiVersion, projectRoot) {
331
+ await this.validateProjectRoot(projectRoot);
272
332
  const client = await this.engine(signal, apiVersion);
273
333
  const resource = await client.json('GET', `/${kind}/${encodeURIComponent(id)}${kind === 'containers' ? '/json' : ''}`, undefined, { signal });
274
334
  const labels = kind === 'containers' ? resource.Config.Labels : resource.Labels;
275
335
  if (labels?.[host_docker_dto_1.DOCKER_PROJECT_LABEL] !== projectId) {
276
336
  if (kind !== 'containers' ||
277
- labels?.[host_docker_dto_1.DOCKER_PROJECT_LABEL] ||
278
- !(await this.composeHolder(client, resource, projectId, signal)))
337
+ labels?.[host_docker_dto_1.DOCKER_PROJECT_LABEL] !== undefined ||
338
+ !(await this.composeHolder(client, resource, projectId, signal, projectRoot)))
279
339
  this.requireOwner(labels, projectId);
280
340
  }
281
341
  const exactId = kind === 'volumes' ? id : resource.Id;
@@ -292,38 +352,11 @@ let HostDockerService = class HostDockerService {
292
352
  const helper = await this.archives.create(client, input.image, [layout.mount], signal);
293
353
  const hash = (0, node_crypto_1.createHash)('sha256');
294
354
  let bytes = 0;
295
- const toEngine = new node_stream_1.PassThrough();
296
- const received = (async () => {
297
- for await (const chunk of body) {
355
+ try {
356
+ await uploadToEngine(body, (toEngine) => (0, docker_archive_1.writeDockerArchive)(client, helper.id, toEngine, signal, layout.writePath), (chunk) => {
298
357
  hash.update(chunk);
299
358
  bytes += chunk.length;
300
- if (toEngine.destroyed || toEngine.writableEnded)
301
- continue;
302
- if (!toEngine.write(chunk))
303
- await new Promise((done) => {
304
- const settle = () => {
305
- toEngine.off('drain', settle).off('close', settle);
306
- done();
307
- };
308
- toEngine.on('drain', settle).on('close', settle);
309
- });
310
- }
311
- if (!toEngine.destroyed)
312
- toEngine.end();
313
- })();
314
- try {
315
- await Promise.all([
316
- received,
317
- (0, docker_archive_1.writeDockerArchive)(client, helper.id, toEngine, signal, layout.writePath).catch((error) => {
318
- body.destroy();
319
- throw error;
320
- }),
321
- ]);
322
- }
323
- catch (error) {
324
- toEngine.destroy();
325
- await received.catch(() => undefined);
326
- throw error;
359
+ });
327
360
  }
328
361
  finally {
329
362
  await this.archives.cleanup(client, helper);
@@ -331,18 +364,13 @@ let HostDockerService = class HostDockerService {
331
364
  return { sha256: hash.digest('hex'), bytes };
332
365
  }
333
366
  async prepareBinds(input, signal, apiVersion) {
334
- const home = (0, node_os_1.homedir)();
335
- const canonicalHome = await (0, promises_1.realpath)(home);
336
367
  for (const { path, replace, image, file } of input.paths) {
337
368
  signal?.throwIfAborted();
338
- if (path === home || !inside(path, home))
339
- throw new error_types_1.AppError('Bind paths must be under the VM home', 'DOCKER_BIND_OUTSIDE_HOME', 403);
340
- const existing = await nearestExisting(path);
341
- const resolved = await (0, promises_1.realpath)(existing);
342
- if (!inside(resolved, canonicalHome))
343
- throw new error_types_1.AppError('Bind paths must be under the VM home', 'DOCKER_BIND_OUTSIDE_HOME', 403);
344
- if (existing === path && (await (0, promises_1.lstat)(path)).isSymbolicLink())
345
- throw new error_types_1.AppError('Bind paths must not be links', 'DOCKER_BIND_OUTSIDE_HOME', 403);
369
+ const { existing, resolved } = await (0, vm_home_path_1.assertVmHomePath)(path, {
370
+ code: 'DOCKER_BIND_OUTSIDE_HOME',
371
+ message: 'Bind paths must be under the VM home',
372
+ linkMessage: 'Bind paths must not be links',
373
+ });
346
374
  if (file) {
347
375
  await (0, promises_1.mkdir)((0, node_path_1.dirname)(path), { recursive: true });
348
376
  continue;
@@ -382,15 +410,14 @@ let HostDockerService = class HostDockerService {
382
410
  }
383
411
  return { stopped };
384
412
  }
385
- async stopContainer(id, projectId, signal, apiVersion) {
413
+ async stopContainer(id, projectId, signal, apiVersion, projectRoot) {
414
+ await this.validateProjectRoot(projectRoot);
386
415
  const client = await this.engine(signal, apiVersion);
387
416
  const container = await client.json('GET', `/containers/${encodeURIComponent(id)}/json`, undefined, { signal });
388
417
  const labels = container.Config.Labels ?? {};
389
418
  if (labels[host_docker_dto_1.DOCKER_PROJECT_LABEL] !== projectId) {
390
- const compose = labels[host_docker_dto_1.COMPOSE_PROJECT_LABEL];
391
- const owned = !labels[host_docker_dto_1.DOCKER_PROJECT_LABEL] &&
392
- compose !== undefined &&
393
- (await this.composeOwnsProjectVolume(client, compose, projectId, signal));
419
+ const owned = labels[host_docker_dto_1.DOCKER_PROJECT_LABEL] === undefined &&
420
+ (await this.composeOwnsProjectVolume(client, labels, projectId, signal, projectRoot));
394
421
  if (!owned)
395
422
  this.requireOwner(labels, projectId);
396
423
  }
@@ -423,16 +450,42 @@ let HostDockerService = class HostDockerService {
423
450
  })();
424
451
  return output;
425
452
  }
453
+ async validateProjectRoot(root) {
454
+ if (root === undefined)
455
+ return;
456
+ const code = 'DOCKER_PROJECT_ROOT_INVALID';
457
+ if (!(0, node_path_1.isAbsolute)(root) || (0, node_path_1.normalize)(root) !== root || root.includes('\0'))
458
+ throw new error_types_1.AppError('Project root must be an absolute, normalized path', code, 400);
459
+ try {
460
+ await (0, vm_home_path_1.assertVmHomePath)(root, {
461
+ code,
462
+ message: 'Project root must be below the VM home and cannot be the home itself',
463
+ linkMessage: 'Project root must not be a link',
464
+ });
465
+ }
466
+ catch (error) {
467
+ if (error instanceof error_types_1.AppError)
468
+ throw new error_types_1.AppError(error.message, code, 400);
469
+ throw error;
470
+ }
471
+ }
426
472
  requireOwner(labels, projectId, conflict = false) {
427
473
  if (labels?.[host_docker_dto_1.DOCKER_PROJECT_LABEL] !== projectId)
428
474
  throw new error_types_1.AppError('Docker resource is not owned by this imported project', 'DOCKER_OWNERSHIP_REQUIRED', conflict ? 409 : 403);
429
475
  }
430
- async composeOwnsProjectVolume(client, compose, projectId, signal) {
476
+ async composeOwnsProjectVolume(client, labels, projectId, signal, projectRoot) {
477
+ if (projectRoot && (0, docker_project_compose_1.projectCompose)(labels, projectRoot, projectId))
478
+ return true;
479
+ const compose = labels[host_docker_dto_1.COMPOSE_PROJECT_LABEL];
480
+ if (!compose)
481
+ return false;
431
482
  const { Volumes } = await client.json('GET', `/volumes?filters=${encodeURIComponent(JSON.stringify({ label: [`${host_docker_dto_1.DOCKER_PROJECT_LABEL}=${projectId}`] }))}`, undefined, { signal });
432
483
  return (Volumes?.some((volume) => volume.Labels?.[host_docker_dto_1.DOCKER_PROJECT_LABEL] === projectId &&
433
484
  volume.Labels?.[host_docker_dto_1.COMPOSE_PROJECT_LABEL] === compose) ?? false);
434
485
  }
435
- async composeHolder(client, container, projectId, signal) {
486
+ async composeHolder(client, container, projectId, signal, projectRoot) {
487
+ if (projectRoot && (0, docker_project_compose_1.projectCompose)(container.Config.Labels ?? {}, projectRoot, projectId))
488
+ return true;
436
489
  const compose = container.Config.Labels?.[host_docker_dto_1.COMPOSE_PROJECT_LABEL];
437
490
  if (!compose)
438
491
  return false;
@@ -459,7 +512,7 @@ let HostDockerService = class HostDockerService {
459
512
  (0, promises_1.realpath)((0, node_os_1.homedir)()),
460
513
  (0, promises_1.realpath)(file ? (0, node_path_1.dirname)(requested) : requested),
461
514
  ]);
462
- if (!inside(resolved, home))
515
+ if (!(0, vm_home_path_1.inside)(resolved, home))
463
516
  throw new Error();
464
517
  return file ? (0, node_path_1.join)(resolved, (0, node_path_1.basename)(requested)) : resolved;
465
518
  }
@@ -471,21 +524,43 @@ let HostDockerService = class HostDockerService {
471
524
  exports.HostDockerService = HostDockerService;
472
525
  exports.HostDockerService = HostDockerService = __decorate([
473
526
  (0, common_1.Injectable)(),
474
- __metadata("design:paramtypes", [docker_archive_journal_1.DockerArchiveJournal])
527
+ __param(1, (0, common_1.Optional)()),
528
+ __param(1, (0, common_1.Inject)(host_ipv4_routes_1.HOST_IPV4_ROUTES)),
529
+ __metadata("design:paramtypes", [docker_archive_journal_1.DockerArchiveJournal, Function])
475
530
  ], HostDockerService);
476
- function inside(path, root) {
477
- return path === root || path.startsWith(root + node_path_1.sep);
478
- }
479
- async function nearestExisting(path, stop) {
480
- for (let candidate = path;; candidate = (0, node_path_1.dirname)(candidate)) {
481
- try {
482
- await (0, promises_1.lstat)(candidate);
483
- return candidate;
531
+ async function uploadToEngine(body, send, onChunk) {
532
+ const toEngine = new node_stream_1.PassThrough();
533
+ const received = (async () => {
534
+ for await (const chunk of body) {
535
+ onChunk?.(chunk);
536
+ if (toEngine.destroyed || toEngine.writableEnded)
537
+ continue;
538
+ if (!toEngine.write(chunk))
539
+ await new Promise((done) => {
540
+ const settle = () => {
541
+ toEngine.off('drain', settle).off('close', settle);
542
+ done();
543
+ };
544
+ toEngine.on('drain', settle).on('close', settle);
545
+ });
484
546
  }
485
- catch (error) {
486
- if (error.code !== 'ENOENT' || candidate === stop)
547
+ if (!toEngine.destroyed)
548
+ toEngine.end();
549
+ })();
550
+ try {
551
+ const [answer] = await Promise.all([
552
+ send(toEngine).catch((error) => {
553
+ body.destroy();
487
554
  throw error;
488
- }
555
+ }),
556
+ received,
557
+ ]);
558
+ return answer;
559
+ }
560
+ catch (error) {
561
+ toEngine.destroy();
562
+ await received.catch(() => undefined);
563
+ throw error;
489
564
  }
490
565
  }
491
566
  //# sourceMappingURL=host-docker.service.js.map