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.md
CHANGED
|
@@ -47,7 +47,7 @@ DSH is your AI assistant workbench — it holds your settings: model configs, pl
|
|
|
47
47
|
|
|
48
48
|
### Backup DeepSeek Harness configuration
|
|
49
49
|
|
|
50
|
-
Create a portable backup of your DSH settings, model providers, plugins, MCP servers, skills, agent presets and workspace — one ZIP file, no secret values included by default. (DSH's own profiles — `$DSH_HOME/profiles/<name>`, i.e. which plugin stack to boot — are machine-local and are **not** part of the backup; the **Profiles**
|
|
50
|
+
Create a portable backup of your DSH settings, model providers, plugins, MCP servers, skills, agent presets and workspace — one ZIP file, no secret values included by default. (DSH's own profiles — `$DSH_HOME/profiles/<name>`, i.e. which plugin stack to boot — are machine-local and are **not** part of the backup; the **Environment → Profiles** view manages them instead — list / create / rename / delete, plus launching or stopping an independent instance for one.)
|
|
51
51
|
|
|
52
52
|
### Restore DeepSeek Harness on another machine
|
|
53
53
|
|
|
@@ -59,11 +59,11 @@ Move your complete DeepSeek Harness setup without manually reinstalling plugins,
|
|
|
59
59
|
|
|
60
60
|
### Sync DSH configuration across machines
|
|
61
61
|
|
|
62
|
-
Keep portable configuration synchronized between machines through a private Git repository or
|
|
62
|
+
Keep portable configuration synchronized between machines through a private Git repository, WebDAV, an S3-compatible object store (AWS S3 / Alibaba OSS / Tencent COS / MinIO / Qiniu Kodo) or GitHub Gist — secrets do not sync by default (the payload is run through the SecretScanner); check "Export secrets" with an encryption password and `~/.dsh/.credentials.yaml` travels as scrypt + AES-256-GCM ciphertext inside the encrypted snapshot, so another machine can restore the credentials while the remote (Git host / WebDAV / object store / Gist) only ever sees ciphertext.
|
|
63
63
|
|
|
64
64
|
### Schedule automatic full backups
|
|
65
65
|
|
|
66
|
-
Turn on scheduled backups (6h / 12h / 24h / 7d — or a **custom weekly weekday & time**) and DSH quietly keeps a fresh full backup of your configuration in the background — secrets are never included, so it stays safe on disk without a password.
|
|
66
|
+
Turn on scheduled backups in the **Home → Scheduled backup** card (6h / 12h / 24h / 7d — or a **custom weekly weekday & time**) and DSH quietly keeps a fresh full backup of your configuration in the background — secrets are never included, so it stays safe on disk without a password. How many are kept is decided by the **retention policy** in the same card (last N + one per month + one per year), and consecutive failures are highlighted in red.
|
|
67
67
|
|
|
68
68
|
### Discover & install configurations from the marketplace
|
|
69
69
|
|
|
@@ -73,6 +73,10 @@ Browse the built-in official market for ready-made configurations (model provide
|
|
|
73
73
|
|
|
74
74
|
Your setup — and your chat history — already live in another AI coding agent on this machine? Pick the source and DSH Config Manager **translates it into a standard bundle** (MCP servers, skills, global instructions, conversations and the workspaces they belong to) and hands it to the same review-first import flow: preview → per-item conflict decisions → automatic snapshot → apply → rollback. 30 sources are recognized and 29 of them can migrate **chat history** too. Secret **values** are never read — only the key names, so the import plan can ask you to re-enter them.
|
|
75
75
|
|
|
76
|
+
### Go back to a moment in a conversation (rewind)
|
|
77
|
+
|
|
78
|
+
Mid-conversation realisation — "that message sent us down the wrong path, I want to start again from there"? Every user message carries **↺ rewind to here**: it opens a **new branch conversation** from that moment and leaves the **original intact (archived, never rewritten)**; if you want, the **workspace files** are reverted along with it — you see the per-file diff and line counts before anything happens. Rollback points are captured automatically per turn, so there is no manual snapshot to take.
|
|
79
|
+
|
|
76
80
|
---
|
|
77
81
|
|
|
78
82
|
## 🆚 How it differs from the other DSH backup / sync plugins
|
|
@@ -82,7 +86,7 @@ Several DSH plugins live in this space and they solve different problems — pic
|
|
|
82
86
|
| Plugin | Strongest at | Where DSH Config Manager goes further |
|
|
83
87
|
|---|---|---|
|
|
84
88
|
| [xiaoyuyu6420/dsh-backup](https://github.com/xiaoyuyu6420/dsh-backup) | One-command `~/.dsh` snapshots from the CLI, plus session doctor / upgrade snapshots / rescue console | Review-before-write GUI flow (dry-run preview, per-item conflict decisions, automatic rollback), cross-machine path remapping, encrypted credential payload, configuration marketplace |
|
|
85
|
-
| [muyifc/dsh-config-sync](https://github.com/muyifc/dsh-config-sync) | Export / import DSH configuration to a portable, password-encrypted file, callable from tool calls | 13–14 sections (plugins / MCP / skills / workspaces / session logs …), scheduled backups, Git
|
|
89
|
+
| [muyifc/dsh-config-sync](https://github.com/muyifc/dsh-config-sync) | Export / import DSH configuration to a portable, password-encrypted file, callable from tool calls | 13–14 sections (plugins / MCP / skills / workspaces / session logs …), scheduled backups, four sync channels (Git / WebDAV / object storage / Gist), session migration with path rebase |
|
|
86
90
|
| [dickpy/dsh-cloud-sync](https://github.com/dickpy/dsh-cloud-sync) · [weibaohui/dsh-sync](https://github.com/weibaohui/dsh-sync) | Keeping machines consistent through WebDAV / S3 or a private Git mirror | Sync is one of five capabilities here — alongside export/import, scheduling, marketplace and profile instance launch/stop |
|
|
87
91
|
| `cp -r ~/.dsh` (or Git on the home dir) | Free, zero setup, fine for a purely textual config | No secret handling, no path remapping, no capture of `link:` / `file:` plugin installs, no session-log work, no conflict handling or rollback |
|
|
88
92
|
|
|
@@ -94,24 +98,25 @@ Several DSH plugins live in this space and they solve different problems — pic
|
|
|
94
98
|
|
|
95
99
|
| Icon | Feature | In one line |
|
|
96
100
|
|:---:|---|---|
|
|
97
|
-
| 🚀 | **One-click Export** |
|
|
101
|
+
| 🚀 | **One-click Export** | Open the export flow — the recommended sections are pre-ticked — and package a ZIP in one click (adjust section by section, item by item if you want) |
|
|
98
102
|
| 📦 | **One-click Import** | Restore your environment on another machine |
|
|
99
|
-
| 👀 | **Preview before import** |
|
|
100
|
-
| ⚔️ | **Conflict handling** | Keep
|
|
103
|
+
| 👀 | **Preview before import** | Read the migration consult verdict and its evidence first, then pick content item by item and resolve conflicts one by one — **never touches your config silently** |
|
|
104
|
+
| ⚔️ | **Conflict handling** | Keep current / Use backup — you decide (with bulk buttons) |
|
|
101
105
|
| 🗺️ | **Path auto-mapping** | Detects dead absolute paths and lets you remap them |
|
|
102
106
|
| 🔒 | **Secret safety** | API Keys are not exported by default — non-encrypted imports ask you to re-enter; encrypted backups restore them with the password |
|
|
103
107
|
| ↩️ | **Automatic rollback** | Failed import restores everything automatically |
|
|
104
|
-
| 📸 | **Snapshot restore** |
|
|
105
|
-
|
|
|
106
|
-
|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
108
|
+
| 📸 | **Snapshot restore** | In the Library, hit "Restore" on a pre-import snapshot: review the line-by-line restore plan, then whole-file restore + uninstall added plugins (CLI & GUI) |
|
|
109
|
+
| ↺ | **Rewind a conversation** | Every user message carries "rewind to here": a new branch conversation takes over while the original is archived intact; tick the checkbox to revert workspace files too, with a per-file diff before you confirm (this is **not** the same as "Snapshot restore") |
|
|
110
|
+
| 🔄 | **Remote Sync** | Push/pull portable config via **Git private repo / WebDAV / S3-compatible object storage / GitHub Gist** — each channel is configured on its own (secrets do not sync by default; encrypted snapshots can optionally carry encrypted credentials) |
|
|
111
|
+
| ⏰ | **Scheduled backups** | Full backup on a fixed cadence (6h / 12h / 24h / 7d, or a custom weekly time) — set-and-forget, secrets never included |
|
|
112
|
+
| 🛒 | **Config Marketplace** | Browse & one-click install community configs — supply-chain warnings + per-item content selection (change summary + in-place high-risk flags); entry: Library footer "Browse market / Publish to market", or ⌘K |
|
|
113
|
+
| 🗂️ | **Profiles (DSH profiles)** | Under **Environment → Profiles**, manage `$DSH_HOME/profiles/<name>` directly: list / create from a shipped template / rename / hard delete / **launch this profile (independent instance)** / **stop the instance** (the row button flips between Launch and Stop with the running state) |
|
|
109
114
|
| 🌐 | **Bilingual UI** | Interface, reports and error details follow the DSH app language (中文 / English) |
|
|
110
115
|
| 🧩 | **Local plugin migration** | `link:` / `file:` development plugins are packed into the backup, so switching machines does not lose them |
|
|
111
116
|
| 🗄️ | **Configurable retention (GFS tiers)** | "keep the last N + one per month + one per year" — the defaults are equivalent to the previous behaviour |
|
|
112
117
|
| 🤖 | **Agent tools** | Backup / snapshot / restore / sync right from an agent session |
|
|
113
|
-
| 💾 | **Disk usage report** |
|
|
114
|
-
| ⬆️ | **Update check** | The About
|
|
118
|
+
| 💾 | **Disk usage report** | **Environment → Maintenance & Diagnostics** shows how much space the plugin's own artifacts take (backups / snapshots / sync copies / caches / staging) with a three-tier cleanup policy; **one-click cleanup only touches regenerable caches and expired backups** — snapshots and sync data are never removed there |
|
|
119
|
+
| ⬆️ | **Update check** | The About panel (top-right nav icon) reads the latest version from npm (read-only, cached 10 minutes); when there is a newer one it offers a copyable upgrade command **and** a one-click **Update now** that installs exactly that version — DSH must then be restarted, and the plugin never restarts it for you. Offline failures are reported honestly and affect nothing else |
|
|
115
120
|
| 🧭 | **Compatibility explained** | Before importing you see "source DSH version / platform → local" plus **structured reasons** for the score (cross-platform / missing sections / newer source …) instead of a bare "partial" |
|
|
116
121
|
| 🧳 | **Import from other AI agents** | Read Claude Code / Cursor / Codex / Hermes / Antigravity … configuration **and chat history** on this machine, translate it into a standard bundle, then import through the usual preview / conflict / rollback flow |
|
|
117
122
|
|
|
@@ -119,21 +124,13 @@ Several DSH plugins live in this space and they solve different problems — pic
|
|
|
119
124
|
|
|
120
125
|
## 📸 Screenshots
|
|
121
126
|
|
|
122
|
-
|
|
|
123
|
-
|:---:|:---:|
|
|
124
|
-
|  |  |
|
|
125
|
-
|
|
126
|
-
| Export | Import Preview |
|
|
127
|
+
| Home | Library |
|
|
127
128
|
|:---:|:---:|
|
|
128
|
-
|  |  |
|
|
129
130
|
|
|
130
|
-
|
|
|
131
|
+
| Sync (four channel cards) | Environment · Maintenance & Diagnostics |
|
|
131
132
|
|:---:|:---:|
|
|
132
|
-
|  |
|
|
133
|
+
|  |  |
|
|
137
134
|
|
|
138
135
|
---
|
|
139
136
|
|
|
@@ -151,10 +148,21 @@ Every step confirms and backs up first — **it never modifies your config direc
|
|
|
151
148
|
|
|
152
149
|
```
|
|
153
150
|
Select ZIP → validate file → check integrity → check schema → compatibility check
|
|
154
|
-
→ scan contents → build import plan →
|
|
155
|
-
→
|
|
151
|
+
→ scan contents → build import plan → migration consult (verdict + evidence)
|
|
152
|
+
→ choose what to import → per-item conflict decisions → path mapping / secrets re-entry
|
|
153
|
+
→ confirm import → auto-backup current config → apply → validate → done
|
|
156
154
|
│
|
|
157
|
-
└─ failed midway? → automatically restored (rollback)
|
|
155
|
+
└─ failed midway? → automatically restored (rollback, can be switched off on the confirm page)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Rewind (go back to a moment in a conversation)
|
|
159
|
+
|
|
160
|
+
One **rollback point** is captured automatically **per turn** (its workspace state is the one from *before* that turn), so you can always go back to that moment:
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
Click "↺ rewind" on a user message → preview which files change and how many lines
|
|
164
|
+
→ confirm → a new branch conversation continues from that moment, the original is archived
|
|
165
|
+
→ rewound too far? the "rescue point" captured before the rewind can undo it
|
|
158
166
|
```
|
|
159
167
|
|
|
160
168
|
---
|
|
@@ -195,7 +203,7 @@ dsh plugin --profile web add dsh-config-manager@latest
|
|
|
195
203
|
> dsh plugin --profile web add "dsh-config-manager@$(npm view dsh-config-manager version)"
|
|
196
204
|
> ```
|
|
197
205
|
>
|
|
198
|
-
> After restarting DSH, **Settings → Backup & Migration → About** shows the version you are actually running (and pops up the release notes whenever it changes).
|
|
206
|
+
> After restarting DSH, **Settings → Backup & Migration → the About icon at the top right** shows the version you are actually running (and pops up the release notes whenever it changes).
|
|
199
207
|
>
|
|
200
208
|
> - Or disable the age gate entirely with a one-liner (adds `minimumReleaseAge: 0` at the top of the profile's `pnpm-workspace.yaml`):
|
|
201
209
|
> ```powershell
|
|
@@ -247,34 +255,42 @@ allowBuilds:
|
|
|
247
255
|
|
|
248
256
|
## 🚀 Quick start (3-minute tour)
|
|
249
257
|
|
|
258
|
+
> **Where things are**: there are only 4 top-level pages — **Home** (how this machine is doing, plus the four actions Back up now / Export / Import / Remote sync), **Library** (local snapshots / backup files / remote snapshots / marketplace configs — every "thing" lives in this one list), **Sync** (four channel cards: Git / WebDAV / object storage / Gist) and **Environment** (Profiles / Maintenance & Diagnostics). **Export, import, browse market and publish to market are flow panels**: open them from the Home toolbar or the Library footer, switch pages to collapse, switch back to continue. The four icons at the top right are the ⌘K command palette, activity, migration history and About.
|
|
259
|
+
|
|
250
260
|
```
|
|
251
261
|
Machine A (export)
|
|
252
|
-
1. Open DSH → Settings → "Backup & Migration"
|
|
253
|
-
2. Click "Export
|
|
254
|
-
3.
|
|
262
|
+
1. Open DSH → Settings → "Backup & Migration" → Home
|
|
263
|
+
2. Click "Export" in the toolbar → the recommended sections are already ticked (change them via "Choose what to export")
|
|
264
|
+
3. Click "Start export" → the ZIP is downloaded automatically as dsh-config-<date>-<random>.zip (the report confirms no secrets inside)
|
|
255
265
|
|
|
256
266
|
Copy the ZIP to Machine B (import)
|
|
257
|
-
1. Open DSH → "Backup & Migration" → "Import
|
|
258
|
-
2. Select the ZIP → wait for analysis →
|
|
259
|
-
3.
|
|
260
|
-
4.
|
|
261
|
-
5.
|
|
262
|
-
6.
|
|
263
|
-
7.
|
|
267
|
+
1. Open DSH → "Backup & Migration" → click "Import" on Home (or "Import from file" in the Library footer)
|
|
268
|
+
2. Select the ZIP → wait for analysis → read the migration consult verdict and evidence → "Next: choose what to import"
|
|
269
|
+
3. Tick the content you want (anything unticked is neither imported nor snapshotted)
|
|
270
|
+
4. Path issues? → fill in new paths under "Path mapping" (batch prefix mapping supported)
|
|
271
|
+
5. Conflicts? → pick "Keep current / Use backup" per item (bulk buttons included)
|
|
272
|
+
6. "Confirm import" → wait (a safety snapshot is taken first; "roll back everything on failure" can be switched off on the confirm page)
|
|
273
|
+
7. Re-enter any missing API Keys as prompted
|
|
274
|
+
8. ✅ Settings / plugins / MCP / skills / workspace / global instructions (AGENTS.md) are back
|
|
264
275
|
```
|
|
265
276
|
|
|
266
277
|
---
|
|
267
278
|
|
|
268
279
|
## 🧩 Features
|
|
269
280
|
|
|
270
|
-
### 📤 Export (
|
|
281
|
+
### 📤 Export (one flow + a content picker)
|
|
282
|
+
|
|
283
|
+
Open the **Export** flow panel (Home toolbar → "Export", or the Library footer → "Manual export") and do it on one screen:
|
|
271
284
|
|
|
272
|
-
|
|
|
285
|
+
| Area | Description |
|
|
273
286
|
|---|---|
|
|
274
|
-
|
|
|
275
|
-
|
|
|
287
|
+
| Choose what to export | Opens the content picker: **section → smallest splittable unit**, ticked item by item; the recommended sections (portable, not device-specific) are pre-ticked and can be changed any time |
|
|
288
|
+
| Security options | Two independent switches: "Encrypt backup" (scrypt + AES-256-GCM) and "Export secrets"; ticking Export secrets auto-enables encryption (secrets are never plaintext) |
|
|
289
|
+
| File name & note | Your own file name plus a note (the note makes it findable in the Library); illegal characters are pointed out right at the field |
|
|
290
|
+
| What will be exported | An always-visible composition card: every section that will really go in, its item count and total size; **unreadable sections say "loading / read failed" instead of a fake 0** |
|
|
291
|
+
| Result | On completion the ZIP is **downloaded automatically** to your browser's download folder (the report offers it again); the report lists sections and warnings item by item |
|
|
276
292
|
|
|
277
|
-
>
|
|
293
|
+
> Export is read-only — it writes no configuration. The file carries a manifest + per-section data + SHA-256 checksums and defaults to `dsh-config-<date>-<6 random chars>.zip` (a name clash increments instead of overwriting an existing backup).
|
|
278
294
|
|
|
279
295
|
**Export extras:**
|
|
280
296
|
- **Preview before export** — see what will be packaged (section count + estimated size, no secrets) before anything is written
|
|
@@ -303,8 +319,10 @@ When the target already has a same-named item, you choose:
|
|
|
303
319
|
|
|
304
320
|
| Option | Meaning |
|
|
305
321
|
|---|---|
|
|
306
|
-
| **Keep
|
|
307
|
-
| **Use
|
|
322
|
+
| **Keep current** | Leave the target's config untouched |
|
|
323
|
+
| **Use backup** | Overwrite with the backup's value |
|
|
324
|
+
|
|
325
|
+
There are also two bulk buttons at the top of the list ("Keep all current" / "Use all from backup").
|
|
308
326
|
|
|
309
327
|
> Note: a "decide later / review" option is intentionally **not** offered — an undecided conflict would block the import from proceeding. Every conflict must be resolved before continuing.
|
|
310
328
|
|
|
@@ -324,7 +342,7 @@ You do not have to rebuild another agent's setup by hand.
|
|
|
324
342
|
- **What travels** — MCP servers, skills, global instructions (as `AGENTS.md`), and **chat history together with the workspaces those conversations belong to** (29 sources; conversations are re-encoded into DSH's session-log format and placed by their recorded `cwd`).
|
|
325
343
|
- **What does not** — secret **values** are never read: only the key names are recorded so the plan can ask you to re-enter them. Structures DSH has no equivalent for (Claude Code hooks, slash commands, …) are reported as explicit codes rather than silently dropped.
|
|
326
344
|
- **Honest skips** — a conversation with no recorded `cwd` cannot be placed and is reported as skipped (never guessed into some other project); known lossy items are listed **before** the import runs.
|
|
327
|
-
- **Entry points** —
|
|
345
|
+
- **Entry points** — Home toolbar → "Import" → **"Import from another agent"** (Home also has a direct entry), the ⌘K command, or the CLI: `dcm import --from <source> [--dry-run] [--out <path>]`.
|
|
328
346
|
|
|
329
347
|
### 🔒 Secrets
|
|
330
348
|
|
|
@@ -335,25 +353,29 @@ You do not have to rebuild another agent's setup by hand.
|
|
|
335
353
|
| Encrypted backup import | The export-time password is required: enter → verify → credentials are restored; **no password, no import** |
|
|
336
354
|
| After non-encrypted import | "3 secrets need re-entry" — values stay in memory only |
|
|
337
355
|
|
|
338
|
-
### 🔄 Remote Sync (
|
|
356
|
+
### 🔄 Remote Sync (four channels)
|
|
339
357
|
|
|
340
|
-
|
|
358
|
+
The **Sync** page renders one card per channel, **all four always visible** (unconfigured ones are a short state with the configure button inside) — Git private repo / WebDAV server / object storage (S3-compatible: AWS S3, Alibaba OSS, Tencent COS, MinIO, Qiniu Kodo) / GitHub Gist:
|
|
341
359
|
|
|
342
|
-
| |
|
|
360
|
+
| Channel | Endpoint (non-secret fields) | Credentials (DSH credentials only, never read back) |
|
|
343
361
|
|:---:|---|---|
|
|
344
|
-
| **
|
|
345
|
-
| **
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
362
|
+
| **Git private repo** | `repoUrl` (pick from the **private** repos the current token can see, or create a new private one inline) | access token → `DSH_CONFIG_MANAGER_SYNC_TOKEN` |
|
|
363
|
+
| **WebDAV** | `webdav.url` | `username` stored in the config (echoed in the UI); **password never synced / never logged** → `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` |
|
|
364
|
+
| **Object storage (S3-compatible)** | endpoint / region / bucket / object key prefix / AccessKey ID (an identifier, may be echoed) | AccessKey Secret → that channel's own credential slot (the sync file keeps only a "configured" marker) |
|
|
365
|
+
| **GitHub Gist** | gist id / API base / file prefix | Gist token → that channel's own credential slot |
|
|
366
|
+
|
|
367
|
+
- **Every channel is configured on its own**: sync sections, auto sync (switch + fallback poll interval), encryption and "Export secrets", remote snapshots and the encrypt/decrypt passwords are all **per channel**, inside that channel's own card (configured cards collapse, so four expanded cards cannot overflow the canvas).
|
|
368
|
+
- **Remote retention follows your backup schedule**: by default the newest **10** snapshots, plus optional "one per month / one per year" tiers — and the snapshot you just pushed is always kept; older ones are deleted automatically.
|
|
369
|
+
- **Switching channels starts fresh**: channels do **not** share snapshots or a common ancestor. When you switch transport (or reconfigure one), sync begins again from the new remote's empty baseline — push a fresh snapshot first.
|
|
370
|
+
- **Changing a Git repository address just works — and the working copy has a repair entry**: the working copy under `<dataDir>/sync/work` re-points its `origin` (fetch **and** push URL) at the configured `repoUrl` on **every** sync (zero write commands when they already match), so switching between two reachable addresses of the same repository (LAN → VPN/Tailscale, host rename…) no longer leaves sync talking to the old address — the failure used to look like a plain network timeout. The Git card shows the working copy's path and origin plus a warn badge when it still points elsewhere, and offers "re-point repository address" (non-destructive) and "clone working copy again" (deletes `<dataDir>/sync/work` and re-clones — **discards commits that were never pushed**, hence the danger confirmation). SSH host-key failures and "the remote is not the same history" now come with actionable messages instead of raw git stderr.
|
|
349
371
|
- **WebDAV auth** uses HTTP Basic: the `username` is stored in the config and may be echoed back into the UI, while the `password` is read live from the DSH credentials slot `DSH_CONFIG_MANAGER_SYNC_WEBDAV_PASSWORD` — it never appears in any sync file or log.
|
|
350
|
-
- **Plugins auto-install**: when pulling diffs, plugins that are new in the backup are **installed automatically** on confirm — no manual per-item ticking in the diff list. Only **version-conflict** plugins still ask you to pick "Keep
|
|
372
|
+
- **Plugins auto-install**: when pulling diffs, plugins that are new in the backup are **installed automatically** on confirm — no manual per-item ticking in the diff list. Only **version-conflict** plugins still ask you to pick "Keep current / Use backup".
|
|
351
373
|
- **Push preview before uploading** — the Push button first shows a read-only preview of what will be sent (sections + per-section counts + changed-vs-baseline markers, first-baseline notice) and only writes the remote after you confirm.
|
|
352
374
|
- **Secrets do not sync by default**: every section goes through the `SecretScanner` (sensitive field values stripped) and the credential section is structurally excluded. With "Export secrets" checked and an encryption password set, `~/.dsh/.credentials.yaml` travels as scrypt + AES-256-GCM ciphertext in a **separate credentials payload** of the encrypted snapshot (never inside any section); the receiving side decrypts it into per-ref "credential migration" items that are written back to the local credential store (`credentials.set`) only after you confirm. The encryption/decryption password is kept in a dedicated local DSH credential slot (`~/.dsh/.credentials.yaml`): it is remembered once "Encrypt backup" is checked (leave the fields empty to reuse it) and cleared when you uncheck it or press "Delete saved password" — never written to sync files, responses, logs or the exported backup, and never sent back to the browser. The decryption password is only ever used when the pulled snapshot is actually encrypted. **Auto sync never carries credentials** (it has no password and skips encrypted snapshots).
|
|
353
375
|
|
|
354
376
|
### 🛒 Configuration Marketplace
|
|
355
377
|
|
|
356
|
-
Browse and install ready-made configurations (model providers, plugins, MCP servers, skills, agent presets…) shared by the community:
|
|
378
|
+
Browse and install ready-made configurations (model providers, plugins, MCP servers, skills, agent presets…) shared by the community. The entry point is the **Library footer ("Browse market / Publish to market")** (or ⌘K) — it is a **flow panel**, not a top-level page:
|
|
357
379
|
|
|
358
380
|
- **Built-in official market** — read-only, bound to the official public repo (official badge shown, not editable); first open auto-refreshes, manual refresh also available
|
|
359
381
|
- **Search & filter** — keyword search (matches name / description / author / **categories**), category filter, **section filter** (items already downloaded list their sections; others are excluded with a hint), source filter (Official / Community), sorting (recently updated / most starred / name A–Z), and a ⭐ badge showing the **source repo's** star count (queried anonymously, no token involved)
|
|
@@ -365,7 +387,7 @@ Browse and install ready-made configurations (model providers, plugins, MCP serv
|
|
|
365
387
|
### 🗂️ Profiles (= DSH's own profiles)
|
|
366
388
|
|
|
367
389
|
A "profile" here is DSH's own profile (`$DSH_HOME/profiles/<name>`) — one **plugin stack (bundles) + dependencies + patch layer**,
|
|
368
|
-
launched with `dsh --profile <name>`.
|
|
390
|
+
launched with `dsh --profile <name>`. **Environment → Profiles** reads and writes that directory directly instead of keeping its own config snapshots:
|
|
369
391
|
|
|
370
392
|
| Action | What it does |
|
|
371
393
|
|---|---|
|
|
@@ -380,12 +402,32 @@ launched with `dsh --profile <name>`. This page reads and writes that directory
|
|
|
380
402
|
> **Why there is no "set as next launch"** (button and marker removed in 2026-09): DSH has **no "default / next launch
|
|
381
403
|
> profile" state** — the profile comes only from the launch arguments (`dsh <name>` / `--profile <name>`; `dsh web` is a
|
|
382
404
|
> hard-coded alias), so any "which profile to use next" marker has **no consumer at all**: the `dsh web` you type
|
|
383
|
-
> yourself still boots web after a restart. Only two mechanisms really switch profiles: ①
|
|
405
|
+
> yourself still boots web after a restart. Only two mechanisms really switch profiles: ① the Profiles view's "launch this
|
|
384
406
|
> profile" (an extra instance, no interruption, stoppable at any time), ② pointing your launch command/shortcut at
|
|
385
407
|
> `dsh --profile <name>` (ecosystem tools such as dshm and DSH Launcher all spawn instances from an external launcher).
|
|
386
408
|
> Instances started by this plugin are recorded in `<dataDir>/launches.json` (pid/port/log), which is why they can be
|
|
387
409
|
> stopped; third-party plugins must be installed into that profile separately (`dsh plugin --profile <name> add <pkg>`).
|
|
388
|
-
> The
|
|
410
|
+
> The view lives at Settings → "Backup & Migration" → **Environment → Profiles**.
|
|
411
|
+
|
|
412
|
+
### ↺ Rewind (go back to a moment)
|
|
413
|
+
|
|
414
|
+
Every **user message** in the chat carries a "↺ rewind to here" — no trip to Settings, and nothing to export first:
|
|
415
|
+
|
|
416
|
+
| Action | What it does |
|
|
417
|
+
|---|---|
|
|
418
|
+
| Back to that moment | Continue from before that message: the plugin opens a **new branch conversation** to take over while the **original is archived intact** (its content is never rewritten; the conversation list shows only the rewound one) |
|
|
419
|
+
| Conversation only / files too | By default only the conversation is rewound; tick "revert workspace files too" to touch the disk, and you get a **per-file diff** with line counts first |
|
|
420
|
+
| Rewind preview | States up front how many files change, how many lines are added or removed and how many are deleted; **clicking a file name shows its "now → after rewind" diff** (the same screen appears in the settings rollback panel and in the chat bubble) |
|
|
421
|
+
| Automatic rescue points | A protective point is captured before every rewind so a wrong rewind can be undone; 20 per conversation / 50 globally, oldest dropped first |
|
|
422
|
+
| Rollback ledger | Environment → Maintenance & Diagnostics → "View rollback points" opens the **rollback ledger** dialog: every rewindable moment grouped by conversation with real titles, removable one by one |
|
|
423
|
+
|
|
424
|
+
**Capture is automatic**: one point (workspace + conversation) is recorded per turn — its workspace state is the one from *before* that turn — and there is no manual "take a snapshot" step. Points live under `$DSH_HOME/dsh-config-manager/rollback-points/`; pre-upgrade three-state checkpoint data stays on disk, is no longer read, and is never deleted by the plugin.
|
|
425
|
+
|
|
426
|
+
**Skip directories you choose**: drop a `.dsh-rollback-ignore` file in the project (the usual `.gitignore` subset) and capture plus rewind skip the matching directories and files (the built-in dependency directory cannot be re-included). When a whole directory is skipped, deleting files created after that point is **refused outright** rather than done partially.
|
|
427
|
+
|
|
428
|
+
**Two honest boundaries**: ① while a conversation is **running**, only the conversation is rewound by default, never the files (the plugin will not race a running tool for the disk) — reopen the dialog after the turn finishes to revert files too; ② when a point's capture is incomplete the plugin **never guesses** — only files it can prove did not exist at capture time are deleted, otherwise nothing is deleted and it says so.
|
|
429
|
+
|
|
430
|
+
**Straight from the chat**: type `/rollback` to list this conversation's rewindable moments, then run it again with one of those ids to rewind without leaving the chat.
|
|
389
431
|
|
|
390
432
|
### 📸 Snapshot restore (undo an import)
|
|
391
433
|
|
|
@@ -395,33 +437,30 @@ Every import creates a **safety snapshot** first. If something feels off afterwa
|
|
|
395
437
|
|---|---|
|
|
396
438
|
| Whole-file restore | settings.yaml / settings.json / cordis.patch.yml blobs are written back to `$DSH_HOME`; files that didn't exist at snapshot time but appeared after import are removed |
|
|
397
439
|
| Plugin uninstall | Plugins added during import are removed via the official `dsh plugin remove` (baseline comparison; old snapshots without a baseline only get a hint) |
|
|
398
|
-
| File compensation | skills / agentPresets / agentInstructions / pluginFiles / sessions blobs are written back to their original paths |
|
|
440
|
+
| File compensation | skills / agentPresets / agentInstructions / pluginFiles / pluginData / pluginAssets / sessions blobs are written back to their original paths |
|
|
399
441
|
| Credentials | DSH never reads credential values back — you get a manual re-entry hint instead |
|
|
400
442
|
|
|
401
|
-
**GUI**:
|
|
443
|
+
**GUI**: Library → switch the source filter to **"Local snapshots"** → the row's ⋯ menu → **"Restore"** → review the plan (dry-run, zero writes; a git-style line-by-line comparison) → confirm. The same menu offers "Inspect & compare / Migration consult / Pin / Delete", depending on what that row is.
|
|
402
444
|
|
|
403
445
|
**Snapshot management:**
|
|
404
|
-
- **Retention is visible** — up to **
|
|
446
|
+
- **Retention is visible** — how many snapshots are kept is up to your **retention policy** (Home → Scheduled backup card; the default keeps the newest **10**); the hint is shown in the list
|
|
405
447
|
- **Pin important snapshots** — a pinned snapshot is exempt from auto-pruning and can only be deleted manually
|
|
406
448
|
- **Manual delete** — remove any snapshot (danger, confirmed) when you no longer need that rollback point
|
|
407
449
|
|
|
408
|
-
**Backup
|
|
409
|
-
|
|
450
|
+
**Backup files** (Library → **"Backup files"** source):
|
|
451
|
+
|
|
452
|
+
- Every export ZIP in `exports/` (manual + scheduled) with its source badge, size, time and your **note**
|
|
410
453
|
- **Search** by file name or note
|
|
411
454
|
- **Inspect / Compare** — read-only preview of what the backup contains (sections + per-section counts) and the diff against your current config (zero writes) before deciding to import
|
|
455
|
+
- Download, import straight back, delete
|
|
412
456
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
**
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
log, …) and labels each item's cleanup policy: **regenerated on demand** (caches/staging), **retained**
|
|
421
|
-
(exports for 7 days, scheduled backups keep the latest N), or **your data / safety net** (snapshots and sync —
|
|
422
|
-
never auto-cleaned). **"Clean now"** clears only regenerable caches by default; reclaiming expired backups is
|
|
423
|
-
an explicit opt-in with a confirmation. Snapshots and sync data are never touched, and unreadable directories
|
|
424
|
-
are reported as "not measured" instead of a misleading 0 bytes.
|
|
457
|
+
**Disk usage** (Environment → Maintenance & Diagnostics): the "Disk usage" card lists what this plugin
|
|
458
|
+
itself occupies (exports, pre-import snapshots, sync config and working copies, marketplace cache, temp
|
|
459
|
+
staging, logs, transaction log, …) and labels each item's cleanup policy: **regenerated on demand**
|
|
460
|
+
(caches/staging), **retained** (exports for 7 days, scheduled backups keep the latest N), or **your data /
|
|
461
|
+
safety net** (snapshots and sync — never auto-cleaned). **"Clean now"** clears only regenerable caches by
|
|
462
|
+
default; reclaiming expired backups is an explicit opt-in with a confirmation. Snapshots and sync data are
|
|
463
|
+
never touched, and unreadable directories are reported as "not measured" instead of a misleading 0 bytes.
|
|
425
464
|
|
|
426
465
|
---
|
|
427
466
|
|
|
@@ -537,7 +576,7 @@ dsh-config-manager backup --out D:/rescue/config.zip # explicit destination
|
|
|
537
576
|
dsh-config-manager backup --sections skills,self # narrow the scope
|
|
538
577
|
```
|
|
539
578
|
|
|
540
|
-
`--sections` accepts `skills,agentPresets,agentInstructions,self,pluginFiles
|
|
579
|
+
`--sections` accepts `skills,agentPresets,agentInstructions,self,pluginFiles` (third-party plugin data — `pluginData` / `pluginAssets` — is **not** available to the offline CLI backup; naming it explicitly points you to the GUI export/import). `pluginFiles` is **opt-in** (as in the GUI): it copies third-party plugin files verbatim, and `dsh-ssh.json` holds plaintext host passwords — select it only when you have looked at what is in there.
|
|
541
580
|
|
|
542
581
|
**A typical rescue flow** when DSH won't start: ① `dsh-config-manager reinstall` to bring the launcher back (plus any clean-up), ② if DSH reports a session-log error (`corrupt session log` / `duplicate JSONL session id`), run `dsh-config-manager sessions repair --fix` — it repairs the log layout offline, ③ `dsh web` to start DSH again, ④ re-add the plugin from the registry, and ⑤ pull a snapshot from the remote repo (or run `dsh-config-manager restore`) to bring your config back. The CLI works at every step regardless of DSH's health.
|
|
543
582
|
|
|
@@ -575,7 +614,18 @@ In the content picker, selecting sessions also selects the workspaces that own t
|
|
|
575
614
|
|
|
576
615
|
Cross-machine restores need no extra step in the GUI: **exporting sessions now carries the workspaces that own them**, and the path mapping you fill in the import wizard rewrites both the workspace paths and the sessions' first-frame cwd (relocating the directories accordingly) before the sessions are attached to those workspaces.
|
|
577
616
|
|
|
578
|
-
**Plugins installed but the backup doesn't see them?** Check **Settings →
|
|
617
|
+
**Plugins installed but the backup doesn't see them?** Check **Settings → Backup & Migration → the About icon at the top right**: it shows which directory / profile the plugin list was read from, and how many plugins were detected. The list comes from `$DSH_HOME/profiles/<profile>/package.json` → `dependencies` (plus anything declared in `dsh.profile.bundles` that is not a dependency), where `<profile>` is resolved as `config.profile` → `--profile` → `web`. If the shown path is not the profile you installed into (Desktop builds may use a different profile or a different `DSH_HOME`), that is the cause — align `--profile` / `DSH_HOME` with it.
|
|
618
|
+
|
|
619
|
+
**`web` — the offline rescue console (for when you would rather click than type).** It starts a small web page bound to **127.0.0.1 only** and lays out the same diagnostics and rescue actions in a browser:
|
|
620
|
+
|
|
621
|
+
```bash
|
|
622
|
+
dsh-config-manager web # starts it and opens your browser (the terminal prints a one-time token URL)
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
- **Read-only:** running instances / SAFE MODE / leftover lock / snapshots / exported backups (with one-click verification) / disk usage / session health / profiles and their instances.
|
|
626
|
+
- **Write actions (each needs an explicit confirmation in the page, and every one calls the same implementation as the CLI):** ① relocate misplaced sessions ② clear rebuildable caches and expired exports ③ reclaim a stale environment lock ④ start/stop a profile's standalone instance ⑤ **unlock an encrypted backup** (decrypted in memory, lists entries only — never written to disk) ⑥ **restore a snapshot** (see the per-item plan first, zero writes; restoring copies current files to `<snapshot>/pre-restore/` first) ⑦ **offline export** (file-based sections, self-checked right after writing) ⑧ **reinstall DSH** (uninstall + reinstall the global CLI; **requires a 6-character code printed only in the terminal**).
|
|
627
|
+
- **Safety:** loopback-only binding; a one-time token printed to your terminal is exchanged for an HttpOnly + SameSite=Strict session cookie; the page has no scripts and no external resources. `Ctrl+C` or the idle timeout (30 minutes by default) shuts it down.
|
|
628
|
+
- **Preconditions:** session relocation and restore need DSH stopped; with an unresolved SAFE MODE transaction or a leftover environment lock every write action is refused (the page says why). **Import** (writing a bundle back into this machine) stays on the GUI/CLI — structural sections need live DSH services.
|
|
579
629
|
|
|
580
630
|
### 🌐 Behind a proxy? (GitHub login / sync)
|
|
581
631
|
|
|
@@ -606,17 +656,6 @@ How it behaves:
|
|
|
606
656
|
|
|
607
657
|
Alternative (host-wide): set `NODE_USE_ENV_PROXY=1` **before starting DSH** (Node 24+); note this also routes the host's own outbound traffic, not just this plugin's.
|
|
608
658
|
|
|
609
|
-
**`web` — the offline rescue console (for when you would rather click than type).** It starts a small web page bound to **127.0.0.1 only** and lays out the same diagnostics and rescue actions in a browser:
|
|
610
|
-
|
|
611
|
-
```bash
|
|
612
|
-
dsh-config-manager web # starts it and opens your browser (the terminal prints a one-time token URL)
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
- **Read-only:** running instances / SAFE MODE / leftover lock / snapshots / exported backups (with one-click verification) / disk usage / session health / profiles and their instances.
|
|
616
|
-
- **Write actions (each needs an explicit confirmation in the page, and every one calls the same implementation as the CLI):** ① relocate misplaced sessions ② clear rebuildable caches and expired exports ③ reclaim a stale environment lock ④ start/stop a profile's standalone instance ⑤ **unlock an encrypted backup** (decrypted in memory, lists entries only — never written to disk) ⑥ **restore a snapshot** (see the per-item plan first, zero writes; restoring copies current files to `<snapshot>/pre-restore/` first) ⑦ **offline export** (file-based sections, self-checked right after writing) ⑧ **reinstall DSH** (uninstall + reinstall the global CLI; **requires a 6-character code printed only in the terminal**).
|
|
617
|
-
- **Safety:** loopback-only binding; a one-time token printed to your terminal is exchanged for an HttpOnly + SameSite=Strict session cookie; the page has no scripts and no external resources. `Ctrl+C` or the idle timeout (30 minutes by default) shuts it down.
|
|
618
|
-
- **Preconditions:** session relocation and restore need DSH stopped; with an unresolved SAFE MODE transaction or a leftover environment lock every write action is refused (the page says why). **Import** (writing a bundle back into this machine) stays on the GUI/CLI — structural sections need live DSH services.
|
|
619
|
-
|
|
620
659
|
### 🤖 Agent tools (for AI assistants)
|
|
621
660
|
|
|
622
661
|
The plugin also registers **5 model tools** that an AI agent (a DSH assistant session) can call directly — the same backup / snapshot / sync engines, no GUI needed:
|
|
@@ -660,7 +699,7 @@ Once the plugin is installed the tools appear automatically in every agent sessi
|
|
|
660
699
|
Not by default. The default backup **never contains any secret value** — only records which keys you'll need to re-enter. If you explicitly choose an **encrypted backup**, secrets are included, but only as scrypt + AES-256-GCM ciphertext (random salt & IV per export) — never plaintext.
|
|
661
700
|
|
|
662
701
|
**Q: Will importing overwrite my existing config?**
|
|
663
|
-
Not silently. Conflicts ask you to choose (Keep
|
|
702
|
+
Not silently. Conflicts ask you to choose per item (Keep current / Use backup, with bulk buttons); the target is auto-snapshotted first and can roll back.
|
|
664
703
|
|
|
665
704
|
**Q: Does it work across platforms (Windows → macOS)?**
|
|
666
705
|
Yes. Dead absolute paths are detected and remapped (batch replacement supported).
|
|
@@ -669,7 +708,7 @@ Yes. Dead absolute paths are detected and remapped (batch replacement supported)
|
|
|
669
708
|
No. A checksum mismatch rejects the import outright (protects against corruption or tampering).
|
|
670
709
|
|
|
671
710
|
**Q: Will re-importing duplicate things?**
|
|
672
|
-
No. Items are matched by stable IDs (plugin ID / MCP name / skill name…): identical ones are skipped, and ones that differ from the target surface as **conflicts you decide** (Keep
|
|
711
|
+
No. Items are matched by stable IDs (plugin ID / MCP name / skill name…): identical ones are skipped, and ones that differ from the target surface as **conflicts you decide** (Keep current / Use backup) — nothing is overwritten silently.
|
|
673
712
|
|
|
674
713
|
**Q: Why is the console quiet after `dsh web` — how do I get the plugin logs back?**
|
|
675
714
|
By design. Routine progress logs (mount banner, scheduler skips, export/backup completion) are emitted at `info`, and the shipped default level is `warn` — so only warnings and errors reach the terminal. Set `DSH_CONFIG_MANAGER_LOG_LEVEL=info` (or `debug`) before starting DSH to bring the verbose lines back.
|
|
@@ -684,11 +723,12 @@ Yes. The import wizard asks for the export-time encryption password and verifies
|
|
|
684
723
|
1. **Installing / updating plugins or MCP takes effect after restarting DSH**
|
|
685
724
|
2. **Some UI state is not migrated** (e.g. task board data, panel widths — they live in the browser, not in DSH's config files)
|
|
686
725
|
3. **keybindings / workflow configs / commands** — DSH has no such concepts, so nothing is exported for them. Global agent rules are covered by **Agent Instructions** (`~/.dsh/AGENTS.md`, injected into every session); per-project `AGENTS.md`/`CLAUDE.md` belong to each project's repo and are not migrated
|
|
687
|
-
4. **History/session migration is opt-in** — DSH's own sessions are only exported/synced when you explicitly select the `sessions` section (the sync channel additionally needs both sides to allow it); **another agent's chat history is migrated when you pick that source** in the foreign import. Conversation state that DSH's session format has no room for (model reasoning traces, images, compaction checkpoints) is counted and reported, never fabricated
|
|
726
|
+
4. **History/session migration is opt-in** — DSH's own sessions are only exported/synced when you explicitly select the `sessions` section (the sync channel additionally needs both sides to allow it); **MCP servers are the other opt-in sync section** — the `mcp` section is `platformSpecific`, so it is never in the default sync set; tick **MCP Servers** in the sync-section dialog to carry it (auto sync follows along, but a pulled `mcp` change still lands in the diff review, since it is a medium-risk section). Servers whose `command` / `cwd` are absolute paths, or whose runtime (npx / uvx / pipx) is missing on the target, are reported by the import analysis — the config is written anyway; **another agent's chat history is migrated when you pick that source** in the foreign import. Conversation state that DSH's session format has no room for (model reasoning traces, images, compaction checkpoints) is counted and reported, never fabricated
|
|
688
727
|
5. **Encrypted backups**: a lost password means the `secrets.enc` can't be decrypted (by design — keep your password safe)
|
|
689
728
|
6. **Snapshot restore is offline and honest**: entries the offline engine can't restore (settings namespaces / patch lines when the snapshot has no whole-file backup, workspace records stored in DSH storages) are reported as skipped with a pointer to online rollback; credential **values** are never auto-written (manual re-entry hint only); old snapshots without a plugin baseline only get a hint to remove added plugins manually
|
|
690
729
|
7. **Foreign-agent import has two known blanks**: **Copilot has no chat-history import** (its session format could not be verified on this machine, so only its configuration is imported), and Cursor's per-project history is located through Cursor's own folder-slug scheme, which may not resolve for every project. Conversations already imported with an older build should be deleted and re-imported first (a second import of the same id is reported as a **skipped** `session-id-conflict`, not merged)
|
|
691
730
|
8. **Local source plugins (`link:` / `file:`) are packed into the backup**: the export runs `npm pack` on plugins you are developing locally and stores the tarball in the backup; the import unpacks it under `$DSH_HOME/dsh-config-manager/local-plugins/` and installs it as `file:`. Three consequences: ① backup size grows with those plugins (a single plugin over 100 MB is skipped with a warning — publish it to a registry / git first); ② plugin **source code** enters the backup (this does not conflict with "no secrets in backups" — secrets stay excluded, what travels is code); ③ packing needs a working `npm` on this machine; without it the plugin falls back to the previous behaviour (the original spec is kept, and a new machine still needs a manual install)
|
|
731
|
+
9. **A rewind only reaches as far as its rollback point**: it only handles the files recorded at capture time plus files created after that point; the default per-point limit is **20,000 files / 512 MiB** (an over-limit point is marked incomplete and reported as such — never faked). While a conversation is **running**, only the conversation is rewound by default, not the files; crash leftovers that already moved into the quarantine no longer take part in the next startup's classification and need an explicit restore or a manual move-back
|
|
692
732
|
|
|
693
733
|
## 💬 Feedback
|
|
694
734
|
|
|
@@ -702,7 +742,7 @@ Found a bug, a misaligned panel, a button that does nothing — or just have an
|
|
|
702
742
|
| 💬 **Not sure whether it is a bug — just asking** | [Discussions](https://github.com/xiajiajun516/dsh-config-manager/discussions) |
|
|
703
743
|
| 🔒 **Security issue / leaked credential** | [Private security advisory](https://github.com/xiajiajun516/dsh-config-manager/security/advisories/new) (please do not open a public issue) |
|
|
704
744
|
|
|
705
|
-
**Report straight from the plugin**: Settings → Backup & Migration → **About** → "Issues"; or hit **Copy environment info**
|
|
745
|
+
**Report straight from the plugin**: Settings → Backup & Migration → the **About icon at the top right** → "Issues"; or hit **Copy environment info** there — plugin version / DSH version / platform are included, so you can paste it into the issue instead of typing version numbers.
|
|
706
746
|
|
|
707
747
|
**Every report gets followed up**: a new issue receives an immediate reply and the `needs-triage` label, and progress is visible in the labels (`needs-info` → `confirmed` → `fixed`). Fixed problems end up in [CHANGELOG.md](CHANGELOG.md) under the release that fixed them, tagged with the issue number (e.g. #38 / #43 / #45) — that is where a report finally lands.
|
|
708
748
|
|
|
@@ -723,9 +763,20 @@ Found a bug, a misaligned panel, a button that does nothing — or just have an
|
|
|
723
763
|
The report came with upstream evidence (host artwork frames of 48/36 px and 40/30 px, the official published bundle
|
|
724
764
|
icons, the fixture SVG) and the PR shipped a 16/30/36/48 × dark/light acceptance sheet plus a written argument for
|
|
725
765
|
keeping the proposal's palette over the plugin's brand blue.
|
|
726
|
-
- **
|
|
727
|
-
|
|
728
|
-
|
|
766
|
+
- **iuuuuuuuu** — [PR #67](https://github.com/xiajiajun516/dsh-config-manager/pull/67) (merge `780af10`),
|
|
767
|
+
[PR #68](https://github.com/xiajiajun516/dsh-config-manager/pull/68) (`16e13c1`) and
|
|
768
|
+
[PR #72](https://github.com/xiajiajun516/dsh-config-manager/pull/72) (`6e552a0`): (1) a **repository picker** for the git
|
|
769
|
+
sync channel — choose from the **private** repositories the token can see (sorted by most recently updated; public
|
|
770
|
+
repositories are never listed), or create a private one inline; the create request does not even carry `private`, so
|
|
771
|
+
there is no way to express "public" on the client and the constraint lives on the host side. Along the way it fixed
|
|
772
|
+
the link-traversal boundary check that mixed `realpath` spellings (Windows 8.3 short names and macOS `/var` →
|
|
773
|
+
`/private/var` were misjudged `outside-home`, so linked content was silently dropped while the backup reported
|
|
774
|
+
success). (2) The Overview first paint no longer waits for a full read-only preview — the `plugins` section gained a
|
|
775
|
+
`preview()` (no more one `npm pack` per local plugin) and `settings` / `credentialsStatus` are read back in one call
|
|
776
|
+
instead of one `describe` per namespace (24 namespaces × 12 local plugins, 27.6 s of preview on a real machine).
|
|
777
|
+
(3) The issue #71 fix — MCP servers and skills configured in the shell were not backed up at all: patch rows are now
|
|
778
|
+
read per layer and written back to their own layer, and skills are collected through the shell's `skills` service.
|
|
779
|
+
All three shipped with unit tests and route / source-level guards.
|
|
729
780
|
|
|
730
781
|
> Maintainers & developers: see [DEVELOPERS.md](DEVELOPERS.md) for build, testing, auto-publishing and full technical notes.
|
|
731
782
|
|