dsh-config-manager 0.1.67 → 0.1.69
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 +53 -0
- package/README.zh-CN.md +51 -0
- package/icon.svg +16 -0
- package/lib/adapters/agent-instructions.d.ts +28 -3
- package/lib/adapters/agent-instructions.js +26 -22
- package/lib/adapters/file-collection.d.ts +40 -1
- package/lib/adapters/file-collection.js +106 -15
- package/lib/adapters/plugins.d.ts +3 -1
- package/lib/adapters/self.d.ts +51 -5
- package/lib/adapters/self.js +34 -49
- package/lib/adapters/sessions.d.ts +7 -2
- package/lib/adapters/sessions.js +41 -3
- package/lib/adapters/test-helpers.d.ts +7 -0
- package/lib/adapters/test-helpers.js +10 -0
- package/lib/adapters/units.d.ts +12 -2
- package/lib/adapters/units.js +13 -6
- package/lib/cli/actions.d.ts +513 -0
- package/lib/cli/actions.js +1074 -0
- package/lib/cli/index.d.ts +7 -1
- package/lib/cli/index.js +156 -38
- package/lib/cli/sessions-inspect.d.ts +17 -0
- package/lib/cli/sessions-inspect.js +104 -0
- package/lib/cli/sessions-repair.js +12 -1
- package/lib/cli/web/browser.d.ts +1 -0
- package/lib/cli/web/browser.js +21 -0
- package/lib/cli/web/client-script.d.ts +4 -0
- package/lib/cli/web/client-script.js +245 -0
- package/lib/cli/web/exec.d.ts +1 -0
- package/lib/cli/web/exec.js +22 -0
- package/lib/cli/web/http.d.ts +19 -0
- package/lib/cli/web/http.js +13 -0
- package/lib/cli/web/page.d.ts +137 -0
- package/lib/cli/web/page.js +943 -0
- package/lib/cli/web/routes.d.ts +15 -0
- package/lib/cli/web/routes.js +407 -0
- package/lib/cli/web/server.d.ts +37 -0
- package/lib/cli/web/server.js +189 -0
- package/lib/client.d.ts +1006 -120
- package/lib/client.js +25726 -20712
- package/lib/core/analyzer.d.ts +33 -1
- package/lib/core/analyzer.js +229 -8
- package/lib/core/backup-verify.js +1 -3
- package/lib/core/cache-cleaner.d.ts +28 -1
- package/lib/core/cache-cleaner.js +153 -88
- package/lib/core/crash-report.js +1 -4
- package/lib/core/disk-usage.d.ts +113 -0
- package/lib/core/disk-usage.js +246 -0
- package/lib/core/importer.d.ts +6 -1
- package/lib/core/journal.js +1 -10
- package/lib/core/local-plugin-host.d.ts +1 -1
- package/lib/core/local-plugin-host.js +17 -2
- package/lib/core/local-plugin-pack.d.ts +28 -0
- package/lib/core/local-plugin-pack.js +56 -1
- package/lib/core/messages.d.ts +7 -0
- package/lib/core/messages.js +15 -0
- package/lib/core/migration-history.js +3 -10
- package/lib/core/recovery-orchestrator.d.ts +19 -1
- package/lib/core/recovery-orchestrator.js +68 -7
- package/lib/core/restore.d.ts +7 -1
- package/lib/core/restore.js +12 -2
- package/lib/core/session-health.d.ts +164 -0
- package/lib/core/session-health.js +164 -0
- package/lib/core/session-meta.d.ts +6 -1
- package/lib/core/session-meta.js +49 -1
- package/lib/core/types.d.ts +221 -1
- package/lib/core/update-check.d.ts +81 -0
- package/lib/core/update-check.js +145 -0
- package/lib/core/validator.d.ts +22 -2
- package/lib/core/validator.js +52 -19
- package/lib/index.d.ts +70 -5
- package/lib/index.js +250 -26
- package/lib/market/git-file-writer.js +1 -4
- package/lib/market/types.d.ts +0 -5
- package/lib/profiles/dsh-profile-io.d.ts +8 -0
- package/lib/profiles/dsh-profile-io.js +31 -0
- package/lib/profiles/dsh-profile-launcher.js +6 -19
- package/lib/profiles/dsh-profile-manager.d.ts +2 -0
- package/lib/profiles/dsh-profile-manager.js +22 -13
- package/lib/profiles/dsh-profile-runtime.js +4 -14
- package/lib/profiles/dsh-profile-shared.d.ts +19 -0
- package/lib/routes/backup.js +155 -1
- package/lib/routes/consult.js +10 -2
- package/lib/routes/import.js +21 -10
- package/lib/routes/kit.d.ts +8 -0
- package/lib/routes/kit.js +8 -0
- package/lib/routes/prefs.d.ts +2 -1
- package/lib/routes/prefs.js +32 -1
- package/lib/routes/profiles.js +2 -0
- package/lib/routes/recovery.js +167 -1
- package/lib/routes/session-format.d.ts +25 -0
- package/lib/routes/session-format.js +54 -0
- package/lib/routes/sync.js +138 -5
- package/lib/schema/config.d.ts +1 -11
- package/lib/schema/config.js +0 -10
- package/lib/security/container-kind.d.ts +15 -0
- package/lib/security/container-kind.js +48 -0
- package/lib/security/index.d.ts +2 -1
- package/lib/security/index.js +2 -1
- package/lib/security/integrity.d.ts +0 -1
- package/lib/security/integrity.js +0 -1
- package/lib/security/redaction.d.ts +2 -0
- package/lib/security/redaction.js +37 -1
- package/lib/sync/backup-files.d.ts +28 -2
- package/lib/sync/backup-files.js +19 -5
- package/lib/sync/git/git-transport.d.ts +27 -2
- package/lib/sync/git/git-transport.js +50 -11
- package/lib/sync/snapshot-json.d.ts +8 -1
- package/lib/sync/snapshot-json.js +10 -3
- package/lib/sync/sync-config.d.ts +25 -0
- package/lib/sync/sync-config.js +46 -0
- package/lib/sync/sync-engine.d.ts +54 -0
- package/lib/sync/sync-engine.js +75 -7
- package/lib/sync/transport.js +4 -1
- package/lib/sync/ui-prefs.d.ts +10 -0
- package/lib/sync/ui-prefs.js +6 -0
- package/lib/sync/webdav/webdav-transport.d.ts +12 -0
- package/lib/sync/webdav/webdav-transport.js +22 -2
- package/lib/ui/artifact-view.d.ts +150 -0
- package/lib/ui/artifact-view.js +264 -0
- package/lib/ui/commands.d.ts +72 -0
- package/lib/ui/commands.js +153 -0
- package/lib/ui/disk-usage-view.d.ts +77 -0
- package/lib/ui/disk-usage-view.js +104 -0
- package/lib/ui/dsh-profiles-view.d.ts +17 -0
- package/lib/ui/dsh-profiles-view.js +17 -0
- package/lib/ui/export-flow.d.ts +0 -7
- package/lib/ui/history-model.d.ts +1 -1
- package/lib/ui/history-model.js +1 -1
- package/lib/ui/i18n.d.ts +116 -0
- package/lib/ui/i18n.js +234 -0
- package/lib/ui/import-wizard.d.ts +25 -1
- package/lib/ui/import-wizard.js +69 -1
- package/lib/ui/menu-placement.d.ts +56 -0
- package/lib/ui/menu-placement.js +63 -0
- package/lib/ui/mid-ellipsis.d.ts +3 -2
- package/lib/ui/mid-ellipsis.js +3 -2
- package/lib/ui/nav-model.d.ts +34 -0
- package/lib/ui/nav-model.js +70 -0
- package/lib/ui/next-steps.d.ts +23 -1
- package/lib/ui/next-steps.js +19 -2
- package/lib/ui/overview-view.d.ts +1 -1
- package/lib/ui/overview-view.js +1 -1
- package/lib/ui/runs-view.d.ts +1 -6
- package/lib/ui/runs-view.js +1 -8
- package/lib/ui/session-format-disposition.d.ts +108 -0
- package/lib/ui/session-format-disposition.js +122 -0
- package/lib/ui/session-inventory-view.d.ts +255 -0
- package/lib/ui/session-inventory-view.js +181 -0
- package/lib/ui/test-helpers.d.ts +6 -2
- package/lib/ui/test-helpers.js +1 -1
- package/lib/ui/types.d.ts +114 -14
- package/lib/ui/types.js +0 -4
- package/lib/utils/atomic-write.js +1 -3
- package/lib/utils/env-lock.d.ts +0 -4
- package/lib/utils/env-lock.js +11 -16
- package/lib/utils/git-quote.d.ts +8 -0
- package/lib/utils/git-quote.js +11 -0
- package/lib/utils/guards.d.ts +12 -0
- package/lib/utils/guards.js +17 -0
- package/lib/utils/hashing.d.ts +0 -1
- package/lib/utils/hashing.js +0 -5
- package/lib/utils/json.d.ts +13 -0
- package/lib/utils/json.js +13 -0
- package/lib/utils/logger.d.ts +0 -3
- package/lib/utils/logger.js +1 -6
- package/lib/utils/paths.d.ts +0 -4
- package/lib/utils/paths.js +0 -10
- package/lib/utils/session-format.d.ts +32 -0
- package/lib/utils/session-format.js +107 -0
- package/lib/utils/session-health-scan.d.ts +42 -0
- package/lib/utils/session-health-scan.js +319 -0
- package/lib/utils/session-log-repair.d.ts +127 -0
- package/lib/utils/session-log-repair.js +484 -0
- package/lib/utils/session-log.d.ts +28 -0
- package/lib/utils/session-log.js +65 -8
- package/lib/utils/session-repair-service.d.ts +146 -0
- package/lib/utils/session-repair-service.js +353 -0
- package/lib/utils/session-row-facts.d.ts +53 -0
- package/lib/utils/session-row-facts.js +108 -0
- package/lib/utils/shared-constants.d.ts +23 -0
- package/lib/utils/shared-constants.js +24 -0
- package/lib/utils/ttl-cache.d.ts +40 -0
- package/lib/utils/ttl-cache.js +66 -0
- package/lib/utils/zip.d.ts +15 -0
- package/lib/utils/zip.js +69 -14
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +13 -6
- package/src/adapters/agent-instructions.test.ts +113 -0
- package/src/adapters/agent-instructions.ts +28 -23
- package/src/adapters/file-collection.test.ts +168 -1
- package/src/adapters/file-collection.ts +128 -17
- package/src/adapters/plugins.test.ts +3 -1
- package/src/adapters/plugins.ts +2 -1
- package/src/adapters/self.test.ts +48 -0
- package/src/adapters/self.ts +45 -29
- package/src/adapters/sessions.test.ts +112 -0
- package/src/adapters/sessions.ts +49 -4
- package/src/adapters/test-helpers.ts +10 -0
- package/src/adapters/units.ts +22 -7
- package/src/cli/actions.test.ts +433 -0
- package/src/cli/actions.ts +1440 -0
- package/src/cli/index.ts +174 -39
- package/src/cli/sessions-inspect.test.ts +90 -0
- package/src/cli/sessions-inspect.ts +114 -0
- package/src/cli/sessions-repair.ts +11 -1
- package/src/cli/web/browser.ts +20 -0
- package/src/cli/web/client-script.ts +247 -0
- package/src/cli/web/exec.ts +23 -0
- package/src/cli/web/http.ts +30 -0
- package/src/cli/web/page.ts +1120 -0
- package/src/cli/web/routes.ts +502 -0
- package/src/cli/web/server.ts +234 -0
- package/src/cli/web/web.test.ts +1003 -0
- package/src/client/CLIENT_DEPENDENCIES.md +10 -1
- package/src/client/ConfigManagerSection.tsx +370 -159
- package/src/client/about/AboutPanel.tsx +83 -8
- package/src/client/about/about-view.test.ts +42 -2
- package/src/client/about/about-view.ts +57 -1
- package/src/client/api.ts +53 -4
- package/src/client/client-types.ts +5 -0
- package/src/client/common/CommandPalette.tsx +173 -0
- package/src/client/common/ContentPicker.tsx +4 -1
- package/src/client/common/CopyButton.tsx +9 -12
- package/src/client/common/ErrorBanner.tsx +1 -5
- package/src/client/common/Icon.tsx +4 -4
- package/src/client/common/InfoHint.tsx +280 -0
- package/src/client/common/Modal.tsx +14 -2
- package/src/client/common/MoreMenu.tsx +195 -0
- package/src/client/common/RunsCenter.tsx +12 -10
- package/src/client/common/Select.tsx +183 -40
- package/src/client/common/ToastViewport.tsx +1 -1
- package/src/client/common/client-route-parity.test.ts +10 -0
- package/src/client/common/clipboard.test.ts +42 -0
- package/src/client/common/clipboard.ts +19 -0
- package/src/client/common/compat-label.test.ts +43 -0
- package/src/client/common/compat-label.ts +28 -0
- package/src/client/common/floating-bounds.ts +48 -0
- package/src/client/common/floating-units.test.ts +71 -0
- package/src/client/common/http.test.ts +24 -0
- package/src/client/common/http.ts +19 -3
- package/src/client/common/info-hint-guard.test.ts +836 -0
- package/src/client/common/menu-align.ts +29 -0
- package/src/client/common/menu-scroll-guard.test.ts +61 -0
- package/src/client/common/morph-icons.ts +0 -2
- package/src/client/common/plan-text-redaction.test.ts +7 -6
- package/src/client/common/routes.ts +18 -0
- package/src/client/common/ui.tsx +1 -1
- package/src/client/config-manager.module.css +793 -446
- package/src/client/{profiles/ProfilesPanel.tsx → environment/EnvironmentPanel.tsx} +91 -21
- package/src/client/export/ExportView.tsx +18 -10
- package/src/client/history/HistoryPanel.tsx +2 -2
- package/src/client/history/history-locales.ts +0 -20
- package/src/client/{overview/OverviewPanel.tsx → home/HomePanel.tsx} +105 -32
- package/src/client/import/ImportWizardView.tsx +110 -16
- package/src/client/import/import-file-select.test.ts +53 -0
- package/src/client/import/import-wizard-steps.tsx +101 -1
- package/src/client/import/use-import-wizard-controller.ts +113 -5
- package/src/client/index.ts +2 -2
- package/src/client/library/ArtifactDetail.tsx +34 -0
- package/src/client/library/ArtifactRow.tsx +128 -0
- package/src/client/library/BackupInspectView.tsx +96 -0
- package/src/client/library/LibraryActions.tsx +638 -0
- package/src/client/library/LibraryPanel.tsx +250 -0
- package/src/client/library/task-panel-visibility.test.ts +42 -0
- package/src/client/locales.ts +205 -0
- package/src/client/lucide-icons.d.ts +1 -0
- package/src/client/market/MarketImportReview.tsx +8 -2
- package/src/client/market/MarketPanel.tsx +52 -4
- package/src/client/market/MyConfigsLoginCard.tsx +2 -1
- package/src/client/market/MyConfigsWizard.tsx +4 -2
- package/src/client/market/market-locales.ts +5 -0
- package/src/client/recovery/RecoveryPanel.tsx +612 -4
- package/src/client/recovery/recovery-api.ts +51 -1
- package/src/client/recovery/recovery-locales.ts +186 -0
- package/src/client/recovery/recovery-view.test.ts +38 -0
- package/src/client/recovery/recovery-view.ts +14 -10
- package/src/client/recovery/session-dialog-mount.test.ts +58 -0
- package/src/client/run-store.test.ts +90 -56
- package/src/client/run-store.ts +162 -62
- package/src/client/snapshots/BackupScheduleCard.tsx +84 -115
- package/src/client/snapshots/DiskUsageCard.tsx +253 -0
- package/src/client/snapshots/files-layout.test.ts +90 -0
- package/src/client/snapshots/report-dismiss.test.ts +19 -15
- package/src/client/sync/AutosyncCard.tsx +5 -6
- package/src/client/sync/ChannelClearConfirmDialog.tsx +58 -0
- package/src/client/sync/ChannelConfigDialog.tsx +31 -45
- package/src/client/sync/DecryptPasswordCard.tsx +2 -2
- package/src/client/sync/SecurityOptionsCard.tsx +2 -2
- package/src/client/sync/SyncChannelEntryCard.tsx +22 -6
- package/src/client/sync/SyncConfirmView.tsx +85 -26
- package/src/client/sync/{SyncHistoryView.tsx → SyncLogList.tsx} +84 -103
- package/src/client/sync/{SyncSettingsView.tsx → SyncPanel.tsx} +313 -174
- package/src/client/sync/SyncSectionPickerDialog.tsx +20 -9
- package/src/client/sync/SyncSettingsView.test.ts +40 -5
- package/src/client/sync/UnreadableSnapshotsBanner.tsx +35 -0
- package/src/client/sync/history-model.ts +2 -2
- package/src/client/sync/sync-api.ts +66 -1
- package/src/client/sync/sync-locales.ts +52 -0
- package/src/client/sync/sync-view-v2.test.ts +54 -2
- package/src/client/sync/sync-view.test.ts +1 -14
- package/src/client/sync/sync-view.ts +67 -23
- package/src/client/task/TaskShell.tsx +83 -0
- package/src/core/analyzer-cache.test.ts +154 -0
- package/src/core/analyzer.ts +248 -10
- package/src/core/backup-verify.ts +1 -4
- package/src/core/cache-cleaner.test.ts +66 -0
- package/src/core/cache-cleaner.ts +98 -15
- package/src/core/compatibility-reasons.test.ts +100 -0
- package/src/core/crash-report.ts +1 -5
- package/src/core/disk-usage.test.ts +179 -0
- package/src/core/disk-usage.ts +360 -0
- package/src/core/import-sessions-visibility.test.ts +183 -7
- package/src/core/importer.ts +3 -1
- package/src/core/incident-wiring.test.ts +6 -1
- package/src/core/journal.ts +1 -13
- package/src/core/local-plugin-host.ts +17 -3
- package/src/core/local-plugin-pack.test.ts +101 -0
- package/src/core/local-plugin-pack.ts +70 -1
- package/src/core/messages.ts +15 -0
- package/src/core/migration-history.ts +3 -13
- package/src/core/recovery-orchestrator.ts +84 -9
- package/src/core/restore.ts +15 -2
- package/src/core/session-health.test.ts +224 -0
- package/src/core/session-health.ts +305 -0
- package/src/core/session-meta.test.ts +88 -2
- package/src/core/session-meta.ts +48 -1
- package/src/core/smoke.test.ts +14 -0
- package/src/core/types.ts +201 -1
- package/src/core/update-check.test.ts +149 -0
- package/src/core/update-check.ts +170 -0
- package/src/core/validator.ts +53 -21
- package/src/index.ts +256 -25
- package/src/market/git-file-writer.ts +1 -5
- package/src/market/types.ts +0 -6
- package/src/profiles/dsh-profile-io.ts +31 -0
- package/src/profiles/dsh-profile-launcher.ts +6 -23
- package/src/profiles/dsh-profile-manager.test.ts +26 -0
- package/src/profiles/dsh-profile-manager.ts +21 -14
- package/src/profiles/dsh-profile-runtime.ts +4 -14
- package/src/profiles/dsh-profile-shared.ts +19 -0
- package/src/routes/backup.ts +167 -1
- package/src/routes/consult.ts +10 -2
- package/src/routes/import.ts +21 -8
- package/src/routes/kit.ts +13 -0
- package/src/routes/prefs.ts +31 -1
- package/src/routes/profiles.ts +2 -0
- package/src/routes/recovery.ts +151 -0
- package/src/routes/session-format.test.ts +59 -0
- package/src/routes/session-format.ts +74 -0
- package/src/routes/sync.ts +140 -4
- package/src/schema/config.ts +1 -15
- package/src/security/container-kind.test.ts +92 -0
- package/src/security/container-kind.ts +51 -0
- package/src/security/index.ts +2 -1
- package/src/security/integrity.ts +0 -1
- package/src/security/redaction.ts +39 -1
- package/src/security/security.test.ts +9 -0
- package/src/sync/backup-files.test.ts +34 -0
- package/src/sync/backup-files.ts +39 -5
- package/src/sync/git/git-transport.test.ts +56 -0
- package/src/sync/git/git-transport.ts +50 -16
- package/src/sync/snapshot-json.test.ts +35 -0
- package/src/sync/snapshot-json.ts +10 -3
- package/src/sync/sync-config.test.ts +68 -1
- package/src/sync/sync-config.ts +56 -0
- package/src/sync/sync-engine.test.ts +31 -0
- package/src/sync/sync-engine.ts +84 -7
- package/src/sync/transport.ts +5 -1
- package/src/sync/ui-prefs.test.ts +24 -0
- package/src/sync/ui-prefs.ts +16 -0
- package/src/sync/webdav/webdav-transport.ts +24 -2
- package/src/ui/artifact-view.test.ts +203 -0
- package/src/ui/artifact-view.ts +410 -0
- package/src/ui/commands.test.ts +159 -0
- package/src/ui/commands.ts +208 -0
- package/src/ui/disk-usage-view.test.ts +119 -0
- package/src/ui/disk-usage-view.ts +179 -0
- package/src/ui/dsh-profiles-view.test.ts +21 -2
- package/src/ui/dsh-profiles-view.ts +38 -0
- package/src/ui/export-flow.ts +0 -8
- package/src/ui/history-model.ts +1 -1
- package/src/ui/i18n.ts +234 -0
- package/src/ui/import-wizard.test.ts +124 -5
- package/src/ui/import-wizard.ts +93 -3
- package/src/ui/menu-placement.test.ts +84 -0
- package/src/ui/menu-placement.ts +89 -0
- package/src/ui/mid-ellipsis.test.ts +8 -6
- package/src/ui/mid-ellipsis.ts +3 -2
- package/src/ui/nav-model.test.ts +86 -0
- package/src/ui/nav-model.ts +82 -0
- package/src/ui/next-steps.test.ts +39 -1
- package/src/ui/next-steps.ts +33 -2
- package/src/ui/overview-view.ts +1 -1
- package/src/ui/runs-view.ts +1 -8
- package/src/ui/session-format-disposition.test.ts +114 -0
- package/src/ui/session-format-disposition.ts +174 -0
- package/src/ui/session-inventory-view.test.ts +209 -0
- package/src/ui/session-inventory-view.ts +366 -0
- package/src/ui/test-helpers.ts +12 -6
- package/src/ui/types.ts +128 -21
- package/src/utils/atomic-write.ts +1 -4
- package/src/utils/env-lock.test.ts +32 -4
- package/src/utils/env-lock.ts +11 -18
- package/src/utils/git-quote.ts +10 -0
- package/src/utils/guards.ts +17 -0
- package/src/utils/hashing.ts +0 -6
- package/src/utils/json.ts +14 -0
- package/src/utils/logger.ts +1 -7
- package/src/utils/paths.ts +0 -12
- package/src/utils/session-format.test.ts +107 -0
- package/src/utils/session-format.ts +115 -0
- package/src/utils/session-health-scan.test.ts +217 -0
- package/src/utils/session-health-scan.ts +365 -0
- package/src/utils/session-log-repair.test.ts +310 -0
- package/src/utils/session-log-repair.ts +544 -0
- package/src/utils/session-log.test.ts +13 -0
- package/src/utils/session-log.ts +78 -0
- package/src/utils/session-repair-service.test.ts +178 -0
- package/src/utils/session-repair-service.ts +457 -0
- package/src/utils/session-row-facts.ts +118 -0
- package/src/utils/shared-constants.ts +24 -0
- package/src/utils/ttl-cache.test.ts +96 -0
- package/src/utils/ttl-cache.ts +90 -0
- package/src/utils/zip.ts +65 -15
- package/lib/ui/nav-overflow.d.ts +0 -35
- package/lib/ui/nav-overflow.js +0 -41
- package/src/client/overview/overview-kind-labels.test.ts +0 -43
- package/src/client/snapshots/SnapshotsEmptyState.tsx +0 -31
- package/src/client/snapshots/SnapshotsListTable.tsx +0 -97
- package/src/client/snapshots/SnapshotsPanel.tsx +0 -811
- package/src/ui/nav-overflow.test.ts +0 -57
- package/src/ui/nav-overflow.ts +0 -58
package/lib/adapters/self.js
CHANGED
|
@@ -1,31 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* self 分区 adapter(插件自身配置,设计「self 分区」):
|
|
3
|
-
* 数据源 = $DSH_HOME/dsh-config-manager/ 下的插件自身配置文件(白名单收集,非递归):
|
|
4
|
-
* - sync/sync-config.json 同步通道配置(git repoUrl / webdav url+username;凭据值走 credentials 槽位,不含 secret)
|
|
5
|
-
* - sync/sync-autosync.json 自动同步调度配置
|
|
6
|
-
* - sync/sync-selection.json 同步分区选择(默认/高级模式 + 勾选分区)
|
|
7
|
-
* - sync/ui-prefs.json 插件 UI 偏好(如上次选择的同步通道;从 localStorage 迁入)
|
|
8
|
-
* - market/market-config.json 配置市场配置
|
|
9
|
-
*
|
|
10
|
-
* 排除项:sync/sync-history.json(执行记录,属数据非配置)、market/cache/(缓存)、
|
|
11
|
-
* snapshots/(快照)、tmp/ exports/(临时/导出产物)——只备份「配置」,不备份数据。
|
|
12
|
-
*
|
|
13
|
-
* 实现:继承 FileCollectionAdapter 复用 analyzeImport/applyItem/validate(幂等 hash 比对、
|
|
14
|
-
* 快照/回滚路径一致),仅覆写 export() 为白名单收集(self 目录内存在大量非配置子目录,
|
|
15
|
-
* 不能像 skills/sessions 那样整体递归)。
|
|
16
|
-
*
|
|
17
|
-
* relativePath 一律是「相对 baseDir」的路径(如 sync/sync-config.json),与
|
|
18
|
-
* FileCollectionAdapter 的基准目录语义一致:导入时按 path.join(baseDir, rel) 写回
|
|
19
|
-
* $DSH_HOME/dsh-config-manager/<rel>;ZIP 内位于 self/<rel>。
|
|
20
|
-
*
|
|
21
|
-
* 安全不变量:配置文件本身不含凭据值(同步凭据走 DSH credentials 槽位引用),
|
|
22
|
-
* 且文件类分区不进 SecretScanner(与 pluginFiles/skills 同语义)。
|
|
23
|
-
*/
|
|
24
|
-
import path from 'node:path';
|
|
25
|
-
import { msgOf } from '../core/messages.js';
|
|
26
|
-
import { sha256Hex } from '../utils/hashing.js';
|
|
27
1
|
import { FileCollectionAdapter } from './file-collection.js';
|
|
28
|
-
import { unitAllowed } from './units.js';
|
|
29
2
|
/** self 分区白名单文件(相对 baseDir,即 $DSH_HOME/dsh-config-manager/)。 */
|
|
30
3
|
export const SELF_CONFIG_FILES = [
|
|
31
4
|
'sync/sync-config.json',
|
|
@@ -49,35 +22,47 @@ export class SelfAdapter extends FileCollectionAdapter {
|
|
|
49
22
|
super();
|
|
50
23
|
this.baseDir = baseDir;
|
|
51
24
|
}
|
|
52
|
-
/** 白名单收集:只导出配置类文件(存在才收),不递归(排除快照/历史/缓存/临时产物)。
|
|
53
|
-
* relativePath 产出相对 baseDir 的路径(与 analyzeImport/applyItem 的 path.join(baseDir, ref) 匹配)。 */
|
|
54
25
|
/** self 的白名单文件彼此独立(同步配置 / 市场配置 / UI 偏好…),不构成 bundle
|
|
55
26
|
* → 覆写为「逐文件单元」,用户可以只带走其中几项。 */
|
|
56
27
|
unitIdOf(relativePath) {
|
|
57
28
|
return relativePath;
|
|
58
29
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
30
|
+
/**
|
|
31
|
+
* 清单枚举 = **白名单文件**(覆写基类的目录递归)。
|
|
32
|
+
*
|
|
33
|
+
* 为什么必须覆写:self 目录下并存着插件自身的数据(snapshots/、config-snapshots/、
|
|
34
|
+
* sync/work/ 的 Git 工作副本与远端快照、transactions/、exports/、遗留 profiles/),
|
|
35
|
+
* 整目录递归会把它们全部当成「可勾选单元」(实测本机 2460 个文件 / 11.44 MB)。
|
|
36
|
+
* 覆写后 export()(基类 collect,content 模式)与 preview()(size 模式)拿到**同一份清单**,
|
|
37
|
+
* 选择器显示的条目/体积与真实导出逐项一致。
|
|
38
|
+
*
|
|
39
|
+
* 存在性判定优先 statSize(只 stat;白名单最多 7 个文件);旧宿主未实现时退回读一次文件
|
|
40
|
+
* (单文件代价可忽略,且 collect 之后还要读它)。读不到 / 未创建 → 跳过,
|
|
41
|
+
* 与「文件不存在 = 非白名单命中」同语义(如从未配置市场/同步)。
|
|
42
|
+
*
|
|
43
|
+
* 路径一律用 POSIX 分隔符拼:relativePath 是**备份格式的一部分**(ZIP 内为 self/<rel>),
|
|
44
|
+
* 同时是单元 id(self:<rel>)与 includeItems 的比对键 —— 不能随平台漂移成反斜杠。
|
|
45
|
+
*/
|
|
46
|
+
async listRelPaths(ctx) {
|
|
47
|
+
const empty = { paths: [], skippedLinks: [], followedLinks: 0, unreadableDirs: [] };
|
|
48
|
+
const found = [];
|
|
63
49
|
for (const rel of SELF_CONFIG_FILES) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
50
|
+
const full = `${this.baseDir}/${rel}`;
|
|
51
|
+
try {
|
|
52
|
+
if (ctx.fs.statSize !== undefined) {
|
|
53
|
+
if ((await ctx.fs.statSize(full)) === null)
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
await ctx.fs.readFile(full);
|
|
58
|
+
}
|
|
59
|
+
found.push(full);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// 未创建过的配置文件跳过
|
|
63
|
+
}
|
|
71
64
|
}
|
|
72
|
-
|
|
73
|
-
warnings.push(msgOf(ctx)('adapter.dirEmpty', { type: this.displayName }));
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
sectionId: this.id,
|
|
77
|
-
data: { version: 1, files },
|
|
78
|
-
counts: { files: files.length },
|
|
79
|
-
warnings,
|
|
80
|
-
};
|
|
65
|
+
return { ...empty, paths: found };
|
|
81
66
|
}
|
|
82
67
|
}
|
|
83
68
|
//# sourceMappingURL=self.js.map
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* core/session-select.ts(单位 = 会话目录、文件名判据不写死、按日志最新 mtime 倒序)。
|
|
9
9
|
*/
|
|
10
10
|
import { FileCollectionAdapter } from './file-collection.ts';
|
|
11
|
-
import type { ApplyResult, ExportOptions, ExportSection, HostContext, ImportContext } from '../core/types.ts';
|
|
11
|
+
import type { ApplyResult, ExportOptions, ExportSection, HostContext, ImportContext, PlanItem } from '../core/types.ts';
|
|
12
12
|
import type { FilesSection } from '../schema/types.ts';
|
|
13
13
|
export declare class SessionsAdapter extends FileCollectionAdapter {
|
|
14
14
|
readonly id: 'sessions';
|
|
@@ -66,8 +66,12 @@ export declare class SessionsAdapter extends FileCollectionAdapter {
|
|
|
66
66
|
* 返回键 = `sessionIdKey(目录名)`(`session-<uuid>` 与裸 `<uuid>` 归一化成同一个会话,取较大者);
|
|
67
67
|
* 时间读不到的会话**不进 Map**(调用方按「时间未知」处理,绝不把未知当成 0 —— 那会把它排到最旧)。
|
|
68
68
|
* 宿主不提供 `mtimeMs` 门面 → 返回空 Map(调用方退回元数据缓存时间,行为与改造前一致)。
|
|
69
|
+
*
|
|
70
|
+
* @param precomputed 预览**顺带**取到的时间(`SectionPreview.statTimes`:homeDir 相对路径 → mtime)。
|
|
71
|
+
* 给了就**不再逐文件 stat**(这正是「合并成一次 stat」的落点);只认那些确实是会话日志的路径。
|
|
72
|
+
* 缺省(旧宿主 / 未实现 `statInfo`)→ 走原来的逐文件 `mtimeMs`。
|
|
69
73
|
*/
|
|
70
|
-
unitActivityTimes(ctx: HostContext, section: ExportSection<FilesSection>): Promise<Map<string, number>>;
|
|
74
|
+
unitActivityTimes(ctx: HostContext, section: ExportSection<FilesSection>, precomputed?: ReadonlyMap<string, number>): Promise<Map<string, number>>;
|
|
71
75
|
/**
|
|
72
76
|
* 分区收尾(issue #45):把用户填的路径映射**同时**作用到会话日志首帧 cwd 与目录位置。
|
|
73
77
|
*
|
|
@@ -130,5 +134,6 @@ export declare class SessionsAdapter extends FileCollectionAdapter {
|
|
|
130
134
|
* 挂在本地父对话之下 —— 无脑告警会把正常情况说成「看不到」,比不告警更糟。
|
|
131
135
|
*/
|
|
132
136
|
private orphanSubagentWarnings;
|
|
137
|
+
applyItem(item: PlanItem, ctx: ImportContext): Promise<ApplyResult>;
|
|
133
138
|
finalizeApply(ctx: ImportContext): Promise<ApplyResult[]>;
|
|
134
139
|
}
|
package/lib/adapters/sessions.js
CHANGED
|
@@ -19,6 +19,16 @@ import { readLogHeaderFromBytes } from '../utils/session-log.js';
|
|
|
19
19
|
import { toPosixRel } from './units.js';
|
|
20
20
|
/** 逐批并发 stat 的批大小:会话树可能有上千个日志文件,一次性开满 Promise 会打爆 libuv 线程池 */
|
|
21
21
|
const MTIME_BATCH = 16;
|
|
22
|
+
/**
|
|
23
|
+
* 「本次导入真正写入了几个会话文件」的计数(T2)。
|
|
24
|
+
*
|
|
25
|
+
* 为什么用 WeakMap<ImportContext, number> 而不是适配器实例字段:宿主**每个插件进程只
|
|
26
|
+
* createAdapters 一次**(makeImporter() 复用同一批适配器实例),实例字段会跨导入累积 ——
|
|
27
|
+
* 第二次导入即使一个会话都没勾,也会因为「上次写过」而提示「需重启 DSH」。
|
|
28
|
+
* ImportContext 是**每次导入新建**的,用它当键天然按导入隔离;WeakMap 不阻止回收,
|
|
29
|
+
* 请求结束后计数随之消失(不会把会话内容或路径长期留在内存里)。
|
|
30
|
+
*/
|
|
31
|
+
const writtenSessionFiles = new WeakMap();
|
|
22
32
|
export class SessionsAdapter extends FileCollectionAdapter {
|
|
23
33
|
id = 'sessions';
|
|
24
34
|
displayName = 'Sessions';
|
|
@@ -135,8 +145,12 @@ export class SessionsAdapter extends FileCollectionAdapter {
|
|
|
135
145
|
* 返回键 = `sessionIdKey(目录名)`(`session-<uuid>` 与裸 `<uuid>` 归一化成同一个会话,取较大者);
|
|
136
146
|
* 时间读不到的会话**不进 Map**(调用方按「时间未知」处理,绝不把未知当成 0 —— 那会把它排到最旧)。
|
|
137
147
|
* 宿主不提供 `mtimeMs` 门面 → 返回空 Map(调用方退回元数据缓存时间,行为与改造前一致)。
|
|
148
|
+
*
|
|
149
|
+
* @param precomputed 预览**顺带**取到的时间(`SectionPreview.statTimes`:homeDir 相对路径 → mtime)。
|
|
150
|
+
* 给了就**不再逐文件 stat**(这正是「合并成一次 stat」的落点);只认那些确实是会话日志的路径。
|
|
151
|
+
* 缺省(旧宿主 / 未实现 `statInfo`)→ 走原来的逐文件 `mtimeMs`。
|
|
138
152
|
*/
|
|
139
|
-
async unitActivityTimes(ctx, section) {
|
|
153
|
+
async unitActivityTimes(ctx, section, precomputed) {
|
|
140
154
|
const out = new Map();
|
|
141
155
|
const logRels = [];
|
|
142
156
|
const homeRelOf = new Map();
|
|
@@ -153,7 +167,13 @@ export class SessionsAdapter extends FileCollectionAdapter {
|
|
|
153
167
|
homeRelOf.set(relPath, toPosixRel(this.baseDir + '/' + relPath));
|
|
154
168
|
keyOfRel.set(relPath, sessionIdKey(dir));
|
|
155
169
|
}
|
|
156
|
-
|
|
170
|
+
// 预览已 stat 过 → 直接按 homeRel 取时间(过滤掉非日志路径),不再发起第二趟 I/O。
|
|
171
|
+
const mtimes = precomputed !== undefined
|
|
172
|
+
? new Map(logRels.map((rel) => {
|
|
173
|
+
const at = precomputed.get(homeRelOf.get(rel) ?? rel);
|
|
174
|
+
return [rel, at === undefined ? null : at];
|
|
175
|
+
}))
|
|
176
|
+
: await this.logMtimes(ctx, logRels, homeRelOf);
|
|
157
177
|
for (const [rel, at] of mtimes) {
|
|
158
178
|
if (at === null)
|
|
159
179
|
continue;
|
|
@@ -414,10 +434,28 @@ export class SessionsAdapter extends FileCollectionAdapter {
|
|
|
414
434
|
}),
|
|
415
435
|
}];
|
|
416
436
|
}
|
|
437
|
+
async applyItem(item, ctx) {
|
|
438
|
+
const result = await super.applyItem(item, ctx);
|
|
439
|
+
// 只累计「本次导入(同一 ImportContext)」写成功的数量 —— 见 writtenSessionFiles 的说明。
|
|
440
|
+
if (result.ok)
|
|
441
|
+
writtenSessionFiles.set(ctx, (writtenSessionFiles.get(ctx) ?? 0) + 1);
|
|
442
|
+
return result;
|
|
443
|
+
}
|
|
417
444
|
async finalizeApply(ctx) {
|
|
418
445
|
const data = ctx.sections.get('sessions');
|
|
419
446
|
if (data === undefined || !Array.isArray(data.files))
|
|
420
447
|
return [];
|
|
448
|
+
// T2:DSH 的会话列表在**启动期**读取(会话注册表 + 工作区投影都在进程启动时建立),
|
|
449
|
+
// 所以写入会话后必须显式提示「重启 DSH 才会出现」。生态同类插件(dsh-chatsync)同结论。
|
|
450
|
+
// 位置放在收尾结果的最前:它是本次会话导入的**唯一必读提示**,不该被逐会话明细淹没。
|
|
451
|
+
const writtenCount = writtenSessionFiles.get(ctx) ?? 0;
|
|
452
|
+
const restartNotice = writtenCount > 0
|
|
453
|
+
? [{
|
|
454
|
+
ok: true,
|
|
455
|
+
needsRestart: true,
|
|
456
|
+
message: ctx.msg('import.sessionsNeedRestart', { count: String(writtenCount) }),
|
|
457
|
+
}]
|
|
458
|
+
: [];
|
|
421
459
|
const byUnit = new Map();
|
|
422
460
|
for (const file of data.files) {
|
|
423
461
|
const unit = toPosixRel(this.unitIdOf(file.relativePath));
|
|
@@ -426,7 +464,7 @@ export class SessionsAdapter extends FileCollectionAdapter {
|
|
|
426
464
|
byUnit.set(unit, list);
|
|
427
465
|
}
|
|
428
466
|
// 父对话缺席的子代理会话:先如实告警(这是数据层面的结论,与本机有没有归位能力无关)
|
|
429
|
-
const results = await this.orphanSubagentWarnings(ctx, byUnit);
|
|
467
|
+
const results = [...restartNotice, ...await this.orphanSubagentWarnings(ctx, byUnit)];
|
|
430
468
|
const store = ctx.target.sessions;
|
|
431
469
|
if (store?.readLogCwd === undefined || store.relocateDir === undefined)
|
|
432
470
|
return results;
|
|
@@ -26,6 +26,13 @@ export declare class MemFs implements FileSystemFacade {
|
|
|
26
26
|
/** 测试助手:登记某文件的 mtime(null = 恢复为「读不到」) */
|
|
27
27
|
setMtime(relPath: string, ms: number | null): void;
|
|
28
28
|
mtimeMs(relPath: string): Promise<number | null>;
|
|
29
|
+
/**
|
|
30
|
+
* 文件字节数(只读预览用)。
|
|
31
|
+
*
|
|
32
|
+
* 语义与真实门面一致:**读不到 → null**(不返回 0)—— 0 会让字节闸门少算,
|
|
33
|
+
* 让预览把本该剔除的单元也列出来,与真实导出分叉。
|
|
34
|
+
*/
|
|
35
|
+
statSize(relPath: string): Promise<number | null>;
|
|
29
36
|
listRecursive(dir: string): Promise<string[]>;
|
|
30
37
|
mkdir(): Promise<void>;
|
|
31
38
|
}
|
|
@@ -57,6 +57,16 @@ export class MemFs {
|
|
|
57
57
|
async mtimeMs(relPath) {
|
|
58
58
|
return this.mtimes.get(this.key(relPath)) ?? null;
|
|
59
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* 文件字节数(只读预览用)。
|
|
62
|
+
*
|
|
63
|
+
* 语义与真实门面一致:**读不到 → null**(不返回 0)—— 0 会让字节闸门少算,
|
|
64
|
+
* 让预览把本该剔除的单元也列出来,与真实导出分叉。
|
|
65
|
+
*/
|
|
66
|
+
async statSize(relPath) {
|
|
67
|
+
const v = this.files.get(this.key(relPath));
|
|
68
|
+
return v === undefined ? null : v.byteLength;
|
|
69
|
+
}
|
|
60
70
|
async listRecursive(dir) {
|
|
61
71
|
const base = normalizePath(this.homeDir);
|
|
62
72
|
const prefix = normalizePath(dir) === '' ? base : `${base}/${normalizePath(dir)}`;
|
package/lib/adapters/units.d.ts
CHANGED
|
@@ -23,10 +23,20 @@ export declare function defaultUnitId(rel: string): string;
|
|
|
23
23
|
* 空数组 = 什么都不允许(调用方应把该分区整体视为未勾选,见 Exporter.export)。
|
|
24
24
|
*/
|
|
25
25
|
export declare function unitAllowed(allow: readonly string[] | undefined, id: string): boolean;
|
|
26
|
-
/** 白名单是否让该分区整体为空(= 用户取消了整个分区,不是「导出空分区」)。 */
|
|
27
|
-
export declare function allowListEmptiesSection(allow: readonly string[] | undefined): boolean;
|
|
28
26
|
/** 由「成员文件」归并出单元清单(体积 = 成员文件字节合计;零 I/O)。 */
|
|
29
27
|
export declare function unitsFromFiles(sectionId: string, files: readonly {
|
|
30
28
|
relativePath: string;
|
|
31
29
|
data: Uint8Array;
|
|
32
30
|
}[], unitIdOf: (rel: string) => string): ExportUnit[];
|
|
31
|
+
/**
|
|
32
|
+
* 由「路径 + 已知体积」归并出单元清单(零 I/O)。
|
|
33
|
+
*
|
|
34
|
+
* 为什么要有这一份:只读预览(`/export-preview`)拿不到文件内容(也不该读),体积来自
|
|
35
|
+
* `ctx.fs.statSize`。若预览改用「data 为空的 FilesSection」喂 `unitsFromFiles`,
|
|
36
|
+
* 每个单元的体积会变成 0,选择器显示的体积全错。两份实现必须**同一套聚合规则**,
|
|
37
|
+
* 否则预览与导出会算出不同的单元体积(`file-collection.test.ts` 钉住两者逐项相等)。
|
|
38
|
+
*/
|
|
39
|
+
export declare function unitsFromEntries(sectionId: string, entries: readonly {
|
|
40
|
+
relativePath: string;
|
|
41
|
+
sizeBytes: number;
|
|
42
|
+
}[], unitIdOf: (rel: string) => string): ExportUnit[];
|
package/lib/adapters/units.js
CHANGED
|
@@ -15,18 +15,25 @@ export function defaultUnitId(rel) {
|
|
|
15
15
|
export function unitAllowed(allow, id) {
|
|
16
16
|
return allow === undefined || allow.includes(id);
|
|
17
17
|
}
|
|
18
|
-
/** 白名单是否让该分区整体为空(= 用户取消了整个分区,不是「导出空分区」)。 */
|
|
19
|
-
export function allowListEmptiesSection(allow) {
|
|
20
|
-
return allow !== undefined && allow.length === 0;
|
|
21
|
-
}
|
|
22
18
|
/** 由「成员文件」归并出单元清单(体积 = 成员文件字节合计;零 I/O)。 */
|
|
23
19
|
export function unitsFromFiles(sectionId, files, unitIdOf) {
|
|
20
|
+
return unitsFromEntries(sectionId, files.map((f) => ({ relativePath: f.relativePath, sizeBytes: f.data.byteLength })), unitIdOf);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 由「路径 + 已知体积」归并出单元清单(零 I/O)。
|
|
24
|
+
*
|
|
25
|
+
* 为什么要有这一份:只读预览(`/export-preview`)拿不到文件内容(也不该读),体积来自
|
|
26
|
+
* `ctx.fs.statSize`。若预览改用「data 为空的 FilesSection」喂 `unitsFromFiles`,
|
|
27
|
+
* 每个单元的体积会变成 0,选择器显示的体积全错。两份实现必须**同一套聚合规则**,
|
|
28
|
+
* 否则预览与导出会算出不同的单元体积(`file-collection.test.ts` 钉住两者逐项相等)。
|
|
29
|
+
*/
|
|
30
|
+
export function unitsFromEntries(sectionId, entries, unitIdOf) {
|
|
24
31
|
const byUnit = new Map();
|
|
25
|
-
for (const f of
|
|
32
|
+
for (const f of entries) {
|
|
26
33
|
const unit = unitIdOf(f.relativePath);
|
|
27
34
|
const cur = byUnit.get(unit) ?? { count: 0, size: 0 };
|
|
28
35
|
cur.count += 1;
|
|
29
|
-
cur.size += f.
|
|
36
|
+
cur.size += f.sizeBytes;
|
|
30
37
|
byUnit.set(unit, cur);
|
|
31
38
|
}
|
|
32
39
|
return [...byUnit.entries()].map(([unit, agg]) => ({
|