dsh-config-manager 0.1.71 → 0.1.73
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 +149 -98
- package/README.zh-CN.md +245 -88
- package/lib/adapters/agent-instructions.js +1 -1
- package/lib/adapters/file-collection.js +1 -1
- package/lib/adapters/index.d.ts +2 -1
- package/lib/adapters/index.js +6 -1
- package/lib/adapters/link-report.d.ts +1 -0
- package/lib/adapters/link-report.js +27 -3
- package/lib/adapters/messages.d.ts +21 -0
- package/lib/adapters/messages.js +57 -0
- package/lib/adapters/plugin-data.d.ts +114 -0
- package/lib/adapters/plugin-data.js +309 -0
- package/lib/adapters/plugin-files.js +3 -2
- package/lib/adapters/plugins.js +4 -3
- package/lib/adapters/prompts.d.ts +1 -0
- package/lib/adapters/prompts.js +7 -1
- package/lib/adapters/self.d.ts +8 -2
- package/lib/adapters/self.js +3 -2
- package/lib/adapters/sessions.d.ts +1 -0
- package/lib/adapters/sessions.js +4 -2
- package/lib/adapters/test-helpers.d.ts +9 -0
- package/lib/adapters/test-helpers.js +14 -0
- package/lib/adapters/ui.d.ts +2 -2
- package/lib/adapters/ui.js +25 -25
- package/lib/adapters/workspaces.d.ts +1 -0
- package/lib/adapters/workspaces.js +7 -3
- package/lib/cli/actions.d.ts +9 -1
- package/lib/cli/actions.js +5 -2
- package/lib/cli/help.js +23 -10
- package/lib/cli/index.d.ts +23 -0
- package/lib/cli/index.js +90 -32
- package/lib/cli/sessions-inspect.js +3 -1
- package/lib/cli/sessions-repair.js +25 -6
- package/lib/cli/web/page.d.ts +12 -0
- package/lib/cli/web/page.js +21 -12
- package/lib/cli/web/routes.js +2 -2
- package/lib/cli/web/server.js +4 -4
- package/lib/client.d.ts +1442 -494
- package/lib/client.js +15326 -8520
- package/lib/core/analyzer.d.ts +11 -2
- package/lib/core/analyzer.js +31 -8
- package/lib/core/backup-plan.d.ts +10 -0
- package/lib/core/backup-plan.js +51 -20
- package/lib/core/backup-verify.js +24 -23
- package/lib/core/backup.d.ts +25 -1
- package/lib/core/backup.js +99 -28
- package/lib/core/boot-rescue.js +4 -3
- package/lib/core/boot-safety.js +2 -1
- package/lib/core/command-rollback.d.ts +182 -0
- package/lib/core/command-rollback.js +293 -0
- package/lib/core/consult-source.js +7 -6
- package/lib/core/disk-usage.d.ts +74 -10
- package/lib/core/disk-usage.js +67 -4
- package/lib/core/engine-locale.d.ts +87 -0
- package/lib/core/engine-locale.js +125 -0
- package/lib/core/exporter.js +3 -3
- package/lib/core/fork-reconcile.d.ts +128 -0
- package/lib/core/fork-reconcile.js +150 -0
- package/lib/core/journal.js +6 -5
- package/lib/core/local-plugin-host.js +3 -2
- package/lib/core/local-plugin-pack.js +11 -6
- package/lib/core/messages-core.d.ts +294 -0
- package/lib/core/messages-core.js +619 -0
- package/lib/core/messages.d.ts +61 -2
- package/lib/core/messages.js +118 -13
- package/lib/core/migration-consult.js +21 -20
- package/lib/core/migration-history.js +19 -5
- package/lib/core/model-tools.d.ts +0 -22
- package/lib/core/model-tools.js +50 -27
- package/lib/core/phase3-host.js +30 -5
- package/lib/core/plugin-cli.js +18 -19
- package/lib/core/plugin-data-registry.d.ts +124 -0
- package/lib/core/plugin-data-registry.js +198 -0
- package/lib/core/reconcile.d.ts +2 -14
- package/lib/core/reconcile.js +87 -17
- package/lib/core/recovery-orchestrator.js +19 -18
- package/lib/core/reinstall.d.ts +4 -0
- package/lib/core/reinstall.js +26 -21
- package/lib/core/restore.js +20 -17
- package/lib/core/rollback-gate.d.ts +33 -0
- package/lib/core/rollback-gate.js +57 -0
- package/lib/core/rollback-ignore-rules.d.ts +31 -0
- package/lib/core/rollback-ignore-rules.js +140 -0
- package/lib/core/rollback-ledger.d.ts +248 -0
- package/lib/core/rollback-ledger.js +1282 -0
- package/lib/core/rollback-point.d.ts +1391 -0
- package/lib/core/rollback-point.js +3503 -0
- package/lib/core/rollback.js +6 -4
- package/lib/core/run-registry.js +6 -5
- package/lib/core/session-health.d.ts +15 -0
- package/lib/core/session-meta.d.ts +42 -2
- package/lib/core/session-meta.js +140 -1
- package/lib/core/session-title.d.ts +28 -0
- package/lib/core/session-title.js +185 -0
- package/lib/core/startup-barrier.d.ts +24 -0
- package/lib/core/startup-barrier.js +22 -0
- package/lib/core/transaction-coordinator.js +4 -3
- package/lib/core/types.d.ts +37 -1
- package/lib/core/validator.js +5 -4
- package/lib/core/verify-recovery.js +31 -30
- package/lib/foreign/bundle.js +3 -2
- package/lib/foreign/continue.js +2 -1
- package/lib/foreign/crush.js +2 -1
- package/lib/foreign/gemini.js +2 -1
- package/lib/foreign/goose.js +2 -1
- package/lib/foreign/kilocode.js +2 -1
- package/lib/foreign/kimi.js +2 -1
- package/lib/foreign/messages.d.ts +15 -0
- package/lib/foreign/messages.js +40 -0
- package/lib/foreign/mimocode.js +2 -1
- package/lib/foreign/openclaw.js +2 -1
- package/lib/foreign/opencode.js +2 -1
- package/lib/foreign/pi.js +2 -1
- package/lib/foreign/qoder.js +2 -1
- package/lib/foreign/qwen.js +2 -1
- package/lib/foreign/registry.d.ts +1 -1
- package/lib/foreign/registry.js +8 -7
- package/lib/foreign/teleagent.js +2 -1
- package/lib/foreign/workbuddy.js +2 -1
- package/lib/foreign/zcode.js +2 -1
- package/lib/foreign/zed.js +2 -1
- package/lib/index.d.ts +227 -7
- package/lib/index.js +799 -54
- package/lib/market/git-file-writer.js +20 -19
- package/lib/market/github-repos.js +35 -19
- package/lib/market/index-parser.js +31 -30
- package/lib/market/messages-market.d.ts +138 -0
- package/lib/market/messages-market.js +305 -0
- package/lib/market/my-repo.d.ts +2 -2
- package/lib/market/my-repo.js +32 -29
- package/lib/market/prepare.js +18 -15
- package/lib/market/security.js +20 -19
- package/lib/market/types.js +2 -1
- package/lib/market/url.js +2 -1
- package/lib/migrations/index.js +6 -5
- package/lib/migrations/messages-migrations.d.ts +32 -0
- package/lib/migrations/messages-migrations.js +58 -0
- package/lib/profiles/dsh-profile-launcher.js +2 -1
- package/lib/profiles/dsh-profile-runtime.js +2 -1
- package/lib/profiles/messages.d.ts +7 -0
- package/lib/profiles/messages.js +27 -0
- package/lib/routes/backup.js +18 -2
- package/lib/routes/import.js +3 -3
- package/lib/routes/index.d.ts +1 -1
- package/lib/routes/kit.d.ts +3 -2
- package/lib/routes/kit.js +6 -1
- package/lib/routes/market.js +1 -1
- package/lib/routes/messages.d.ts +43 -0
- package/lib/routes/messages.js +102 -0
- package/lib/routes/prefs.js +26 -3
- package/lib/routes/profiles.js +12 -6
- package/lib/routes/recovery.d.ts +21 -0
- package/lib/routes/recovery.js +478 -94
- package/lib/routes/snapshots.js +51 -4
- package/lib/routes/sync.js +79 -17
- package/lib/schema/config.d.ts +11 -1
- package/lib/schema/config.js +52 -20
- package/lib/schema/index.d.ts +8 -6
- package/lib/schema/index.js +8 -6
- package/lib/schema/manifest.js +19 -18
- package/lib/schema/messages.d.ts +47 -0
- package/lib/schema/messages.js +110 -0
- package/lib/schema/section-registry.d.ts +42 -15
- package/lib/schema/section-registry.js +67 -32
- package/lib/schema/types.d.ts +1 -1
- package/lib/schema/versions.js +6 -5
- package/lib/security/encryption.js +16 -15
- package/lib/security/integrity.js +8 -7
- package/lib/security/messages.d.ts +30 -0
- package/lib/security/messages.js +77 -0
- package/lib/security/redaction.js +12 -0
- package/lib/security/secret-scanner.js +16 -13
- package/lib/security/vault.js +2 -1
- package/lib/security/zip-security.js +4 -3
- package/lib/sync/ancestor.js +2 -1
- package/lib/sync/autosync-config.d.ts +11 -0
- package/lib/sync/autosync-config.js +12 -0
- package/lib/sync/autosync-scheduler.d.ts +11 -1
- package/lib/sync/autosync-scheduler.js +115 -76
- package/lib/sync/backup-files.js +3 -2
- package/lib/sync/backup-scheduler.js +6 -5
- package/lib/sync/blob-store.js +2 -1
- package/lib/sync/git/git-transport.d.ts +55 -0
- package/lib/sync/git/git-transport.js +152 -2
- package/lib/sync/github-auth.js +10 -9
- package/lib/sync/layout.js +13 -12
- package/lib/sync/messages.d.ts +63 -0
- package/lib/sync/messages.js +149 -0
- package/lib/sync/review-queue.js +6 -5
- package/lib/sync/s3/messages.d.ts +7 -0
- package/lib/sync/s3/messages.js +16 -0
- package/lib/sync/s3/s3-providers.d.ts +4 -1
- package/lib/sync/s3/s3-providers.js +5 -5
- package/lib/sync/s3/s3-transport.js +1 -1
- package/lib/sync/s3/sigv4.js +2 -1
- package/lib/sync/snapshot-crypto.js +6 -5
- package/lib/sync/snapshot-json.js +3 -2
- package/lib/sync/sync-engine.d.ts +58 -22
- package/lib/sync/sync-engine.js +119 -48
- package/lib/sync/sync-history.js +7 -6
- package/lib/sync/sync-selection.d.ts +15 -4
- package/lib/sync/sync-selection.js +17 -5
- package/lib/sync/ui-prefs.d.ts +22 -0
- package/lib/sync/ui-prefs.js +28 -0
- package/lib/sync/webdav/webdav-transport.d.ts +1 -0
- package/lib/sync/webdav/webdav-transport.js +4 -1
- package/lib/ui/artifact-view.js +4 -3
- package/lib/ui/commands.d.ts +1 -1
- package/lib/ui/commands.js +10 -0
- package/lib/ui/diff-view.d.ts +10 -0
- package/lib/ui/diff-view.js +17 -0
- package/lib/ui/disk-usage-view.d.ts +33 -4
- package/lib/ui/disk-usage-view.js +29 -1
- package/lib/ui/errors.d.ts +1 -1
- package/lib/ui/errors.js +4 -3
- package/lib/ui/export-flow.js +26 -20
- package/lib/ui/foreign-view.d.ts +5 -1
- package/lib/ui/foreign-view.js +26 -2
- package/lib/ui/i18n.d.ts +68 -1
- package/lib/ui/i18n.js +120 -2
- package/lib/ui/import-wizard.d.ts +7 -0
- package/lib/ui/import-wizard.js +13 -10
- package/lib/ui/progress.d.ts +2 -2
- package/lib/ui/progress.js +1 -2
- package/lib/ui/report.d.ts +5 -5
- package/lib/ui/report.js +6 -6
- package/lib/ui/rollback-view.d.ts +815 -0
- package/lib/ui/rollback-view.js +738 -0
- package/lib/ui/selection-model.d.ts +41 -0
- package/lib/ui/selection-model.js +30 -0
- package/lib/ui/session-inventory-view.d.ts +97 -3
- package/lib/ui/session-inventory-view.js +76 -2
- package/lib/ui/session-issue-labels.d.ts +43 -0
- package/lib/ui/session-issue-labels.js +48 -0
- package/lib/ui/sync-settings-view.d.ts +33 -0
- package/lib/ui/sync-settings-view.js +40 -0
- package/lib/ui/test-helpers.js +2 -1
- package/lib/ui/types.d.ts +8 -3
- package/lib/ui/types.js +1 -1
- package/lib/utils/atomic-write.js +6 -5
- package/lib/utils/bundle-scan.d.ts +11 -1
- package/lib/utils/bundle-scan.js +12 -1
- package/lib/utils/env-lock.d.ts +10 -0
- package/lib/utils/env-lock.js +73 -46
- package/lib/utils/json.js +6 -5
- package/lib/utils/messages-utils.d.ts +96 -0
- package/lib/utils/messages-utils.js +216 -0
- package/lib/utils/proxy.js +18 -5
- package/lib/utils/recursive-walk.d.ts +22 -0
- package/lib/utils/recursive-walk.js +75 -1
- package/lib/utils/session-log-repair.js +10 -9
- package/lib/utils/zip.js +27 -26
- package/package.json +12 -2
- package/src/adapters/agent-instructions.ts +1 -1
- package/src/adapters/file-collection.test.ts +1 -0
- package/src/adapters/file-collection.ts +1 -1
- package/src/adapters/files.test.ts +27 -0
- package/src/adapters/index.ts +6 -1
- package/src/adapters/link-report.test.ts +22 -2
- package/src/adapters/link-report.ts +29 -4
- package/src/adapters/messages.ts +61 -0
- package/src/adapters/plugin-data.test.ts +225 -0
- package/src/adapters/plugin-data.ts +351 -0
- package/src/adapters/plugin-files.ts +3 -2
- package/src/adapters/plugins.ts +4 -3
- package/src/adapters/prompts.ts +7 -1
- package/src/adapters/self.test.ts +26 -0
- package/src/adapters/self.ts +10 -3
- package/src/adapters/sessions.ts +4 -2
- package/src/adapters/settings.test.ts +38 -1
- package/src/adapters/test-helpers.ts +15 -0
- package/src/adapters/ui.test.ts +2 -2
- package/src/adapters/ui.ts +27 -26
- package/src/adapters/workspaces.ts +7 -3
- package/src/cli/actions.test.ts +28 -0
- package/src/cli/actions.ts +11 -2
- package/src/cli/help.ts +23 -10
- package/src/cli/index-guards.test.ts +193 -0
- package/src/cli/index.ts +106 -31
- package/src/cli/sessions-inspect.test.ts +15 -1
- package/src/cli/sessions-inspect.ts +3 -1
- package/src/cli/sessions-repair.test.ts +84 -0
- package/src/cli/sessions-repair.ts +33 -7
- package/src/cli/web/console-route-parity.test.ts +115 -0
- package/src/cli/web/page.ts +23 -12
- package/src/cli/web/routes.ts +2 -1
- package/src/cli/web/server.ts +4 -4
- package/src/cli/web/web.test.ts +2 -2
- package/src/client/ConfigManagerSection.tsx +30 -2
- package/src/client/about/AboutPanel.tsx +2 -2
- package/src/client/about/PluginUpdateDialog.tsx +1 -1
- package/src/client/about/ReleaseNotesDialog.tsx +2 -2
- package/src/client/about/about-view.test.ts +13 -3
- package/src/client/about/about-view.ts +10 -6
- package/src/client/about/release-notes-view.test.ts +14 -4
- package/src/client/about/release-notes-view.ts +4 -2
- package/src/client/api.ts +18 -6
- package/src/client/chat/ChatEntryView.tsx +411 -0
- package/src/client/chat/RollbackDiffTab.tsx +108 -0
- package/src/client/chat/RollbackFileIcon.tsx +96 -0
- package/src/client/chat/RollbackReviewDialog.tsx +607 -0
- package/src/client/chat/chat-entry-view.test.ts +1174 -0
- package/src/client/chat/chat-entry-view.ts +758 -0
- package/src/client/chat/chat-locales.ts +152 -0
- package/src/client/chat/chat-node-registration.ts +64 -0
- package/src/client/chat/chat-point-window.ts +183 -0
- package/src/client/chat/chat-slots.ts +107 -0
- package/src/client/chat/rollback-diff-tab.test.ts +105 -0
- package/src/client/chat/rollback-diff-tab.ts +174 -0
- package/src/client/chat/rollback-entry-view.test.ts +1469 -0
- package/src/client/chat/rollback-entry-view.ts +946 -0
- package/src/client/chat/sidebar-slots.ts +59 -0
- package/src/client/common/ConfirmDialog.tsx +7 -3
- package/src/client/common/ContentPicker.tsx +48 -10
- package/src/client/common/DiffTable.tsx +133 -0
- package/src/client/common/ErrorBanner.tsx +4 -4
- package/src/client/common/Icon.tsx +2 -0
- package/src/client/common/Modal.tsx +8 -1
- package/src/client/common/ProgressBar.tsx +8 -2
- package/src/client/common/ReportView.tsx +4 -4
- package/src/client/common/RunsCenter.tsx +1 -0
- package/src/client/common/client-route-parity.test.ts +84 -0
- package/src/client/common/info-hint-guard.test.ts +46 -13
- package/src/client/common/picker-lazy-units.test.ts +42 -0
- package/src/client/common/plan-text-redaction.test.ts +17 -6
- package/src/client/common/progress-view-edge.test.ts +8 -7
- package/src/client/common/progress-view.test.ts +9 -9
- package/src/client/common/progress-view.ts +2 -2
- package/src/client/common/routes.ts +38 -0
- package/src/client/common/section-labels.test.ts +1 -0
- package/src/client/common/section-labels.ts +2 -0
- package/src/client/common/ui.tsx +73 -10
- package/src/client/config-manager.module.css +1109 -31
- package/src/client/css-scale-guard.test.ts +30 -0
- package/src/client/environment/EnvironmentPanel.tsx +11 -4
- package/src/client/environment/maintenance/DiskUsageCard.tsx +23 -2
- package/src/client/export/ExportView.tsx +13 -8
- package/src/client/history/HistoryPanel.tsx +4 -3
- package/src/client/history/history-api.ts +2 -2
- package/src/client/history/history-locales.ts +5 -1
- package/src/client/home/HomePanel.tsx +29 -8
- package/src/client/import/ForeignImportView.tsx +4 -5
- package/src/client/import/ImportWizardView.tsx +5 -3
- package/src/client/import/import-wizard-split.test.ts +3 -1
- package/src/client/import/import-wizard-steps.tsx +9 -9
- package/src/client/index.ts +232 -3
- package/src/client/library/LibraryActions.tsx +32 -7
- package/src/client/library/LibraryPanel.tsx +23 -3
- package/src/client/library/RestorePlanView.tsx +9 -66
- package/src/client/locales.ts +62 -9
- package/src/client/lucide-icons.d.ts +1 -0
- package/src/client/market/MarketPanel.tsx +13 -2
- package/src/client/market/MyConfigsView.tsx +5 -4
- package/src/client/market/MyConfigsWizard.tsx +10 -8
- package/src/client/market/market-api.test.ts +9 -8
- package/src/client/market/market-api.ts +2 -2
- package/src/client/market/market-locales.ts +3 -0
- package/src/client/market/market-view.test.ts +6 -6
- package/src/client/market/market-view.ts +3 -3
- package/src/client/market/my-configs-api.ts +2 -2
- package/src/client/market/my-configs-view.test.ts +23 -22
- package/src/client/market/my-configs-view.ts +8 -8
- package/src/client/recovery/IncompleteCopiesSection.tsx +2 -1
- package/src/client/recovery/RecoveryPanel.tsx +442 -283
- package/src/client/recovery/RollbackCard.tsx +859 -0
- package/src/client/recovery/RollbackDiffPane.tsx +69 -0
- package/src/client/recovery/RollbackFileChanges.tsx +163 -0
- package/src/client/recovery/incident-api.ts +2 -2
- package/src/client/recovery/recovery-api.ts +144 -6
- package/src/client/recovery/recovery-locales.test.ts +299 -0
- package/src/client/recovery/recovery-locales.ts +520 -149
- package/src/client/recovery/recovery-panel-layout.test.ts +132 -2
- package/src/client/recovery/rollback-enabled.ts +41 -0
- package/src/client/recovery/rollback-file-changes.test.ts +114 -0
- package/src/client/recovery/session-dialog-mount.test.ts +54 -0
- package/src/client/run-store.ts +84 -21
- package/src/client/sync/AutosyncCard.tsx +25 -1
- package/src/client/sync/ChannelClearConfirmDialog.tsx +6 -3
- package/src/client/sync/ChannelConfigDialog.tsx +10 -10
- package/src/client/sync/DecryptPasswordCard.tsx +2 -2
- package/src/client/sync/SecurityOptionsCard.tsx +27 -17
- package/src/client/sync/SyncChannelEntryCard.tsx +14 -2
- package/src/client/sync/SyncConfirmView.tsx +46 -8
- package/src/client/sync/SyncLogList.tsx +1 -1
- package/src/client/sync/SyncPanel.tsx +31 -23
- package/src/client/sync/SyncRepositoryPicker.tsx +3 -5
- package/src/client/sync/SyncSectionPickerDialog.tsx +11 -2
- package/src/client/sync/SyncSettingsView.test.ts +20 -1
- package/src/client/sync/UnreadableSnapshotsBanner.tsx +1 -1
- package/src/client/sync/WorkDirCard.tsx +112 -0
- package/src/client/sync/history-model.test.ts +42 -9
- package/src/client/sync/history-model.ts +30 -15
- package/src/client/sync/sync-api.test.ts +57 -33
- package/src/client/sync/sync-api.ts +80 -6
- package/src/client/sync/sync-locales.ts +104 -3
- package/src/client/sync/sync-view-v2.test.ts +65 -13
- package/src/client/sync/sync-view.test.ts +107 -52
- package/src/client/sync/sync-view.ts +124 -41
- package/src/core/analyzer.ts +31 -9
- package/src/core/backup-plan.test.ts +48 -5
- package/src/core/backup-plan.ts +51 -20
- package/src/core/backup-verify.ts +24 -23
- package/src/core/backup.test.ts +76 -0
- package/src/core/backup.ts +105 -29
- package/src/core/boot-rescue.ts +4 -3
- package/src/core/boot-safety.ts +2 -1
- package/src/core/command-rollback.test.ts +536 -0
- package/src/core/command-rollback.ts +406 -0
- package/src/core/consult-source.ts +7 -6
- package/src/core/disk-usage.test.ts +257 -1
- package/src/core/disk-usage.ts +134 -14
- package/src/core/engine-locale.test.ts +593 -0
- package/src/core/engine-locale.ts +175 -0
- package/src/core/exporter.ts +3 -3
- package/src/core/fork-reconcile.test.ts +279 -0
- package/src/core/fork-reconcile.ts +234 -0
- package/src/core/journal.ts +6 -5
- package/src/core/local-plugin-host.ts +3 -2
- package/src/core/local-plugin-pack.ts +11 -6
- package/src/core/messages-core.ts +661 -0
- package/src/core/messages.ts +125 -17
- package/src/core/migration-consult.ts +21 -20
- package/src/core/migration-history.ts +19 -5
- package/src/core/model-tools.ts +28 -27
- package/src/core/phase3-host.ts +21 -5
- package/src/core/phase3-p2b-fingerprint.test.ts +22 -0
- package/src/core/plugin-cli.ts +18 -19
- package/src/core/plugin-data-registry.test.ts +113 -0
- package/src/core/plugin-data-registry.ts +261 -0
- package/src/core/reconcile.test.ts +117 -0
- package/src/core/reconcile.ts +85 -17
- package/src/core/recovery-orchestrator.ts +19 -18
- package/src/core/reinstall.ts +26 -21
- package/src/core/restore.ts +20 -17
- package/src/core/rollback-file-diff.test.ts +159 -0
- package/src/core/rollback-gate.test.ts +66 -0
- package/src/core/rollback-gate.ts +61 -0
- package/src/core/rollback-ignore-rules.ts +126 -0
- package/src/core/rollback-ledger.test.ts +655 -0
- package/src/core/rollback-ledger.ts +1314 -0
- package/src/core/rollback-point.test.ts +2853 -0
- package/src/core/rollback-point.ts +4340 -0
- package/src/core/rollback.ts +5 -3
- package/src/core/run-registry.ts +6 -5
- package/src/core/session-health.ts +15 -0
- package/src/core/session-meta.test.ts +117 -1
- package/src/core/session-meta.ts +149 -2
- package/src/core/session-title.test.ts +127 -0
- package/src/core/session-title.ts +189 -0
- package/src/core/startup-barrier.test.ts +69 -0
- package/src/core/startup-barrier.ts +27 -0
- package/src/core/transaction-coordinator.ts +4 -3
- package/src/core/types.ts +37 -1
- package/src/core/validator.ts +5 -4
- package/src/core/verify-recovery.ts +31 -30
- package/src/foreign/bundle.ts +3 -2
- package/src/foreign/continue.ts +2 -1
- package/src/foreign/crush.ts +2 -1
- package/src/foreign/file-budget.test.ts +2 -0
- package/src/foreign/gemini.ts +2 -1
- package/src/foreign/goose.ts +2 -1
- package/src/foreign/kilocode.ts +2 -1
- package/src/foreign/kimi.ts +2 -1
- package/src/foreign/messages.ts +44 -0
- package/src/foreign/mimocode.ts +2 -1
- package/src/foreign/openclaw.ts +2 -1
- package/src/foreign/opencode.ts +2 -1
- package/src/foreign/pi.ts +2 -1
- package/src/foreign/qoder.ts +2 -1
- package/src/foreign/qwen.ts +2 -1
- package/src/foreign/registry.test.ts +1 -1
- package/src/foreign/registry.ts +8 -7
- package/src/foreign/teleagent.ts +2 -1
- package/src/foreign/workbuddy.ts +2 -1
- package/src/foreign/zcode.ts +2 -1
- package/src/foreign/zed.ts +2 -1
- package/src/index.facade.test.ts +340 -1
- package/src/index.ts +876 -57
- package/src/market/git-file-writer.ts +20 -19
- package/src/market/github-repos.test.ts +23 -0
- package/src/market/github-repos.ts +37 -19
- package/src/market/index-parser.ts +31 -30
- package/src/market/messages-market.ts +325 -0
- package/src/market/my-repo.ts +32 -29
- package/src/market/prepare.ts +18 -15
- package/src/market/security.ts +20 -19
- package/src/market/types.ts +2 -1
- package/src/market/url.ts +2 -1
- package/src/migrations/index.ts +6 -5
- package/src/migrations/messages-migrations.ts +59 -0
- package/src/profiles/dsh-profile-launcher.ts +2 -1
- package/src/profiles/dsh-profile-runtime.ts +2 -1
- package/src/profiles/messages.ts +31 -0
- package/src/routes/backup.ts +18 -2
- package/src/routes/import.ts +3 -3
- package/src/routes/index.ts +1 -1
- package/src/routes/kit.ts +9 -3
- package/src/routes/market.ts +1 -1
- package/src/routes/messages.ts +106 -0
- package/src/routes/prefs.ts +31 -2
- package/src/routes/profiles.ts +12 -6
- package/src/routes/recovery.test.ts +405 -1
- package/src/routes/recovery.ts +477 -94
- package/src/routes/snapshots.ts +51 -4
- package/src/routes/sync.ts +82 -17
- package/src/schema/config.ts +53 -20
- package/src/schema/index.ts +7 -5
- package/src/schema/manifest-schema.test.ts +4 -4
- package/src/schema/manifest.ts +19 -18
- package/src/schema/messages.ts +120 -0
- package/src/schema/registry.test.ts +28 -7
- package/src/schema/section-registry.ts +96 -42
- package/src/schema/types.ts +2 -1
- package/src/schema/versions.ts +6 -5
- package/src/security/encryption.ts +16 -15
- package/src/security/integrity.ts +8 -7
- package/src/security/messages.ts +87 -0
- package/src/security/redaction.test.ts +17 -1
- package/src/security/redaction.ts +13 -0
- package/src/security/secret-scanner.ts +19 -12
- package/src/security/security.test.ts +47 -0
- package/src/security/vault.ts +2 -1
- package/src/security/zip-security.ts +4 -3
- package/src/sync/ancestor.ts +2 -1
- package/src/sync/autosync-config.ts +21 -0
- package/src/sync/autosync-scheduler.test.ts +63 -7
- package/src/sync/autosync-scheduler.ts +118 -78
- package/src/sync/backup-files.ts +3 -2
- package/src/sync/backup-scheduler.ts +6 -5
- package/src/sync/blob-store.ts +2 -1
- package/src/sync/git/git-transport.test.ts +170 -8
- package/src/sync/git/git-transport.ts +176 -2
- package/src/sync/github-auth.ts +10 -9
- package/src/sync/layout.ts +13 -12
- package/src/sync/messages.ts +153 -0
- package/src/sync/review-queue.ts +6 -5
- package/src/sync/s3/messages.ts +16 -0
- package/src/sync/s3/s3-providers.ts +9 -6
- package/src/sync/s3/s3-transport.ts +1 -1
- package/src/sync/s3/sigv4.ts +3 -1
- package/src/sync/snapshot-crypto.ts +6 -5
- package/src/sync/snapshot-json.ts +3 -2
- package/src/sync/sync-credentials.test.ts +119 -0
- package/src/sync/sync-engine-download-tombstone.test.ts +1 -1
- package/src/sync/sync-engine.test.ts +226 -8
- package/src/sync/sync-engine.ts +154 -52
- package/src/sync/sync-history.ts +7 -6
- package/src/sync/sync-selection.test.ts +12 -2
- package/src/sync/sync-selection.ts +18 -5
- package/src/sync/transport.test.ts +1 -0
- package/src/sync/ui-prefs.test.ts +44 -1
- package/src/sync/ui-prefs.ts +39 -0
- package/src/sync/webdav/webdav-transport.ts +4 -1
- package/src/ui/artifact-view.ts +4 -3
- package/src/ui/commands.test.ts +1 -0
- package/src/ui/commands.ts +11 -1
- package/src/ui/diff-view.test.ts +9 -1
- package/src/ui/diff-view.ts +22 -0
- package/src/ui/disk-usage-view.test.ts +113 -6
- package/src/ui/disk-usage-view.ts +63 -7
- package/src/ui/errors.ts +4 -3
- package/src/ui/export-flow.ts +26 -20
- package/src/ui/foreign-view.test.ts +43 -0
- package/src/ui/foreign-view.ts +30 -3
- package/src/ui/i18n.ts +131 -2
- package/src/ui/import-wizard.ts +18 -10
- package/src/ui/progress.ts +2 -2
- package/src/ui/report.ts +7 -6
- package/src/ui/rollback-view.test.ts +836 -0
- package/src/ui/rollback-view.ts +1405 -0
- package/src/ui/selection-model.test.ts +33 -1
- package/src/ui/selection-model.ts +53 -0
- package/src/ui/session-inventory-view.test.ts +109 -0
- package/src/ui/session-inventory-view.ts +138 -3
- package/src/ui/session-issue-labels.test.ts +51 -0
- package/src/ui/session-issue-labels.ts +70 -0
- package/src/ui/sync-settings-view.test.ts +36 -0
- package/src/ui/sync-settings-view.ts +49 -0
- package/src/ui/test-helpers.ts +2 -1
- package/src/ui/types.ts +10 -4
- package/src/utils/atomic-write.ts +6 -5
- package/src/utils/bundle-scan.test.ts +2 -2
- package/src/utils/bundle-scan.ts +12 -1
- package/src/utils/env-lock.ts +83 -49
- package/src/utils/json.ts +7 -5
- package/src/utils/messages-utils.ts +232 -0
- package/src/utils/proxy.test.ts +25 -0
- package/src/utils/proxy.ts +19 -5
- package/src/utils/recursive-walk.test.ts +43 -0
- package/src/utils/recursive-walk.ts +75 -1
- package/src/utils/session-log-repair.ts +10 -9
- package/src/utils/zip.ts +27 -26
- package/lib/core/checkpoint.d.ts +0 -362
- package/lib/core/checkpoint.js +0 -1309
- package/src/core/checkpoint.test.ts +0 -665
- package/src/core/checkpoint.ts +0 -1614
package/README.zh-CN.md
CHANGED
|
@@ -60,11 +60,11 @@ DSH 是你的 AI 助手工作台,里面存着你的各种设置:模型配置
|
|
|
60
60
|
|
|
61
61
|
### 在多台电脑间同步 DSH 配置
|
|
62
62
|
|
|
63
|
-
通过私有 Git
|
|
63
|
+
通过私有 Git 仓库、WebDAV、S3 兼容对象存储(AWS S3 / 阿里云 OSS / 腾讯 COS / MinIO / 七牛 Kodo)或 GitHub Gist 在多台电脑间保持可移植配置同步——密钥默认不参与同步(同步载荷会被 SecretScanner 剥离);勾选「导出密钥」并设置加密密码后,`~/.dsh/.credentials.yaml` 会以 scrypt + AES-256-GCM 密文随加密快照上行,换机后可随同步写回本机凭据,远端(仓库 / WebDAV / 对象存储 / Gist)全程只见密文。
|
|
64
64
|
|
|
65
65
|
### 定时自动全量备份
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
在首页的「定时备份」卡里开启(6h / 12h / 24h / 7d,或自定义「每周固定星期与时刻」),DSH 会在后台按周期悄悄保留一份全新的全量配置备份——密钥永不包含,无需密码也能安心躺在磁盘上;保留多少份由同一张卡的「保留策略」(最近 N 份 + 每月 1 份 + 每年 1 份)决定,连续失败会在卡里标红。
|
|
68
68
|
|
|
69
69
|
### 从配置市场发现并安装共享配置
|
|
70
70
|
|
|
@@ -74,6 +74,10 @@ DSH 是你的 AI 助手工作台,里面存着你的各种设置:模型配置
|
|
|
74
74
|
|
|
75
75
|
你在这台机器上已经用过别的 AI 编程 Agent,配置和历史对话都在?选一个来源,本插件会把它**翻译成标准 bundle**(MCP、技能、全局指令、历史会话及其所属工作区),再交给同一条「先审后写」的导入流程:预览 → 逐项冲突决策 → 自动快照 → 应用 → 可回滚。共识别 **30 个来源**,其中 **29 个**可一并迁移**历史会话**。密钥**值**绝不读取,只记下名字供导入计划提示补录。
|
|
76
76
|
|
|
77
|
+
### 回到对话里的某一刻(对话回退)
|
|
78
|
+
|
|
79
|
+
聊着聊着发现「这条消息把方向带偏了,我想从那一刻重来」?每条用户消息旁都有 **↺ 回退到这一刻**:它开出一条**新的分支对话**从那一刻继续,**原对话不改写、归档保留**;需要的话可以把**工作区文件**也一起退回去——动手前先给你逐文件差异与增删行数。留点按回合自动做,不需要你手动拍点。
|
|
80
|
+
|
|
77
81
|
---
|
|
78
82
|
|
|
79
83
|
## 🆚 与其它备份 / 同步插件的区别
|
|
@@ -83,7 +87,7 @@ DSH 生态里这个方向有几个插件,它们解决的问题并不相同—
|
|
|
83
87
|
| 插件 | 最擅长 | 本插件更进一步的地方 |
|
|
84
88
|
|---|---|---|
|
|
85
89
|
| [xiaoyuyu6420/dsh-backup](https://github.com/xiaoyuyu6420/dsh-backup) | 一条命令从 CLI 给整个 `~/.dsh` 打快照,另有会话体检 / 升级快照 / 救援控制台 | 写盘前可审阅的 GUI 流程(dry-run 预览、冲突逐项决策、失败自动回滚)、跨机路径重映射、加密凭据载荷、配置市场 |
|
|
86
|
-
| [muyifc/dsh-config-sync](https://github.com/muyifc/dsh-config-sync) | 把 DSH 配置导出/导入成可移植的密码加密文件,可被工具调用 | 13–14 个分区(插件 / MCP / 技能 / 工作区 / 会话日志
|
|
90
|
+
| [muyifc/dsh-config-sync](https://github.com/muyifc/dsh-config-sync) | 把 DSH 配置导出/导入成可移植的密码加密文件,可被工具调用 | 13–14 个分区(插件 / MCP / 技能 / 工作区 / 会话日志 …)、定时备份、四条同步通道(Git / WebDAV / 对象存储 / Gist)、会话跨机迁移与路径重定基 |
|
|
87
91
|
| [dickpy/dsh-cloud-sync](https://github.com/dickpy/dsh-cloud-sync) · [weibaohui/dsh-sync](https://github.com/weibaohui/dsh-sync) | 通过 WebDAV / S3 或私有 Git 镜像让多台机器保持一致 | 同步只是本插件五项能力之一——另有导出/导入、定时备份、配置市场与档案实例启停 |
|
|
88
92
|
| `cp -r ~/.dsh`(或给 home 目录挂 Git) | 免费、零配置,纯文本配置够用 | 不处理密钥、不做路径重映射、抓不到 `link:` / `file:` 安装的本地插件、不动会话日志、没有冲突处理与回滚 |
|
|
89
93
|
|
|
@@ -95,24 +99,25 @@ DSH 生态里这个方向有几个插件,它们解决的问题并不相同—
|
|
|
95
99
|
|
|
96
100
|
| 图标 | 功能 | 一句话说明 |
|
|
97
101
|
|:---:|---|---|
|
|
98
|
-
| 🚀 | **一键导出** |
|
|
102
|
+
| 🚀 | **一键导出** | 打开导出流程,默认已勾好推荐分区,点一下打包成 ZIP(可逐分区 / 逐条目调整) |
|
|
99
103
|
| 📦 | **一键导入** | 在另一台电脑点一下,环境就回来了 |
|
|
100
|
-
| 👀 | **先预览再导入** |
|
|
101
|
-
| ⚔️ | **冲突处理** |
|
|
104
|
+
| 👀 | **先预览再导入** | 先看「迁移前咨询」的结论与依据,再逐项选内容、逐项解决冲突,**绝不偷偷改你的配置** |
|
|
105
|
+
| ⚔️ | **冲突处理** | 遇到同名配置,让你自己选:保留当前 / 使用备份(可批量) |
|
|
102
106
|
| 🗺️ | **路径自动映射** | 换了电脑路径变了?自动检测并让你重新指定 |
|
|
103
107
|
| 🔒 | **密钥安全** | API Key 默认不导出;非加密导入后提醒重新填写,加密备份用密码解锁恢复 |
|
|
104
108
|
| ↩️ | **自动回滚** | 导入失败自动恢复原样,不会弄坏现有配置 |
|
|
105
|
-
| 📸 | **快照恢复** |
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
109
|
+
| 📸 | **快照恢复** | 在产物库对某份导入前快照点「恢复」:先看逐行对照的恢复计划,确认后整文件还原 + 卸载新增插件(CLI 与 GUI 均支持) |
|
|
110
|
+
| ↺ | **对话回退** | 聊天里每条用户消息旁都能「回退到这一刻」:开出新分支对话、原对话归档保留;可勾选把工作区文件一起退回,动手前先看逐文件差异(与「快照恢复」不是同一件事) |
|
|
111
|
+
| 🔄 | **远程同步** | 通过 **Git 私有仓库 / WebDAV / S3 兼容对象存储 / GitHub Gist** 推送 / 拉取可移植配置,四条通道各配各的(密钥默认不参与同步;加密快照可选携带密文凭据) |
|
|
112
|
+
| ⏰ | **定时全量备份** | 按固定周期(6h / 12h / 24h / 7d 或自定义每周固定时刻)自动全量备份,一劳永逸,密钥永不包含 |
|
|
113
|
+
| 🛒 | **配置市场** | 浏览并一键安装社区分享的配置——供应链警示 + 逐项内容选择(可就地看到改动与高风险分区);入口在产物库底栏「逛市场 / 发布到市场」或 ⌘K |
|
|
114
|
+
| 🗂️ | **档案 Profiles(DSH profile)** | 在「环境 → 档案」里直接管理 `$DSH_HOME/profiles/<name>`:列表 / 新建(官方模板)/ 重命名 / 物理删除 / **启动该档案(独立实例)** / **停止实例**(行内按钮按运行状态在「启动 ↔ 停止」间切换) |
|
|
110
115
|
| 🧩 | **本地插件随备份迁移** | `link:` / `file:` 安装的本地开发插件会被打包进备份,换机不再丢失 |
|
|
111
116
|
| 🗄️ | **保留策略可配(GFS 分层)** | 「最近 N 份 + 每月留 1 份 + 每年留 1 份」,默认值等价旧行为 |
|
|
112
117
|
| 🌐 | **双语界面** | 界面、报告与错误详情跟随 DSH 应用语言(中文 / English) |
|
|
113
118
|
| 🤖 | **Agent 工具** | Agent 会话内直接备份 / 快照 / 恢复 / 同步 |
|
|
114
|
-
| 💾 | **磁盘占用体检** |
|
|
115
|
-
| ⬆️ | **版本更新检查** |
|
|
119
|
+
| 💾 | **磁盘占用体检** | 「环境 → 维护与诊断」逐项列出本插件自身占了多少盘(备份 / 快照 / 同步副本 / 缓存 / 暂存),三档回收策略一目了然;**一键清理只碰可重建缓存与过期备份**,快照与同步数据永不在此删除 |
|
|
120
|
+
| ⬆️ | **版本更新检查** | 「关于」面板(导航右上角的图标)只读探测 npm 上的最新版本(缓存 10 分钟);有新版本时既给可复制的升级命令,也提供一键**立即更新**(按该精确版本安装)——之后需重启 DSH 才生效,插件绝不代你重启;离线失败如实显示,不影响其它功能 |
|
|
116
121
|
| 🧭 | **兼容性讲清楚** | 导入前显示「来源 DSH 版本 / 平台 → 本机」,并用**结构化原因**解释评分(跨平台 / 分区缺失 / 版本超前…),而不是只丢一句「部分兼容」 |
|
|
117
122
|
| 🧳 | **从其它 AI Agent 导入** | 读取本机 Claude Code / Cursor / Codex / Hermes / Antigravity 等的配置**与历史会话**,翻译成标准 bundle,再走既有的预览 / 冲突 / 回滚流程导入 |
|
|
118
123
|
|
|
@@ -120,21 +125,13 @@ DSH 生态里这个方向有几个插件,它们解决的问题并不相同—
|
|
|
120
125
|
|
|
121
126
|
## 📸 功能截图
|
|
122
127
|
|
|
123
|
-
|
|
|
124
|
-
|:---:|:---:|
|
|
125
|
-
|  |  |
|
|
126
|
-
|
|
127
|
-
| 导出备份 | 导入预览 |
|
|
128
|
+
| 首页 | 产物库 |
|
|
128
129
|
|:---:|:---:|
|
|
129
|
-
|  |  |
|
|
130
131
|
|
|
131
|
-
|
|
|
132
|
+
| 同步(四条通道卡) | 环境 · 维护与诊断 |
|
|
132
133
|
|:---:|:---:|
|
|
133
|
-
|  |
|
|
134
|
+
|  |  |
|
|
138
135
|
|
|
139
136
|
---
|
|
140
137
|
|
|
@@ -152,10 +149,21 @@ DSH 生态里这个方向有几个插件,它们解决的问题并不相同—
|
|
|
152
149
|
|
|
153
150
|
```
|
|
154
151
|
选择 ZIP → 校验文件 → 检查完整性 → 检查版本 → 兼容性检查
|
|
155
|
-
→ 扫描内容 → 生成导入计划 →
|
|
156
|
-
→
|
|
152
|
+
→ 扫描内容 → 生成导入计划 → 迁移前咨询(结论 + 依据)
|
|
153
|
+
→ 选择要导入的内容 → 冲突逐项决策 → 路径映射 / 补录密钥
|
|
154
|
+
→ 确认导入 → 自动备份当前配置 → 执行导入 → 验证 → 完成
|
|
157
155
|
│
|
|
158
|
-
└─ 中途失败?→
|
|
156
|
+
└─ 中途失败?→ 自动恢复原样(回滚,可在确认页关闭)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 回退(回到对话里的某一刻)
|
|
160
|
+
|
|
161
|
+
每个回合自动留一个回滚点(工作区态 = 那一轮**开始之前**),随时可以退回那一刻:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
在聊天里点某条用户消息旁的「↺ 回退」 → 预览这次要改哪些文件、增删多少行
|
|
165
|
+
→ 确认 → 新分支对话接替那一刻继续,原对话归档保留
|
|
166
|
+
→ 退错了?回退前自动留的「救援点」还能再退回来
|
|
159
167
|
```
|
|
160
168
|
|
|
161
169
|
---
|
|
@@ -196,7 +204,7 @@ dsh plugin --profile web add dsh-config-manager@latest
|
|
|
196
204
|
> dsh plugin --profile web add "dsh-config-manager@$(npm view dsh-config-manager version)"
|
|
197
205
|
> ```
|
|
198
206
|
>
|
|
199
|
-
> 重启 DSH 后,可在 **设置 → 备份与迁移 →
|
|
207
|
+
> 重启 DSH 后,可在 **设置 → 备份与迁移 → 导航右上角的「关于」图标** 看到实际运行的版本(版本变化时也会自动弹出更新内容)。
|
|
200
208
|
|
|
201
209
|
### 从 GitHub 源码安装(`git+https://...`)
|
|
202
210
|
|
|
@@ -248,40 +256,53 @@ allowBuilds:
|
|
|
248
256
|
|
|
249
257
|
## 🚀 快速上手(3 分钟体验)
|
|
250
258
|
|
|
259
|
+
> **界面速览**:一级只有 4 页 —— **首页**(这台机器现在怎么样 + 立即备份 / 导出 / 导入 / 远程同步四个动作)、**产物库**(本机快照 / 备份文件 / 远端快照 / 市场配置,所有「东西」都在这张列表里)、**同步**(Git / WebDAV / 对象存储 / Gist 四张通道卡)、**环境**(档案 / 维护与诊断)。**导出、导入、逛市场、发布到市场**是**流程面板**:从首页工具栏或产物库底栏打开,切到别的页就收起、切回来接着做。导航右上角四个图标分别是 ⌘K 命令面板、活动记录、迁移历史、关于。
|
|
260
|
+
|
|
251
261
|
```
|
|
252
262
|
电脑 A(导出)
|
|
253
|
-
1. 打开 DSH → 设置 →
|
|
254
|
-
2.
|
|
255
|
-
3.
|
|
263
|
+
1. 打开 DSH → 设置 → 「备份与迁移」→ 首页
|
|
264
|
+
2. 点工具栏「导出」→ 面板里默认已勾好推荐分区(要改就点「选择要导出的内容」逐分区 / 逐条目调整)
|
|
265
|
+
3. 点「开始导出」→ 完成后自动下载得到 dsh-config-<日期>-<随机后缀>.zip(报告里可确认没有密钥)
|
|
256
266
|
|
|
257
267
|
把 ZIP 拷到电脑 B(导入)
|
|
258
|
-
1. 打开 DSH →
|
|
259
|
-
2. 选择 ZIP → 等待分析 →
|
|
260
|
-
3.
|
|
261
|
-
4.
|
|
262
|
-
5.
|
|
263
|
-
6.
|
|
264
|
-
7.
|
|
268
|
+
1. 打开 DSH → 「备份与迁移」→ 首页点「导入」(或产物库底栏「从文件导入」)
|
|
269
|
+
2. 选择 ZIP → 等待分析 → 先读「迁移前咨询」的结论与依据 → 点「下一步:选择要导入的内容」
|
|
270
|
+
3. 逐项勾选要导入的内容(不勾选的既不导入、也不进快照)
|
|
271
|
+
4. 有路径问题?→ 在「路径映射」里填新路径(支持批量前缀映射)
|
|
272
|
+
5. 有同名配置冲突?→ 逐项选「保留当前 / 使用备份」(可一键全选其一)
|
|
273
|
+
6. 「确认导入」→ 等待执行(执行前自动创建安全快照;「失败时整体回滚」可在确认页关闭)
|
|
274
|
+
7. 按提示补录缺失的 API Key
|
|
275
|
+
8. ✅ 设置 / 插件 / MCP / 技能 / 工作区 / 全局指令(AGENTS.md)都回来了
|
|
265
276
|
```
|
|
266
277
|
|
|
267
278
|
---
|
|
268
279
|
|
|
269
280
|
## 🧩 功能详解
|
|
270
281
|
|
|
271
|
-
### 📤
|
|
282
|
+
### 📤 导出(一个流程 + 内容选择器)
|
|
283
|
+
|
|
284
|
+
打开「导出」流程面板(首页工具栏「导出」,或产物库底栏「手动导出」),一屏完成:
|
|
272
285
|
|
|
273
|
-
|
|
|
286
|
+
| 区域 | 说明 |
|
|
274
287
|
|---|---|
|
|
275
|
-
|
|
|
276
|
-
|
|
|
288
|
+
| 选择要导出的内容 | 打开内容选择器:**分区 → 最小可拆单元**逐项勾选;默认已勾好推荐分区(可移植、非设备专属),随时可改 |
|
|
289
|
+
| 安全选项 | 「加密备份」(scrypt + AES-256-GCM)与「导出密钥」两个独立开关;勾选导出密钥会自动联动加密(密钥绝不明文) |
|
|
290
|
+
| 文件名与备注 | 自定义文件名与备注(备注让你在产物库里搜得到),非法字符由字段错误提示当场指出 |
|
|
291
|
+
| 本次将导出 | 恒常显示的构成卡:真正会进包的每个分区与条目数、合计大小;**读不到的分区如实显示「读取中 / 读取失败」,不伪报 0** |
|
|
292
|
+
| 结果 | 完成后**自动下载**到浏览器下载目录(报告里也可再下载);报告逐条列出分区与告警 |
|
|
277
293
|
|
|
278
|
-
>
|
|
294
|
+
> 导出只读、不写任何配置。文件内含清单 + 各分区数据 + SHA-256 校验和,默认命名 `dsh-config-<日期>-<6 位随机>.zip`(撞名自动递进,不覆盖已有备份)。
|
|
295
|
+
|
|
296
|
+
**导出补充:**
|
|
297
|
+
- **导出前就能看**:构成卡在导出之前就给出会进包的分区与预估体积(不含密钥),不必先导出再翻报告
|
|
298
|
+
- **自定义文件名与备注**:文件名默认自动生成,也可自己起名;备注会显示在产物库的**「备份文件」**列表里(备注随 `self` 分区一起被备份 / 同步带走)
|
|
279
299
|
|
|
280
300
|
### 📥 导入(安全流程)
|
|
281
301
|
|
|
282
302
|
- **未确认不写入**:分析、预览阶段零修改
|
|
283
303
|
- **先备份再导入**:执行前自动备份将被修改的配置
|
|
284
304
|
- **失败自动回滚**:按你的选择整体回滚或跳过失败项继续
|
|
305
|
+
- **导入后的下一步清单**:结果页会列出需要重启 DSH 的项(按插件 / MCP)、待补录的凭据,以及可重试的失败 / 跳过项
|
|
285
306
|
|
|
286
307
|
### 👀 导入预览(Dry Run)
|
|
287
308
|
|
|
@@ -299,8 +320,10 @@ allowBuilds:
|
|
|
299
320
|
|
|
300
321
|
| 选项 | 含义 |
|
|
301
322
|
|---|---|
|
|
302
|
-
|
|
|
303
|
-
|
|
|
323
|
+
| **保留当前** | 不动目标机现有的配置 |
|
|
324
|
+
| **使用备份** | 用备份里的配置覆盖 |
|
|
325
|
+
|
|
326
|
+
列表顶部还有「全部保留当前配置 / 全部使用备份配置」两个批量按钮。
|
|
304
327
|
|
|
305
328
|
> 说明:刻意**不提供**「稍后决定 / 再看看」选项——未决的冲突会让导入无法继续,每个冲突都必须在继续前做出选择。
|
|
306
329
|
|
|
@@ -320,7 +343,7 @@ allowBuilds:
|
|
|
320
343
|
- **会带走什么** —— MCP Servers、技能、全局指令(落成 `AGENTS.md`),以及**历史会话连同这些对话所属的工作区**(29 个来源;会话会重新编码成 DSH 的会话日志格式,并按它记录的 `cwd` 归位)。
|
|
321
344
|
- **不会带走什么** —— 密钥**值**一律不读:只记录键名,由导入计划提示补录。DSH 没有对等结构的东西(Claude Code 的 hooks、斜杠命令等)会**报出明确的码**,不会静默丢掉。
|
|
322
345
|
- **如实跳过** —— 没记录 `cwd` 的对话无处归位,会列为跳过(绝不猜进别的项目);已知的有损项在导入**之前**就摆明。
|
|
323
|
-
- **入口** ——
|
|
346
|
+
- **入口** —— 首页工具栏「导入」→ 面板里的**「从其它 agent 导入」**(首页另有直达入口)、⌘K 的「从其它 agent 导入」,或 CLI:`dcm import --from <来源> [--dry-run] [--out <路径>]`。
|
|
324
347
|
|
|
325
348
|
### 🔒 密钥处理
|
|
326
349
|
|
|
@@ -331,27 +354,32 @@ allowBuilds:
|
|
|
331
354
|
| 加密备份导入 | 必须输入导出时的加密密码解锁:输入→验证密码→凭据自动恢复,**无密码无法导入** |
|
|
332
355
|
| 非加密导入后 | 提示「3 个密钥需要重新填写」,输入后仅保存在内存中写入 |
|
|
333
356
|
|
|
334
|
-
### 🔄
|
|
357
|
+
### 🔄 远程同步(四条通道)
|
|
335
358
|
|
|
336
|
-
|
|
359
|
+
「同步」页把每条通道列成一张卡,**四张恒显示**(未配置的是矮态,点卡里的按钮配置)——Git 私有仓库 / WebDAV 服务器 / 对象存储(S3 兼容:AWS S3、阿里云 OSS、腾讯 COS、MinIO、七牛 Kodo)/ GitHub Gist:
|
|
337
360
|
|
|
338
|
-
| |
|
|
361
|
+
| 通道 | 端点(非密字段) | 凭据(只进 DSH credentials,绝不回读) |
|
|
339
362
|
|:---:|---|---|
|
|
340
|
-
|
|
|
341
|
-
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
363
|
+
| **Git 私有仓库** | `repoUrl`(可直接从当前 token 可见的**私有**仓库里选,或就地新建一个私有仓库) | 访问令牌 → `DSH_CONFIG_MANAGER_SYNC_TOKEN` |
|
|
364
|
+
| **WebDAV** | `webdav.url` | `username` 存配置、可在界面回显;**密码永不同步、永不记日志** → `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` |
|
|
365
|
+
| **对象存储(S3 兼容)** | 端点 / region / bucket / 对象键前缀 / AccessKey ID(标识符,可回显) | AccessKey Secret → 该通道自己的凭据槽位(同步文件里只留「已配置」标记) |
|
|
366
|
+
| **GitHub Gist** | gist id / API 根 / 文件名前缀 | Gist token → 该通道自己的凭据槽位 |
|
|
367
|
+
|
|
368
|
+
- **每条通道各配各的**:同步分区、自动同步(开关 + 兜底轮询间隔)、加密与「导出密钥」、远端快照、加密 / 解密密码都**按通道独立**,在它自己那张卡内配置(已配置的卡可折叠,免得 4 张全展开撑爆画布)。
|
|
369
|
+
- **远端保留跟本地同一套策略**:按你的备份计划保留——默认最新 **10** 个快照,可另设「每月 1 份 / 每年 1 份」分层;刚推上去的那份恒保留,更旧的自动删除。
|
|
370
|
+
- **切换通道重新开始**:各通道的远端快照 / 共同祖先**互不共享**。换一条通道(或断开重配)就是从新远端的空基线重新开始——请先推送一个新快照。
|
|
345
371
|
- **WebDAV 认证**采用 HTTP Basic:`username` 存配置、可在界面回显;`password` 则实时从 DSH credentials 槽位 `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` 读取——绝不出现于任何同步文件或日志。
|
|
346
|
-
- **插件自动安装**:拉取差异时,备份里新增的插件会在确认导入时**自动安装**,无需在差异列表里逐项手动勾选;只有**版本冲突**的插件仍需要你决定「保留当前 /
|
|
372
|
+
- **插件自动安装**:拉取差异时,备份里新增的插件会在确认导入时**自动安装**,无需在差异列表里逐项手动勾选;只有**版本冲突**的插件仍需要你决定「保留当前 / 使用备份」。
|
|
373
|
+
- **推送前先预览**:「推送」按钮先给出只读预览(分区 + 各分区条目数 + 相对基线的改动标记;没有基线时提示这是首个基线),确认后才真正写远端。
|
|
347
374
|
- **密钥默认不同步**:同步载荷逐分区过 `SecretScanner`(敏感字段值剥离),凭据分区结构性排除。勾选「导出密钥」并设置加密密码后,`~/.dsh/.credentials.yaml` 以 scrypt + AES-256-GCM 密文作为**独立凭据载荷**随加密快照上行(不放进任何分区);拉取侧解密后生成逐条「凭据迁移」项,你确认采纳才写回本机凭据(`credentials.set`)。加密/解密密码保存在本机 DSH 凭据库(`~/.dsh/.credentials.yaml` 的独立槽位):勾选「加密备份」后自动记住(输入框留空即沿用),取消勾选或点「删除已保存密码」即清除 —— 密码绝不写入同步文件、响应、日志或导出备份,也绝不回传浏览器;解密密码只在拉取的快照确实加密时才会被使用。**自动同步恒不含凭据**(无密码可用,遇到加密快照会跳过)。
|
|
348
375
|
|
|
349
376
|
### 🛒 配置市场(Marketplace)
|
|
350
377
|
|
|
351
|
-
浏览并一键安装社区分享的现成配置(模型 / Provider、插件、MCP、技能、Agent
|
|
378
|
+
浏览并一键安装社区分享的现成配置(模型 / Provider、插件、MCP、技能、Agent 预设……)。入口在**产物库底栏的「逛市场 / 发布到市场」**(也可用 ⌘K)——它是**流程面板**,不是一级页面:
|
|
352
379
|
|
|
353
380
|
- **内置官方市场**——只读、绑定官方公开仓库(官方徽章,不可编辑);首次打开自动刷新,也支持手动拉取最新
|
|
354
|
-
-
|
|
381
|
+
- **搜索与筛选**——关键词搜索(匹配名称 / 描述 / 作者 / **分类**)、类别过滤、**分区筛选**(已下载过的条目会列出自己的分区,其余条目标注提示后排除)、来源筛选(官方 / 个人)、排序(最近更新 / ⭐ 最多 / 名称 A–Z),并显示**来源仓库**的 ⭐ star 数(匿名查询,不触碰任何 token)
|
|
382
|
+
- **影响预览**——详情页在确认之前就列出「装它会改什么」(更新项 / 一致项 / 冲突项 / 待补录密钥 / 需要重启 DSH)
|
|
355
383
|
- **供应链警示恒展示**——来源仓库 URL +「未经官方审核」+ 下载时间;**逐项内容选择**——选择页列出每个单元「本次将改动什么」并就地标出高风险分区(默认勾选,取消勾选即不导入、也不进快照);历史会话 / 任意文件类高风险内容仍直接禁止上架
|
|
356
384
|
- **安装复用安全导入管道**——分析 → 预览 → 自动备份 → 执行 → 回滚;确认前零写入
|
|
357
385
|
- **「我的配置」**——GitHub 登录(device flow)后一键上传到**你自己的公开仓库**,并自动向官方市场仓库提交**收录 PR**;管理已上传条目(收录状态徽章:未收录 / PR 待审核 / 已收录)、一键更新、装回本地、删除(自动下架 PR)
|
|
@@ -359,7 +387,7 @@ allowBuilds:
|
|
|
359
387
|
### 🗂️ 档案(Profiles = DSH 自带 profile)
|
|
360
388
|
|
|
361
389
|
「档案」就是 DSH 自己的 profile(`$DSH_HOME/profiles/<name>`)——一套**插件组合(bundles)+ 依赖 + patch 层**,
|
|
362
|
-
用 `dsh --profile <name>`
|
|
390
|
+
用 `dsh --profile <name>` 启动。「环境 → 档案」直接读写这个目录,不再自建一套「配置快照」:
|
|
363
391
|
|
|
364
392
|
| 动作 | 说明 |
|
|
365
393
|
|---|---|
|
|
@@ -369,16 +397,36 @@ allowBuilds:
|
|
|
369
397
|
| 删除 | **物理删除整个目录**(含 node_modules);当前运行中的档案需额外勾选确认 |
|
|
370
398
|
| 启动该档案 | **真正可用的切换**:以该档案另起一个**独立 DSH 实例**(自动挑空闲端口 + 自动打开浏览器),当前实例与正在跑的任务不受影响;只支持 **web 形态**档案:非 web 形态(如 base 模板)没有浏览器界面,点击后给出终端命令而不是静默失败 |
|
|
371
399
|
| 停止实例 | 该档案有实例在跑时,行内「启动」自动变成「停止」(运行状态卡里也有一个);先请它自己退出(优雅期),超时才结束进程树,并如实告诉你是哪种;**实例运行中拒绝物理删除该档案** |
|
|
372
|
-
| 不会重复启动 | 「哪些档案在跑」= 本插件启动的实例台账 ∪ **每个实例自报的心跳**(`<dataDir>/running/<profile>.json`,只含 pid/端口,**不含认证 token**)→ 哪怕某个档案是你手动 `dsh web`
|
|
400
|
+
| 不会重复启动 | 「哪些档案在跑」= 本插件启动的实例台账 ∪ **每个实例自报的心跳**(`<dataDir>/running/<profile>.json`,只含 pid/端口,**不含认证 token**)→ 哪怕某个档案是你手动 `dsh web` 起来的,「档案」子视图也不会再启动第二个同名实例(明确提示已在运行);**当前这个实例本身**不给停止按钮(停自己会把你自己杀掉——请关窗口/终端,或到启动它的那个实例里停止) |
|
|
373
401
|
|
|
374
402
|
> **为什么没有「设为下次启动」**(2026-09 该按钮与标记一并移除):DSH **没有「默认 / 下次启动 profile」这种状态** ——
|
|
375
403
|
> profile 只由启动参数决定(`dsh <名>` / `--profile <名>`,`dsh web` 是硬编码别名),任何「下次启动用哪个」的标记
|
|
376
|
-
> **都没有消费者**:你自己敲的 `dsh web` 重启后当然还是 web。真正可用的切换只有两种:①
|
|
404
|
+
> **都没有消费者**:你自己敲的 `dsh web` 重启后当然还是 web。真正可用的切换只有两种:① 「环境 → 档案」里的「启动该档案」
|
|
377
405
|
> 另起一个实例(不打断当前会话,随时可停);② 把启动命令/快捷方式换成 `dsh --profile <名>`
|
|
378
406
|
> (生态里的 dshm、DSH Launcher 也都是「外部启动器 spawn 实例」这一条路)。
|
|
379
407
|
> 本插件启动的实例记在 `<dataDir>/launches.json`(pid/端口/日志),所以**关得掉**;
|
|
380
408
|
> 第三方插件需要在该档案里单独安装(`dsh plugin --profile <name> add <pkg>`)。
|
|
381
409
|
|
|
410
|
+
### ↺ 对话回退(回到某一刻)
|
|
411
|
+
|
|
412
|
+
聊天里**每条用户消息**旁都有一个「↺ 回退到这一刻」——不用回设置页,也不用先导出什么:
|
|
413
|
+
|
|
414
|
+
| 动作 | 说明 |
|
|
415
|
+
|---|---|
|
|
416
|
+
| 回到那一刻 | 从那条消息之前继续:插件**开一条新的分支对话**接替它,**原对话归档保留**(内容不改写;会话列表里只留退回后的那条) |
|
|
417
|
+
| 只退对话 / 连文件一起退 | 默认只回溯对话;勾上「连工作区文件一起退回」才会动盘,动手前给出**逐文件差异**与增删行数 |
|
|
418
|
+
| 回退预览 | 先说清这次要改几个文件、增删多少行、删掉几个;**点文件名就能看这个文件的「现在 → 回退后」差异**(设置页的回滚面板与聊天气泡里是同一屏) |
|
|
419
|
+
| 自动救援点 | 每次回退前自动留一个保护点,退错了还能再退回来;每会话 20 个 / 全局 50 个,超出淘汰最旧的 |
|
|
420
|
+
| 回滚点台账 | 环境 → 维护与诊断 → 「查看回滚点」打开**回滚点台账**弹窗:按对话分组列出所有可回溯的时刻(显示对话真实标题),可单条删除 |
|
|
421
|
+
|
|
422
|
+
**留点是自动的**:每个回合自动记一个点(工作区 + 对话;工作区态 = 那一轮**开始之前**),不需要你手动拍点。点存放在 `$DSH_HOME/dsh-config-manager/rollback-points/`;升级前留下的旧三态检查点数据仍在磁盘上,本插件不再读取、也不删它。
|
|
423
|
+
|
|
424
|
+
**跳过你指定的目录**:在项目里放一个 `.dsh-rollback-ignore`(写法是 `.gitignore` 的常用子集)就能让留点与回退跳过匹配的目录与文件(`node_modules` 等依赖目录不可取消)。整个目录被跳过时,「该点之后新建的文件」的删除会**整体拒绝**(宁可不动)。
|
|
425
|
+
|
|
426
|
+
**两条诚实边界**:① 对话**正在运行**时默认只回溯消息、不动文件(避免和正在跑的工具抢盘),要连文件一起退请等这一轮结束后重新打开弹窗;② 一个点的捕获不完整时**绝不猜着删**——只有能证明「留点时不存在」的新建文件才会被删,证明不了就一个都不删,并如实告知。
|
|
427
|
+
|
|
428
|
+
**在聊天里直接用**:输入 `/rollback` 列出本对话可回溯的时刻;带上某个时刻的编号再输一次,就退到那一刻,不必离开聊天。
|
|
429
|
+
|
|
382
430
|
### 📸 快照恢复(撤销一次导入)
|
|
383
431
|
|
|
384
432
|
每次导入都会先创建**安全快照**。导入后如果觉得哪里不对劲,可以把目标环境恢复到导入前的状态:
|
|
@@ -387,17 +435,29 @@ allowBuilds:
|
|
|
387
435
|
|---|---|
|
|
388
436
|
| 整文件还原 | settings.yaml / settings.json / cordis.patch.yml 的 blob 写回 `$DSH_HOME`;快照时不存在、导入后新增的文件会被移除 |
|
|
389
437
|
| 插件卸载 | 导入期间新增的插件经官方 `dsh plugin remove` 卸载(与基线对比;旧快照无基线时只给提示) |
|
|
390
|
-
| 文件补偿 | skills / agentPresets / agentInstructions / pluginFiles / sessions 的 blob 写回原路径 |
|
|
438
|
+
| 文件补偿 | skills / agentPresets / agentInstructions / pluginFiles / pluginData / pluginAssets / sessions 的 blob 写回原路径 |
|
|
391
439
|
| 凭据 | DSH 不回读凭据值——只提示人工重新填写 |
|
|
392
440
|
|
|
393
|
-
**GUI
|
|
441
|
+
**GUI**:产物库 → 源筛选切到**「本机快照」**→ 行内 ⋯ → **「恢复」**→ 先看恢复计划(dry-run,零写入;git 风格的逐行对照)→ 确认执行。行内还有「查看与对比 / 迁移前咨询 / 置顶 / 删除」等能力,按该行是什么产物给。
|
|
394
442
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
443
|
+
**快照管理**:
|
|
444
|
+
|
|
445
|
+
- **保留份数可见**:保留多少份由你的**保留策略**决定(首页「定时备份」卡;默认保留最新 **10** 份),列表里有提示
|
|
446
|
+
- **置顶重要快照**:置顶的快照豁免自动清理,只能手动删除
|
|
447
|
+
- **手动删除**:不再需要这个回滚点时可直接删除(危险操作,有二次确认)
|
|
448
|
+
|
|
449
|
+
**备份文件**(产物库 → **「备份文件」**来源):
|
|
450
|
+
|
|
451
|
+
- 列出 `exports/` 里每一份导出 ZIP(手动导出 + 定时备份),带来源徽章、体积、时间与你写的**备注**
|
|
452
|
+
- 按文件名或备注**搜索**
|
|
453
|
+
- **查看与对比**:导入前先只读预览它包含什么(分区 + 各分区条目数)以及与当前配置的差异(零写入)
|
|
454
|
+
- 下载、直接导入恢复、删除
|
|
455
|
+
|
|
456
|
+
**磁盘占用**:在**环境 → 维护与诊断**的**「磁盘占用」卡**里,逐项列出本插件自己占用的空间
|
|
457
|
+
(导出备份 / 导入前快照 / 同步配置与工作副本 / 市场缓存 / 临时暂存 / 日志 / 事务日志 …),
|
|
458
|
+
标注每项的回收策略:**可随时重建**(缓存与暂存)、**有保留期**(导出产物 7 天、定时备份保留最近 N 个)、
|
|
459
|
+
**用户数据 / 安全网**(快照与同步,永不自动清理)。需要腾空间时点**「立即清理」**:
|
|
460
|
+
默认只清可重建的缓存与暂存;要回收过期备份文件需显式勾选「同时回收过期备份文件」(并二次确认)。
|
|
401
461
|
**快照与同步数据永远不会被这个按钮删掉**;目录读不到时如实显示「未统计」,不会伪报 0 字节。
|
|
402
462
|
|
|
403
463
|
---
|
|
@@ -415,19 +475,40 @@ npm install -g dsh-config-manager@latest --omit=peer
|
|
|
415
475
|
|
|
416
476
|
> ⚠️ 只安装/更新插件(`dsh plugin --profile web add ...`)只启用 GUI,**不会**产生 `dsh-config-manager` 命令。请先执行上面这条安装命令,然后使用下面任意命令。
|
|
417
477
|
|
|
418
|
-
全部命令(`dsh-config-manager help`
|
|
478
|
+
全部命令(`dsh-config-manager help` 也会按风险分组列出;`dsh-config-manager <命令> --help` 打印该命令的参数、退出码与示例):
|
|
419
479
|
|
|
420
480
|
```text
|
|
421
|
-
|
|
481
|
+
# 离线救急台(本机网页,最省打字)
|
|
482
|
+
dsh-config-manager web [--port <n>] [--no-open] [--home <dir>]
|
|
483
|
+
[--data-root <dir>] [--idle-timeout <min>]
|
|
484
|
+
|
|
485
|
+
# 只读检查(绝不改你的配置)
|
|
422
486
|
dsh-config-manager snapshots [--data-dir <dir>] # 列出快照(最新在前)
|
|
423
|
-
dsh-config-manager
|
|
487
|
+
dsh-config-manager verify [<文件|路径>] [--json] # 只读自检备份 ZIP
|
|
488
|
+
[--data-dir <dir>]
|
|
489
|
+
dsh-config-manager sessions list [--home <dir>] [--json] # 列出本机会话
|
|
490
|
+
dsh-config-manager sessions doctor [--home <dir>] [--json] # 会话体检 + 建议
|
|
491
|
+
|
|
492
|
+
# 备份与迁移(只写新文件)
|
|
493
|
+
dsh-config-manager backup [--sections <a,b,c>] [--out <path>] # 离线文件级备份
|
|
494
|
+
[--dry-run] [--data-dir <dir>]
|
|
495
|
+
dsh-config-manager import --from <来源> [--dry-run] # 外部 agent 配置 → bundle ZIP
|
|
496
|
+
[--out <路径>] [--cwd <dir>] [--data-dir <dir>]
|
|
497
|
+
|
|
498
|
+
# 修复(会写本机 —— 先用 --dry-run 预览)
|
|
499
|
+
dsh-config-manager restore [--id <id>] [--dry-run] # 回滚到某份导入前快照
|
|
500
|
+
[--data-dir <dir>] [--data-root <dir>]
|
|
424
501
|
[--profile <name>] [--settings <path>]
|
|
502
|
+
dsh-config-manager sessions repair [--home <dir>] [--fix] # 离线会话布局归位
|
|
503
|
+
[--keep <dir>] [--map old=new]...
|
|
504
|
+
dsh-config-manager recover-stale-lock [--data-dir <dir>] # 回收残留锁(见下)
|
|
505
|
+
|
|
506
|
+
# 危险(改 DSH 安装本体 / 可能清数据)
|
|
425
507
|
dsh-config-manager reinstall [--version <v>] [--yes] [--list]
|
|
426
|
-
[--wipe-config] [--dry-run]
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
dsh-config-manager
|
|
430
|
-
[--dry-run] [--data-dir <dir>]
|
|
508
|
+
[--wipe-config] [--dry-run] [--data-root <dir>]
|
|
509
|
+
|
|
510
|
+
# 帮助
|
|
511
|
+
dsh-config-manager help [command] # 总览 / 单条命令详情
|
|
431
512
|
```
|
|
432
513
|
|
|
433
514
|
**`reinstall` —— DSH 损坏时的救急重装。** 跨平台一键重装 `@deepseek-ai/dsh` 启动器(按操作系统自动选用正确命令:Windows 走 PowerShell、Unix 走 bash)。默认重装启动器 + 清全局残留缓存;交互式多选会询问是否勾选**危险**清理项(设置 / 插件 / 会话与凭据)——这些**默认不勾选**,且只要涉及删数据的动作,执行前都必须**二次确认输入 `YES`**。清空 `~/.dsh` 数据前会先做一份 `.reinstall-backup` 紧急备份(`snapshots/` 目录按设计绝不触碰)。
|
|
@@ -493,11 +574,47 @@ dsh-config-manager backup --out D:/rescue/config.zip # 指定输出(绝
|
|
|
493
574
|
dsh-config-manager backup --sections skills,self # 收窄范围
|
|
494
575
|
```
|
|
495
576
|
|
|
496
|
-
`--sections` 可选值为 `skills,agentPresets,agentInstructions,self,pluginFiles
|
|
577
|
+
`--sections` 可选值为 `skills,agentPresets,agentInstructions,self,pluginFiles`(第三方插件数据 `pluginData` / `pluginAssets` **不在**离线命令行备份范围内,显式点名会提示改用图形界面的导出/导入)。其中 `pluginFiles` 与 GUI 侧一致属**默认关闭**:它原样复制第三方插件自有文件,而 `dsh-ssh.json` 里是明文主机密码——确认过内容之后再选它。
|
|
497
578
|
|
|
498
579
|
|
|
499
580
|
**典型救急流程**(DSH 起不来时):① `dsh-config-manager reinstall` 先把启动器重装回来(必要时顺带清理),② 若 DSH 报会话日志错误(`corrupt session log` / `duplicate JSONL session id`),先跑 `dsh-config-manager sessions repair --fix` 把日志目录离线归位,③ `dsh web` 重新启动 DSH,④ 从仓库装回插件,⑤ 从远程仓库拉取快照(或执行 `dsh-config-manager restore`)把配置恢复回来。整个流程中 CLI 全程可用,与 DSH 是否健康无关。
|
|
500
581
|
|
|
582
|
+
**`recover-stale-lock` —— 每次操作都突然失败时用这个。** 动你的配置之前,插件会先占一把小的环境锁(记录谁在操作 + 心跳),让两个操作永远不可能同时写配置。如果某个 `dsh web` 进程被**强杀**(任务管理器 / `kill -9`),锁文件会带着一个已经死掉的持有者留在盘上:下一次操作被拒,而且**重试多少次、重启 DSH 都没用** —— 因为插件刻意从不自行删锁(猜错就会把正在进行的操作踢掉)。
|
|
583
|
+
|
|
584
|
+
症状与修法:
|
|
585
|
+
|
|
586
|
+
| 症状 | 含义 | 修法 |
|
|
587
|
+
|---|---|---|
|
|
588
|
+
| 「另一个任务正在运行,请稍后重试。」 | 有活着的操作持锁 | 等一会儿,它会自己清 |
|
|
589
|
+
| 「检测到上次异常退出残留的配置锁…重试或重启 DSH 均无效」(日志里是 `自动同步已跳过`) | 持有者进程**已被证明死亡**(残留锁) | 跑下面这条命令,或用 GUI **事故恢复 → 回收残留锁** |
|
|
590
|
+
| 同一句提示,但持有者 PID 被一个无关进程**复用**了(Windows 常见) | 心跳已陈旧很久,锁仍被判成残留 | 同样的修法 —— 心跳陈旧时间远超阈值后即可回收 |
|
|
591
|
+
|
|
592
|
+
```bash
|
|
593
|
+
# 安全:先检查,证明持有者已死才回收(活着的锁绝不碰)
|
|
594
|
+
dsh-config-manager recover-stale-lock
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
**`sessions repair` —— DSH 因为会话日志起不来时用这个。** DSH 校验每条会话日志必须正好待在自己 header 声明的目录里:`corrupt session log … header id and cwd identify …`,或 `duplicate JSONL session id … in multiple project directories`。这时插件帮不上忙(它只在 DSH *内部*加载),而这是唯一能在 DSH 停着时工作的修复路径。它读每条会话首帧的 cwd,把会话目录搬到 `projectKeyOf(cwd)` —— 位置从日志本身推导,绝不猜。
|
|
598
|
+
|
|
599
|
+
- **默认 dry run**(零写入);`--fix` 才真的搬。退出码:dry run 恒 0,`--fix` 有任何失败 / 冲突 / 回滚则 1。
|
|
600
|
+
- **`--map old=new`**(可重复)用于跨机恢复:前缀命中时先改写首帧 cwd 再搬目录(其余帧逐字节拷贝)。目标已存在时绝不覆盖。
|
|
601
|
+
- **`--keep <dir>`** 解决重复 id:你点名的副本保留,其余移入 `sessions/.cm-repair-quarantine-<时间戳>/` —— 只移动、绝不删除。不给 `--keep` 时只报告重复、不动。
|
|
602
|
+
|
|
603
|
+
```bash
|
|
604
|
+
# 先看会搬什么(完全不写盘)
|
|
605
|
+
dsh-config-manager sessions repair
|
|
606
|
+
# 执行,并把源机前缀映射到本机
|
|
607
|
+
dsh-config-manager sessions repair --fix --map 'C:/Users/alice=D:/Work'
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
两台机器的 **DSH 基础路径不同**时(如 `/opt/dsh/.dsh` 对 Windows 盘符路径),备份里记着源机基础路径,导入会**自动重定基**:把它下面所有路径(会话 cwd、工作区路径…)落到你本机的路径上 —— 不用手填映射。用户映射仍在其后生效,可覆盖任何一条。
|
|
611
|
+
|
|
612
|
+
在内容选择器里,勾选会话会连带勾选拥有它们的工作区(取消勾选工作区也会取消它的会话)。
|
|
613
|
+
|
|
614
|
+
跨机恢复在 GUI 里不需要额外步骤:**导出会话现在会连带带上拥有它们的工作区**,导入向导里填的路径映射会同时改写工作区路径与会话首帧 cwd(并相应搬目录),然后才把这些会话登记到那些工作区上。
|
|
615
|
+
|
|
616
|
+
**插件装好了但备份看不到?** 检查 **设置 → 备份与迁移 → 导航右上角的「关于」图标**:它会显示插件清单是从哪个目录 / profile 读的、识别到几个插件。清单来自 `$DSH_HOME/profiles/<profile>/package.json` → `dependencies`(外加 `dsh.profile.bundles` 里声明、但不是依赖的项),`<profile>` 按 `config.profile` → `--profile` → `web` 解析。如果显示的路径不是你装插件的那个 profile(桌面端可能用别的 profile 或别的 `DSH_HOME`),那就是原因 —— 把 `--profile` / `DSH_HOME` 对齐即可。
|
|
617
|
+
|
|
501
618
|
**`web` —— 离线救急台(不想在终端里敲命令时用这个)。** 它在本机起一个**只绑 127.0.0.1** 的小网页,
|
|
502
619
|
把上面的诊断信息与救急动作都摊在浏览器里:
|
|
503
620
|
|
|
@@ -506,12 +623,43 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
|
|
|
506
623
|
```
|
|
507
624
|
|
|
508
625
|
- **只读部分**:实例心跳 / SAFE MODE / 残留锁 / 快照 / 导出产物(可一键自检)/ 磁盘占用 / 会话体检 / 档案与实例状态。
|
|
509
|
-
-
|
|
510
|
-
|
|
626
|
+
- **写动作(每个都要在网页里显式确认,且都调用与命令行同一套实现)**:① 会话布局归位 ② 清理可重建缓存与过期导出产物
|
|
627
|
+
③ 回收残留环境锁 ④ 启动 / 停止某个档案的独立实例 ⑤ **解锁加密备份**(只在内存里解密、只列条目,绝不写盘)
|
|
628
|
+
⑥ **恢复快照**(先看逐条计划,零写入;恢复前先把当前文件复制到 `<snapshot>/pre-restore/`)⑦ **离线导出**(文件类分区,落盘后立即自检)
|
|
629
|
+
⑧ **重装 DSH**(卸载 + 重装全局 CLI,**要求输入只打印在终端里的 6 位校验码**)。结果页逐条如实回执。
|
|
511
630
|
- **安全**:只绑回环地址;启动时生成一次性 token(只打印在终端),换成一个 HttpOnly + SameSite=Strict 的
|
|
512
631
|
会话 cookie,用过即废;页面零脚本、零外链。`Ctrl+C` 或空闲超时(缺省 30 分钟)即退出。
|
|
513
|
-
-
|
|
514
|
-
|
|
632
|
+
- **门槛**:会话归位与恢复快照需要 DSH 已停止;有 SAFE MODE 未结案或残留环境锁时写动作一律被拒(页面会写明原因)。
|
|
633
|
+
**导入**(把 bundle 写回本机)留在 GUI/CLI —— 结构化分区需要 DSH 服务层在线。
|
|
634
|
+
|
|
635
|
+
### 🌐 走代理?(GitHub 登录 / 同步)
|
|
636
|
+
|
|
637
|
+
Node 内置的 `fetch()` 默认**不读** `HTTP_PROXY` / `HTTPS_PROXY`,所以在「GitHub 只能经本地代理访问」的网络里,「用 GitHub 登录」以前会直接失败:`请求 GitHub 设备码失败:fetch failed` —— 哪怕你的浏览器和 `git` 都正常。
|
|
638
|
+
|
|
639
|
+
**现在插件会把自己的出站请求自动走你的代理** —— 只要保证代理环境变量对 DSH 进程可见:
|
|
640
|
+
|
|
641
|
+
```bash
|
|
642
|
+
# macOS / Linux —— 启动 dsh 之前
|
|
643
|
+
export HTTPS_PROXY=http://127.0.0.1:7897
|
|
644
|
+
export NO_PROXY=localhost,127.0.0.1
|
|
645
|
+
dsh web
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
```powershell
|
|
649
|
+
# Windows PowerShell
|
|
650
|
+
$env:HTTPS_PROXY='http://127.0.0.1:7897'; dsh web
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
行为细节:
|
|
654
|
+
|
|
655
|
+
- **覆盖插件全部出站**:GitHub API + device flow 登录(`fetch`)与 WebDAV 同步(原生 `http`/`https`),`https` 目标含 `CONNECT` 隧道;
|
|
656
|
+
- **没配代理就零影响** —— 没有代理变量时行为一字不变;
|
|
657
|
+
- **尊重 `NO_PROXY`**(`*`、精确主机、`example.com` 后缀、可选 `:port`);
|
|
658
|
+
- **`DSH_CONFIG_MANAGER_PROXY=off`** 强制直连(即使有代理变量);
|
|
659
|
+
- URL 里的代理凭据只用于 `Proxy-Authorization`,且**绝不记日志**;启动日志会打印一份脱敏的代理摘要,便于确认路由是否生效;
|
|
660
|
+
- 这是**插件私有**行为:绝不改全局 / 进程级网络设置(不同于 `NODE_USE_ENV_PROXY`,那会影响整个宿主进程,包括模型 API 调用)。
|
|
661
|
+
|
|
662
|
+
替代方案(宿主级):在启动 DSH **之前**设 `NODE_USE_ENV_PROXY=1`(Node 24+);注意这会把宿主自己的出站流量也一起走代理,不只是本插件。
|
|
515
663
|
|
|
516
664
|
### 🤖 Agent 可调用的模型工具
|
|
517
665
|
|
|
@@ -556,7 +704,7 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
|
|
|
556
704
|
默认不会。默认备份**绝不包含任何密钥**,只记录哪些密钥需要重新填写。若你显式选择**加密备份**,密钥才会包含在内,但仅以 scrypt + AES-256-GCM 密文存在(每次导出随机 salt 与 IV)——绝不明文。
|
|
557
705
|
|
|
558
706
|
**Q:导入会不会覆盖我现有的配置?**
|
|
559
|
-
|
|
707
|
+
不会偷偷覆盖。有冲突时让你逐项选择:保留当前 / 使用备份(可批量);导入前还会自动创建安全快照,失败可回滚。
|
|
560
708
|
|
|
561
709
|
**Q:换电脑(Windows → macOS)能用吗?**
|
|
562
710
|
能。插件会自动检测失效的绝对路径,让你重新映射(支持批量替换)。
|
|
@@ -565,7 +713,7 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
|
|
|
565
713
|
不能。校验和检查不通过会直接拒绝导入(防止损坏或篡改)。
|
|
566
714
|
|
|
567
715
|
**Q:重复导入会重复吗?**
|
|
568
|
-
不会。按插件 ID / MCP 名称 /
|
|
716
|
+
不会。按插件 ID / MCP 名称 / 技能名等稳定标识配对:完全一致的跳过,与目标机有差异的会列为**冲突由你决定**(保留当前 / 使用备份),不会静默覆盖。
|
|
569
717
|
|
|
570
718
|
**Q:加密备份导入时需要密码吗?**
|
|
571
719
|
需要。导入向导会要求输入导出时设置的加密密码并验证通过后才能继续执行;密码仅存于内存、绝不保存。密码错误或缺失都会阻止导入(密码正确时凭据直接从备份解密恢复,无需重新填写)。
|
|
@@ -580,11 +728,12 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
|
|
|
580
728
|
1. **安装/更新插件或 MCP 后需重启 DSH 才生效**
|
|
581
729
|
2. **部分界面状态不迁移**(如任务看板数据、面板宽度——它们存在浏览器里,不在 DSH 配置文件内)
|
|
582
730
|
3. **keybindings / workflows 配置 / commands**:DSH 当前没有这些概念,因此不会导出相关内容。全局 agent 规则已由**全局指令(Agent Instructions)**承接(`~/.dsh/AGENTS.md`,注入每个会话);项目级 `AGENTS.md` / `CLAUDE.md` 属于各项目仓库本身,不在个人配置迁移范围内
|
|
583
|
-
4. **历史会话是显式可选项** —— DSH 自己的会话只有在导出 / 同步时**显式勾选 `sessions`
|
|
731
|
+
4. **历史会话是显式可选项** —— DSH 自己的会话只有在导出 / 同步时**显式勾选 `sessions` 分区**才会带走(同步通道还要求两侧都放行);**MCP 服务器是另一个显式可选的同步分区**——`mcp` 分区是 `platformSpecific`,永不进默认同步集合,要在同步分区弹窗里勾选 **MCP Servers** 才会带走(自动同步跟着走,但拉取侧的 mcp 变更仍会落进差异确认,它是 medium 风险分区)。`command` / `cwd` 是绝对路径、或目标机缺运行时(npx / uvx / pipx)的服务器,会由导入分析给出提示——配置照常写入;**其它 Agent 的历史会话在你选中那个来源时迁移**。DSH 会话格式里没有位置的对话状态(模型思考过程、图片、压缩检查点)一律**如实计数并报告**,绝不伪造
|
|
584
732
|
5. **加密备份**:密码丢失则无法解密(设计使然——请牢记密码)
|
|
585
733
|
6. **快照恢复是离线的、诚实的**:离线引擎无法恢复的条目(快照无整文件备份时的 settings namespace / patch 行、存在 DSH storages 里的 workspace 记录)会如实列为跳过并指向在线回滚;凭据**值**绝不自动改写(只提示人工补录);无插件基线的旧快照只提示人工核对新增插件
|
|
586
734
|
7. **从其它 Agent 导入有两处已知空白**:**Copilot 不支持导入历史会话**(其会话格式在本机无法取证,只导入它的配置);Cursor 的项目历史要靠它自己的目录 slug 反解,个别项目可能对不上。用**旧版本**导入过的会话请先删掉再重导(同一 id 二次导入会如实报**跳过** `session-id-conflict`,不会合并)
|
|
587
735
|
8. **本地源插件(`link:` / `file:`)随备份打包**:导出时执行 `npm pack` 把本地开发中的插件打成 tarball 一并备份,导入时解包到 `$DSH_HOME/dsh-config-manager/local-plugins/` 后按 `file:` 安装。因此:① 备份体积会随本地插件的体积增大(单插件超过 100 MB 会被跳过并告警,建议先发布到 registry / git 再备份);② 插件**源码**会进入备份(与「密钥永不进备份」不冲突——密钥仍被排除,这里进的是代码);③ 打包需要本机有可用的 `npm`,无 npm 时该插件退化为原行为(保留原 spec,换机后仍需手工安装)
|
|
736
|
+
9. **对话回退只覆盖「留点之后」**:它只处理「留点当时记录在案的文件」与「该点之后新建的文件」;单个回滚点默认上限 **20000 个文件 / 512 MiB**(超限会把该点标记为不完整并如实告知,绝不假装完整)。对话**正在运行**时默认只回溯消息、不动文件;已进隔离区(`quarantine/`)的崩溃残留不再参与下次启动的分类,需要显式恢复或手工移回
|
|
588
737
|
|
|
589
738
|
## 💬 反馈与建议
|
|
590
739
|
|
|
@@ -598,7 +747,7 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
|
|
|
598
747
|
| 💬 **不确定是不是 Bug,想先问问** | [Discussions](https://github.com/xiajiajun516/dsh-config-manager/discussions) |
|
|
599
748
|
| 🔒 **安全问题 / 密钥泄露** | [私密安全公告](https://github.com/xiajiajun516/dsh-config-manager/security/advisories/new)(请不要开公开 issue) |
|
|
600
749
|
|
|
601
|
-
**在插件里就地反馈**:设置 → 备份与迁移 →
|
|
750
|
+
**在插件里就地反馈**:设置 → 备份与迁移 → 导航右上角的**「关于」图标** → 「反馈问题」;或点那里的**复制环境信息**按钮,插件版本 / DSH 版本 / 平台会自动带上,粘进 issue 即可 —— 不用手抄版本号。
|
|
602
751
|
|
|
603
752
|
**每条都会跟进**:新 issue 会立刻收到一条回复并打上 `needs-triage`,处理进度体现在标签上(`needs-info` → `confirmed` → `fixed`)。修好的问题会出现在 [CHANGELOG.md](CHANGELOG.md) 的对应版本条目里,带 issue 编号(例:#38 / #43 / #45)—— 这就是一条反馈最终的落地记录。
|
|
604
753
|
|
|
@@ -616,8 +765,16 @@ dsh-config-manager web # 启动并自动打开浏览器(终端里
|
|
|
616
765
|
36×36 无底框的 `icon.svg`(issue #61,对齐官方插件图标约定)。反馈自带上游取证(宿主图位 48/36 与 40/30、
|
|
617
766
|
官方随包发布的图标形态与官方 fixture),PR 里附 16/30/36/48 × 深浅双主题实况图,并对「不换成品牌蓝」写了
|
|
618
767
|
可复核的理由(后片若同色,深色模式下两层会融成一块、16px 读不出前后关系)。
|
|
619
|
-
-
|
|
620
|
-
|
|
768
|
+
- **iuuuuuuuu** —— [PR #67](https://github.com/xiajiajun516/dsh-config-manager/pull/67)(合并提交 `780af10`)、
|
|
769
|
+
[PR #68](https://github.com/xiajiajun516/dsh-config-manager/pull/68)(`16e13c1`)、
|
|
770
|
+
[PR #72](https://github.com/xiajiajun516/dsh-config-manager/pull/72)(`6e552a0`):① git 同步通道有了**仓库选择器** ——
|
|
771
|
+
从当前 token 可见的**私有**仓库里选(按最近更新排序,公开仓库不进列表),或就地新建私有仓库并自动选中;新建请求体
|
|
772
|
+
根本不带 `private`,客户端连表达「公开」的途径都没有,安全约束落在宿主侧;顺带修掉链接跟随边界判定的 `realpath` 口径
|
|
773
|
+
(Windows 8.3 短名与 macOS `/var` → `/private/var` 曾被误判 `outside-home`,备份报成功却静默丢内容)。
|
|
774
|
+
② 「总览」首屏不再等一次全量预览:`plugins` 分区补上 `preview()`(不再逐个 spawn `npm pack`),`settings` 与
|
|
775
|
+
`credentialsStatus` 一次读回全部 namespace 而不是逐个 `describe`(真机 24 个 namespace × 12 个本地源插件,
|
|
776
|
+
全量预览 27.6 s)。③ 修 issue #71「外壳里配好的 MCP 与 Skills 备份不到」:patch 行按层读取、写回原层,技能改经
|
|
777
|
+
外壳的 `skills` 服务收编。三个 PR 均带单测与路由 / 源码级守卫。
|
|
621
778
|
|
|
622
779
|
> 维护者与开发者:构建、测试、自动发布与完整技术说明见 [DEVELOPERS.md](DEVELOPERS.md)。
|
|
623
780
|
|
|
@@ -35,7 +35,7 @@ export class AgentInstructionsAdapter extends FileCollectionAdapter {
|
|
|
35
35
|
* (单文件代价可忽略,且 `collect` 之后还要读它)。读不到 → 空清单(与「文件不存在 = 空分区」同语义)。
|
|
36
36
|
*/
|
|
37
37
|
async listRelPaths(ctx) {
|
|
38
|
-
const empty = { paths: [], skippedLinks: [], followedLinks: 0, unreadableDirs: [] };
|
|
38
|
+
const empty = { paths: [], skippedLinks: [], skippedDepDirs: [], followedLinks: 0, unreadableDirs: [] };
|
|
39
39
|
const rel = AgentInstructionsAdapter.FILE;
|
|
40
40
|
try {
|
|
41
41
|
if (ctx.fs.statSize !== undefined) {
|
|
@@ -154,7 +154,7 @@ export class FileCollectionAdapter {
|
|
|
154
154
|
// issue #37:用「跟随 junction/符号链接」的遍历,并把跟随/跳过的链接写进告警——
|
|
155
155
|
// 此前链接目录及其全部内容被静默排除,备份仍报成功。
|
|
156
156
|
// 枚举走 listRelPaths 钩子(单文件分区覆写它,避免对 home 根整目录递归)。
|
|
157
|
-
let listing = { paths: [], skippedLinks: [], followedLinks: 0, unreadableDirs: [] };
|
|
157
|
+
let listing = { paths: [], skippedLinks: [], skippedDepDirs: [], followedLinks: 0, unreadableDirs: [] };
|
|
158
158
|
try {
|
|
159
159
|
listing = await this.listRelPaths(ctx);
|
|
160
160
|
}
|