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.
- package/README.md +1 -4
- package/dist/build-info.json +2 -2
- package/dist/cli.js +66 -11
- package/dist/host-install/devchain-host-bootstrap.tgz +0 -0
- package/dist/host-install/pins.json +31 -2
- package/dist/lib/exclusive-run.js +51 -3
- package/dist/lib/git-owner.js +284 -0
- package/dist/lib/host-install.js +19 -151
- package/dist/lib/local-api.js +175 -0
- package/dist/server/common/config/env.config.d.ts +3 -0
- package/dist/server/common/config/env.config.js +1 -0
- package/dist/server/common/config/env.config.js.map +1 -1
- package/dist/server/common/config/host-image.json +3 -3
- package/dist/server/common/constants/syncthing-markers.d.ts +1 -0
- package/dist/server/common/constants/syncthing-markers.js +6 -1
- package/dist/server/common/constants/syncthing-markers.js.map +1 -1
- package/dist/server/common/filesystem/vm-home-path.d.ts +11 -0
- package/dist/server/common/filesystem/vm-home-path.js +48 -0
- package/dist/server/common/filesystem/vm-home-path.js.map +1 -0
- package/dist/server/common/process-ids-env.d.ts +1 -0
- package/dist/server/common/process-ids-env.js +13 -0
- package/dist/server/common/process-ids-env.js.map +1 -0
- package/dist/server/common/test/api-test-app.d.ts +12 -0
- package/dist/server/common/test/api-test-app.js +76 -0
- package/dist/server/common/test/api-test-app.js.map +1 -0
- package/dist/server/common/test/app-bootstrap.helper.js +8 -1
- package/dist/server/common/test/app-bootstrap.helper.js.map +1 -1
- package/dist/server/common/test/fake-bootstrap.server.js +3 -2
- package/dist/server/common/test/fake-bootstrap.server.js.map +1 -1
- package/dist/server/common/test/fake-docker-engine.server.d.ts +24 -6
- package/dist/server/common/test/fake-docker-engine.server.js +123 -25
- package/dist/server/common/test/fake-docker-engine.server.js.map +1 -1
- package/dist/server/common/test/fake-proxmox.server.js +4 -4
- package/dist/server/common/test/fake-ssh.server.js +6 -6
- package/dist/server/common/test/fake-ssh.server.js.map +1 -1
- package/dist/server/common/test/test-database.helper.d.ts +6 -0
- package/dist/server/common/test/test-database.helper.js +29 -0
- package/dist/server/common/test/test-database.helper.js.map +1 -0
- package/dist/server/modules/cloud-tunnel/services/mobile-chat-rpc.service.d.ts +1 -0
- package/dist/server/modules/cloud-tunnel/services/mobile-chat-rpc.service.js +9 -3
- package/dist/server/modules/cloud-tunnel/services/mobile-chat-rpc.service.js.map +1 -1
- package/dist/server/modules/cloud-tunnel/services/mobile-transcript-projection.d.ts +6 -0
- package/dist/server/modules/cloud-tunnel/services/mobile-transcript-projection.js +88 -0
- package/dist/server/modules/cloud-tunnel/services/mobile-transcript-projection.js.map +1 -0
- package/dist/server/modules/cloud-tunnel/services/tunnel-event-forwarder.service.js +7 -1
- package/dist/server/modules/cloud-tunnel/services/tunnel-event-forwarder.service.js.map +1 -1
- package/dist/server/modules/core/controllers/docker-archive.d.ts +9 -2
- package/dist/server/modules/core/controllers/docker-archive.js +22 -6
- package/dist/server/modules/core/controllers/docker-archive.js.map +1 -1
- package/dist/server/modules/core/controllers/docker-engine.client.d.ts +2 -1
- package/dist/server/modules/core/controllers/docker-engine.client.js +57 -4
- package/dist/server/modules/core/controllers/docker-engine.client.js.map +1 -1
- package/dist/server/modules/core/controllers/docker-image-metadata.d.ts +248 -0
- package/dist/server/modules/core/controllers/docker-image-metadata.js +161 -0
- package/dist/server/modules/core/controllers/docker-image-metadata.js.map +1 -0
- package/dist/server/modules/core/controllers/docker-settings.d.ts +13 -2
- package/dist/server/modules/core/controllers/docker-settings.js +49 -11
- package/dist/server/modules/core/controllers/docker-settings.js.map +1 -1
- package/dist/server/modules/core/controllers/host-user-identity.d.ts +34 -0
- package/dist/server/modules/core/controllers/host-user-identity.js +23 -0
- package/dist/server/modules/core/controllers/host-user-identity.js.map +1 -0
- package/dist/server/modules/core/controllers/runtime.controller.d.ts +11 -4
- package/dist/server/modules/core/controllers/runtime.controller.js +2 -0
- package/dist/server/modules/core/controllers/runtime.controller.js.map +1 -1
- package/dist/server/modules/file-sync/build-exclusion-suggestions.d.ts +15 -0
- package/dist/server/modules/file-sync/build-exclusion-suggestions.js +402 -0
- package/dist/server/modules/file-sync/build-exclusion-suggestions.js.map +1 -0
- package/dist/server/modules/file-sync/file-sync-auto-fix.dto.d.ts +102 -0
- package/dist/server/modules/file-sync/file-sync-auto-fix.dto.js +22 -0
- package/dist/server/modules/file-sync/file-sync-auto-fix.dto.js.map +1 -0
- package/dist/server/modules/file-sync/file-sync-auto-fix.store.d.ts +12 -0
- package/dist/server/modules/file-sync/file-sync-auto-fix.store.js +73 -0
- package/dist/server/modules/file-sync/file-sync-auto-fix.store.js.map +1 -0
- package/dist/server/modules/file-sync/file-sync-conflicts.d.ts +3 -0
- package/dist/server/modules/file-sync/file-sync-conflicts.js +191 -0
- package/dist/server/modules/file-sync/file-sync-conflicts.js.map +1 -0
- package/dist/server/modules/file-sync/file-sync-ignores.store.d.ts +5 -1
- package/dist/server/modules/file-sync/file-sync-ignores.store.js +39 -8
- package/dist/server/modules/file-sync/file-sync-ignores.store.js.map +1 -1
- package/dist/server/modules/file-sync/file-sync.controller.d.ts +1 -3
- package/dist/server/modules/file-sync/file-sync.controller.js +5 -14
- package/dist/server/modules/file-sync/file-sync.controller.js.map +1 -1
- package/dist/server/modules/file-sync/file-sync.dto.d.ts +220 -1
- package/dist/server/modules/file-sync/file-sync.dto.js +70 -4
- package/dist/server/modules/file-sync/file-sync.dto.js.map +1 -1
- package/dist/server/modules/file-sync/file-sync.module.js +16 -1
- package/dist/server/modules/file-sync/file-sync.module.js.map +1 -1
- package/dist/server/modules/file-sync/file-sync.service.d.ts +20 -5
- package/dist/server/modules/file-sync/file-sync.service.js +173 -37
- package/dist/server/modules/file-sync/file-sync.service.js.map +1 -1
- package/dist/server/modules/file-sync/git-guard.dto.d.ts +61 -0
- package/dist/server/modules/file-sync/git-guard.dto.js +26 -0
- package/dist/server/modules/file-sync/git-guard.dto.js.map +1 -0
- package/dist/server/modules/file-sync/home-git-guard.service.d.ts +4 -2
- package/dist/server/modules/file-sync/home-git-guard.service.js +50 -25
- package/dist/server/modules/file-sync/home-git-guard.service.js.map +1 -1
- package/dist/server/modules/file-sync/host-git-guard.controller.d.ts +10 -0
- package/dist/server/modules/file-sync/host-git-guard.controller.js +64 -0
- package/dist/server/modules/file-sync/host-git-guard.controller.js.map +1 -0
- package/dist/server/modules/file-sync/host-git-index.controller.d.ts +9 -0
- package/dist/server/modules/file-sync/host-git-index.controller.js +67 -0
- package/dist/server/modules/file-sync/host-git-index.controller.js.map +1 -0
- package/dist/server/modules/file-sync/host-sync.controller.d.ts +15 -2
- package/dist/server/modules/file-sync/host-sync.controller.js +122 -14
- package/dist/server/modules/file-sync/host-sync.controller.js.map +1 -1
- package/dist/server/modules/file-sync/ignore-pattern-matcher.d.ts +30 -0
- package/dist/server/modules/file-sync/ignore-pattern-matcher.js +183 -0
- package/dist/server/modules/file-sync/ignore-pattern-matcher.js.map +1 -0
- package/dist/server/modules/file-sync/project-repository.d.ts +2 -0
- package/dist/server/modules/file-sync/project-repository.js +20 -0
- package/dist/server/modules/file-sync/project-repository.js.map +1 -0
- package/dist/server/modules/file-sync/sync-chown.dto.d.ts +99 -0
- package/dist/server/modules/file-sync/sync-chown.dto.js +46 -0
- package/dist/server/modules/file-sync/sync-chown.dto.js.map +1 -0
- package/dist/server/modules/file-sync/sync-chown.service.d.ts +12 -0
- package/dist/server/modules/file-sync/sync-chown.service.js +230 -0
- package/dist/server/modules/file-sync/sync-chown.service.js.map +1 -0
- package/dist/server/modules/file-sync/sync-path-inspection.dto.d.ts +626 -0
- package/dist/server/modules/file-sync/sync-path-inspection.dto.js +108 -0
- package/dist/server/modules/file-sync/sync-path-inspection.dto.js.map +1 -0
- package/dist/server/modules/file-sync/sync-path-inspector.d.ts +12 -0
- package/dist/server/modules/file-sync/sync-path-inspector.js +413 -0
- package/dist/server/modules/file-sync/sync-path-inspector.js.map +1 -0
- package/dist/server/modules/file-sync/syncthing-rest.client.d.ts +1 -1
- package/dist/server/modules/file-sync/syncthing-rest.client.js +9 -4
- package/dist/server/modules/file-sync/syncthing-rest.client.js.map +1 -1
- package/dist/server/modules/file-sync/testing/fake-file-sync.service.d.ts +28 -5
- package/dist/server/modules/file-sync/testing/fake-file-sync.service.js +68 -5
- package/dist/server/modules/file-sync/testing/fake-file-sync.service.js.map +1 -1
- package/dist/server/modules/file-sync/translate-git-ignore-rule.d.ts +3 -0
- package/dist/server/modules/file-sync/translate-git-ignore-rule.js +30 -0
- package/dist/server/modules/file-sync/translate-git-ignore-rule.js.map +1 -0
- package/dist/server/modules/hooks/dtos/hook-event.dto.d.ts +86 -0
- package/dist/server/modules/hooks/dtos/hook-event.dto.js +15 -1
- package/dist/server/modules/hooks/dtos/hook-event.dto.js.map +1 -1
- package/dist/server/modules/hooks/services/hooks-config.service.js +29 -0
- package/dist/server/modules/hooks/services/hooks-config.service.js.map +1 -1
- package/dist/server/modules/hooks/services/hooks.service.d.ts +5 -1
- package/dist/server/modules/hooks/services/hooks.service.js +27 -5
- package/dist/server/modules/hooks/services/hooks.service.js.map +1 -1
- package/dist/server/modules/hooks/services/pending-ask-user-question.service.d.ts +2 -2
- package/dist/server/modules/hooks/services/pending-ask-user-question.service.js +9 -12
- package/dist/server/modules/hooks/services/pending-ask-user-question.service.js.map +1 -1
- package/dist/server/modules/mcp/services/handlers/skill-tools.js +2 -2
- package/dist/server/modules/mcp/services/handlers/skill-tools.js.map +1 -1
- package/dist/server/modules/metrics/services/metrics.service.js +1 -1
- package/dist/server/modules/metrics/services/metrics.service.js.map +1 -1
- package/dist/server/modules/providers/adapters/claude.adapter.d.ts +3 -1
- package/dist/server/modules/providers/adapters/claude.adapter.js +4 -1
- package/dist/server/modules/providers/adapters/claude.adapter.js.map +1 -1
- package/dist/server/modules/remotes/connect-choices.controller.d.ts +9 -0
- package/dist/server/modules/remotes/connect-choices.controller.js +54 -0
- package/dist/server/modules/remotes/connect-choices.controller.js.map +1 -0
- package/dist/server/modules/remotes/connect-choices.dto.d.ts +52 -0
- package/dist/server/modules/remotes/connect-choices.dto.js +19 -0
- package/dist/server/modules/remotes/connect-choices.dto.js.map +1 -0
- package/dist/server/modules/remotes/connect-choices.store.d.ts +12 -0
- package/dist/server/modules/remotes/connect-choices.store.js +95 -0
- package/dist/server/modules/remotes/connect-choices.store.js.map +1 -0
- package/dist/server/modules/remotes/controllers/remotes.controller.d.ts +3 -0
- package/dist/server/modules/remotes/controllers/remotes.controller.js +9 -1
- package/dist/server/modules/remotes/controllers/remotes.controller.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-copy-back.d.ts +1 -0
- package/dist/server/modules/remotes/docker/docker-copy-back.js +70 -31
- package/dist/server/modules/remotes/docker/docker-copy-back.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-handoff.d.ts +5 -3
- package/dist/server/modules/remotes/docker/docker-handoff.js +221 -53
- package/dist/server/modules/remotes/docker/docker-handoff.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-handoff.store.d.ts +5 -0
- package/dist/server/modules/remotes/docker/docker-handoff.store.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-plan-fit.d.ts +4 -1
- package/dist/server/modules/remotes/docker/docker-plan-fit.js +19 -6
- package/dist/server/modules/remotes/docker/docker-plan-fit.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-plan-policy.d.ts +6 -2
- package/dist/server/modules/remotes/docker/docker-plan-policy.js +191 -38
- package/dist/server/modules/remotes/docker/docker-plan-policy.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-plan-source.service.d.ts +55 -6
- package/dist/server/modules/remotes/docker/docker-plan-source.service.js +284 -52
- package/dist/server/modules/remotes/docker/docker-plan-source.service.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-plan.controller.d.ts +2 -1
- package/dist/server/modules/remotes/docker/docker-plan.controller.js +15 -1
- package/dist/server/modules/remotes/docker/docker-plan.controller.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-plan.dto.d.ts +47 -1
- package/dist/server/modules/remotes/docker/docker-plan.dto.js +1 -0
- package/dist/server/modules/remotes/docker/docker-plan.dto.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-plan.service.d.ts +15 -6
- package/dist/server/modules/remotes/docker/docker-plan.service.js +83 -20
- package/dist/server/modules/remotes/docker/docker-plan.service.js.map +1 -1
- package/dist/server/modules/remotes/docker/docker-project-compose.d.ts +7 -0
- package/dist/server/modules/remotes/docker/docker-project-compose.js +30 -0
- package/dist/server/modules/remotes/docker/docker-project-compose.js.map +1 -0
- package/dist/server/modules/remotes/dtos/remote.dto.d.ts +2 -0
- package/dist/server/modules/remotes/dtos/remote.dto.js.map +1 -1
- package/dist/server/modules/remotes/git-owner.store.d.ts +13 -0
- package/dist/server/modules/remotes/git-owner.store.js +69 -0
- package/dist/server/modules/remotes/git-owner.store.js.map +1 -0
- package/dist/server/modules/remotes/host/host-docker.controller.d.ts +14 -1
- package/dist/server/modules/remotes/host/host-docker.controller.js +28 -9
- package/dist/server/modules/remotes/host/host-docker.controller.js.map +1 -1
- package/dist/server/modules/remotes/host/host-docker.dto.d.ts +640 -3
- package/dist/server/modules/remotes/host/host-docker.dto.js +66 -9
- package/dist/server/modules/remotes/host/host-docker.dto.js.map +1 -1
- package/dist/server/modules/remotes/host/host-docker.service.d.ts +18 -6
- package/dist/server/modules/remotes/host/host-docker.service.js +184 -81
- package/dist/server/modules/remotes/host/host-docker.service.js.map +1 -1
- package/dist/server/modules/remotes/host/host-ipv4-routes.d.ts +4 -0
- package/dist/server/modules/remotes/host/host-ipv4-routes.js +43 -0
- package/dist/server/modules/remotes/host/host-ipv4-routes.js.map +1 -0
- package/dist/server/modules/remotes/host-image.d.ts +1 -1
- package/dist/server/modules/remotes/host-image.js +1 -1
- package/dist/server/modules/remotes/host-install/host-install-block.d.ts +1 -0
- package/dist/server/modules/remotes/host-install/host-install-block.js +76 -2
- package/dist/server/modules/remotes/host-install/host-install-block.js.map +1 -1
- package/dist/server/modules/remotes/host-install/host-install.service.d.ts +0 -1
- package/dist/server/modules/remotes/host-install/host-install.service.js +9 -26
- package/dist/server/modules/remotes/host-install/host-install.service.js.map +1 -1
- package/dist/server/modules/remotes/operations/attach.operation.d.ts +5 -1
- package/dist/server/modules/remotes/operations/attach.operation.js +41 -5
- package/dist/server/modules/remotes/operations/attach.operation.js.map +1 -1
- package/dist/server/modules/remotes/operations/claim.operation.d.ts +1 -0
- package/dist/server/modules/remotes/operations/claim.operation.js +6 -1
- package/dist/server/modules/remotes/operations/claim.operation.js.map +1 -1
- package/dist/server/modules/remotes/operations/detach.operation.d.ts +4 -1
- package/dist/server/modules/remotes/operations/detach.operation.js +10 -2
- package/dist/server/modules/remotes/operations/detach.operation.js.map +1 -1
- package/dist/server/modules/remotes/operations/docker-import-inventory.store.d.ts +10 -0
- package/dist/server/modules/remotes/operations/docker-import-inventory.store.js +17 -0
- package/dist/server/modules/remotes/operations/docker-import-inventory.store.js.map +1 -1
- package/dist/server/modules/remotes/operations/file-sync-handoff.d.ts +30 -2
- package/dist/server/modules/remotes/operations/file-sync-handoff.js +498 -57
- package/dist/server/modules/remotes/operations/file-sync-handoff.js.map +1 -1
- package/dist/server/modules/remotes/operations/force-sync.operation.d.ts +39 -0
- package/dist/server/modules/remotes/operations/force-sync.operation.js +177 -0
- package/dist/server/modules/remotes/operations/force-sync.operation.js.map +1 -0
- package/dist/server/modules/remotes/operations/git-owner.dto.d.ts +83 -0
- package/dist/server/modules/remotes/operations/git-owner.dto.js +25 -0
- package/dist/server/modules/remotes/operations/git-owner.dto.js.map +1 -0
- package/dist/server/modules/remotes/operations/git-owner.operation.d.ts +35 -0
- package/dist/server/modules/remotes/operations/git-owner.operation.js +216 -0
- package/dist/server/modules/remotes/operations/git-owner.operation.js.map +1 -0
- package/dist/server/modules/remotes/operations/remote-host.client.d.ts +72 -8
- package/dist/server/modules/remotes/operations/remote-host.client.js +162 -28
- package/dist/server/modules/remotes/operations/remote-host.client.js.map +1 -1
- package/dist/server/modules/remotes/operations/remote-operation.dto.d.ts +19 -0
- package/dist/server/modules/remotes/operations/remote-operation.dto.js +5 -1
- package/dist/server/modules/remotes/operations/remote-operation.dto.js.map +1 -1
- package/dist/server/modules/remotes/operations/remote-operation.runner.d.ts +3 -1
- package/dist/server/modules/remotes/operations/remote-operation.runner.js +59 -21
- package/dist/server/modules/remotes/operations/remote-operation.runner.js.map +1 -1
- package/dist/server/modules/remotes/operations/remote-operation.types.d.ts +4 -1
- package/dist/server/modules/remotes/operations/remote-operation.types.js +4 -2
- package/dist/server/modules/remotes/operations/remote-operation.types.js.map +1 -1
- package/dist/server/modules/remotes/operations/remote-operations.controller.d.ts +5 -0
- package/dist/server/modules/remotes/operations/remote-operations.controller.js +56 -0
- package/dist/server/modules/remotes/operations/remote-operations.controller.js.map +1 -1
- package/dist/server/modules/remotes/operations/remote-operations.service.d.ts +16 -1
- package/dist/server/modules/remotes/operations/remote-operations.service.js +155 -5
- package/dist/server/modules/remotes/operations/remote-operations.service.js.map +1 -1
- package/dist/server/modules/remotes/operations/update-logins.operation.d.ts +1 -3
- package/dist/server/modules/remotes/operations/update-logins.operation.js +3 -18
- package/dist/server/modules/remotes/operations/update-logins.operation.js.map +1 -1
- package/dist/server/modules/remotes/ports/remote-health.port.d.ts +2 -0
- package/dist/server/modules/remotes/ports/remote-health.port.js.map +1 -1
- package/dist/server/modules/remotes/remotes.module.js +18 -0
- package/dist/server/modules/remotes/remotes.module.js.map +1 -1
- package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.d.ts +2 -2
- package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.js +2 -13
- package/dist/server/modules/remotes/replica/__fixtures__/replica-seed.js.map +1 -1
- package/dist/server/modules/remotes/services/remote-health.service.js +5 -0
- package/dist/server/modules/remotes/services/remote-health.service.js.map +1 -1
- package/dist/server/modules/remotes/sync/file-sync-failures.service.d.ts +18 -0
- package/dist/server/modules/remotes/sync/file-sync-failures.service.js +157 -0
- package/dist/server/modules/remotes/sync/file-sync-failures.service.js.map +1 -0
- package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.d.ts +14 -0
- package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.js +99 -0
- package/dist/server/modules/remotes/sync/file-sync-pattern-preview.service.js.map +1 -0
- package/dist/server/modules/remotes/sync/file-sync-suggestions.service.d.ts +15 -0
- package/dist/server/modules/remotes/sync/file-sync-suggestions.service.js +90 -0
- package/dist/server/modules/remotes/sync/file-sync-suggestions.service.js.map +1 -0
- package/dist/server/modules/remotes/sync/project-file-sync.controller.d.ts +29 -0
- package/dist/server/modules/remotes/sync/project-file-sync.controller.js +160 -0
- package/dist/server/modules/remotes/sync/project-file-sync.controller.js.map +1 -0
- package/dist/server/modules/remotes/sync/remote-file-sync.dto.d.ts +72 -0
- package/dist/server/modules/remotes/sync/remote-file-sync.dto.js +16 -0
- package/dist/server/modules/remotes/sync/remote-file-sync.dto.js.map +1 -0
- package/dist/server/modules/remotes/sync/remote-file-sync.service.d.ts +32 -1
- package/dist/server/modules/remotes/sync/remote-file-sync.service.js +499 -38
- package/dist/server/modules/remotes/sync/remote-file-sync.service.js.map +1 -1
- package/dist/server/modules/remotes/sync/remote-live-sync.service.d.ts +2 -0
- package/dist/server/modules/remotes/sync/remote-live-sync.service.js +26 -12
- package/dist/server/modules/remotes/sync/remote-live-sync.service.js.map +1 -1
- package/dist/server/modules/remotes/vm-user-identity.d.ts +29 -0
- package/dist/server/modules/remotes/vm-user-identity.js +45 -0
- package/dist/server/modules/remotes/vm-user-identity.js.map +1 -0
- package/dist/server/modules/runtime-context-capture/codex-plugin-profile-materializer.service.js +5 -1
- package/dist/server/modules/runtime-context-capture/codex-plugin-profile-materializer.service.js.map +1 -1
- package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.d.ts +5 -0
- package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.js +9 -0
- package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.js.map +1 -1
- package/dist/server/modules/session-reader/adapters/session-reader-adapter.interface.d.ts +1 -0
- package/dist/server/modules/session-reader/adapters/utils/coalesce-turns.js +1 -0
- package/dist/server/modules/session-reader/adapters/utils/coalesce-turns.js.map +1 -1
- package/dist/server/modules/session-reader/builders/semantic-step-extractor.js +1 -1
- package/dist/server/modules/session-reader/builders/semantic-step-extractor.js.map +1 -1
- package/dist/server/modules/session-reader/controllers/session-reader.controller.js +1 -1
- package/dist/server/modules/session-reader/controllers/session-reader.controller.js.map +1 -1
- package/dist/server/modules/session-reader/data/pricing.json +89 -12
- package/dist/server/modules/session-reader/dtos/unified-message.types.d.ts +1 -0
- package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.d.ts +3 -0
- package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.js +10 -1
- package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.js.map +1 -1
- package/dist/server/modules/session-reader/parsers/claude-turn-evidence.d.ts +11 -0
- package/dist/server/modules/session-reader/parsers/claude-turn-evidence.js +50 -0
- package/dist/server/modules/session-reader/parsers/claude-turn-evidence.js.map +1 -0
- package/dist/server/modules/session-reader/parsers/codex-jsonl.parser.js +8 -2
- package/dist/server/modules/session-reader/parsers/codex-jsonl.parser.js.map +1 -1
- package/dist/server/modules/session-reader/services/bounded-anchor-proof.d.ts +7 -0
- package/dist/server/modules/session-reader/services/bounded-anchor-proof.js +31 -2
- package/dist/server/modules/session-reader/services/bounded-anchor-proof.js.map +1 -1
- package/dist/server/modules/session-reader/services/session-cache.service.d.ts +8 -2
- package/dist/server/modules/session-reader/services/session-cache.service.js +80 -21
- package/dist/server/modules/session-reader/services/session-cache.service.js.map +1 -1
- package/dist/server/modules/session-reader/services/session-reader.service.d.ts +4 -0
- package/dist/server/modules/session-reader/services/session-reader.service.js +40 -8
- package/dist/server/modules/session-reader/services/session-reader.service.js.map +1 -1
- package/dist/server/modules/session-reader/services/transcript-cursor.d.ts +16 -4
- package/dist/server/modules/session-reader/services/transcript-cursor.js +65 -6
- package/dist/server/modules/session-reader/services/transcript-cursor.js.map +1 -1
- package/dist/server/modules/session-reader/services/transcript-serialization.js +2 -1
- package/dist/server/modules/session-reader/services/transcript-serialization.js.map +1 -1
- package/dist/server/modules/session-reader/services/transcript-turn-state.d.ts +4 -0
- package/dist/server/modules/session-reader/services/transcript-turn-state.js +20 -0
- package/dist/server/modules/session-reader/services/transcript-turn-state.js.map +1 -0
- package/dist/server/modules/session-reader/services/transcript-watcher.service.d.ts +4 -1
- package/dist/server/modules/session-reader/services/transcript-watcher.service.js +43 -18
- package/dist/server/modules/session-reader/services/transcript-watcher.service.js.map +1 -1
- package/dist/server/modules/sessions/services/provider-launch-config/provider-launch-config.service.js +5 -0
- package/dist/server/modules/sessions/services/provider-launch-config/provider-launch-config.service.js.map +1 -1
- package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.d.ts +36 -17
- package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.js +26 -9
- package/dist/server/modules/sessions/services/session-runtime/__test-utils__/pipeline-harness.js.map +1 -1
- package/dist/server/modules/sessions/services/session-runtime/ensure-mcp-readiness.d.ts +19 -0
- package/dist/server/modules/sessions/services/session-runtime/ensure-mcp-readiness.js +26 -0
- package/dist/server/modules/sessions/services/session-runtime/ensure-mcp-readiness.js.map +1 -0
- package/dist/server/modules/sessions/services/session-runtime/session-launch-pipeline.service.js +10 -18
- package/dist/server/modules/sessions/services/session-runtime/session-launch-pipeline.service.js.map +1 -1
- package/dist/server/modules/sessions/services/session-runtime/session-restore-pipeline.service.d.ts +5 -1
- package/dist/server/modules/sessions/services/session-runtime/session-restore-pipeline.service.js +20 -2
- package/dist/server/modules/sessions/services/session-runtime/session-restore-pipeline.service.js.map +1 -1
- package/dist/server/modules/settings/local/delegates/skills-settings.delegate.d.ts +6 -0
- package/dist/server/modules/settings/local/delegates/skills-settings.delegate.js +26 -0
- package/dist/server/modules/settings/local/delegates/skills-settings.delegate.js.map +1 -1
- package/dist/server/modules/settings/services/settings.service.d.ts +3 -1
- package/dist/server/modules/settings/services/settings.service.js +6 -0
- package/dist/server/modules/settings/services/settings.service.js.map +1 -1
- package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js +5 -5
- package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js.map +1 -1
- package/dist/server/modules/skills/adapters/github-directory-skill-source.adapter.js +5 -5
- package/dist/server/modules/skills/adapters/github-directory-skill-source.adapter.js.map +1 -1
- package/dist/server/modules/skills/adapters/github-skill-source.base.js +4 -3
- package/dist/server/modules/skills/adapters/github-skill-source.base.js.map +1 -1
- package/dist/server/modules/skills/adapters/local-skill-source.adapter.js +5 -5
- package/dist/server/modules/skills/adapters/local-skill-source.adapter.js.map +1 -1
- package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js +5 -5
- package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js.map +1 -1
- package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js +5 -5
- package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js.map +1 -1
- package/dist/server/modules/skills/adapters/skill-source.adapter.d.ts +5 -0
- package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.d.ts +5 -0
- package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.js +75 -0
- package/dist/server/modules/skills/adapters/skill-sync-temp-cleanup.js.map +1 -0
- package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js +5 -5
- package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js.map +1 -1
- package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js +5 -5
- package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js.map +1 -1
- package/dist/server/modules/skills/controllers/skills.controller.js +2 -2
- package/dist/server/modules/skills/controllers/skills.controller.js.map +1 -1
- package/dist/server/modules/skills/services/skill-source-lifecycle.service.d.ts +3 -3
- package/dist/server/modules/skills/services/skill-source-lifecycle.service.js +9 -4
- package/dist/server/modules/skills/services/skill-source-lifecycle.service.js.map +1 -1
- package/dist/server/modules/skills/services/skill-sync.service.d.ts +3 -3
- package/dist/server/modules/skills/services/skill-sync.service.js +32 -6
- package/dist/server/modules/skills/services/skill-sync.service.js.map +1 -1
- package/dist/server/modules/skills/services/skill-sync.types.d.ts +3 -0
- package/dist/server/modules/storage/db/schema.d.ts +2 -2
- package/dist/server/modules/storage/db/schema.js +2 -0
- package/dist/server/modules/storage/db/schema.js.map +1 -1
- package/dist/server/modules/storage/models/domain.models.d.ts +1 -1
- package/dist/server/modules/storage/models/domain.models.js +2 -0
- package/dist/server/modules/storage/models/domain.models.js.map +1 -1
- package/dist/server/modules/teams/storage/teams.store.d.ts +1 -0
- package/dist/server/modules/teams/storage/teams.store.js +19 -3
- package/dist/server/modules/teams/storage/teams.store.js.map +1 -1
- package/dist/server/modules/terminal/gateways/terminal.gateway.d.ts +3 -1
- package/dist/server/modules/terminal/gateways/terminal.gateway.js +9 -4
- package/dist/server/modules/terminal/gateways/terminal.gateway.js.map +1 -1
- package/dist/server/modules/terminal/services/session-turn-signals.d.ts +18 -0
- package/dist/server/modules/terminal/services/session-turn-signals.js +6 -0
- package/dist/server/modules/terminal/services/session-turn-signals.js.map +1 -0
- package/dist/server/modules/terminal/services/terminal-activity.service.d.ts +32 -5
- package/dist/server/modules/terminal/services/terminal-activity.service.js +322 -40
- package/dist/server/modules/terminal/services/terminal-activity.service.js.map +1 -1
- package/dist/server/modules/terminal/services/terminal-io/lifecycle.js +15 -3
- package/dist/server/modules/terminal/services/terminal-io/lifecycle.js.map +1 -1
- package/dist/server/modules/terminal/terminal.module.js +2 -0
- package/dist/server/modules/terminal/terminal.module.js.map +1 -1
- package/dist/server/modules/terminal/utils/ansi-sanitizer.d.ts +0 -1
- package/dist/server/modules/terminal/utils/ansi-sanitizer.js +0 -4
- package/dist/server/modules/terminal/utils/ansi-sanitizer.js.map +1 -1
- package/dist/server/templates/teams-dev.json +14 -14
- package/dist/server/test-setup-node.js +4 -3
- package/dist/server/test-setup-node.js.map +1 -1
- package/dist/server/test-setup.js +7 -0
- package/dist/server/test-setup.js.map +1 -1
- package/dist/server/tsconfig.tsbuildinfo +1 -1
- package/dist/server/ui/assets/{ExternalRichEditor--kNXs-Eb.js → ExternalRichEditor-CIZPhssf.js} +24 -24
- package/dist/server/ui/assets/ReviewDetailPage-winyLSQ7.js +6 -0
- package/dist/server/ui/assets/ReviewsPage-BYKBReMp.js +6 -0
- package/dist/server/ui/assets/index-CiDJX6Hn.js +1191 -0
- package/dist/server/ui/assets/index-f1WOAqXB.css +32 -0
- package/dist/server/ui/assets/useReviewSubscription-v3Cto0y4.js +69 -0
- package/dist/server/ui/index.html +2 -2
- package/dist/templates/teams-dev.json +14 -14
- package/package.json +15 -1
- package/dist/server/modules/reviews/utils/notification-formatter.d.ts +0 -12
- package/dist/server/modules/reviews/utils/notification-formatter.js +0 -60
- package/dist/server/modules/reviews/utils/notification-formatter.js.map +0 -1
- package/dist/server/ui/assets/ReviewDetailPage-DMgP5fKn.js +0 -6
- package/dist/server/ui/assets/ReviewsPage-CkyFUJr6.js +0 -6
- package/dist/server/ui/assets/index-CVUaAlP4.css +0 -32
- package/dist/server/ui/assets/index-CqRufKpA.js +0 -994
- 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
|
|
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
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
199
|
-
|
|
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.
|
|
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, {
|
|
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
|
-
|
|
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
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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,
|
|
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, {
|
|
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,
|
|
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
|
|
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 ??
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
730
|
-
|
|
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,
|
|
941
|
+
(0, promises_2.pipeline)(source, counter).catch(() => undefined);
|
|
774
942
|
return counter;
|
|
775
943
|
}
|
|
776
944
|
async finish() {
|