dsh-remote 0.8.46 → 0.8.47
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/LICENSE +21 -21
- package/README.en.md +361 -361
- package/README.md +368 -368
- package/cordis.patch.yml +9 -9
- package/lib/binding.js +172 -172
- package/lib/client.js +3637 -3637
- package/lib/credential.js +177 -177
- package/lib/deploy-tasks.js +142 -142
- package/lib/errors.js +87 -87
- package/lib/file-reference.js +457 -457
- package/lib/forwards.js +258 -258
- package/lib/hostkey.js +108 -108
- package/lib/http-transport.js +196 -196
- package/lib/ignore.js +156 -156
- package/lib/index.js +3771 -3747
- package/lib/openssh.js +838 -838
- package/lib/paths.js +225 -225
- package/lib/pool.js +757 -757
- package/lib/registry.js +95 -95
- package/lib/remote-fs.js +148 -143
- package/lib/routes-fs.js +233 -233
- package/lib/search.js +230 -230
- package/lib/sftp-surface.js +76 -76
- package/lib/sshconfig.js +454 -454
- package/lib/sync.js +275 -275
- package/lib/tasks.js +95 -95
- package/lib/telemetry.js +213 -213
- package/lib/update.js +472 -472
- package/lib/web-attach.js +850 -850
- package/lib/web-deploy-skill.js +205 -205
- package/lib/web-deploy.js +694 -694
- package/node_modules/asn1/Jenkinsfile +65 -0
- package/node_modules/asn1/LICENSE +19 -0
- package/node_modules/asn1/README.md +50 -0
- package/node_modules/asn1/lib/ber/errors.js +13 -0
- package/node_modules/asn1/lib/ber/index.js +27 -0
- package/node_modules/asn1/lib/ber/reader.js +262 -0
- package/node_modules/asn1/lib/ber/types.js +36 -0
- package/node_modules/asn1/lib/ber/writer.js +317 -0
- package/node_modules/asn1/lib/index.js +20 -0
- package/node_modules/asn1/package.json +31 -0
- package/node_modules/bcrypt-pbkdf/CONTRIBUTING.md +13 -0
- package/node_modules/bcrypt-pbkdf/LICENSE +66 -0
- package/node_modules/bcrypt-pbkdf/README.md +45 -0
- package/node_modules/bcrypt-pbkdf/index.js +556 -0
- package/node_modules/bcrypt-pbkdf/package.json +15 -0
- package/node_modules/buildcheck/.eslintrc.js +5 -0
- package/node_modules/buildcheck/.github/workflows/ci.yml +88 -0
- package/node_modules/buildcheck/.github/workflows/lint.yml +27 -0
- package/node_modules/buildcheck/.npmignore +3 -0
- package/node_modules/buildcheck/LICENSE +19 -0
- package/node_modules/buildcheck/README.md +106 -0
- package/node_modules/buildcheck/deps/Find-VisualStudio.cs +250 -0
- package/node_modules/buildcheck/lib/findvs.js +361 -0
- package/node_modules/buildcheck/lib/index.js +738 -0
- package/node_modules/buildcheck/package.json +36 -0
- package/node_modules/buildcheck/test/test.js +8 -0
- package/node_modules/cpu-features/.eslintrc.js +5 -0
- package/node_modules/cpu-features/.github/workflows/ci.yml +74 -0
- package/node_modules/cpu-features/.github/workflows/lint.yml +27 -0
- package/node_modules/cpu-features/LICENSE +19 -0
- package/node_modules/cpu-features/README.md +59 -0
- package/node_modules/cpu-features/binding.gyp +16 -0
- package/node_modules/cpu-features/buildcheck.js +32 -0
- package/node_modules/cpu-features/deps/cpu_features/.clang-format +4 -0
- package/node_modules/cpu-features/deps/cpu_features/.dockerignore +31 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/Dockerfile +5 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/aarch64_linux_cmake.yml +30 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_freebsd_cmake.yml +22 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_bazel.yml +26 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_linux_cmake.yml +31 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_macos_cmake.yml +43 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/amd64_windows_cmake.yml +25 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/arm_linux_cmake.yml +31 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/clang_format.yml +24 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/mips_linux_cmake.yml +30 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/power_linux_cmake.yml +29 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/riscv_linux_cmake.yml +28 -0
- package/node_modules/cpu-features/deps/cpu_features/.github/workflows/s390x_linux_cmake.yml +27 -0
- package/node_modules/cpu-features/deps/cpu_features/.grenrc.yml +21 -0
- package/node_modules/cpu-features/deps/cpu_features/BUILD.bazel +329 -0
- package/node_modules/cpu-features/deps/cpu_features/CMakeLists.txt +261 -0
- package/node_modules/cpu-features/deps/cpu_features/CONTRIBUTING.md +23 -0
- package/node_modules/cpu-features/deps/cpu_features/LICENSE +230 -0
- package/node_modules/cpu-features/deps/cpu_features/README.md +272 -0
- package/node_modules/cpu-features/deps/cpu_features/WORKSPACE +19 -0
- package/node_modules/cpu-features/deps/cpu_features/bazel/ci/README.md +5 -0
- package/node_modules/cpu-features/deps/cpu_features/bazel/platforms.bzl +11 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesConfig.cmake.in +3 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/CpuFeaturesNdkCompatConfig.cmake.in +3 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/README.md +30 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/Makefile +252 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/README.md +40 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.dot +64 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/docker.svg +312 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/doc/generate_image.sh +7 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/amd64/Dockerfile +48 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/docker/toolchain/Dockerfile +34 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/CMakeLists.txt +22 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/sample/main.cpp +11 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/ci/vagrant/freebsd/Vagrantfile +107 -0
- package/node_modules/cpu-features/deps/cpu_features/cmake/googletest.CMakeLists.txt.in +15 -0
- package/node_modules/cpu-features/deps/cpu_features/cpu_features.gyp +105 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_cache_info.h +54 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpu_features_macros.h +384 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_aarch64.h +259 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_arm.h +121 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_mips.h +74 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_ppc.h +149 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_riscv.h +72 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_s390x.h +108 -0
- package/node_modules/cpu-features/deps/cpu_features/include/cpuinfo_x86.h +288 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/bit_utils.h +40 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/cpuid_x86.h +37 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/filesystem.h +39 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/hwcaps.h +240 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/stack_line_reader.h +49 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/string_view.h +110 -0
- package/node_modules/cpu-features/deps/cpu_features/include/internal/windows_utils.h +70 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/CMakeLists.txt +60 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/README.md +4 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.c +205 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/cpu-features.h +320 -0
- package/node_modules/cpu-features/deps/cpu_features/ndk_compat/ndk-compat-test.c +12 -0
- package/node_modules/cpu-features/deps/cpu_features/patches/0001-Add-Apple-Silicon-Support.patch +456 -0
- package/node_modules/cpu-features/deps/cpu_features/scripts/generate_badges.d +165 -0
- package/node_modules/cpu-features/deps/cpu_features/scripts/make_release.sh +75 -0
- package/node_modules/cpu-features/deps/cpu_features/scripts/run_integration.sh +490 -0
- package/node_modules/cpu-features/deps/cpu_features/scripts/test_integration.sh +79 -0
- package/node_modules/cpu-features/deps/cpu_features/src/copy.inl +19 -0
- package/node_modules/cpu-features/deps/cpu_features/src/define_introspection.inl +86 -0
- package/node_modules/cpu-features/deps/cpu_features/src/define_introspection_and_hwcaps.inl +26 -0
- package/node_modules/cpu-features/deps/cpu_features/src/equals.inl +22 -0
- package/node_modules/cpu-features/deps/cpu_features/src/filesystem.c +62 -0
- package/node_modules/cpu-features/deps/cpu_features/src/hwcaps.c +169 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64__base_implementation.inl +88 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_linux_or_android.c +79 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.c +82 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_aarch64_windows.c +138 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_arm_linux_or_android.c +212 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_mips_linux_or_android.c +93 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_ppc_linux.c +163 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_riscv_linux.c +111 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_s390x_linux.c +120 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86__base_implementation.inl +2055 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_freebsd.c +68 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_linux_or_android.c +58 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_macos.c +57 -0
- package/node_modules/cpu-features/deps/cpu_features/src/impl_x86_windows.c +58 -0
- package/node_modules/cpu-features/deps/cpu_features/src/stack_line_reader.c +132 -0
- package/node_modules/cpu-features/deps/cpu_features/src/string_view.c +192 -0
- package/node_modules/cpu-features/deps/cpu_features/src/utils/list_cpu_features.c +461 -0
- package/node_modules/cpu-features/deps/cpu_features/test/CMakeLists.txt +114 -0
- package/node_modules/cpu-features/deps/cpu_features/test/bit_utils_test.cc +53 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_aarch64_test.cc +396 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_arm_test.cc +384 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_mips_test.cc +176 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_ppc_test.cc +131 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_riscv_test.cc +180 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_s390x_test.cc +82 -0
- package/node_modules/cpu-features/deps/cpu_features/test/cpuinfo_x86_test.cc +1729 -0
- package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.cc +103 -0
- package/node_modules/cpu-features/deps/cpu_features/test/filesystem_for_testing.h +61 -0
- package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.cc +52 -0
- package/node_modules/cpu-features/deps/cpu_features/test/hwcaps_for_testing.h +31 -0
- package/node_modules/cpu-features/deps/cpu_features/test/stack_line_reader_test.cc +132 -0
- package/node_modules/cpu-features/deps/cpu_features/test/string_view_test.cc +202 -0
- package/node_modules/cpu-features/lib/index.js +5 -0
- package/node_modules/cpu-features/package.json +40 -0
- package/node_modules/cpu-features/src/binding.cc +151 -0
- package/node_modules/cpu-features/test/test.js +12 -0
- package/node_modules/nan/.github/workflows/ci.yml +46 -0
- package/node_modules/nan/.pre-commit-config.yaml +8 -0
- package/node_modules/nan/CHANGELOG.md +605 -0
- package/node_modules/nan/CMakeLists.txt +138 -0
- package/node_modules/nan/LICENSE.md +9 -0
- package/node_modules/nan/README.md +457 -0
- package/node_modules/nan/doc/asyncworker.md +146 -0
- package/node_modules/nan/doc/buffers.md +54 -0
- package/node_modules/nan/doc/callback.md +76 -0
- package/node_modules/nan/doc/converters.md +41 -0
- package/node_modules/nan/doc/errors.md +226 -0
- package/node_modules/nan/doc/json.md +62 -0
- package/node_modules/nan/doc/maybe_types.md +583 -0
- package/node_modules/nan/doc/methods.md +689 -0
- package/node_modules/nan/doc/new.md +147 -0
- package/node_modules/nan/doc/node_misc.md +123 -0
- package/node_modules/nan/doc/object_wrappers.md +263 -0
- package/node_modules/nan/doc/persistent.md +296 -0
- package/node_modules/nan/doc/scopes.md +73 -0
- package/node_modules/nan/doc/script.md +58 -0
- package/node_modules/nan/doc/string_bytes.md +81 -0
- package/node_modules/nan/doc/v8_internals.md +211 -0
- package/node_modules/nan/doc/v8_misc.md +85 -0
- package/node_modules/nan/include_dirs.js +1 -0
- package/node_modules/nan/nan.h +3202 -0
- package/node_modules/nan/nan_callbacks.h +141 -0
- package/node_modules/nan/nan_callbacks_12_inl.h +730 -0
- package/node_modules/nan/nan_callbacks_pre_12_inl.h +528 -0
- package/node_modules/nan/nan_converters.h +72 -0
- package/node_modules/nan/nan_converters_43_inl.h +68 -0
- package/node_modules/nan/nan_converters_pre_43_inl.h +42 -0
- package/node_modules/nan/nan_define_own_property_helper.h +29 -0
- package/node_modules/nan/nan_implementation_12_inl.h +446 -0
- package/node_modules/nan/nan_implementation_pre_12_inl.h +263 -0
- package/node_modules/nan/nan_json.h +166 -0
- package/node_modules/nan/nan_maybe_43_inl.h +360 -0
- package/node_modules/nan/nan_maybe_pre_43_inl.h +268 -0
- package/node_modules/nan/nan_new.h +340 -0
- package/node_modules/nan/nan_object_wrap.h +156 -0
- package/node_modules/nan/nan_persistent_12_inl.h +132 -0
- package/node_modules/nan/nan_persistent_pre_12_inl.h +242 -0
- package/node_modules/nan/nan_private.h +73 -0
- package/node_modules/nan/nan_scriptorigin.h +97 -0
- package/node_modules/nan/nan_string_bytes.h +305 -0
- package/node_modules/nan/nan_typedarray_contents.h +96 -0
- package/node_modules/nan/nan_weak.h +453 -0
- package/node_modules/nan/package.json +38 -0
- package/node_modules/nan/tools/1to2.js +412 -0
- package/node_modules/nan/tools/README.md +14 -0
- package/node_modules/nan/tools/package.json +19 -0
- package/node_modules/safer-buffer/LICENSE +21 -0
- package/node_modules/safer-buffer/Porting-Buffer.md +268 -0
- package/node_modules/safer-buffer/Readme.md +156 -0
- package/node_modules/safer-buffer/dangerous.js +58 -0
- package/node_modules/safer-buffer/package.json +34 -0
- package/node_modules/safer-buffer/safer.js +77 -0
- package/node_modules/safer-buffer/tests.js +406 -0
- package/node_modules/ssh2/.eslintignore +4 -0
- package/node_modules/ssh2/.eslintrc.js +5 -0
- package/node_modules/ssh2/.github/workflows/ci.yml +110 -0
- package/node_modules/ssh2/.github/workflows/lint.yml +27 -0
- package/node_modules/ssh2/LICENSE +19 -0
- package/node_modules/ssh2/README.md +1529 -0
- package/node_modules/ssh2/SFTP.md +413 -0
- package/node_modules/ssh2/examples/server-chat.js +238 -0
- package/node_modules/ssh2/examples/sftp-server-download-only.js +134 -0
- package/node_modules/ssh2/install.js +27 -0
- package/node_modules/ssh2/lib/Channel.js +295 -0
- package/node_modules/ssh2/lib/agent.js +1123 -0
- package/node_modules/ssh2/lib/client.js +2176 -0
- package/node_modules/ssh2/lib/http-agents.js +84 -0
- package/node_modules/ssh2/lib/index.js +44 -0
- package/node_modules/ssh2/lib/keygen.js +582 -0
- package/node_modules/ssh2/lib/protocol/Protocol.js +2136 -0
- package/node_modules/ssh2/lib/protocol/SFTP.js +4052 -0
- package/node_modules/ssh2/lib/protocol/constants.js +356 -0
- package/node_modules/ssh2/lib/protocol/crypto/binding.gyp +23 -0
- package/node_modules/ssh2/lib/protocol/crypto/poly1305.js +43 -0
- package/node_modules/ssh2/lib/protocol/crypto/src/binding.cc +2300 -0
- package/node_modules/ssh2/lib/protocol/crypto.js +1602 -0
- package/node_modules/ssh2/lib/protocol/handlers.js +16 -0
- package/node_modules/ssh2/lib/protocol/handlers.misc.js +1285 -0
- package/node_modules/ssh2/lib/protocol/kex.js +1908 -0
- package/node_modules/ssh2/lib/protocol/keyParser.js +1484 -0
- package/node_modules/ssh2/lib/protocol/node-fs-compat.js +115 -0
- package/node_modules/ssh2/lib/protocol/utils.js +356 -0
- package/node_modules/ssh2/lib/protocol/zlib.js +255 -0
- package/node_modules/ssh2/lib/server.js +1380 -0
- package/node_modules/ssh2/lib/utils.js +336 -0
- package/node_modules/ssh2/package.json +49 -0
- package/node_modules/ssh2/test/common.js +316 -0
- package/node_modules/ssh2/test/fixtures/bad_rsa_private_key +26 -0
- package/node_modules/ssh2/test/fixtures/https_cert.pem +33 -0
- package/node_modules/ssh2/test/fixtures/https_key.pem +52 -0
- package/node_modules/ssh2/test/fixtures/id_dsa +12 -0
- package/node_modules/ssh2/test/fixtures/id_ecdsa +5 -0
- package/node_modules/ssh2/test/fixtures/id_rsa +15 -0
- package/node_modules/ssh2/test/fixtures/id_rsa.ppk +26 -0
- package/node_modules/ssh2/test/fixtures/id_rsa_enc +30 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa +21 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc +22 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc_gcm +23 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc_gcm.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc_gcm.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_dsa_enc_gcm.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa +9 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc +10 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc.pub.result +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc_gcm +10 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc_gcm.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc_gcm.pub.result +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ecdsa_enc_gcm.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ed25519 +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ed25519.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ed25519.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_ed25519.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa +27 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc +28 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc.pub.result +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc_gcm +29 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc_gcm.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc_gcm.pub.result +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_new_rsa_enc_gcm.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa +12 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa_enc +15 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa_enc.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa_enc.pub.result +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_dsa_enc.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa +5 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa_enc +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa_enc.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa_enc.pub.result +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_ecdsa_enc.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa +27 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc +30 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc.pub.result +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc_aes256 +54 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc_aes256.pub +1 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc_aes256.pub.result +6 -0
- package/node_modules/ssh2/test/fixtures/keyParser/openssh_old_rsa_enc_aes256.result +6 -0
- package/node_modules/ssh2/test/fixtures/keyParser/ppk_dsa_enc +17 -0
- package/node_modules/ssh2/test/fixtures/keyParser/ppk_dsa_enc.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/ppk_rsa +26 -0
- package/node_modules/ssh2/test/fixtures/keyParser/ppk_rsa.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/ppk_rsa_enc +18 -0
- package/node_modules/ssh2/test/fixtures/keyParser/ppk_rsa_enc.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa.pub +9 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa2.pub +10 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa2.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa3.pub +11 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa3.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa4.pub +11 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa4.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa5.pub +8 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa5.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa6.pub +13 -0
- package/node_modules/ssh2/test/fixtures/keyParser/rfc4716_rsa6.pub.result +7 -0
- package/node_modules/ssh2/test/fixtures/openssh_new_rsa +27 -0
- package/node_modules/ssh2/test/fixtures/ssh_host_dsa_key +12 -0
- package/node_modules/ssh2/test/fixtures/ssh_host_ecdsa_key +5 -0
- package/node_modules/ssh2/test/fixtures/ssh_host_rsa_key +15 -0
- package/node_modules/ssh2/test/test-exec.js +578 -0
- package/node_modules/ssh2/test/test-integration-openssh.js +486 -0
- package/node_modules/ssh2/test/test-keygen.js +60 -0
- package/node_modules/ssh2/test/test-misc-client-server.js +1460 -0
- package/node_modules/ssh2/test/test-openssh.js +261 -0
- package/node_modules/ssh2/test/test-protocol-crypto.js +631 -0
- package/node_modules/ssh2/test/test-protocol-keyparser.js +177 -0
- package/node_modules/ssh2/test/test-server-hostkeys.js +138 -0
- package/node_modules/ssh2/test/test-sftp.js +842 -0
- package/node_modules/ssh2/test/test-shell.js +109 -0
- package/node_modules/ssh2/test/test-userauth-agent-openssh.js +110 -0
- package/node_modules/ssh2/test/test-userauth-agent.js +171 -0
- package/node_modules/ssh2/test/test-userauth.js +611 -0
- package/node_modules/ssh2/test/test-worker-imports.js +25 -0
- package/node_modules/ssh2/test/test.js +20 -0
- package/node_modules/ssh2/util/build_pagent.bat +2 -0
- package/node_modules/ssh2/util/pagent.c +88 -0
- package/node_modules/ssh2/util/pagent.exe +0 -0
- package/node_modules/tweetnacl/.npmignore +4 -0
- package/node_modules/tweetnacl/AUTHORS.md +28 -0
- package/node_modules/tweetnacl/CHANGELOG.md +221 -0
- package/node_modules/tweetnacl/LICENSE +24 -0
- package/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md +20 -0
- package/node_modules/tweetnacl/README.md +459 -0
- package/node_modules/tweetnacl/nacl-fast.js +2388 -0
- package/node_modules/tweetnacl/nacl-fast.min.js +2 -0
- package/node_modules/tweetnacl/nacl.d.ts +98 -0
- package/node_modules/tweetnacl/nacl.js +1175 -0
- package/node_modules/tweetnacl/nacl.min.js +1 -0
- package/node_modules/tweetnacl/package.json +58 -0
- package/package.json +95 -89
package/cordis.patch.yml
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# dsh-remote bundle patch: inserts only this plugin into a profile's layer stack.
|
|
2
|
-
#
|
|
3
|
-
# dsh-better-sidebar is deliberately not mounted here and is not a dependency.
|
|
4
|
-
# Users who want that optional Web UI can install its bundle separately;
|
|
5
|
-
# lib/client.js discovers the betterSidebar service dynamically and adds the
|
|
6
|
-
# remote explorer/editor tabs when it is present.
|
|
7
|
-
- insert:
|
|
8
|
-
- id: dsh-remote
|
|
9
|
-
name: 'dsh-remote'
|
|
1
|
+
# dsh-remote bundle patch: inserts only this plugin into a profile's layer stack.
|
|
2
|
+
#
|
|
3
|
+
# dsh-better-sidebar is deliberately not mounted here and is not a dependency.
|
|
4
|
+
# Users who want that optional Web UI can install its bundle separately;
|
|
5
|
+
# lib/client.js discovers the betterSidebar service dynamically and adds the
|
|
6
|
+
# remote explorer/editor tabs when it is present.
|
|
7
|
+
- insert:
|
|
8
|
+
- id: dsh-remote
|
|
9
|
+
name: 'dsh-remote'
|
package/lib/binding.js
CHANGED
|
@@ -1,172 +1,172 @@
|
|
|
1
|
-
// Session → remote-binding resolution.
|
|
2
|
-
//
|
|
3
|
-
// A session's remote target is derived from its own workspace mirror, never
|
|
4
|
-
// from the plugin's mutable active-machine state. That is what keeps concurrent
|
|
5
|
-
// sessions on different hosts independent: with a single shared connection and
|
|
6
|
-
// a single shared workspace value, one session switching machines redirected
|
|
7
|
-
// every other session's commands to the wrong host (issue #25).
|
|
8
|
-
//
|
|
9
|
-
// The mirror directory is the durable record of that binding: `ensureMirror()`
|
|
10
|
-
// writes `.dsh-remote-meta.json` with the remote origin (`host`/`port`/
|
|
11
|
-
// `username`/`remotePath`) when the workspace is picked, so a session's cwd
|
|
12
|
-
// alone identifies both the machine to connect to and the workspace root.
|
|
13
|
-
|
|
14
|
-
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs'
|
|
15
|
-
import path from 'node:path'
|
|
16
|
-
import zlib from 'node:zlib'
|
|
17
|
-
|
|
18
|
-
/** Strip trailing separators so a mirror root and a path inside it compare cleanly. */
|
|
19
|
-
const norm = (p) => path.resolve(String(p || '')).replace(/[\\/]+$/, '') || ''
|
|
20
|
-
|
|
21
|
-
/** Whether `base` is `dir` itself or nested under it (separator-aware, so
|
|
22
|
-
* `/a/mirror-2` is NOT treated as living inside `/a/mirror`). */
|
|
23
|
-
const isUnder = (base, dir) => base === dir || base.startsWith(dir + path.sep) || base.startsWith(dir + '/')
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Resolve which remote workspace a LOCAL path belongs to by scanning the mirror
|
|
27
|
-
* registry for the mirror that contains it.
|
|
28
|
-
*
|
|
29
|
-
* Mirrors live exactly one level under the registry root as
|
|
30
|
-
* `<host>-<user>-<port>/<basename>`, and `mirrorDirFor()` appends a short hash
|
|
31
|
-
* when two remote paths share a basename, so containment is unambiguous. The
|
|
32
|
-
* longest containing path still wins, which keeps the result stable if a
|
|
33
|
-
* future layout ever nests them.
|
|
34
|
-
*
|
|
35
|
-
* A mirror whose meta is missing, unparsable, or has no `host` is skipped
|
|
36
|
-
* rather than guessed at: reporting no binding makes the caller refuse loudly,
|
|
37
|
-
* while guessing would send commands to an unintended host.
|
|
38
|
-
*
|
|
39
|
-
* @param {string} local - absolute local path, typically a session's cwd.
|
|
40
|
-
* @param {string} root - the mirror registry root (`$DSH_HOME/remote-workspaces`).
|
|
41
|
-
* @returns {{mirrorDir: string|null, remotePath: string, machine: {host: string, port: number, username: string, alias: string}|null}}
|
|
42
|
-
* `machine` is the mirror-recorded origin (`alias` is the ~/.ssh/config alias
|
|
43
|
-
* it was created through, '' when the machine uses literal values), or null
|
|
44
|
-
* when `local` is not inside a usable mirror (in which case `remotePath` is
|
|
45
|
-
* empty too).
|
|
46
|
-
*/
|
|
47
|
-
export function resolveMirror(local, root) {
|
|
48
|
-
let mirrorDir = null
|
|
49
|
-
let remotePath = ''
|
|
50
|
-
let machine = null
|
|
51
|
-
if (!local || !root || !existsSync(root)) return { mirrorDir, remotePath, machine }
|
|
52
|
-
const base = norm(local)
|
|
53
|
-
let hostDirs
|
|
54
|
-
try {
|
|
55
|
-
hostDirs = readdirSync(root)
|
|
56
|
-
} catch {
|
|
57
|
-
return { mirrorDir, remotePath, machine }
|
|
58
|
-
}
|
|
59
|
-
for (const hostDir of hostDirs) {
|
|
60
|
-
const hostPath = path.join(root, hostDir)
|
|
61
|
-
if (!statSync(hostPath, { throwIfNoEntry: false })?.isDirectory?.()) continue
|
|
62
|
-
let entries
|
|
63
|
-
try {
|
|
64
|
-
entries = readdirSync(hostPath)
|
|
65
|
-
} catch {
|
|
66
|
-
continue
|
|
67
|
-
}
|
|
68
|
-
for (const entry of entries) {
|
|
69
|
-
const metaPath = path.join(hostPath, entry, '.dsh-remote-meta.json')
|
|
70
|
-
if (!existsSync(metaPath)) continue
|
|
71
|
-
const mirrorAbs = norm(path.join(hostPath, entry))
|
|
72
|
-
if (!isUnder(base, mirrorAbs)) continue
|
|
73
|
-
// Deepest match wins; an equal-length path cannot occur twice.
|
|
74
|
-
if (mirrorDir && mirrorAbs.length <= mirrorDir.length) continue
|
|
75
|
-
try {
|
|
76
|
-
const meta = JSON.parse(readFileSync(metaPath, 'utf8'))
|
|
77
|
-
if (!meta || !meta.host) continue
|
|
78
|
-
mirrorDir = mirrorAbs
|
|
79
|
-
remotePath = String(meta.remotePath || '')
|
|
80
|
-
machine = {
|
|
81
|
-
host: String(meta.host),
|
|
82
|
-
port: Number(meta.port) || 22,
|
|
83
|
-
username: String(meta.username || ''),
|
|
84
|
-
// The ~/.ssh/config alias this mirror was created through, when the
|
|
85
|
-
// machine was saved as one (issue #38): it keeps the mirror bound to
|
|
86
|
-
// its machine even if that alias's HostName/port later change.
|
|
87
|
-
alias: String(meta.alias || ''),
|
|
88
|
-
}
|
|
89
|
-
} catch { /* unparsable meta → not a usable binding */ }
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return { mirrorDir, remotePath, machine }
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Stable pool key for a remote identity. Two sessions on the same machine
|
|
97
|
-
* produce the same key and therefore share one SSH connection; sessions on
|
|
98
|
-
* different machines never collide.
|
|
99
|
-
* @param {{host: string, port?: number|string, username?: string}} m - the remote identity.
|
|
100
|
-
* @returns {string} the canonical `user@host:port` key.
|
|
101
|
-
*/
|
|
102
|
-
export function poolKey(m) {
|
|
103
|
-
return `${(m && m.username) || ''}@${(m && m.host) || ''}:${Number(m && m.port) || 22}`
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** Safe path segment for a session id (mirrors DSH's encodeSegment). */
|
|
107
|
-
export function encodeSegmentSafe(id) {
|
|
108
|
-
const s = String(id || '').replace(/[^A-Za-z0-9._-]/g, '_')
|
|
109
|
-
return s || 'session'
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/** Read the cwd from a session log header (JSONL / .gz / zstd first frame). */
|
|
113
|
-
export function readSessionHeaderCwd(file) {
|
|
114
|
-
try {
|
|
115
|
-
let buf = readFileSync(file)
|
|
116
|
-
if (/\.zstd$/.test(file)) buf = zlib.zstdDecompressSync(buf)
|
|
117
|
-
else if (/\.gz$/.test(file)) buf = zlib.gunzipSync(buf)
|
|
118
|
-
const nl = buf.indexOf(10)
|
|
119
|
-
if (nl < 0) return ''
|
|
120
|
-
const head = JSON.parse(buf.subarray(0, nl).toString('utf8'))
|
|
121
|
-
return typeof head.cwd === 'string' ? head.cwd : ''
|
|
122
|
-
} catch {
|
|
123
|
-
return ''
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Resolve a session's workspace cwd from the live sessions service, then from
|
|
129
|
-
* durable session logs under `$DSH_HOME/sessions`.
|
|
130
|
-
*/
|
|
131
|
-
export function lookupSessionCwd(sessionId, { sessions, dshHome } = {}) {
|
|
132
|
-
if (!sessionId) return ''
|
|
133
|
-
try {
|
|
134
|
-
if (sessions && typeof sessions.get === 'function') {
|
|
135
|
-
const s = sessions.get(sessionId)
|
|
136
|
-
const cwd = s && s.header && s.header.cwd
|
|
137
|
-
if (cwd) return String(cwd)
|
|
138
|
-
}
|
|
139
|
-
} catch { /* sessions service unavailable */ }
|
|
140
|
-
if (!dshHome) return ''
|
|
141
|
-
try {
|
|
142
|
-
const sessionsRoot = path.join(dshHome, 'sessions')
|
|
143
|
-
if (!existsSync(sessionsRoot)) return ''
|
|
144
|
-
const targetDir = encodeSegmentSafe(sessionId)
|
|
145
|
-
for (const projDir of readdirSync(sessionsRoot)) {
|
|
146
|
-
const projPath = path.join(sessionsRoot, projDir)
|
|
147
|
-
if (!statSync(projPath, { throwIfNoEntry: false })?.isDirectory?.()) continue
|
|
148
|
-
const sessDir = path.join(projPath, targetDir)
|
|
149
|
-
if (!statSync(sessDir, { throwIfNoEntry: false })?.isDirectory?.()) continue
|
|
150
|
-
const logFile = ['session.jsonl.zstd', 'session.jsonl', 'session.jsonl.gz']
|
|
151
|
-
.map((n) => path.join(sessDir, n)).find((p) => existsSync(p))
|
|
152
|
-
if (!logFile) continue
|
|
153
|
-
const cwd = readSessionHeaderCwd(logFile)
|
|
154
|
-
if (cwd) return cwd
|
|
155
|
-
}
|
|
156
|
-
} catch { /* session log scan failed */ }
|
|
157
|
-
return ''
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/** Pull sessionId / local from a JSON HTTP request (query string + body). */
|
|
161
|
-
export function requestSessionHint(req, body = {}) {
|
|
162
|
-
let sessionId = ''
|
|
163
|
-
let local = ''
|
|
164
|
-
try {
|
|
165
|
-
const q = new URL(req.url || '', 'http://localhost').searchParams
|
|
166
|
-
sessionId = q.get('sessionId') ? decodeURIComponent(q.get('sessionId')) : ''
|
|
167
|
-
local = q.get('local') ? decodeURIComponent(q.get('local')) : ''
|
|
168
|
-
} catch { /* malformed url */ }
|
|
169
|
-
if (!sessionId && body && body.sessionId) sessionId = String(body.sessionId)
|
|
170
|
-
if (!local && body && body.local) local = String(body.local)
|
|
171
|
-
return { sessionId: String(sessionId || '').trim(), local: String(local || '').trim() }
|
|
172
|
-
}
|
|
1
|
+
// Session → remote-binding resolution.
|
|
2
|
+
//
|
|
3
|
+
// A session's remote target is derived from its own workspace mirror, never
|
|
4
|
+
// from the plugin's mutable active-machine state. That is what keeps concurrent
|
|
5
|
+
// sessions on different hosts independent: with a single shared connection and
|
|
6
|
+
// a single shared workspace value, one session switching machines redirected
|
|
7
|
+
// every other session's commands to the wrong host (issue #25).
|
|
8
|
+
//
|
|
9
|
+
// The mirror directory is the durable record of that binding: `ensureMirror()`
|
|
10
|
+
// writes `.dsh-remote-meta.json` with the remote origin (`host`/`port`/
|
|
11
|
+
// `username`/`remotePath`) when the workspace is picked, so a session's cwd
|
|
12
|
+
// alone identifies both the machine to connect to and the workspace root.
|
|
13
|
+
|
|
14
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs'
|
|
15
|
+
import path from 'node:path'
|
|
16
|
+
import zlib from 'node:zlib'
|
|
17
|
+
|
|
18
|
+
/** Strip trailing separators so a mirror root and a path inside it compare cleanly. */
|
|
19
|
+
const norm = (p) => path.resolve(String(p || '')).replace(/[\\/]+$/, '') || ''
|
|
20
|
+
|
|
21
|
+
/** Whether `base` is `dir` itself or nested under it (separator-aware, so
|
|
22
|
+
* `/a/mirror-2` is NOT treated as living inside `/a/mirror`). */
|
|
23
|
+
const isUnder = (base, dir) => base === dir || base.startsWith(dir + path.sep) || base.startsWith(dir + '/')
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Resolve which remote workspace a LOCAL path belongs to by scanning the mirror
|
|
27
|
+
* registry for the mirror that contains it.
|
|
28
|
+
*
|
|
29
|
+
* Mirrors live exactly one level under the registry root as
|
|
30
|
+
* `<host>-<user>-<port>/<basename>`, and `mirrorDirFor()` appends a short hash
|
|
31
|
+
* when two remote paths share a basename, so containment is unambiguous. The
|
|
32
|
+
* longest containing path still wins, which keeps the result stable if a
|
|
33
|
+
* future layout ever nests them.
|
|
34
|
+
*
|
|
35
|
+
* A mirror whose meta is missing, unparsable, or has no `host` is skipped
|
|
36
|
+
* rather than guessed at: reporting no binding makes the caller refuse loudly,
|
|
37
|
+
* while guessing would send commands to an unintended host.
|
|
38
|
+
*
|
|
39
|
+
* @param {string} local - absolute local path, typically a session's cwd.
|
|
40
|
+
* @param {string} root - the mirror registry root (`$DSH_HOME/remote-workspaces`).
|
|
41
|
+
* @returns {{mirrorDir: string|null, remotePath: string, machine: {host: string, port: number, username: string, alias: string}|null}}
|
|
42
|
+
* `machine` is the mirror-recorded origin (`alias` is the ~/.ssh/config alias
|
|
43
|
+
* it was created through, '' when the machine uses literal values), or null
|
|
44
|
+
* when `local` is not inside a usable mirror (in which case `remotePath` is
|
|
45
|
+
* empty too).
|
|
46
|
+
*/
|
|
47
|
+
export function resolveMirror(local, root) {
|
|
48
|
+
let mirrorDir = null
|
|
49
|
+
let remotePath = ''
|
|
50
|
+
let machine = null
|
|
51
|
+
if (!local || !root || !existsSync(root)) return { mirrorDir, remotePath, machine }
|
|
52
|
+
const base = norm(local)
|
|
53
|
+
let hostDirs
|
|
54
|
+
try {
|
|
55
|
+
hostDirs = readdirSync(root)
|
|
56
|
+
} catch {
|
|
57
|
+
return { mirrorDir, remotePath, machine }
|
|
58
|
+
}
|
|
59
|
+
for (const hostDir of hostDirs) {
|
|
60
|
+
const hostPath = path.join(root, hostDir)
|
|
61
|
+
if (!statSync(hostPath, { throwIfNoEntry: false })?.isDirectory?.()) continue
|
|
62
|
+
let entries
|
|
63
|
+
try {
|
|
64
|
+
entries = readdirSync(hostPath)
|
|
65
|
+
} catch {
|
|
66
|
+
continue
|
|
67
|
+
}
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
const metaPath = path.join(hostPath, entry, '.dsh-remote-meta.json')
|
|
70
|
+
if (!existsSync(metaPath)) continue
|
|
71
|
+
const mirrorAbs = norm(path.join(hostPath, entry))
|
|
72
|
+
if (!isUnder(base, mirrorAbs)) continue
|
|
73
|
+
// Deepest match wins; an equal-length path cannot occur twice.
|
|
74
|
+
if (mirrorDir && mirrorAbs.length <= mirrorDir.length) continue
|
|
75
|
+
try {
|
|
76
|
+
const meta = JSON.parse(readFileSync(metaPath, 'utf8'))
|
|
77
|
+
if (!meta || !meta.host) continue
|
|
78
|
+
mirrorDir = mirrorAbs
|
|
79
|
+
remotePath = String(meta.remotePath || '')
|
|
80
|
+
machine = {
|
|
81
|
+
host: String(meta.host),
|
|
82
|
+
port: Number(meta.port) || 22,
|
|
83
|
+
username: String(meta.username || ''),
|
|
84
|
+
// The ~/.ssh/config alias this mirror was created through, when the
|
|
85
|
+
// machine was saved as one (issue #38): it keeps the mirror bound to
|
|
86
|
+
// its machine even if that alias's HostName/port later change.
|
|
87
|
+
alias: String(meta.alias || ''),
|
|
88
|
+
}
|
|
89
|
+
} catch { /* unparsable meta → not a usable binding */ }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return { mirrorDir, remotePath, machine }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Stable pool key for a remote identity. Two sessions on the same machine
|
|
97
|
+
* produce the same key and therefore share one SSH connection; sessions on
|
|
98
|
+
* different machines never collide.
|
|
99
|
+
* @param {{host: string, port?: number|string, username?: string}} m - the remote identity.
|
|
100
|
+
* @returns {string} the canonical `user@host:port` key.
|
|
101
|
+
*/
|
|
102
|
+
export function poolKey(m) {
|
|
103
|
+
return `${(m && m.username) || ''}@${(m && m.host) || ''}:${Number(m && m.port) || 22}`
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Safe path segment for a session id (mirrors DSH's encodeSegment). */
|
|
107
|
+
export function encodeSegmentSafe(id) {
|
|
108
|
+
const s = String(id || '').replace(/[^A-Za-z0-9._-]/g, '_')
|
|
109
|
+
return s || 'session'
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Read the cwd from a session log header (JSONL / .gz / zstd first frame). */
|
|
113
|
+
export function readSessionHeaderCwd(file) {
|
|
114
|
+
try {
|
|
115
|
+
let buf = readFileSync(file)
|
|
116
|
+
if (/\.zstd$/.test(file)) buf = zlib.zstdDecompressSync(buf)
|
|
117
|
+
else if (/\.gz$/.test(file)) buf = zlib.gunzipSync(buf)
|
|
118
|
+
const nl = buf.indexOf(10)
|
|
119
|
+
if (nl < 0) return ''
|
|
120
|
+
const head = JSON.parse(buf.subarray(0, nl).toString('utf8'))
|
|
121
|
+
return typeof head.cwd === 'string' ? head.cwd : ''
|
|
122
|
+
} catch {
|
|
123
|
+
return ''
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Resolve a session's workspace cwd from the live sessions service, then from
|
|
129
|
+
* durable session logs under `$DSH_HOME/sessions`.
|
|
130
|
+
*/
|
|
131
|
+
export function lookupSessionCwd(sessionId, { sessions, dshHome } = {}) {
|
|
132
|
+
if (!sessionId) return ''
|
|
133
|
+
try {
|
|
134
|
+
if (sessions && typeof sessions.get === 'function') {
|
|
135
|
+
const s = sessions.get(sessionId)
|
|
136
|
+
const cwd = s && s.header && s.header.cwd
|
|
137
|
+
if (cwd) return String(cwd)
|
|
138
|
+
}
|
|
139
|
+
} catch { /* sessions service unavailable */ }
|
|
140
|
+
if (!dshHome) return ''
|
|
141
|
+
try {
|
|
142
|
+
const sessionsRoot = path.join(dshHome, 'sessions')
|
|
143
|
+
if (!existsSync(sessionsRoot)) return ''
|
|
144
|
+
const targetDir = encodeSegmentSafe(sessionId)
|
|
145
|
+
for (const projDir of readdirSync(sessionsRoot)) {
|
|
146
|
+
const projPath = path.join(sessionsRoot, projDir)
|
|
147
|
+
if (!statSync(projPath, { throwIfNoEntry: false })?.isDirectory?.()) continue
|
|
148
|
+
const sessDir = path.join(projPath, targetDir)
|
|
149
|
+
if (!statSync(sessDir, { throwIfNoEntry: false })?.isDirectory?.()) continue
|
|
150
|
+
const logFile = ['session.jsonl.zstd', 'session.jsonl', 'session.jsonl.gz']
|
|
151
|
+
.map((n) => path.join(sessDir, n)).find((p) => existsSync(p))
|
|
152
|
+
if (!logFile) continue
|
|
153
|
+
const cwd = readSessionHeaderCwd(logFile)
|
|
154
|
+
if (cwd) return cwd
|
|
155
|
+
}
|
|
156
|
+
} catch { /* session log scan failed */ }
|
|
157
|
+
return ''
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Pull sessionId / local from a JSON HTTP request (query string + body). */
|
|
161
|
+
export function requestSessionHint(req, body = {}) {
|
|
162
|
+
let sessionId = ''
|
|
163
|
+
let local = ''
|
|
164
|
+
try {
|
|
165
|
+
const q = new URL(req.url || '', 'http://localhost').searchParams
|
|
166
|
+
sessionId = q.get('sessionId') ? decodeURIComponent(q.get('sessionId')) : ''
|
|
167
|
+
local = q.get('local') ? decodeURIComponent(q.get('local')) : ''
|
|
168
|
+
} catch { /* malformed url */ }
|
|
169
|
+
if (!sessionId && body && body.sessionId) sessionId = String(body.sessionId)
|
|
170
|
+
if (!local && body && body.local) local = String(body.local)
|
|
171
|
+
return { sessionId: String(sessionId || '').trim(), local: String(local || '').trim() }
|
|
172
|
+
}
|