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/lib/adapters/plugins.js
CHANGED
|
@@ -16,6 +16,7 @@ import { sha256Hex } from '../utils/hashing.js';
|
|
|
16
16
|
import { installSpecFor, resolveProcessProfileName } from '../core/plugin-cli.js';
|
|
17
17
|
import { classifyPluginSpec, LOCAL_PLUGIN_DIR, resolveLocalPluginPath } from '../core/local-plugin-pack.js';
|
|
18
18
|
import { msgOf, zhMsg } from '../core/messages.js';
|
|
19
|
+
import { engineMsg } from './messages.js';
|
|
19
20
|
import { stringifyJsonSafe } from '../utils/json.js';
|
|
20
21
|
import { isPathSafe, normalizePath } from '../utils/paths.js';
|
|
21
22
|
import { isENOENT } from '../utils/guards.js';
|
|
@@ -58,7 +59,7 @@ function tarballOf(data, pkgName) {
|
|
|
58
59
|
export function localTarballCacheName(relativePath) {
|
|
59
60
|
const base = relativePath.split('/').pop() ?? '';
|
|
60
61
|
if (base === '' || base.includes('\\') || base === '.' || base === '..') {
|
|
61
|
-
throw new Error(
|
|
62
|
+
throw new Error(engineMsg('adapter.tarballRelPathInvalid', { path: relativePath }));
|
|
62
63
|
}
|
|
63
64
|
return base;
|
|
64
65
|
}
|
|
@@ -677,7 +678,7 @@ export class PluginsAdapter {
|
|
|
677
678
|
names: clean.dropped.map((d) => d.name).join(', '),
|
|
678
679
|
}));
|
|
679
680
|
}
|
|
680
|
-
return { ok: true, needsRestart: true, message: notes.join('
|
|
681
|
+
return { ok: true, needsRestart: true, message: notes.join(msg('adapter.listSeparator')) };
|
|
681
682
|
}
|
|
682
683
|
catch (err) {
|
|
683
684
|
const reason = err instanceof Error ? err.message : String(err);
|
|
@@ -710,7 +711,7 @@ export class PluginsAdapter {
|
|
|
710
711
|
}
|
|
711
712
|
catch (err) {
|
|
712
713
|
// 解包失败不阻断安装尝试:退回原 spec(可能失败,但会如实报错而非静默丢失)
|
|
713
|
-
ctx.onLog?.(
|
|
714
|
+
ctx.onLog?.(msg('adapter.localTarballUnpackFailed', { name, err: err instanceof Error ? err.message : String(err) }));
|
|
714
715
|
}
|
|
715
716
|
}
|
|
716
717
|
// 执行日志:记录实际将发起的子进程命令行(与宿主 DshPluginsFacade 的
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MsgFunc } from '../core/messages.ts';
|
|
2
|
+
import './messages.ts';
|
|
2
3
|
import type { PromptEntry } from '../schema/types.ts';
|
|
3
4
|
import type { ApplyResult, ConfigAdapter, ExportOptions, ExportSection, HostContext, ImportContext, PlanItem, ValidationResult } from '../core/types.ts';
|
|
4
5
|
/** 导出记录:PromptEntry 之外记录来源行名与所在层(导入重建 / 写回定位用) */
|
package/lib/adapters/prompts.js
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* 于是写进 profile 层的 systemPrompt / planMode 在备份里全部丢失。现在两层都读、写回原层。
|
|
14
14
|
*/
|
|
15
15
|
import { msgOf, zhMsg } from '../core/messages.js';
|
|
16
|
+
// t6:注册 adapters 域追加目录(本模块只消费注入的 msg,故只引它的注册副作用)。
|
|
17
|
+
import './messages.js';
|
|
16
18
|
import { locatePatchLineLayer, readEffectivePatchLines, resolveWriteLayer } from '../core/patch-layers.js';
|
|
17
19
|
import { sectionMeta } from '../schema/section-registry.js';
|
|
18
20
|
import { validateJsonSection } from './json-section.js';
|
|
@@ -146,7 +148,11 @@ export class PromptsAdapter {
|
|
|
146
148
|
items.push({
|
|
147
149
|
id, kind: 'Conflict', adapter: 'prompts',
|
|
148
150
|
description: msg('adapter.promptDiff', { name: p.name }),
|
|
149
|
-
detail:
|
|
151
|
+
detail: msg('adapter.promptDiffDetail', {
|
|
152
|
+
line: String(p.sourceLineId),
|
|
153
|
+
current: JSON.stringify(sameName.text).slice(0, 80),
|
|
154
|
+
imported: JSON.stringify(p.text).slice(0, 80),
|
|
155
|
+
}),
|
|
150
156
|
severity: 'warning',
|
|
151
157
|
// 层身份随计划项走:快照按这一层记原行、回滚才能写回原文件(issue #71)
|
|
152
158
|
target: { adapter: 'prompts', ref: p.sourceLineId ?? '', file: targetLine.file },
|
package/lib/adapters/self.d.ts
CHANGED
|
@@ -8,7 +8,13 @@
|
|
|
8
8
|
* - market/market-config.json 配置市场配置
|
|
9
9
|
*
|
|
10
10
|
* 排除项:sync/sync-history.json(执行记录,属数据非配置)、market/cache/(缓存)、
|
|
11
|
-
* snapshots/(快照)、tmp/ exports
|
|
11
|
+
* snapshots/(快照)、tmp/ exports/(临时/导出产物)、rollback-points/(回滚点库——磁盘体检
|
|
12
|
+
* 会统计它,但它是**数据**不是配置)、checkpoints/(遗留旧检查点库,已不再读取,也不删)
|
|
13
|
+
* ——只备份「配置」,不备份数据。
|
|
14
|
+
*
|
|
15
|
+
* 与磁盘体检(`src/core/disk-usage.ts`)的关系:那边新增统计 `rollback-points` / 遗留
|
|
16
|
+
* `checkpoints` **不改变本分区的载荷**——本清单是白名单(`SELF_CONFIG_FILES`),
|
|
17
|
+
* 被统计的目录一律不在其中,既不重复也不遗漏(守卫见 `self.test.ts`)。
|
|
12
18
|
*
|
|
13
19
|
* 实现:继承 FileCollectionAdapter 复用 analyzeImport/applyItem/validate(幂等 hash 比对、
|
|
14
20
|
* 快照/回滚路径一致);**清单来自覆写的 listRelPaths()(白名单),export() 与 preview() 都经
|
|
@@ -41,7 +47,7 @@ import { FileCollectionAdapter } from './file-collection.ts';
|
|
|
41
47
|
export declare const SELF_CONFIG_FILES: readonly string[];
|
|
42
48
|
export declare class SelfAdapter extends FileCollectionAdapter {
|
|
43
49
|
readonly id: 'self';
|
|
44
|
-
readonly displayName
|
|
50
|
+
readonly displayName: string;
|
|
45
51
|
readonly defaultIncluded = true;
|
|
46
52
|
readonly portability: 'portable';
|
|
47
53
|
/** 插件自身配置目录(相对 homeDir;宿主按 dataDir 解析注入,缺省 dsh-config-manager) */
|
package/lib/adapters/self.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sectionMeta } from '../schema/section-registry.js';
|
|
1
2
|
import { FileCollectionAdapter } from './file-collection.js';
|
|
2
3
|
/** self 分区白名单文件(相对 baseDir,即 $DSH_HOME/dsh-config-manager/)。 */
|
|
3
4
|
export const SELF_CONFIG_FILES = [
|
|
@@ -65,7 +66,7 @@ function canonicalizeWithoutRunState(raw) {
|
|
|
65
66
|
}
|
|
66
67
|
export class SelfAdapter extends FileCollectionAdapter {
|
|
67
68
|
id = 'self';
|
|
68
|
-
displayName = '
|
|
69
|
+
displayName = sectionMeta('self').displayName;
|
|
69
70
|
defaultIncluded = true;
|
|
70
71
|
portability = 'portable';
|
|
71
72
|
/** 插件自身配置目录(相对 homeDir;宿主按 dataDir 解析注入,缺省 dsh-config-manager) */
|
|
@@ -96,7 +97,7 @@ export class SelfAdapter extends FileCollectionAdapter {
|
|
|
96
97
|
* 同时是单元 id(self:<rel>)与 includeItems 的比对键 —— 不能随平台漂移成反斜杠。
|
|
97
98
|
*/
|
|
98
99
|
async listRelPaths(ctx) {
|
|
99
|
-
const empty = { paths: [], skippedLinks: [], followedLinks: 0, unreadableDirs: [] };
|
|
100
|
+
const empty = { paths: [], skippedLinks: [], skippedDepDirs: [], followedLinks: 0, unreadableDirs: [] };
|
|
100
101
|
const found = [];
|
|
101
102
|
for (const rel of SELF_CONFIG_FILES) {
|
|
102
103
|
const full = `${this.baseDir}/${rel}`;
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* core/session-select.ts(单位 = 会话目录、文件名判据不写死、按日志最新 mtime 倒序)。
|
|
9
9
|
*/
|
|
10
10
|
import { FileCollectionAdapter } from './file-collection.ts';
|
|
11
|
+
import './messages.ts';
|
|
11
12
|
import type { ApplyResult, ExportOptions, ExportSection, HostContext, ImportContext, PlanItem } from '../core/types.ts';
|
|
12
13
|
import type { FilesSection } from '../schema/types.ts';
|
|
13
14
|
export declare class SessionsAdapter extends FileCollectionAdapter {
|
package/lib/adapters/sessions.js
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
import { FileCollectionAdapter } from './file-collection.js';
|
|
11
11
|
import { listFilesDetailed } from './link-report.js';
|
|
12
12
|
import { msgOf } from '../core/messages.js';
|
|
13
|
+
// t6:注册 adapters 域追加目录(本模块只消费注入的 msg,故只引它的注册副作用)。
|
|
14
|
+
import './messages.js';
|
|
13
15
|
import { groupSessionUnits, isSessionLogFileName, normalizeSessionLimit, pickLatestSessionUnits, sessionIdKey } from '../core/session-select.js';
|
|
14
16
|
import { projectKeyOf } from '../core/session-meta.js';
|
|
15
17
|
import { applyPathMapping } from '../core/path-mapping.js';
|
|
@@ -357,7 +359,7 @@ export class SessionsAdapter extends FileCollectionAdapter {
|
|
|
357
359
|
continue;
|
|
358
360
|
const dirRel = await this.findSessionDir(ctx, next.sessionId, next.key, allKeys);
|
|
359
361
|
if (dirRel === null) {
|
|
360
|
-
uncoupled.push(next.sessionId
|
|
362
|
+
uncoupled.push(msg('adapter.sessionUncoupledNote', { id: next.sessionId, reason: msg('export.sessionRelationNotFound') }));
|
|
361
363
|
continue;
|
|
362
364
|
}
|
|
363
365
|
const listing = await listFilesDetailed(ctx.fs, dirRel);
|
|
@@ -374,7 +376,7 @@ export class SessionsAdapter extends FileCollectionAdapter {
|
|
|
374
376
|
loaded.push({ relativePath: this.relPathOf(rel), data, contentHash: sha256Hex(data) });
|
|
375
377
|
}
|
|
376
378
|
if (tooLarge || loaded.length === 0) {
|
|
377
|
-
uncoupled.push(next.sessionId
|
|
379
|
+
uncoupled.push(msg('adapter.sessionUncoupledNote', { id: next.sessionId, reason: msg('export.sessionParentTooLarge') }));
|
|
378
380
|
continue;
|
|
379
381
|
}
|
|
380
382
|
usedBytes += unitBytes;
|
|
@@ -167,6 +167,15 @@ export declare class MockHostContext implements HostContext {
|
|
|
167
167
|
sessions?: HostContext['sessions'];
|
|
168
168
|
/** 可选(issue #71):技能服务端口;测试按需注入(缺省 = 退回纯目录扫描)。 */
|
|
169
169
|
skills?: HostContext['skills'];
|
|
170
|
+
/**
|
|
171
|
+
* 可选(第三方插件数据):系统 home 与它的文件门面。缺省 undefined = **旧宿主形态**
|
|
172
|
+
* (pluginData / pluginAssets 不收集也不写入,如实报码);需要它们的测试自行注入,
|
|
173
|
+
* 或用 withOsHome() 把系统 home 指向本夹具自己的根。
|
|
174
|
+
*/
|
|
175
|
+
osHomeDir?: string;
|
|
176
|
+
homeFs?: HostContext['homeFs'];
|
|
177
|
+
/** 测试助手:把「系统 home」指向本上下文的根(两分区在本夹具里即可直接用) */
|
|
178
|
+
withOsHome(): this;
|
|
170
179
|
constructor(platform: string, homeDir: string, profile?: string);
|
|
171
180
|
}
|
|
172
181
|
export declare function makeContext(platform: string, homeDir: string, profile?: string): MockHostContext;
|
|
@@ -261,6 +261,19 @@ export class MockHostContext {
|
|
|
261
261
|
sessions;
|
|
262
262
|
/** 可选(issue #71):技能服务端口;测试按需注入(缺省 = 退回纯目录扫描)。 */
|
|
263
263
|
skills;
|
|
264
|
+
/**
|
|
265
|
+
* 可选(第三方插件数据):系统 home 与它的文件门面。缺省 undefined = **旧宿主形态**
|
|
266
|
+
* (pluginData / pluginAssets 不收集也不写入,如实报码);需要它们的测试自行注入,
|
|
267
|
+
* 或用 withOsHome() 把系统 home 指向本夹具自己的根。
|
|
268
|
+
*/
|
|
269
|
+
osHomeDir;
|
|
270
|
+
homeFs;
|
|
271
|
+
/** 测试助手:把「系统 home」指向本上下文的根(两分区在本夹具里即可直接用) */
|
|
272
|
+
withOsHome() {
|
|
273
|
+
this.osHomeDir = this.homeDir;
|
|
274
|
+
this.homeFs = this.fs;
|
|
275
|
+
return this;
|
|
276
|
+
}
|
|
264
277
|
constructor(platform, homeDir, profile) {
|
|
265
278
|
this.platform = platform;
|
|
266
279
|
this.homeDir = homeDir;
|
|
@@ -283,6 +296,7 @@ export function makeManifest(platform = 'win32') {
|
|
|
283
296
|
settings: false, ui: false, providers: false, plugins: false, mcp: false, prompts: false,
|
|
284
297
|
skills: false, agentPresets: false, agentInstructions: false, workspaces: false, pluginFiles: false,
|
|
285
298
|
credentialsStatus: false, secrets: false, sessions: false, self: false,
|
|
299
|
+
pluginData: false, pluginAssets: false,
|
|
286
300
|
},
|
|
287
301
|
security: { containsSecrets: false, encrypted: false, encryption: null },
|
|
288
302
|
};
|
package/lib/adapters/ui.d.ts
CHANGED
|
@@ -11,8 +11,8 @@ import { type NamespaceProvider } from './settings.ts';
|
|
|
11
11
|
export declare const KNOWN_UI_NAMESPACE_PREFIXES: readonly string[];
|
|
12
12
|
/** namespace 名是否属于 UI 类(大小写不敏感前缀匹配) */
|
|
13
13
|
export declare function isUiNamespace(name: string): boolean;
|
|
14
|
-
/**
|
|
15
|
-
export declare
|
|
14
|
+
/** UI 迁移说明行(取文案在调用期现取;缺省 = 当前引擎语言的 engineMsg)。 */
|
|
15
|
+
export declare function uiMigrationNotes(msg?: MsgFunc): UiSection['uiMigrationNotes'];
|
|
16
16
|
export declare class UiAdapter implements ConfigAdapter<UiSection> {
|
|
17
17
|
readonly id: 'ui';
|
|
18
18
|
readonly displayName: string;
|
package/lib/adapters/ui.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { zhMsg } from '../core/messages.js';
|
|
2
|
+
import { engineMsg } from './messages.js';
|
|
2
3
|
import { collectNamespaceRecords, planNamespaceItems, applyNamespaceItem, resolveNamespaces } from './settings.js';
|
|
3
4
|
import { sectionMeta } from '../schema/section-registry.js';
|
|
4
5
|
import { validateJsonSection } from './json-section.js';
|
|
@@ -20,30 +21,28 @@ export function isUiNamespace(name) {
|
|
|
20
21
|
const lower = name.toLowerCase();
|
|
21
22
|
return KNOWN_UI_NAMESPACE_PREFIXES.some((p) => lower.startsWith(p.toLowerCase()));
|
|
22
23
|
}
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
|
|
34
|
-
storage: 'localStorage',
|
|
35
|
-
key: 'aionui-panel.*',
|
|
36
|
-
migratable: false,
|
|
37
|
-
reason: '面板宽度/折叠状态存于浏览器 localStorage,Host 侧无访问通道,需在目标机器重新配置',
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
plugin: 'dsh-client-ui-*',
|
|
41
|
-
storage: 'localStorage',
|
|
42
|
-
key: '*',
|
|
43
|
-
migratable: false,
|
|
44
|
-
reason: '浏览器端 UI 状态无法经 Host API 迁移',
|
|
45
|
-
},
|
|
24
|
+
/**
|
|
25
|
+
* localStorage 等 Host 无通道的 UI 状态说明(纯说明,不含值;研究报告 §2.2/§4.4)。
|
|
26
|
+
*
|
|
27
|
+
* t6(英文界面零中文):说明行的 `reason` 是用户可见文案 ⇒ 表里只放**目录键**,取文案在导出期现取
|
|
28
|
+
* (`uiMigrationNotes(msg)`)—— 这样导出的说明行跟随界面语言,而不是冻结在装配期语言。
|
|
29
|
+
* (表本身是数据;中文只存在于 adapters 域的追加目录 `src/adapters/messages.ts`。)
|
|
30
|
+
*/
|
|
31
|
+
const UI_MIGRATION_NOTE_ROWS = [
|
|
32
|
+
{ plugin: 'dsh-task-board', storage: 'localStorage', key: 'dsh.taskBoard.v1', migratable: false, reasonKey: 'adapter.uiLocalStorageTaskBoard' },
|
|
33
|
+
{ plugin: 'dsh-aionui-panel', storage: 'localStorage', key: 'aionui-panel.*', migratable: false, reasonKey: 'adapter.uiLocalStoragePanel' },
|
|
34
|
+
{ plugin: 'dsh-client-ui-*', storage: 'localStorage', key: '*', migratable: false, reasonKey: 'adapter.uiLocalStorageGeneric' },
|
|
46
35
|
];
|
|
36
|
+
/** UI 迁移说明行(取文案在调用期现取;缺省 = 当前引擎语言的 engineMsg)。 */
|
|
37
|
+
export function uiMigrationNotes(msg = engineMsg) {
|
|
38
|
+
return UI_MIGRATION_NOTE_ROWS.map((row) => ({
|
|
39
|
+
plugin: row.plugin,
|
|
40
|
+
storage: row.storage,
|
|
41
|
+
key: row.key,
|
|
42
|
+
migratable: row.migratable,
|
|
43
|
+
reason: msg(row.reasonKey),
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
47
46
|
export class UiAdapter {
|
|
48
47
|
id = 'ui';
|
|
49
48
|
// 元数据唯一来源 = 注册表(t31):不再与 ui/export-flow.ts 的导出目录各写一份
|
|
@@ -59,10 +58,11 @@ export class UiAdapter {
|
|
|
59
58
|
const all = await resolveNamespaces(this.namespaces, ctx);
|
|
60
59
|
const uiNames = all.filter((n) => isUiNamespace(n));
|
|
61
60
|
const namespaces = await collectNamespaceRecords(ctx, uiNames, warnings);
|
|
61
|
+
const notes = uiMigrationNotes(ctx.msg);
|
|
62
62
|
return {
|
|
63
63
|
sectionId: 'ui',
|
|
64
|
-
data: { version: 1, namespaces, uiMigrationNotes:
|
|
65
|
-
counts: { namespaces: Object.keys(namespaces).length, notes:
|
|
64
|
+
data: { version: 1, namespaces, uiMigrationNotes: notes },
|
|
65
|
+
counts: { namespaces: Object.keys(namespaces).length, notes: notes.length },
|
|
66
66
|
warnings,
|
|
67
67
|
};
|
|
68
68
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MsgFunc } from '../core/messages.ts';
|
|
2
|
+
import './messages.ts';
|
|
2
3
|
import type { WorkspacesSection } from '../schema/types.ts';
|
|
3
4
|
import type { ApplyResult, ConfigAdapter, ExportOptions, ExportSection, ExportUnit, HostContext, ImportContext, PlanItem, ValidationResult } from '../core/types.ts';
|
|
4
5
|
/**
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
import { isDeepStrictEqual } from 'node:util';
|
|
8
8
|
import { normalizePath } from '../utils/paths.js';
|
|
9
9
|
import { zhMsg } from '../core/messages.js';
|
|
10
|
+
// t6:注册 adapters 域追加目录(本模块只消费注入的 msg,故只引它的注册副作用)。
|
|
11
|
+
import './messages.js';
|
|
10
12
|
import { validateJsonSection } from './json-section.js';
|
|
11
13
|
// issue #45 勾选联动第二判据:工作区 path 的 cwd 目录键(DSH 就是按它把会话显示在工作区下的)
|
|
12
14
|
import { projectKeyOf } from '../core/session-meta.js';
|
|
@@ -211,14 +213,16 @@ export class WorkspacesAdapter {
|
|
|
211
213
|
// 目标端无法写入(如路径 realpath 失败/目录不存在)→ 非致命警告(§34.17),
|
|
212
214
|
// 不触发整体回滚——否则一个失效路径会拖垮已成功导入的其余配置。
|
|
213
215
|
const reason = err instanceof Error ? err.message : String(err);
|
|
214
|
-
const detail = notes.length > 0
|
|
216
|
+
const detail = notes.length > 0
|
|
217
|
+
? ctx.msg('adapter.workspaceNotesParen', { notes: notes.join(ctx.msg('adapter.listSeparator')) })
|
|
218
|
+
: '';
|
|
215
219
|
return {
|
|
216
220
|
ok: false,
|
|
217
221
|
warning: true,
|
|
218
222
|
message: ctx.msg('adapter.workspaceWriteFailed', { ref, msg: reason }) + detail,
|
|
219
223
|
};
|
|
220
224
|
}
|
|
221
|
-
return { ok: true, ...(notes.length > 0 ? { message: notes.join('
|
|
225
|
+
return { ok: true, ...(notes.length > 0 ? { message: notes.join(ctx.msg('adapter.listSeparator')) } : {}) };
|
|
222
226
|
}
|
|
223
227
|
/**
|
|
224
228
|
* 全部分区收尾之后(finalizeImport):把本次导入的工作区记录里声明的会话登记进工作区(issue #45 缺口②)。
|
|
@@ -416,7 +420,7 @@ async function registerImportedSessions(ctx, rec, units) {
|
|
|
416
420
|
const outsideNote = outsideFailed > 0
|
|
417
421
|
? ctx.msg('adapter.workspaceSessionsOutsideBundle', { count: String(outsideFailed) })
|
|
418
422
|
: '';
|
|
419
|
-
const compose = (head) => (outsideNote === '' || head === '' ? head + outsideNote : head + '
|
|
423
|
+
const compose = (head) => (outsideNote === '' || head === '' ? head + outsideNote : head + ctx.msg('adapter.listSeparator') + outsideNote);
|
|
420
424
|
if (bundledFailed > 0) {
|
|
421
425
|
return {
|
|
422
426
|
message: compose(ctx.msg('adapter.workspaceSessionsPending', {
|
package/lib/cli/actions.d.ts
CHANGED
|
@@ -121,6 +121,12 @@ export interface RescuePaths {
|
|
|
121
121
|
locksDir: string;
|
|
122
122
|
controlRoots: readonly string[];
|
|
123
123
|
profile: string;
|
|
124
|
+
/**
|
|
125
|
+
* 离线导出的 manifest.exporter.version(CLI 传真实版本;缺省 = 中性占位)。
|
|
126
|
+
* 为什么不在这里再算一次版本:actions.ts 不得 import ./index.ts(会成环),
|
|
127
|
+
* 而版本号只有 CLI 侧从 package.json 读得到 —— 由 runWeb 经本结构注入。
|
|
128
|
+
*/
|
|
129
|
+
exporterVersion?: string;
|
|
124
130
|
}
|
|
125
131
|
export interface RescueStatus {
|
|
126
132
|
generatedAt: string;
|
|
@@ -173,7 +179,9 @@ export type WriteGateOutcome = {
|
|
|
173
179
|
/**
|
|
174
180
|
* 写动作的前置门(与 CLI `sessions repair --fix` 同一判据)。
|
|
175
181
|
*
|
|
176
|
-
* `needsDshStopped
|
|
182
|
+
* `needsDshStopped`:**改写/搬动会话字节**的动作(会话布局归位 repairSessions、字节级就地修复
|
|
183
|
+
* repairSessionLogInline)与**快照恢复**(runSnapshotRestore 会覆盖/删除 `$DSH_HOME` 下正在使用的文件)
|
|
184
|
+
* 都要「DSH 已停」这一条;磁盘清理不需要(只碰可重建缓存)。
|
|
177
185
|
*/
|
|
178
186
|
export declare function checkWriteGates(controlRoots: readonly string[], options?: {
|
|
179
187
|
needsDshStopped: boolean;
|
package/lib/cli/actions.js
CHANGED
|
@@ -282,7 +282,9 @@ function errorText(error) {
|
|
|
282
282
|
/**
|
|
283
283
|
* 写动作的前置门(与 CLI `sessions repair --fix` 同一判据)。
|
|
284
284
|
*
|
|
285
|
-
* `needsDshStopped
|
|
285
|
+
* `needsDshStopped`:**改写/搬动会话字节**的动作(会话布局归位 repairSessions、字节级就地修复
|
|
286
|
+
* repairSessionLogInline)与**快照恢复**(runSnapshotRestore 会覆盖/删除 `$DSH_HOME` 下正在使用的文件)
|
|
287
|
+
* 都要「DSH 已停」这一条;磁盘清理不需要(只碰可重建缓存)。
|
|
286
288
|
*/
|
|
287
289
|
export async function checkWriteGates(controlRoots, options = { needsDshStopped: true }) {
|
|
288
290
|
for (const report of readSafeMode(controlRoots)) {
|
|
@@ -989,7 +991,8 @@ export async function exportOfflineBackup(paths, sections) {
|
|
|
989
991
|
}
|
|
990
992
|
const checksums = buildChecksums(collection.entries);
|
|
991
993
|
const manifest = buildManifest({
|
|
992
|
-
|
|
994
|
+
// 真实版本(runWeb 经 RescuePaths 注入);拿不到时给中性占位,绝不谎报某个具体版本。
|
|
995
|
+
exporterVersion: paths.exporterVersion ?? '0.0.0-unknown',
|
|
993
996
|
// 离线探测不到真实 DSH 版本:如实标注,不谎报
|
|
994
997
|
dshVersion: 'cli-offline',
|
|
995
998
|
platform: process.platform,
|
package/lib/cli/help.js
CHANGED
|
@@ -101,7 +101,7 @@ export const COMMAND_HELP = [
|
|
|
101
101
|
title: '离线救急台(本机网页)',
|
|
102
102
|
usage: 'web',
|
|
103
103
|
summary: '离线救急台:只读诊断 + 逐项确认的修复',
|
|
104
|
-
usageLines: ['web [--port <n>] [--no-open] [--home <dir>] [--data-root <dir>] [--idle-timeout <min>]'],
|
|
104
|
+
usageLines: ['web [--port <n>] [--no-open] [--home <dir>] [--data-dir <dir>] [--data-root <dir>] [--profile <name>] [--idle-timeout <min>]'],
|
|
105
105
|
description: [
|
|
106
106
|
'启动一个只绑 127.0.0.1 的本机网页,把诊断与修复动作摆成能点的界面:',
|
|
107
107
|
'实例心跳 / SAFE MODE / 残留锁 / 快照 / 备份自检 / 磁盘占用 / 会话体检 / 档案实例。',
|
|
@@ -117,7 +117,9 @@ export const COMMAND_HELP = [
|
|
|
117
117
|
{ flag: '--no-open', desc: '启动后不打开浏览器(SSH / 无桌面场景)' },
|
|
118
118
|
{ flag: '--idle-timeout <min>', desc: '空闲多少分钟自动退出(0 = 不自动退出;缺省 30)' },
|
|
119
119
|
{ flag: '--home <dir>', desc: '要查看的 DSH home(缺省 $DSH_HOME,即 ~/.dsh)' },
|
|
120
|
-
{ flag: '--data-
|
|
120
|
+
{ flag: '--data-dir <dir>', desc: '快照 / 导出目录(历史语义):尾段是 snapshots / exports 时按它的父目录当数据根,再派生 快照/导出/锁 三个目录;否则整条按数据根处理(缺省 $DSH_HOME/dsh-config-manager)' },
|
|
121
|
+
{ flag: '--data-root <dir>', desc: '插件数据根 dataDir(自定义时必须显式传;给了就以它为准)' },
|
|
122
|
+
{ flag: '--profile <name>', desc: '救急台操作的 DSH profile(缺省 web;影响「恢复」页的目标档案)' },
|
|
121
123
|
{ flag: '-h, --help', desc: '显示本页' },
|
|
122
124
|
],
|
|
123
125
|
},
|
|
@@ -141,6 +143,7 @@ export const COMMAND_HELP = [
|
|
|
141
143
|
'快照是每次导入前自动留下的整机配置副本;本命令只读,按新→旧列出:',
|
|
142
144
|
'ID / 创建时间 / 来源 ZIP / 状态 / 条目数 / 宿主文件数 / 插件数。',
|
|
143
145
|
'没有任何快照时打印「无快照」并照常返回 0。',
|
|
146
|
+
'目录存在却读不出来(权限 / 路径被文件占住)时,把事实打到 stderr 并以非 0 退出 —— 读不到 ≠ 没有快照。',
|
|
144
147
|
],
|
|
145
148
|
sections: [
|
|
146
149
|
{
|
|
@@ -150,7 +153,13 @@ export const COMMAND_HELP = [
|
|
|
150
153
|
{ flag: '-h, --help', desc: '显示本页' },
|
|
151
154
|
],
|
|
152
155
|
},
|
|
153
|
-
{
|
|
156
|
+
{
|
|
157
|
+
title: '退出码',
|
|
158
|
+
entries: [
|
|
159
|
+
{ flag: '0', desc: '列出成功(目录不存在、没有快照也是 0)' },
|
|
160
|
+
{ flag: '1', desc: '快照目录存在但读不出来(≠ 没有快照;原因打到 stderr)' },
|
|
161
|
+
],
|
|
162
|
+
},
|
|
154
163
|
],
|
|
155
164
|
examples: ['dcm snapshots', 'dcm snapshots --data-dir D:/rescue/snapshots'],
|
|
156
165
|
},
|
|
@@ -159,7 +168,7 @@ export const COMMAND_HELP = [
|
|
|
159
168
|
title: '只读自检备份 ZIP',
|
|
160
169
|
usage: 'verify [<file|path>]',
|
|
161
170
|
summary: '只读自检备份 ZIP(无参 = 导出目录全部)',
|
|
162
|
-
usageLines: ['verify [<file|path>] [--json] [--data-dir <dir>]'],
|
|
171
|
+
usageLines: ['verify [<file|path> | --id <file|path>] [--json] [--data-dir <dir>]'],
|
|
163
172
|
description: [
|
|
164
173
|
'重新读取备份 ZIP,核对结构与 integrity/checksums.json 的逐条 SHA-256;全程零写入。',
|
|
165
174
|
'无参数时校验导出目录下全部 *.zip;也可以给一个文件名或完整路径。',
|
|
@@ -180,6 +189,7 @@ export const COMMAND_HELP = [
|
|
|
180
189
|
title: '选项',
|
|
181
190
|
entries: [
|
|
182
191
|
{ flag: '--json', desc: '机器可读输出(退出码仍为 0/1;出错的 JSON 也走 stdout)' },
|
|
192
|
+
{ flag: '--id <file|path>', desc: '待校验目标(文件名或路径);与位置参数同义,同时给出时以 --id 为准' },
|
|
183
193
|
{ flag: '--data-dir <dir>', desc: '导出目录(缺省 $DSH_HOME/dsh-config-manager/exports)' },
|
|
184
194
|
{ flag: '-h, --help', desc: '显示本页' },
|
|
185
195
|
],
|
|
@@ -276,8 +286,9 @@ export const COMMAND_HELP = [
|
|
|
276
286
|
description: [
|
|
277
287
|
'把配置恢复到该快照的状态:每个被覆盖或被删除的文件先拷到 <快照目录>/pre-restore/,以便反悔。',
|
|
278
288
|
'不带 --id 时挑最近一个非 rolled-back 的快照;--dry-run 只打印计划,零写入。',
|
|
279
|
-
'
|
|
280
|
-
' ① SAFE MODE 存在未恢复的 transaction;②
|
|
289
|
+
'真正执行前有三道门,任一不过就拒绝(没有 --force):',
|
|
290
|
+
' ① SAFE MODE 存在未恢复的 transaction;② 环境锁被别的任务持有;',
|
|
291
|
+
' ③ 本机有 DSH 实例在跑(恢复会覆盖/删除它正在使用的文件)——关掉 DSH,或改用 dcm web 救急台。',
|
|
281
292
|
],
|
|
282
293
|
sections: [
|
|
283
294
|
{
|
|
@@ -296,7 +307,7 @@ export const COMMAND_HELP = [
|
|
|
296
307
|
title: '退出码',
|
|
297
308
|
entries: [
|
|
298
309
|
{ flag: '0', desc: '全部动作成功(--dry-run 恒 0)' },
|
|
299
|
-
{ flag: '1', desc: '有失败步骤 / 没有可用快照 / id 非法 / SAFE MODE
|
|
310
|
+
{ flag: '1', desc: '有失败步骤 / 没有可用快照 / 快照目录读不出来 / id 非法 / SAFE MODE、环境锁或「DSH 在跑」拒绝' },
|
|
300
311
|
],
|
|
301
312
|
},
|
|
302
313
|
],
|
|
@@ -320,6 +331,8 @@ export const COMMAND_HELP = [
|
|
|
320
331
|
'--map old=new 用于跨机恢复:命中前缀会先改写首帧 cwd,其余帧逐字节保留。',
|
|
321
332
|
'--keep <dir> 处理重复 id:点名保留哪一份,其余移进 sessions/.cm-repair-quarantine-<时间戳>/(只搬不删)。',
|
|
322
333
|
'写盘前会检查 DSH 是否在跑;在跑则拒绝,避免边读边改。',
|
|
334
|
+
'--json 的 ok 与退出码同源:0(无阻断级问题)时为 true,否则 false —— 两者不会互相矛盾。',
|
|
335
|
+
'会话根不存在或存在却读不出来时,repair 都如实报错并非 0 退出(读不到 ≠ 没有会话)。',
|
|
323
336
|
],
|
|
324
337
|
sections: [
|
|
325
338
|
{
|
|
@@ -344,9 +357,9 @@ export const COMMAND_HELP = [
|
|
|
344
357
|
{
|
|
345
358
|
title: '退出码',
|
|
346
359
|
entries: [
|
|
347
|
-
{ flag: '0', desc: '无阻断问题;repair 的 dry-run 恒 0' },
|
|
348
|
-
{ flag: '1', desc: '
|
|
349
|
-
{ flag: '2', desc: 'list / doctor
|
|
360
|
+
{ flag: '0', desc: '无阻断问题;repair 的 dry-run 恒 0(--json 的 ok 同时为 true)' },
|
|
361
|
+
{ flag: '1', desc: '有阻断问题(--json 的 ok 为 false);repair 的 --fix 有失败/冲突/回滚;repair 的会话根不存在或读不出来;参数错误' },
|
|
362
|
+
{ flag: '2', desc: 'list / doctor 找不到会话根目录(repair 的同一情形是 1)' },
|
|
350
363
|
],
|
|
351
364
|
},
|
|
352
365
|
],
|
package/lib/cli/index.d.ts
CHANGED
|
@@ -137,5 +137,28 @@ export interface CliDeps {
|
|
|
137
137
|
* reinstall → 交互多选 + 二次确认 + 跨平台执行。失败项存在时 exit 1,否则 0。
|
|
138
138
|
*/
|
|
139
139
|
export declare function runCli(argv: readonly string[], io?: CliIo, env?: Record<string, string | undefined>, deps?: CliDeps): Promise<number>;
|
|
140
|
+
/** 救急台的目录事实(由 --data-dir / --data-root 统一派生;四处只认这一份)。 */
|
|
141
|
+
export interface WebPaths {
|
|
142
|
+
/** 插件数据根(快照/导出/锁都挂在它下面) */
|
|
143
|
+
root: string;
|
|
144
|
+
/** 与 root 同值(RescuePaths.dataDir 的语义) */
|
|
145
|
+
dataDir: string;
|
|
146
|
+
snapshotsDir: string;
|
|
147
|
+
exportsDir: string;
|
|
148
|
+
locksDir: string;
|
|
149
|
+
controlRoots: string[];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 派生救急台要用的四个目录 —— **root 只算一次**,再同时派生 snapshots / exports / locks / dataDir。
|
|
153
|
+
*
|
|
154
|
+
* 为什么必须统一:`--data-dir` 的历史语义是「快照目录 / 导出目录」,尾段命中 `snapshots`/`exports`
|
|
155
|
+
* 时要**上溯一层**才是数据根。此前只对「那一条」取原值、另一条仍 `path.join(dataDir, ...)`,
|
|
156
|
+
* 于是 `--data-dir <root>/snapshots` 会派生出 `<root>/snapshots/exports`(半上溯)——
|
|
157
|
+
* 命令行与网页看到的目录事实立刻分叉。`--data-root` 恒为准。
|
|
158
|
+
*/
|
|
159
|
+
export declare function resolveWebPaths(opts?: {
|
|
160
|
+
dataRoot?: string;
|
|
161
|
+
dataDir?: string;
|
|
162
|
+
}, env?: Record<string, string | undefined>): WebPaths;
|
|
140
163
|
/** 导出目录:--data-dir 覆盖优先,缺省 $DSH_HOME/dsh-config-manager/exports */
|
|
141
164
|
export declare function resolveExportsDir(flag: string | undefined, env?: Record<string, string | undefined>): string;
|