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
|
@@ -0,0 +1,661 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 核心引擎领域消息目录(src/core/** 与 src/migrations/** 的追加目录)。
|
|
3
|
+
*
|
|
4
|
+
* 与 src/core/messages.ts 的分工:
|
|
5
|
+
* - messages.ts = 基础目录(既有 372 键,指纹冻结在 engine-locale.test.ts,只许追加不许改);
|
|
6
|
+
* - 本文件 = 领域追加目录,键一律带 `core.` 前缀,经 registerMessageCatalog 注册进
|
|
7
|
+
* 引擎语言运行时(src/core/engine-locale.ts),**只在基础目录未命中时生效**。
|
|
8
|
+
*
|
|
9
|
+
* 用法:`import { engineMsg } from './messages-core.ts'` —— 从本模块 import 有两个作用:
|
|
10
|
+
* ① 模块加载即完成目录注册(本文件顶层调用 registerMessageCatalog);
|
|
11
|
+
* ② 拿到活翻译器 engineMsg(每次取值时按 getEngineLocale() 选 zh/en)。
|
|
12
|
+
* **不要**从 engine-locale.ts 直接 import engineMsg 后使用 core.* 键:那样目录可能尚未注册。
|
|
13
|
+
*
|
|
14
|
+
* 纪律:
|
|
15
|
+
* - zh 值 = 迁移前的中文字面量原样(逐字不变,既有测试断言依赖它);
|
|
16
|
+
* - en 值类型 Record<keyof typeof zh, string>(缺键/多键即编译错误),必须是纯英文;
|
|
17
|
+
* - 动态明细(路径 / id / err.message / 字节数)一律以 {param} 插值传入,绝不写死。
|
|
18
|
+
*/
|
|
19
|
+
import { engineMsg, getEngineLocale, registerMessageCatalog } from './engine-locale.ts';
|
|
20
|
+
import {
|
|
21
|
+
en as migrationEn,
|
|
22
|
+
setMigrationLanguageSource,
|
|
23
|
+
zh as migrationZh,
|
|
24
|
+
} from '../migrations/messages-migrations.ts';
|
|
25
|
+
|
|
26
|
+
export { engineMsg };
|
|
27
|
+
|
|
28
|
+
export const zh = {
|
|
29
|
+
// ---------- boot-safety ----------
|
|
30
|
+
'core.bootSafety.bundlesNotArray': 'dsh.profile.bundles 不是数组或结构异常',
|
|
31
|
+
|
|
32
|
+
// ---------- exporter ----------
|
|
33
|
+
'core.exporter.fileSectionSecretsTruncated': '文件类分区 {section} 中检测到疑似凭据: (另有 {count} 个文件命中,详见报告)',
|
|
34
|
+
|
|
35
|
+
// ---------- local-plugin-host ----------
|
|
36
|
+
'core.localPluginHost.packTimeout': '{stderr}\nnpm pack 超时({timeoutMs}ms)已终止',
|
|
37
|
+
'core.localPluginHost.tmpDirCreateFailed': '本地插件打包临时目录创建失败,已跳过本地插件打包: {reason}',
|
|
38
|
+
|
|
39
|
+
// ---------- boot-rescue ----------
|
|
40
|
+
'core.bootRescue.patchTakenOver': '# 本文件(profile patch 层)已被救援模式接管;home patch 同时被置空。',
|
|
41
|
+
'core.bootRescue.bundlesNarrowed': '# dsh.profile.bundles 已被收窄为 DSH 核心与救援插件自身,被禁用的包同时已从 dependencies 临时摘除:其余用户插件本次启动不挂载。',
|
|
42
|
+
'core.bootRescue.bundlesNote': '# 注意:dsh.profile.bundles 里的插件仍由 bundle 层挂载(本次只裁剪了不可解析的 bundle)。',
|
|
43
|
+
|
|
44
|
+
// ---------- phase3-host ----------
|
|
45
|
+
'core.phase3.transactionNotConverged': 'active transaction {opId} 未收敛(待 recover / reconcile),拒绝创建新 transaction',
|
|
46
|
+
'core.phase3.snapshotProviderNull': 'snapshotProvider 返回 null(快照创建失败),abort operation {operationType}',
|
|
47
|
+
'core.phase3.bindSnapshotEmptyId': 'bindSnapshot: snapshotId 为空',
|
|
48
|
+
'core.phase3.bindSnapshotIllegalState': 'bindSnapshot 非法 state: {state}',
|
|
49
|
+
|
|
50
|
+
// ---------- transaction-coordinator ----------
|
|
51
|
+
'core.txn.residuePending': '残留 active transaction {residue} 待处理,请重试',
|
|
52
|
+
'core.txn.unresolvedActive': '存在 unresolved active transaction {residue}',
|
|
53
|
+
'core.txn.tailCommitFailed': 'tail/commit 后异常:{message}',
|
|
54
|
+
|
|
55
|
+
// ---------- validator ----------
|
|
56
|
+
'core.compat.excellent': 'Excellent — 完美兼容(同平台、无缺失、schema 支持)',
|
|
57
|
+
'core.compat.good': 'Good — 兼容(旧版备份导入新版 DSH)',
|
|
58
|
+
'core.compat.partial': 'Partial — 部分兼容(跨平台/分区缺失/版本超前,需人工确认)',
|
|
59
|
+
'core.compat.unsupported': 'Unsupported — 不受支持(schema 超出范围)',
|
|
60
|
+
|
|
61
|
+
// ---------- journal ----------
|
|
62
|
+
'core.journal.illegalTransition': '非法 journal state transition: {from} → {to} (op {opId})',
|
|
63
|
+
'core.journal.illegalOperationId': '非法 operationId: {opId}',
|
|
64
|
+
'core.journal.notFoundOrCorrupt': 'journal 不存在或损坏: {opId}',
|
|
65
|
+
'core.journal.illegalOperationIdBare': '非法 operationId',
|
|
66
|
+
'core.journal.notTerminal': 'moveToCompleted 仅接受 terminal journal: {opId} state={state}',
|
|
67
|
+
|
|
68
|
+
// ---------- run-registry ----------
|
|
69
|
+
'core.run.autosyncBusy': '自动同步已在进行中',
|
|
70
|
+
'core.run.syncApplyBusy': '一键同步已在进行中',
|
|
71
|
+
'core.run.backupScheduleBusy': '定时备份已在进行中',
|
|
72
|
+
'core.run.restoreBusy': '快照恢复已在进行中(请等待当前恢复完成)',
|
|
73
|
+
'core.run.recoveryBusy': '恢复/回滚已在进行中(请等待当前恢复完成)',
|
|
74
|
+
|
|
75
|
+
// ---------- consult-source ----------
|
|
76
|
+
'core.consult.manifestUnparsable': 'manifest 无法解析',
|
|
77
|
+
'core.consult.manifestMissing': 'manifest 缺失',
|
|
78
|
+
'core.consult.hashMismatch': '"{name}" (hash 不符)',
|
|
79
|
+
'core.consult.entryMissing': '"{name}" (缺失)',
|
|
80
|
+
'core.consult.snapshotIntegrityFailed': '快照完整性校验失败',
|
|
81
|
+
// ---------- migration-history ----------
|
|
82
|
+
'core.migrationHistory.filenameCollision': 'history filename collision (retry 上限)',
|
|
83
|
+
'core.migrationHistory.title': 'DSH 配置迁移历史',
|
|
84
|
+
'core.migrationHistory.total': '总数',
|
|
85
|
+
'core.migrationHistory.empty': '暂无迁移记录',
|
|
86
|
+
'core.migrationHistory.kind': '操作',
|
|
87
|
+
'core.migrationHistory.time': '时间',
|
|
88
|
+
'core.migrationHistory.result': '结果',
|
|
89
|
+
'core.migrationHistory.sections': '分区',
|
|
90
|
+
'core.migrationHistory.detail': '摘要',
|
|
91
|
+
'core.migrationHistory.resultSuccess': '成功',
|
|
92
|
+
'core.migrationHistory.resultFailed': '失败',
|
|
93
|
+
'core.migrationHistory.resultSkipped': '跳过',
|
|
94
|
+
|
|
95
|
+
// ---------- local-plugin-pack ----------
|
|
96
|
+
'core.localPluginPack.dirCreateFailed': '本地插件打包目录创建失败,已跳过全部本地插件: {reason}',
|
|
97
|
+
'core.localPluginPack.tarballTooLarge': '本地插件 {name} 的 tarball 超过上限({size} > {max} 字节),已跳过打包',
|
|
98
|
+
'core.localPluginPack.packFailed': '本地插件 {name} 打包失败(npm pack 退出码 {code}):{detail}',
|
|
99
|
+
'core.localPluginPack.noOutput': '无输出',
|
|
100
|
+
'core.localPluginPack.parseFilenameFailed': '本地插件 {name} 打包失败:无法从 npm pack 输出解析文件名',
|
|
101
|
+
'core.localPluginPack.packError': '本地插件 {name} 打包失败:{reason}',
|
|
102
|
+
|
|
103
|
+
// ---------- recovery-orchestrator ----------
|
|
104
|
+
'core.recovery.executeFailed': 'recovery 执行失败',
|
|
105
|
+
'core.recovery.stateNotAllowed': 'journal state {state} 不允许 {action}',
|
|
106
|
+
'core.recovery.noTrustedSnapshot': 'journal 无 trusted snapshot,无法恢复',
|
|
107
|
+
'core.recovery.snapshotUntrusted': 'snapshot 不可信: {verdict}',
|
|
108
|
+
'core.recovery.needsAttentionNoAuto': 'recovery decision 为 needs-attention,无法自动执行',
|
|
109
|
+
'core.recovery.noTrustedSnapshotShort': 'journal 无 trusted snapshot',
|
|
110
|
+
'core.recovery.snapshotLoadFailed': 'snapshot 无法加载',
|
|
111
|
+
'core.recovery.needsAttentionNoRetry': 'recovery decision 为 needs-attention,无法 retry',
|
|
112
|
+
'core.recovery.dismissFailed': 'dismiss 失败',
|
|
113
|
+
'core.recovery.lockNotStale': '未判定为 stale,已拒绝回收',
|
|
114
|
+
// ---------- restore ----------
|
|
115
|
+
'core.restore.pathEscaped': '路径越界: {rel}',
|
|
116
|
+
'core.restore.symlinkCriticalFile': 'symlink 化关键文件: {rel}',
|
|
117
|
+
'core.restore.invalidSnapshotId': 'snapshotId 非法',
|
|
118
|
+
'core.restore.snapshotDirOutOfBounds': '快照目录越界或非直接子目录',
|
|
119
|
+
'core.restore.blobSymlink': 'blob 是 symlink: {name}',
|
|
120
|
+
'core.restore.snapshotJsonUnparsable': 'snapshot.json 无法解析',
|
|
121
|
+
'core.restore.legacyNeedsConfirm': '旧快照(无 manifest/READY),需显式确认后恢复',
|
|
122
|
+
'core.restore.envFingerprintMismatch': 'environmentFingerprint 不匹配(可能来自其他机器/安装)',
|
|
123
|
+
'core.restore.legacyNoReadiness': '旧快照(无 readiness),需显式确认后恢复',
|
|
124
|
+
'core.restore.trustedManualLocal': '完整性通过,但非 operation-bound(手动/本地快照)',
|
|
125
|
+
'core.restore.trustedOperationSnapshot': 'READY + manifest 完整 + op/env/owner binding 匹配',
|
|
126
|
+
'core.restore.snapshotDirUnreadable': '快照目录读不出来({code}):{dir}',
|
|
127
|
+
'core.restore.illegalSnapshotId': '非法快照 id: {id}',
|
|
128
|
+
'core.restore.snapshotPathEscaped': '快照路径越界: {id}',
|
|
129
|
+
|
|
130
|
+
// ---------- reconcile ----------
|
|
131
|
+
'core.reconcile.journalUnparsable': 'journal {opId} 无法解析或 schema 非法(隔离处理)',
|
|
132
|
+
'core.reconcile.ownerLive': 'owner 存活,live operation 进行中',
|
|
133
|
+
'core.reconcile.bindingMismatch': 'ownership binding 不匹配(journal.ownerInstanceId/lockId 非 crashed ownership {instanceId}),不作 trusted 恢复',
|
|
134
|
+
'core.reconcile.envMismatch': 'environment fingerprint 不匹配(跨机/环境变化),不自动恢复',
|
|
135
|
+
'core.reconcile.needsAttentionConfirm': 'NEEDS_ATTENTION 待用户确认',
|
|
136
|
+
'core.reconcile.selfProvenNoSteps': '自证零副作用:external intent 未登记任何步骤(fn 未开始)',
|
|
137
|
+
'core.reconcile.selfProvenArtifactOnly': '自证零配置副作用:定时备份只产出 exports 归档与调度状态',
|
|
138
|
+
'core.reconcile.terminalOrganized': 'terminal({state}) journal 规整到 completed',
|
|
139
|
+
'core.reconcile.rollbackInterrupted': '回滚中断({detail}),需显式续跑回滚(用户确认)',
|
|
140
|
+
'core.reconcile.recoveringUnverified': 'RECOVERING 且 recovery 未验证(无 recoveryVerification 或 verdict 非 MATCH/PARTIAL_MATCH),绝不自动 RECOVERED',
|
|
141
|
+
'core.reconcile.danglingPlannedStep': 'planned step {stepId} 缺少 steps 条目(损坏/篡改 journal)',
|
|
142
|
+
'core.reconcile.stepNotReliablyDone': 'step {ref} 未可靠完成(磁盘==before)',
|
|
143
|
+
'core.reconcile.stepFingerprint': 'step {ref} 指纹 {verdict}',
|
|
144
|
+
'core.reconcile.mutationNotStarted': 'mutation 未开始,安全完成',
|
|
145
|
+
'core.reconcile.opaqueRollbackAvailable': 'opaque APPLYING(空 steps)且 mutation 可能已开始,有 trusted snapshot 可回滚(需用户确认)',
|
|
146
|
+
'core.reconcile.opaqueNoSnapshot': 'opaque APPLYING(空 steps)且 mutation 可能已开始,无 trusted snapshot 可回滚',
|
|
147
|
+
'core.reconcile.noSideEffects': '无副作用可恢复,安全完成',
|
|
148
|
+
'core.reconcile.unprovableSteps': '不可证明步骤: {details}',
|
|
149
|
+
'core.reconcile.externalSideEffectsUnknown': '外部副作用未知',
|
|
150
|
+
'core.reconcile.snapshotMissingSuffix': ';快照缺失',
|
|
151
|
+
'core.reconcile.partialApplied': '部分 step 已应用,可安全回滚(需用户确认)',
|
|
152
|
+
|
|
153
|
+
// ---------- reinstall ----------
|
|
154
|
+
'core.reinstall.programLabel': 'DSH 程序本体',
|
|
155
|
+
'core.reinstall.programDesc': '卸载并重装 @deepseek-ai/dsh 全局启动器(核心动作)',
|
|
156
|
+
'core.reinstall.cacheLabel': '全局残留缓存',
|
|
157
|
+
'core.reinstall.cacheDesc': '清 pnpm store 与 npm cache(可选)',
|
|
158
|
+
'core.reinstall.settingsLabel': '~/.dsh 设置',
|
|
159
|
+
'core.reinstall.settingsDesc': '清空 settings.yaml 等配置(不可逆)',
|
|
160
|
+
'core.reinstall.pluginsLabel': '~/.dsh 已装插件',
|
|
161
|
+
'core.reinstall.pluginsDesc': '清空 profiles 下已装插件依赖(不可逆)',
|
|
162
|
+
'core.reinstall.dataLabel': '会话记录与凭据',
|
|
163
|
+
'core.reinstall.dataDesc': '清空 sessions 会话与 .credentials.yaml 凭据(最高风险,强制二次确认)',
|
|
164
|
+
'core.reinstall.stepUninstallGlobal': '卸载全局 @deepseek-ai/dsh',
|
|
165
|
+
'core.reinstall.stepCleanGlobal': '清理全局残留 @deepseek-ai/dsh',
|
|
166
|
+
'core.reinstall.stepInstallGlobal': '安装全局 @deepseek-ai/dsh@{version}',
|
|
167
|
+
'core.reinstall.stepVerifyVersion': '验证版本(dsh --version)',
|
|
168
|
+
'core.reinstall.stepCleanPnpmStore': '清理 pnpm store',
|
|
169
|
+
'core.reinstall.stepCleanNpmCache': '清理 npm cache',
|
|
170
|
+
'core.reinstall.stepBackupHome': '备份 ~/.dsh 到同级 .reinstall-backup(抢救兜底)',
|
|
171
|
+
'core.reinstall.stepWipeSettings': '清空 ~/.dsh 设置(settings.yaml 等)',
|
|
172
|
+
'core.reinstall.stepWipePlugins': '清空 ~/.dsh 已装插件(profiles/*/node_modules)',
|
|
173
|
+
'core.reinstall.stepWipeSessions': '清空会话记录(sessions/)',
|
|
174
|
+
'core.reinstall.stepWipeCredentials': '清空凭据(.credentials.yaml,仅删除文件)',
|
|
175
|
+
// ---------- verify-recovery ----------
|
|
176
|
+
'core.verifyRecovery.blobPathEscaped': 'blob 路径越界: {path}',
|
|
177
|
+
'core.verifyRecovery.revalidateFailed': '快照重验失败: {verdict}',
|
|
178
|
+
'core.verifyRecovery.revalidatePassed': '快照重验通过(TRUSTED_OPERATION_SNAPSHOT)',
|
|
179
|
+
'core.verifyRecovery.snapshotJsonRereadFailed': 'snapshot.json 重读失败: {reason}',
|
|
180
|
+
'core.verifyRecovery.envMismatch': 'environmentFingerprint 不匹配(WRONG_ENVIRONMENT)',
|
|
181
|
+
'core.verifyRecovery.operationMismatch': 'operationId 不匹配(WRONG_OPERATION): snapshot={snapshot} expected={expected}',
|
|
182
|
+
'core.verifyRecovery.none': '无',
|
|
183
|
+
'core.verifyRecovery.hostFileNoBlob': 'host file 无 blob 信息: {rel}',
|
|
184
|
+
'core.verifyRecovery.hostFileMissing': 'host file 缺失: {rel}',
|
|
185
|
+
'core.verifyRecovery.hostFileBlobReadFailed': 'host file blob 读取失败: {rel}',
|
|
186
|
+
'core.verifyRecovery.hostFileContentMismatch': 'host file 内容不匹配: {rel}',
|
|
187
|
+
'core.verifyRecovery.hostFileMatch': 'host file 匹配: {rel}',
|
|
188
|
+
'core.verifyRecovery.hostFileStillPresent': '应删除目标仍存在: {rel}',
|
|
189
|
+
'core.verifyRecovery.hostFileAlreadyGone': '删除目标已不存在: {rel}',
|
|
190
|
+
'core.verifyRecovery.filePathEscaped': 'file 路径越界: {ref}',
|
|
191
|
+
'core.verifyRecovery.fileMissing': 'file 缺失: {ref}',
|
|
192
|
+
'core.verifyRecovery.fileBlobReadFailed': 'file blob 读取失败: {ref}',
|
|
193
|
+
'core.verifyRecovery.fileContentMismatch': 'file 内容不匹配: {ref}',
|
|
194
|
+
'core.verifyRecovery.fileMatch': 'file 匹配: {ref}',
|
|
195
|
+
'core.verifyRecovery.fileStillPresent': '应删除 file 目标仍存在: {ref}',
|
|
196
|
+
'core.verifyRecovery.fileAlreadyGone': '删除 file 目标已不存在: {ref}',
|
|
197
|
+
'core.verifyRecovery.pluginsNoBaseline': '快照无 beforePlugins 基线,插件状态不可验证',
|
|
198
|
+
'core.verifyRecovery.pluginsNoBaselineHint': '插件状态无法自动验证(快照无基线),请人工确认已装插件',
|
|
199
|
+
'core.verifyRecovery.pluginsAdded': '导入期间新增插件未移除: {names}',
|
|
200
|
+
'core.verifyRecovery.pluginsMatch': '插件状态匹配(无新增插件)',
|
|
201
|
+
'core.verifyRecovery.pluginsVerifyFailed': '插件状态无法验证(listInstalled 失败)',
|
|
202
|
+
'core.verifyRecovery.pluginsVerifyFailedHint': '插件状态无法自动验证(listInstalled 失败),请人工确认已装插件',
|
|
203
|
+
'core.verifyRecovery.settingsMismatch': 'settings 不匹配: {ref}',
|
|
204
|
+
'core.verifyRecovery.settingsMatch': 'settings 匹配: {ref}',
|
|
205
|
+
'core.verifyRecovery.settingsVerifyFailed': 'settings 无法验证: {ref}',
|
|
206
|
+
'core.verifyRecovery.settingsVerifyFailedHint': 'settings 无法自动验证({ref}),请人工确认',
|
|
207
|
+
|
|
208
|
+
// ---------- backup-verify ----------
|
|
209
|
+
'core.backupVerify.notRegularFile': '不是普通文件(目录或特殊文件)/ not a regular file: {zip}',
|
|
210
|
+
'core.backupVerify.fileNotFound': '备份文件不存在 / backup file not found: {zip}',
|
|
211
|
+
'core.backupVerify.fileUnreadable': '备份文件不可读 / backup file unreadable: {reason}',
|
|
212
|
+
'core.backupVerify.encryptedContainer': '整体加密备份容器(DCA1)需先用密码解密为 ZIP 才能自检 / encrypted container must be decrypted first',
|
|
213
|
+
'core.backupVerify.cannotOpenZip': 'ZIP 无法打开 / cannot open as ZIP: {reason}',
|
|
214
|
+
'core.backupVerify.emptyArchive': '空 ZIP(0 条目)/ empty archive',
|
|
215
|
+
'core.backupVerify.missingManifest': '缺少 {file}(不是本插件导出的备份)/ {file} missing',
|
|
216
|
+
'core.backupVerify.manifestUnreadable': '{file} 无法读取(归档损坏)/ unreadable entry: {reason}',
|
|
217
|
+
'core.backupVerify.invalidManifest': '{file} 非法 / invalid manifest: {reason}',
|
|
218
|
+
'core.backupVerify.unsupportedSchema': 'schema 版本不受支持 / unsupported schema version: {version}',
|
|
219
|
+
'core.backupVerify.missingChecksums': '缺少 {file}(无法做完整性校验)/ {file} missing',
|
|
220
|
+
'core.backupVerify.invalidChecksums': '{file} 非法或不可读 / invalid or unreadable checksums table: {reason}',
|
|
221
|
+
'core.backupVerify.unreadableEntry': '{name}({reason})',
|
|
222
|
+
'core.backupVerify.emptyTableWithData': '校验表为空但归档含数据条目 / empty checksums table with data entries',
|
|
223
|
+
'core.backupVerify.emptyTable': '校验表为空(归档仅含 manifest 与校验表自身)/ empty checksums table',
|
|
224
|
+
'core.backupVerify.uncoveredEntries': '含未纳入校验表的条目 {count} 个 / entries not covered by checksums: {shown}{suffix}',
|
|
225
|
+
'core.backupVerify.declaredSectionNoEntries': 'manifest 声明分区 {id} 但归档内无对应文件 / declared section has no entries: {id}',
|
|
226
|
+
'core.backupVerify.declaredSectionPayloadMissing': 'manifest 声明分区 {id} 但缺少 {path} / declared section payload missing: {id}',
|
|
227
|
+
'core.backupVerify.encryptedFlagNoSecrets': 'manifest 标记加密但归档内无凭据密文条目 / encrypted flag without secrets entry',
|
|
228
|
+
'core.backupVerify.missingEntries': '校验表内条目缺失({count})/ missing entries: {list}',
|
|
229
|
+
'core.backupVerify.hashMismatch': '条目 SHA-256 不符({count})/ hash mismatch: {list}',
|
|
230
|
+
'core.backupVerify.unreadableEntries': '条目无法读取({count})/ unreadable entries: {list}',
|
|
231
|
+
'core.backupVerify.verificationError': '自检过程异常 / verification error: {reason}',
|
|
232
|
+
|
|
233
|
+
// ---------- backup-plan ----------
|
|
234
|
+
'core.backupPlan.pluginFilesRisk': '第三方插件自有文件不受控(dsh-ssh.json 内含明文主机密码等),仅在你确认内容后才应纳入备份',
|
|
235
|
+
'core.backupPlan.pathWithReason': '{path}({reason})',
|
|
236
|
+
'core.backupPlan.tooDeep': '层级超过上限未进备份(目录或链接目标超出深度上限) / nesting limit exceeded, content NOT in this backup: {at}',
|
|
237
|
+
'core.backupPlan.linkSkipped': '链接未进备份 / link NOT in this backup: {at}',
|
|
238
|
+
'core.backupPlan.dirUnreadable': '目录读取失败,其内容未进备份 / directory unreadable, content NOT in this backup: {dir}',
|
|
239
|
+
'core.backupPlan.countNotMeasured': '文件数未统计 / count not measured',
|
|
240
|
+
'core.backupPlan.fileCount': '{count} 个文件 / {count} file(s)',
|
|
241
|
+
'core.backupPlan.depDirSkipped': '运行时依赖目录未进备份(可重建,目标机需重新安装依赖)/ runtime dependency directory NOT in this backup (rebuildable; reinstall on the target): {path}({files})',
|
|
242
|
+
'core.backupPlan.followedLinks': '已跟随 {count} 个链接目录收集内容 / followed {count} linked director(ies)',
|
|
243
|
+
'core.backupPlan.sectionsMissingValue': '`--sections` 缺值 / missing value for `--sections`',
|
|
244
|
+
'core.backup.osHomeUnavailable': '分区 {section} 的数据在系统主目录下,但宿主未提供该目录的文件门面(旧版本宿主);本次不读也不写 / section {section} stores data under the system home directory but the host provides no file facade for it (older host); nothing is read or written this time',
|
|
245
|
+
'core.backupPlan.unknownSections': '未知分区 / unknown section(s): {unknown}(可用 / available: {available})',
|
|
246
|
+
'core.backupPlan.sectionNotOffline': '分区 {section} 不支持离线 CLI 备份(它的收集依赖插件来源注册表与本机插件清单),请用 GUI 的导出/导入迁移它 / section {section} is not supported by the offline CLI backup (its collection depends on the plugin-data source registry and the local plugin manifests); use the GUI export/import instead',
|
|
247
|
+
'core.backupPlan.unsafeEntryName': '跳过不安全条目名 / unsafe entry name skipped: {name}',
|
|
248
|
+
'core.backupPlan.statFailed': '探测失败 / stat failed: {path}({reason})',
|
|
249
|
+
'core.backupPlan.readFailed': '读取失败 / read failed: {path}({reason})',
|
|
250
|
+
'core.backupPlan.sectionEmpty': '分区无内容,未写入 / section empty, skipped: {section}',
|
|
251
|
+
// ---------- model-tools ----------
|
|
252
|
+
'core.modelTools.illegalSnapshotId': '非法快照 id:{id}',
|
|
253
|
+
'core.modelTools.syncChannelNotConfigured': '同步通道 {channel} 尚未配置(sync-config.json 缺失或损坏)',
|
|
254
|
+
'core.modelTools.snapshotNotFound': '快照不存在:{id}(用 config_list_snapshots 查看可用快照)',
|
|
255
|
+
'core.modelTools.toolsServiceUnavailable': 'tools 服务不可用:跳过模型工具注册(引擎能力仍可用)',
|
|
256
|
+
'core.modelTools.backupToolDesc': '全量备份 DSH 配置到本地 exports 目录(默认不含 secret;可传 password 加密导出)。返回 ZIP 文件名/大小/分区清单/加密状态。',
|
|
257
|
+
'core.modelTools.backupOnlyParam': '仅导出的分区 id 白名单;缺省 = 全部推荐分区',
|
|
258
|
+
'core.modelTools.backupPasswordParam': '可选:加密备份密码(仅内存,不落盘/不回显;提供即加密导出)',
|
|
259
|
+
'core.modelTools.backupOutputDesc': '备份结果(zip 文件名 / sizeBytes / 分区清单 / excluded / encrypted / containsSecrets / redactedHits / warnings)',
|
|
260
|
+
'core.modelTools.listSnapshotsToolDesc': '列出 DSH 配置的本地回滚快照(id / 创建时间 / 来源 / 状态 / 条目数),供后续 config_restore 使用。',
|
|
261
|
+
'core.modelTools.listSnapshotsOutputDesc': '快照数组(id / createdAt / sourceZip / status / entryCount)',
|
|
262
|
+
'core.modelTools.restoreToolDesc': '恢复到指定快照。默认只返回动作计划(零写入);确认要真实执行时传 confirm:true(会覆盖/删除 $DSH_HOME 文件并卸载导入期间新增插件,属破坏性操作,务必先预览)。',
|
|
263
|
+
'core.modelTools.restoreSnapshotIdParam': '要恢复的快照 id(用 config_list_snapshots 获取)',
|
|
264
|
+
'core.modelTools.restoreConfirmParam': 'true 才真实执行恢复;缺省 false 只预览计划(零写入)',
|
|
265
|
+
'core.modelTools.restoreOutputDesc': 'dryRun=true 时为恢复计划;dryRun=false 时为执行报告',
|
|
266
|
+
'core.modelTools.syncPushToolDesc': '手动推送 DSH 配置同步到远端(Git/WebDAV),复用已持久化的通道配置。写远端属主动操作;加密/含凭据须传 password 且引擎强制 encrypt。',
|
|
267
|
+
'core.modelTools.channelParam': '同步通道;缺省 = 已配置的活动通道',
|
|
268
|
+
'core.modelTools.syncPushSectionsParam': '仅推送的分区;缺省 = 全部推荐 portable 分区(非 portable 自动跳过)',
|
|
269
|
+
'core.modelTools.syncPushEncryptParam': '加密快照;开启必须提供 password',
|
|
270
|
+
'core.modelTools.syncPushIncludeSecretsParam': '推送真实凭据值(必须同时 encrypt=true,否则引擎拒绝)',
|
|
271
|
+
'core.modelTools.syncPushPasswordParam': '加密密码(仅内存,不落盘/不回显)',
|
|
272
|
+
'core.modelTools.syncPushOutputDesc': '推送报告(snapshotId / 实际同步分区 / 告警)',
|
|
273
|
+
'core.modelTools.syncPullToolDesc': '拉取远端同步差异预览(Git/WebDAV,零写入:只下载 + 分析出差异报告,绝不直接写配置)。若要落地差异需另走确认导入管道。',
|
|
274
|
+
'core.modelTools.syncPullSnapshotIdParam': '远端快照 id;缺省 = 最新',
|
|
275
|
+
'core.modelTools.syncPullStrategyParam': '冲突全局策略;缺省 merge(冲突保留待决策)',
|
|
276
|
+
'core.modelTools.syncPullPasswordParam': '解密密码(加密快照需要;仅内存)',
|
|
277
|
+
'core.modelTools.syncPullOutputDesc': '差异报告(changes 列表 / needsReview)',
|
|
278
|
+
|
|
279
|
+
// ---------- backup ----------
|
|
280
|
+
'core.backup.fileSectionBaseMissing': '分区 {section} 是文件类分区,但 core/backup.ts 的 FILE_BASES 未给基准目录(拒绝静默退回 homeDir 根)',
|
|
281
|
+
'core.backup.secretsSectionNotSnapshotTarget': 'secrets 分区没有 adapter / 无分区载荷,不应作为快照目标(凭据值走独立加密容器,绝不进快照)',
|
|
282
|
+
'core.backup.sectionUnsupported': '快照不支持分区「{section}」:它未在 schema/section-registry.ts 注册(或缺少快照实现);拒绝按其它分区语义静默记录(那会让该分区的写入无法回滚)',
|
|
283
|
+
'core.backup.blobPathEscaped': '快照 blob 路径越界: {path}',
|
|
284
|
+
'core.backup.snapshotVerifyFailed': '快照 {id} 验证失败: {reason}',
|
|
285
|
+
'core.backup.pruneFailed': '快照保留清理失败(快照本身已就绪发布,不受影响):{reason}',
|
|
286
|
+
'core.backup.pruneAbandoned': '快照保留清理已放弃:读取 recovery 引用集合失败({reason})',
|
|
287
|
+
'core.backup.dirNameIdMismatch': '快照目录名与内部 id 不一致,已跳过自动清理:{dir}(内部 id {id})',
|
|
288
|
+
'core.backup.snapshotPathEscaped': '快照路径越界',
|
|
289
|
+
'core.backup.snapshotJsonMissing': 'snapshot.json 缺失',
|
|
290
|
+
'core.backup.snapshotJsonInvalid': 'snapshot.json 非法',
|
|
291
|
+
'core.backup.snapshotIdDirMismatch': 'snapshot.id 与目录不匹配',
|
|
292
|
+
'core.backup.manifestMissing': 'manifest.json 缺失',
|
|
293
|
+
'core.backup.manifestInvalid': 'manifest 非法或 snapshotId 不匹配',
|
|
294
|
+
'core.backup.entryCountMismatch': 'manifest.entryCount 与 snapshot.entries 不一致(篡改)',
|
|
295
|
+
'core.backup.metadataHashMismatch': 'metadataHash 不匹配(破坏性内容被篡改)',
|
|
296
|
+
'core.backup.blobMissing': 'blob 缺失: {path}',
|
|
297
|
+
'core.backup.blobHashMismatch': 'blob hash 不匹配: {path}',
|
|
298
|
+
'core.backup.blobNotInManifest': 'snapshot 引用的 blob 未在 manifest 中: {blob}',
|
|
299
|
+
// ---------- plugin-cli ----------
|
|
300
|
+
'core.pluginCli.hoistPatternDiff': "profile 的 node_modules 由旧版 pnpm 创建,与当前 pnpm 的默认配置不兼容;在 profile 目录执行一次 pnpm install 重建后重试 / this profile's node_modules was created by a different pnpm major; rebuild it (pnpm install) before retrying",
|
|
301
|
+
'core.pluginCli.addingToRoot': "profile 是 pnpm workspace,当前 dsh CLI 转发未带 -w 被 pnpm 拒绝;可手动执行 dsh plugin --profile <name> add -w <pkg> / pnpm refused to add at a workspace root (missing -w); run dsh plugin --profile <name> add -w <pkg> by hand",
|
|
302
|
+
'core.pluginCli.notAWorkspace': 'profile 目录不是 pnpm workspace,却传入了 -w,因此被 pnpm 拒绝 / -w was passed but the profile is not a pnpm workspace, so pnpm refused the operation',
|
|
303
|
+
'core.pluginCli.releaseAgeViolation': "profile 里有刚发布不久的插件版本,pnpm 的安全等待期检查拒绝了本次改动(即使改的是别的插件);等待发布期满,或临时以 --config.minimumReleaseAge=0 重试 / a recently-published plugin version in this profile trips pnpm's fresh-release safety check, blocking any change (even to other plugins); wait for the release to mature, or retry once with --config.minimumReleaseAge=0",
|
|
304
|
+
'core.pluginCli.gitBuildBlocked': "该 git 插件需要在安装时执行构建脚本,被 pnpm 的 allowBuilds 白名单拦截;把 pnpm 提示的包名加入 profile 的 pnpm-workspace.yaml 的 allowBuilds 后重试 / this git-hosted plugin needs to run its build script at install time, which pnpm blocks until allowed — add the exact package pnpm printed to allowBuilds in the profile's pnpm-workspace.yaml, then re-run",
|
|
305
|
+
'core.pluginCli.parenValue': '({value})',
|
|
306
|
+
'core.pluginCli.patchFileMissing': "profile 的 pnpm-workspace.yaml 声明了 patchedDependencies,但对应的 patch 文件不存在{patch};pnpm 因此拒绝任何安装(含与补丁无关的插件)。把缺失的 patch 文件放回 profile 的 patches/ 目录,或从 pnpm-workspace.yaml 删除该条目后重试 / the profile's pnpm-workspace.yaml declares patchedDependencies but the patch file is missing{patch}; pnpm then refuses every install (even unrelated plugins). Put the patch file back under the profile's patches/ directory, or remove that entry from pnpm-workspace.yaml and retry",
|
|
307
|
+
'core.pluginCli.fetch404': "有一个依赖在 registry 上不存在{pkg},pnpm 拒绝任何安装操作;它可能是之前失败操作残留在 profile package.json 里的幽灵依赖(手动删除该行),也可能是需要登录的私有包 / a dependency cannot be resolved from the registry{pkg}; pnpm refuses every install while it is present — it may be a ghost entry left in the profile's package.json by an earlier failed operation (remove that line by hand), or a private package needing registry credentials",
|
|
308
|
+
'core.pluginCli.transientNetwork': '拉取依赖时网络临时失败(安装会重放整个依赖树,任何一个既有依赖抖动都会中断本次操作);稍后直接重试通常即可 / a transient network failure while fetching dependencies (installs replay the whole dependency tree, so any existing dependency can hiccup); a plain retry usually succeeds',
|
|
309
|
+
'core.pluginCli.desktopProfileReserved': 'desktop 是 DeepSeek Harness Desktop 独占管理的保留档案,普通 dsh CLI 拒绝操作它;请在桌面端应用内重试(新版本插件会自动改用桌面端自带的 CLI 载体),或改用其它档案 / the "desktop" profile is managed exclusively by the DeepSeek Harness Desktop application and the plain dsh CLI refuses to touch it; retry from inside the Desktop app (a current version of this plugin switches to the Desktop-bundled CLI carrier) or target another profile',
|
|
310
|
+
'core.pluginCli.pnpmMissing': '找不到 pnpm(dsh 转发 pnpm 失败):请先安装 pnpm(npm install -g pnpm 或 corepack enable pnpm),然后重试 / pnpm is not on PATH (dsh forwards to pnpm): install pnpm (npm install -g pnpm or corepack enable pnpm) and retry',
|
|
311
|
+
'core.pluginCli.dshCliStartFailed': '无法启动 dsh CLI({spawnError}):请确认 dsh 已安装且在 PATH 上,然后重试安装 {pkg} / cannot start dsh CLI ({spawnError}): make sure dsh is installed and on PATH, then retry installing {pkg}',
|
|
312
|
+
'core.pluginCli.installTimeout': '安装 {pkg} 超时(进程已终止,默认 15 分钟):请检查网络或稍后重试 / install {pkg} timed out (process killed, default 15 min): check your network and retry later',
|
|
313
|
+
'core.pluginCli.installFailed': '安装 {pkg} 失败({code}):{message}',
|
|
314
|
+
'core.pluginCli.noOutput': '无输出',
|
|
315
|
+
'core.pluginCli.installFailedWithTail': 'dsh plugin 安装 {pkg} 失败(exit {exitCode}):{tail}',
|
|
316
|
+
|
|
317
|
+
// ---------- migration-consult ----------
|
|
318
|
+
'core.consult.compatNoManifest': '无法评估兼容性:manifest 缺失',
|
|
319
|
+
'core.consult.compatPartial': '部分兼容:跨平台 / 分区缺失 / 版本超前,需人工确认',
|
|
320
|
+
'core.consult.compatUnsupported': '不受支持:schema 超出本插件支持范围',
|
|
321
|
+
'core.consult.integrityNoManifest': 'manifest 缺失,无法校验结构完整性',
|
|
322
|
+
'core.consult.manifestInvalid': 'manifest 无效:{message}',
|
|
323
|
+
'core.consult.manifestWarning': 'manifest 警告:{message}',
|
|
324
|
+
'core.consult.checksumMismatch': '完整性校验失败:{reason}',
|
|
325
|
+
'core.consult.noChecksums': '源缺少 checksum 表,无法校验条目完整性',
|
|
326
|
+
'core.consult.zipSlip': 'ZIP 路径越界:{path}',
|
|
327
|
+
'core.consult.sectionDataMissing': '声明包含但数据缺失:{section}',
|
|
328
|
+
'core.consult.sectionUnparseable': '分区数据不可解析:{section}',
|
|
329
|
+
'core.consult.listSeparator': '、',
|
|
330
|
+
'core.consult.andMore': ' 等 {count} 个',
|
|
331
|
+
'core.consult.danglingCredentialRef': '备份引用了 {count} 个未在凭据分区声明的凭据(导入后本机若缺值需补录):{shown}{more}',
|
|
332
|
+
'core.consult.unencryptedSecrets': '快照含未加密秘密(凭据值明文暴露)',
|
|
333
|
+
'core.consult.sensitiveHits': '检测到 {count} 处敏感字段暴露(已脱敏)',
|
|
334
|
+
'core.consult.migratabilityNotEvaluated': '未评估可迁移性(dry-run 未执行)',
|
|
335
|
+
'core.consult.migratabilityFailed': '可迁移性检查失败:dry-run 无法通过',
|
|
336
|
+
'core.consult.conflicts': '有 {count} 处冲突需要你决定保留哪一边(下一步可逐个选择;默认不覆盖本机)',
|
|
337
|
+
'core.consult.warnings': '另有 {count} 项需要留意(不影响导入能否成功)',
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
export const en: Record<keyof typeof zh, string> = {
|
|
341
|
+
// ---------- boot-safety ----------
|
|
342
|
+
'core.bootSafety.bundlesNotArray': 'dsh.profile.bundles is not an array or is structurally invalid',
|
|
343
|
+
|
|
344
|
+
// ---------- exporter ----------
|
|
345
|
+
'core.exporter.fileSectionSecretsTruncated': 'Suspected credentials detected in file section {section}: ({count} more files matched, see the report)',
|
|
346
|
+
|
|
347
|
+
// ---------- local-plugin-host ----------
|
|
348
|
+
'core.localPluginHost.packTimeout': '{stderr}\nnpm pack timed out ({timeoutMs}ms); terminated',
|
|
349
|
+
'core.localPluginHost.tmpDirCreateFailed': 'Failed to create the temporary directory for local plugin packing; skipped packing local plugins: {reason}',
|
|
350
|
+
|
|
351
|
+
// ---------- boot-rescue ----------
|
|
352
|
+
'core.bootRescue.patchTakenOver': '# This file (the profile patch layer) has been taken over by rescue mode; the home patch is cleared as well.',
|
|
353
|
+
'core.bootRescue.bundlesNarrowed': '# dsh.profile.bundles has been narrowed to the DSH core and the rescue plugin itself; disabled packages were also temporarily removed from dependencies: other user plugins are not mounted in this boot.',
|
|
354
|
+
'core.bootRescue.bundlesNote': '# Note: plugins listed in dsh.profile.bundles are still mounted by the bundle layer (only unresolvable bundles were pruned this time).',
|
|
355
|
+
|
|
356
|
+
// ---------- phase3-host ----------
|
|
357
|
+
'core.phase3.transactionNotConverged': 'active transaction {opId} has not converged (needs recover / reconcile); refusing to create a new transaction',
|
|
358
|
+
'core.phase3.snapshotProviderNull': 'snapshotProvider returned null (snapshot creation failed); aborting operation {operationType}',
|
|
359
|
+
'core.phase3.bindSnapshotEmptyId': 'bindSnapshot: snapshotId is empty',
|
|
360
|
+
'core.phase3.bindSnapshotIllegalState': 'bindSnapshot: illegal state {state}',
|
|
361
|
+
|
|
362
|
+
// ---------- transaction-coordinator ----------
|
|
363
|
+
'core.txn.residuePending': 'Residual active transaction {residue} is pending; retry',
|
|
364
|
+
'core.txn.unresolvedActive': 'An unresolved active transaction exists: {residue}',
|
|
365
|
+
'core.txn.tailCommitFailed': 'Exception after tail/commit: {message}',
|
|
366
|
+
|
|
367
|
+
// ---------- validator ----------
|
|
368
|
+
'core.compat.excellent': 'Excellent — fully compatible (same platform, nothing missing, schema supported)',
|
|
369
|
+
'core.compat.good': 'Good — compatible (an older backup imported into a newer DSH)',
|
|
370
|
+
'core.compat.partial': 'Partial — partly compatible (cross-platform / missing sections / newer version; needs manual confirmation)',
|
|
371
|
+
'core.compat.unsupported': 'Unsupported — not supported (schema out of range)',
|
|
372
|
+
|
|
373
|
+
// ---------- journal ----------
|
|
374
|
+
'core.journal.illegalTransition': 'Illegal journal state transition: {from} → {to} (op {opId})',
|
|
375
|
+
'core.journal.illegalOperationId': 'Illegal operationId: {opId}',
|
|
376
|
+
'core.journal.notFoundOrCorrupt': 'Journal does not exist or is corrupt: {opId}',
|
|
377
|
+
'core.journal.illegalOperationIdBare': 'Illegal operationId',
|
|
378
|
+
'core.journal.notTerminal': 'moveToCompleted only accepts a terminal journal: {opId} state={state}',
|
|
379
|
+
|
|
380
|
+
// ---------- run-registry ----------
|
|
381
|
+
'core.run.autosyncBusy': 'Automatic sync is already in progress',
|
|
382
|
+
'core.run.syncApplyBusy': 'One-click sync is already in progress',
|
|
383
|
+
'core.run.backupScheduleBusy': 'Scheduled backup is already in progress',
|
|
384
|
+
'core.run.restoreBusy': 'Snapshot restore is already in progress (wait for the current restore to finish)',
|
|
385
|
+
'core.run.recoveryBusy': 'Recovery/rollback is already in progress (wait for the current recovery to finish)',
|
|
386
|
+
|
|
387
|
+
// ---------- consult-source ----------
|
|
388
|
+
'core.consult.manifestUnparsable': 'manifest cannot be parsed',
|
|
389
|
+
'core.consult.manifestMissing': 'manifest is missing',
|
|
390
|
+
'core.consult.hashMismatch': '"{name}" (hash mismatch)',
|
|
391
|
+
'core.consult.entryMissing': '"{name}" (missing)',
|
|
392
|
+
'core.consult.snapshotIntegrityFailed': 'Snapshot integrity verification failed',
|
|
393
|
+
// ---------- migration-history ----------
|
|
394
|
+
'core.migrationHistory.filenameCollision': 'history filename collision (retry limit reached)',
|
|
395
|
+
'core.migrationHistory.title': 'DSH Config Migration History',
|
|
396
|
+
'core.migrationHistory.total': 'Total',
|
|
397
|
+
'core.migrationHistory.empty': 'No migration records',
|
|
398
|
+
'core.migrationHistory.kind': 'Operation',
|
|
399
|
+
'core.migrationHistory.time': 'Time',
|
|
400
|
+
'core.migrationHistory.result': 'Result',
|
|
401
|
+
'core.migrationHistory.sections': 'Sections',
|
|
402
|
+
'core.migrationHistory.detail': 'Summary',
|
|
403
|
+
'core.migrationHistory.resultSuccess': 'success',
|
|
404
|
+
'core.migrationHistory.resultFailed': 'failed',
|
|
405
|
+
'core.migrationHistory.resultSkipped': 'skipped',
|
|
406
|
+
|
|
407
|
+
// ---------- local-plugin-pack ----------
|
|
408
|
+
'core.localPluginPack.dirCreateFailed': 'Failed to create the local plugin packing directory; skipped all local plugins: {reason}',
|
|
409
|
+
'core.localPluginPack.tarballTooLarge': 'The tarball of local plugin {name} exceeds the limit ({size} > {max} bytes); skipped packing',
|
|
410
|
+
'core.localPluginPack.packFailed': 'Failed to pack local plugin {name} (npm pack exit code {code}): {detail}',
|
|
411
|
+
'core.localPluginPack.noOutput': 'no output',
|
|
412
|
+
'core.localPluginPack.parseFilenameFailed': 'Failed to pack local plugin {name}: cannot parse a filename from the npm pack output',
|
|
413
|
+
'core.localPluginPack.packError': 'Failed to pack local plugin {name}: {reason}',
|
|
414
|
+
|
|
415
|
+
// ---------- recovery-orchestrator ----------
|
|
416
|
+
'core.recovery.executeFailed': 'recovery execution failed',
|
|
417
|
+
'core.recovery.stateNotAllowed': 'journal state {state} does not allow {action}',
|
|
418
|
+
'core.recovery.noTrustedSnapshot': 'journal has no trusted snapshot; cannot recover',
|
|
419
|
+
'core.recovery.snapshotUntrusted': 'snapshot is not trusted: {verdict}',
|
|
420
|
+
'core.recovery.needsAttentionNoAuto': 'the recovery decision is needs-attention; cannot execute automatically',
|
|
421
|
+
'core.recovery.noTrustedSnapshotShort': 'journal has no trusted snapshot',
|
|
422
|
+
'core.recovery.snapshotLoadFailed': 'snapshot cannot be loaded',
|
|
423
|
+
'core.recovery.needsAttentionNoRetry': 'the recovery decision is needs-attention; cannot retry',
|
|
424
|
+
'core.recovery.dismissFailed': 'dismiss failed',
|
|
425
|
+
'core.recovery.lockNotStale': 'Not determined to be stale; recovery was refused',
|
|
426
|
+
// ---------- restore ----------
|
|
427
|
+
'core.restore.pathEscaped': 'Path escapes the allowed root: {rel}',
|
|
428
|
+
'core.restore.symlinkCriticalFile': 'Critical file is a symlink: {rel}',
|
|
429
|
+
'core.restore.invalidSnapshotId': 'Invalid snapshotId',
|
|
430
|
+
'core.restore.snapshotDirOutOfBounds': 'Snapshot directory is out of bounds or not a direct child',
|
|
431
|
+
'core.restore.blobSymlink': 'Blob is a symlink: {name}',
|
|
432
|
+
'core.restore.snapshotJsonUnparsable': 'snapshot.json cannot be parsed',
|
|
433
|
+
'core.restore.legacyNeedsConfirm': 'Legacy snapshot (no manifest/READY); restore requires explicit confirmation',
|
|
434
|
+
'core.restore.envFingerprintMismatch': 'environmentFingerprint does not match (possibly from another machine or installation)',
|
|
435
|
+
'core.restore.legacyNoReadiness': 'Legacy snapshot (no readiness); restore requires explicit confirmation',
|
|
436
|
+
'core.restore.trustedManualLocal': 'Integrity passed, but the snapshot is not operation-bound (manual/local)',
|
|
437
|
+
'core.restore.trustedOperationSnapshot': 'READY + complete manifest + matching op/env/owner binding',
|
|
438
|
+
'core.restore.snapshotDirUnreadable': 'Snapshot directory cannot be read ({code}): {dir}',
|
|
439
|
+
'core.restore.illegalSnapshotId': 'Illegal snapshot id: {id}',
|
|
440
|
+
'core.restore.snapshotPathEscaped': 'Snapshot path escapes the root: {id}',
|
|
441
|
+
|
|
442
|
+
// ---------- reconcile ----------
|
|
443
|
+
'core.reconcile.journalUnparsable': 'journal {opId} cannot be parsed or has an illegal schema (quarantined)',
|
|
444
|
+
'core.reconcile.ownerLive': 'The owner is alive; a live operation is in progress',
|
|
445
|
+
'core.reconcile.bindingMismatch': 'ownership binding mismatch (journal.ownerInstanceId/lockId is not the crashed ownership {instanceId}); not treated as a trusted recovery',
|
|
446
|
+
'core.reconcile.envMismatch': 'environment fingerprint mismatch (another machine or changed environment); no automatic recovery',
|
|
447
|
+
'core.reconcile.needsAttentionConfirm': 'NEEDS_ATTENTION awaiting user confirmation',
|
|
448
|
+
'core.reconcile.selfProvenNoSteps': 'Self-proven zero side effects: the external intent registered no steps (fn never started)',
|
|
449
|
+
'core.reconcile.selfProvenArtifactOnly': 'Self-proven zero config side effects: a scheduled backup only produces an exports archive and scheduler state',
|
|
450
|
+
'core.reconcile.terminalOrganized': 'terminal({state}) journal organized into completed',
|
|
451
|
+
'core.reconcile.rollbackInterrupted': 'Rollback interrupted ({detail}); resuming the rollback requires explicit action (user confirmation)',
|
|
452
|
+
'core.reconcile.recoveringUnverified': 'RECOVERING with unverified recovery (no recoveryVerification, or a verdict other than MATCH/PARTIAL_MATCH); never auto-RECOVERED',
|
|
453
|
+
'core.reconcile.danglingPlannedStep': 'planned step {stepId} is missing its steps entry (corrupt or tampered journal)',
|
|
454
|
+
'core.reconcile.stepNotReliablyDone': 'step {ref} did not complete reliably (disk == before)',
|
|
455
|
+
'core.reconcile.stepFingerprint': 'step {ref} fingerprint {verdict}',
|
|
456
|
+
'core.reconcile.mutationNotStarted': 'No mutation started; completed safely',
|
|
457
|
+
'core.reconcile.opaqueRollbackAvailable': 'opaque APPLYING (empty steps) and the mutation may have started; a trusted snapshot is available for rollback (user confirmation required)',
|
|
458
|
+
'core.reconcile.opaqueNoSnapshot': 'opaque APPLYING (empty steps) and the mutation may have started; no trusted snapshot to roll back to',
|
|
459
|
+
'core.reconcile.noSideEffects': 'No side effects to recover; completed safely',
|
|
460
|
+
'core.reconcile.unprovableSteps': 'Unprovable steps: {details}',
|
|
461
|
+
'core.reconcile.externalSideEffectsUnknown': 'external side effects unknown',
|
|
462
|
+
'core.reconcile.snapshotMissingSuffix': '; snapshot is missing',
|
|
463
|
+
'core.reconcile.partialApplied': 'Some steps were applied; a safe rollback is possible (user confirmation required)',
|
|
464
|
+
|
|
465
|
+
// ---------- reinstall ----------
|
|
466
|
+
'core.reinstall.programLabel': 'DSH program itself',
|
|
467
|
+
'core.reinstall.programDesc': 'Uninstall and reinstall the global @deepseek-ai/dsh launcher (core action)',
|
|
468
|
+
'core.reinstall.cacheLabel': 'Global leftover cache',
|
|
469
|
+
'core.reinstall.cacheDesc': 'Clear the pnpm store and npm cache (optional)',
|
|
470
|
+
'core.reinstall.settingsLabel': '~/.dsh settings',
|
|
471
|
+
'core.reinstall.settingsDesc': 'Wipe settings.yaml and other configuration (irreversible)',
|
|
472
|
+
'core.reinstall.pluginsLabel': '~/.dsh installed plugins',
|
|
473
|
+
'core.reinstall.pluginsDesc': 'Wipe installed plugin dependencies under profiles (irreversible)',
|
|
474
|
+
'core.reinstall.dataLabel': 'Sessions and credentials',
|
|
475
|
+
'core.reinstall.dataDesc': 'Wipe sessions and .credentials.yaml credentials (highest risk; double confirmation required)',
|
|
476
|
+
'core.reinstall.stepUninstallGlobal': 'Uninstall the global @deepseek-ai/dsh',
|
|
477
|
+
'core.reinstall.stepCleanGlobal': 'Clean up leftover global @deepseek-ai/dsh',
|
|
478
|
+
'core.reinstall.stepInstallGlobal': 'Install the global @deepseek-ai/dsh@{version}',
|
|
479
|
+
'core.reinstall.stepVerifyVersion': 'Verify the version (dsh --version)',
|
|
480
|
+
'core.reinstall.stepCleanPnpmStore': 'Clean the pnpm store',
|
|
481
|
+
'core.reinstall.stepCleanNpmCache': 'Clean the npm cache',
|
|
482
|
+
'core.reinstall.stepBackupHome': 'Back up ~/.dsh to the sibling .reinstall-backup (rescue fallback)',
|
|
483
|
+
'core.reinstall.stepWipeSettings': 'Wipe ~/.dsh settings (settings.yaml and others)',
|
|
484
|
+
'core.reinstall.stepWipePlugins': 'Wipe ~/.dsh installed plugins (profiles/*/node_modules)',
|
|
485
|
+
'core.reinstall.stepWipeSessions': 'Wipe session records (sessions/)',
|
|
486
|
+
'core.reinstall.stepWipeCredentials': 'Wipe credentials (.credentials.yaml; delete the file only)',
|
|
487
|
+
// ---------- verify-recovery ----------
|
|
488
|
+
'core.verifyRecovery.blobPathEscaped': 'blob path escapes the root: {path}',
|
|
489
|
+
'core.verifyRecovery.revalidateFailed': 'Snapshot re-validation failed: {verdict}',
|
|
490
|
+
'core.verifyRecovery.revalidatePassed': 'Snapshot re-validation passed (TRUSTED_OPERATION_SNAPSHOT)',
|
|
491
|
+
'core.verifyRecovery.snapshotJsonRereadFailed': 'Failed to re-read snapshot.json: {reason}',
|
|
492
|
+
'core.verifyRecovery.envMismatch': 'environmentFingerprint does not match (WRONG_ENVIRONMENT)',
|
|
493
|
+
'core.verifyRecovery.operationMismatch': 'operationId does not match (WRONG_OPERATION): snapshot={snapshot} expected={expected}',
|
|
494
|
+
'core.verifyRecovery.none': 'none',
|
|
495
|
+
'core.verifyRecovery.hostFileNoBlob': 'host file has no blob information: {rel}',
|
|
496
|
+
'core.verifyRecovery.hostFileMissing': 'host file is missing: {rel}',
|
|
497
|
+
'core.verifyRecovery.hostFileBlobReadFailed': 'failed to read the host file blob: {rel}',
|
|
498
|
+
'core.verifyRecovery.hostFileContentMismatch': 'host file content mismatch: {rel}',
|
|
499
|
+
'core.verifyRecovery.hostFileMatch': 'host file matches: {rel}',
|
|
500
|
+
'core.verifyRecovery.hostFileStillPresent': 'a target that should have been deleted still exists: {rel}',
|
|
501
|
+
'core.verifyRecovery.hostFileAlreadyGone': 'delete target no longer exists: {rel}',
|
|
502
|
+
'core.verifyRecovery.filePathEscaped': 'file path escapes the root: {ref}',
|
|
503
|
+
'core.verifyRecovery.fileMissing': 'file is missing: {ref}',
|
|
504
|
+
'core.verifyRecovery.fileBlobReadFailed': 'failed to read the file blob: {ref}',
|
|
505
|
+
'core.verifyRecovery.fileContentMismatch': 'file content mismatch: {ref}',
|
|
506
|
+
'core.verifyRecovery.fileMatch': 'file matches: {ref}',
|
|
507
|
+
'core.verifyRecovery.fileStillPresent': 'the file target that should have been deleted still exists: {ref}',
|
|
508
|
+
'core.verifyRecovery.fileAlreadyGone': 'the deleted file target no longer exists: {ref}',
|
|
509
|
+
'core.verifyRecovery.pluginsNoBaseline': 'the snapshot has no beforePlugins baseline; plugin state cannot be verified',
|
|
510
|
+
'core.verifyRecovery.pluginsNoBaselineHint': 'plugin state cannot be verified automatically (the snapshot has no baseline); please confirm the installed plugins manually',
|
|
511
|
+
'core.verifyRecovery.pluginsAdded': 'plugins added during import were not removed: {names}',
|
|
512
|
+
'core.verifyRecovery.pluginsMatch': 'plugin state matches (no plugins added)',
|
|
513
|
+
'core.verifyRecovery.pluginsVerifyFailed': 'plugin state cannot be verified (listInstalled failed)',
|
|
514
|
+
'core.verifyRecovery.pluginsVerifyFailedHint': 'plugin state cannot be verified automatically (listInstalled failed); please confirm the installed plugins manually',
|
|
515
|
+
'core.verifyRecovery.settingsMismatch': 'settings mismatch: {ref}',
|
|
516
|
+
'core.verifyRecovery.settingsMatch': 'settings matches: {ref}',
|
|
517
|
+
'core.verifyRecovery.settingsVerifyFailed': 'settings cannot be verified: {ref}',
|
|
518
|
+
'core.verifyRecovery.settingsVerifyFailedHint': 'settings cannot be verified automatically ({ref}); please confirm manually',
|
|
519
|
+
|
|
520
|
+
// ---------- backup-verify ----------
|
|
521
|
+
'core.backupVerify.notRegularFile': 'not a regular file (a directory or a special file): {zip}',
|
|
522
|
+
'core.backupVerify.fileNotFound': 'backup file not found: {zip}',
|
|
523
|
+
'core.backupVerify.fileUnreadable': 'backup file unreadable: {reason}',
|
|
524
|
+
'core.backupVerify.encryptedContainer': 'the whole-archive encrypted container (DCA1) must first be decrypted into a ZIP before it can be self-checked',
|
|
525
|
+
'core.backupVerify.cannotOpenZip': 'cannot open as ZIP: {reason}',
|
|
526
|
+
'core.backupVerify.emptyArchive': 'empty archive (0 entries)',
|
|
527
|
+
'core.backupVerify.missingManifest': '{file} is missing (this is not a backup exported by this plugin)',
|
|
528
|
+
'core.backupVerify.manifestUnreadable': '{file} cannot be read (corrupt archive): {reason}',
|
|
529
|
+
'core.backupVerify.invalidManifest': '{file} is invalid: {reason}',
|
|
530
|
+
'core.backupVerify.unsupportedSchema': 'unsupported schema version: {version}',
|
|
531
|
+
'core.backupVerify.missingChecksums': '{file} is missing (integrity cannot be verified)',
|
|
532
|
+
'core.backupVerify.invalidChecksums': '{file} is invalid or unreadable: {reason}',
|
|
533
|
+
'core.backupVerify.unreadableEntry': '{name} ({reason})',
|
|
534
|
+
'core.backupVerify.emptyTableWithData': 'the checksums table is empty but the archive contains data entries',
|
|
535
|
+
'core.backupVerify.emptyTable': 'the checksums table is empty (the archive contains only the manifest and the checksums table itself)',
|
|
536
|
+
'core.backupVerify.uncoveredEntries': '{count} entries are not covered by the checksums table: {shown}{suffix}',
|
|
537
|
+
'core.backupVerify.declaredSectionNoEntries': 'the manifest declares section {id} but the archive has no matching file',
|
|
538
|
+
'core.backupVerify.declaredSectionPayloadMissing': 'the manifest declares section {id} but {path} is missing',
|
|
539
|
+
'core.backupVerify.encryptedFlagNoSecrets': 'the manifest is marked encrypted but the archive has no secrets ciphertext entry',
|
|
540
|
+
'core.backupVerify.missingEntries': 'entries listed in the checksums table are missing ({count}): {list}',
|
|
541
|
+
'core.backupVerify.hashMismatch': 'entry SHA-256 mismatch ({count}): {list}',
|
|
542
|
+
'core.backupVerify.unreadableEntries': 'entries cannot be read ({count}): {list}',
|
|
543
|
+
'core.backupVerify.verificationError': 'the self-check raised an exception: {reason}',
|
|
544
|
+
|
|
545
|
+
// ---------- backup-plan ----------
|
|
546
|
+
'core.backupPlan.pluginFilesRisk': 'third-party plugin files are not under our control (dsh-ssh.json may contain plaintext host passwords etc.); include them in a backup only after you have reviewed the content',
|
|
547
|
+
'core.backupPlan.pathWithReason': '{path} ({reason})',
|
|
548
|
+
'core.backupPlan.tooDeep': 'nesting limit exceeded, content NOT in this backup (a directory or link target is deeper than the limit): {at}',
|
|
549
|
+
'core.backupPlan.linkSkipped': 'link NOT in this backup: {at}',
|
|
550
|
+
'core.backupPlan.dirUnreadable': 'directory unreadable, its content is NOT in this backup: {dir}',
|
|
551
|
+
'core.backupPlan.countNotMeasured': 'count not measured',
|
|
552
|
+
'core.backupPlan.fileCount': '{count} file(s)',
|
|
553
|
+
'core.backupPlan.depDirSkipped': 'runtime dependency directory NOT in this backup (rebuildable; reinstall dependencies on the target): {path} ({files})',
|
|
554
|
+
'core.backupPlan.followedLinks': 'followed {count} linked director(ies) to collect content',
|
|
555
|
+
'core.backupPlan.sectionsMissingValue': 'missing value for `--sections`',
|
|
556
|
+
'core.backup.osHomeUnavailable': 'section {section} stores data under the system home directory but the host provides no file facade for it (older host); nothing is read or written this time',
|
|
557
|
+
'core.backupPlan.unknownSections': 'unknown section(s): {unknown} (available: {available})',
|
|
558
|
+
'core.backupPlan.sectionNotOffline': 'section {section} is not supported by the offline CLI backup (its collection depends on the plugin-data source registry and the local plugin manifests); use the GUI export/import instead',
|
|
559
|
+
'core.backupPlan.unsafeEntryName': 'unsafe entry name skipped: {name}',
|
|
560
|
+
'core.backupPlan.statFailed': 'stat failed: {path} ({reason})',
|
|
561
|
+
'core.backupPlan.readFailed': 'read failed: {path} ({reason})',
|
|
562
|
+
'core.backupPlan.sectionEmpty': 'section empty, skipped: {section}',
|
|
563
|
+
// ---------- model-tools ----------
|
|
564
|
+
'core.modelTools.illegalSnapshotId': 'Illegal snapshot id: {id}',
|
|
565
|
+
'core.modelTools.syncChannelNotConfigured': 'Sync channel {channel} is not configured (sync-config.json is missing or corrupt)',
|
|
566
|
+
'core.modelTools.snapshotNotFound': 'Snapshot does not exist: {id} (use config_list_snapshots to list the available snapshots)',
|
|
567
|
+
'core.modelTools.toolsServiceUnavailable': 'the tools service is unavailable: skipping model tool registration (engine capabilities remain available)',
|
|
568
|
+
'core.modelTools.backupToolDesc': 'Back up the full DSH configuration to the local exports directory (no secrets by default; pass password to export encrypted). Returns the ZIP file name / size / section list / encryption status.',
|
|
569
|
+
'core.modelTools.backupOnlyParam': 'Whitelist of section ids to export; default = all recommended sections',
|
|
570
|
+
'core.modelTools.backupPasswordParam': 'Optional: encryption password for the backup (memory only, never written to disk or echoed back; providing it encrypts the export)',
|
|
571
|
+
'core.modelTools.backupOutputDesc': 'Backup result (zip file name / sizeBytes / section list / excluded / encrypted / containsSecrets / redactedHits / warnings)',
|
|
572
|
+
'core.modelTools.listSnapshotsToolDesc': 'List the local rollback snapshots of the DSH configuration (id / createdAt / sourceZip / status / entryCount) for a later config_restore.',
|
|
573
|
+
'core.modelTools.listSnapshotsOutputDesc': 'Array of snapshots (id / createdAt / sourceZip / status / entryCount)',
|
|
574
|
+
'core.modelTools.restoreToolDesc': 'Restore to the given snapshot. By default it only returns the action plan (zero writes); pass confirm:true to actually execute (it overwrites/deletes $DSH_HOME files and uninstalls plugins added during the import; this is destructive, so preview first).',
|
|
575
|
+
'core.modelTools.restoreSnapshotIdParam': 'Id of the snapshot to restore (obtain it with config_list_snapshots)',
|
|
576
|
+
'core.modelTools.restoreConfirmParam': 'true actually executes the restore; the default false only previews the plan (zero writes)',
|
|
577
|
+
'core.modelTools.restoreOutputDesc': 'the restore plan when dryRun=true; the execution report when dryRun=false',
|
|
578
|
+
'core.modelTools.syncPushToolDesc': 'Manually push the DSH configuration to a remote sync target (Git/WebDAV), reusing the persisted channel configuration. Writing to a remote is an active operation; encryption or credentials require a password and the engine forces encrypt.',
|
|
579
|
+
'core.modelTools.channelParam': 'Sync channel; default = the configured active channel',
|
|
580
|
+
'core.modelTools.syncPushSectionsParam': 'Sections to push; default = all recommended portable sections (non-portable ones are skipped automatically)',
|
|
581
|
+
'core.modelTools.syncPushEncryptParam': 'Encrypt the snapshot; enabling it requires a password',
|
|
582
|
+
'core.modelTools.syncPushIncludeSecretsParam': 'Push real credential values (requires encrypt=true at the same time, otherwise the engine refuses)',
|
|
583
|
+
'core.modelTools.syncPushPasswordParam': 'Encryption password (memory only, never written to disk or echoed back)',
|
|
584
|
+
'core.modelTools.syncPushOutputDesc': 'Push report (snapshotId / actually synced sections / warnings)',
|
|
585
|
+
'core.modelTools.syncPullToolDesc': 'Pull a remote sync diff preview (Git/WebDAV, zero writes: download and analyze only, never write configuration directly). Applying the diff goes through the separate confirmed-import pipeline.',
|
|
586
|
+
'core.modelTools.syncPullSnapshotIdParam': 'Remote snapshot id; default = newest',
|
|
587
|
+
'core.modelTools.syncPullStrategyParam': 'Global conflict strategy; default merge (conflicts are kept for a decision)',
|
|
588
|
+
'core.modelTools.syncPullPasswordParam': 'Decryption password (required for encrypted snapshots; memory only)',
|
|
589
|
+
'core.modelTools.syncPullOutputDesc': 'Diff report (changes list / needsReview)',
|
|
590
|
+
|
|
591
|
+
// ---------- backup ----------
|
|
592
|
+
'core.backup.fileSectionBaseMissing': 'Section {section} is a file section, but FILE_BASES in core/backup.ts has no base directory (refusing to silently fall back to the homeDir root)',
|
|
593
|
+
'core.backup.secretsSectionNotSnapshotTarget': 'the secrets section has no adapter / no section payload and must not be a snapshot target (credential values use the separate encrypted container and never enter a snapshot)',
|
|
594
|
+
'core.backup.sectionUnsupported': 'snapshots do not support section "{section}": it is not registered in schema/section-registry.ts (or lacks a snapshot implementation); refusing to silently record it under another section semantic (that would make writes to this section impossible to roll back)',
|
|
595
|
+
'core.backup.blobPathEscaped': 'Snapshot blob path escapes the root: {path}',
|
|
596
|
+
'core.backup.snapshotVerifyFailed': 'Snapshot {id} failed verification: {reason}',
|
|
597
|
+
'core.backup.pruneFailed': 'Snapshot retention pruning failed (the snapshot itself is already published as READY and unaffected): {reason}',
|
|
598
|
+
'core.backup.pruneAbandoned': 'Snapshot retention pruning was abandoned: failed to read the recovery reference set ({reason})',
|
|
599
|
+
'core.backup.dirNameIdMismatch': 'the snapshot directory name does not match its internal id; automatic pruning skipped it: {dir} (internal id {id})',
|
|
600
|
+
'core.backup.snapshotPathEscaped': 'Snapshot path escapes the root',
|
|
601
|
+
'core.backup.snapshotJsonMissing': 'snapshot.json is missing',
|
|
602
|
+
'core.backup.snapshotJsonInvalid': 'snapshot.json is invalid',
|
|
603
|
+
'core.backup.snapshotIdDirMismatch': 'snapshot.id does not match the directory',
|
|
604
|
+
'core.backup.manifestMissing': 'manifest.json is missing',
|
|
605
|
+
'core.backup.manifestInvalid': 'manifest is invalid or its snapshotId does not match',
|
|
606
|
+
'core.backup.entryCountMismatch': 'manifest.entryCount does not match snapshot.entries (tampering)',
|
|
607
|
+
'core.backup.metadataHashMismatch': 'metadataHash does not match (destructive content was tampered with)',
|
|
608
|
+
'core.backup.blobMissing': 'blob is missing: {path}',
|
|
609
|
+
'core.backup.blobHashMismatch': 'blob hash mismatch: {path}',
|
|
610
|
+
'core.backup.blobNotInManifest': 'a blob referenced by the snapshot is not listed in the manifest: {blob}',
|
|
611
|
+
// ---------- plugin-cli ----------
|
|
612
|
+
'core.pluginCli.hoistPatternDiff': "this profile's node_modules was created by a different pnpm major; rebuild it (pnpm install) before retrying",
|
|
613
|
+
'core.pluginCli.addingToRoot': 'pnpm refused to add at a workspace root (missing -w); run dsh plugin --profile <name> add -w <pkg> by hand',
|
|
614
|
+
'core.pluginCli.notAWorkspace': '-w was passed but the profile is not a pnpm workspace, so pnpm refused the operation',
|
|
615
|
+
'core.pluginCli.releaseAgeViolation': "a recently-published plugin version in this profile trips pnpm's fresh-release safety check, blocking any change (even to other plugins); wait for the release to mature, or retry once with --config.minimumReleaseAge=0",
|
|
616
|
+
'core.pluginCli.gitBuildBlocked': "this git-hosted plugin needs to run its build script at install time, which pnpm blocks until allowed — add the exact package pnpm printed to allowBuilds in the profile's pnpm-workspace.yaml, then re-run",
|
|
617
|
+
'core.pluginCli.parenValue': '({value})',
|
|
618
|
+
'core.pluginCli.patchFileMissing': "the profile's pnpm-workspace.yaml declares patchedDependencies but the patch file is missing{patch}; pnpm then refuses every install (even unrelated plugins). Put the patch file back under the profile's patches/ directory, or remove that entry from pnpm-workspace.yaml and retry",
|
|
619
|
+
'core.pluginCli.fetch404': "a dependency cannot be resolved from the registry{pkg}; pnpm refuses every install while it is present — it may be a ghost entry left in the profile's package.json by an earlier failed operation (remove that line by hand), or a private package needing registry credentials",
|
|
620
|
+
'core.pluginCli.transientNetwork': 'a transient network failure while fetching dependencies (installs replay the whole dependency tree, so any existing dependency can hiccup); a plain retry usually succeeds',
|
|
621
|
+
'core.pluginCli.desktopProfileReserved': 'the "desktop" profile is managed exclusively by the DeepSeek Harness Desktop application and the plain dsh CLI refuses to touch it; retry from inside the Desktop app (a current version of this plugin switches to the Desktop-bundled CLI carrier) or target another profile',
|
|
622
|
+
'core.pluginCli.pnpmMissing': 'pnpm is not on PATH (dsh forwards to pnpm): install pnpm (npm install -g pnpm or corepack enable pnpm) and retry',
|
|
623
|
+
'core.pluginCli.dshCliStartFailed': 'cannot start dsh CLI ({spawnError}): make sure dsh is installed and on PATH, then retry installing {pkg}',
|
|
624
|
+
'core.pluginCli.installTimeout': 'install {pkg} timed out (process killed, default 15 min): check your network and retry later',
|
|
625
|
+
'core.pluginCli.installFailed': 'install {pkg} failed ({code}): {message}',
|
|
626
|
+
'core.pluginCli.noOutput': 'no output',
|
|
627
|
+
'core.pluginCli.installFailedWithTail': 'dsh plugin install {pkg} failed (exit {exitCode}): {tail}',
|
|
628
|
+
|
|
629
|
+
// ---------- migration-consult ----------
|
|
630
|
+
'core.consult.compatNoManifest': 'cannot assess compatibility: the manifest is missing',
|
|
631
|
+
'core.consult.compatPartial': 'partly compatible: cross-platform / missing sections / newer version; manual confirmation required',
|
|
632
|
+
'core.consult.compatUnsupported': 'not supported: the schema is beyond what this plugin supports',
|
|
633
|
+
'core.consult.integrityNoManifest': 'the manifest is missing; structural integrity cannot be verified',
|
|
634
|
+
'core.consult.manifestInvalid': 'invalid manifest: {message}',
|
|
635
|
+
'core.consult.manifestWarning': 'manifest warning: {message}',
|
|
636
|
+
'core.consult.checksumMismatch': 'integrity verification failed: {reason}',
|
|
637
|
+
'core.consult.noChecksums': 'the source has no checksums table; entry integrity cannot be verified',
|
|
638
|
+
'core.consult.zipSlip': 'ZIP path escapes the root: {path}',
|
|
639
|
+
'core.consult.sectionDataMissing': 'declared but the data is missing: {section}',
|
|
640
|
+
'core.consult.sectionUnparseable': 'section data cannot be parsed: {section}',
|
|
641
|
+
'core.consult.listSeparator': ', ',
|
|
642
|
+
'core.consult.andMore': ' and {count} more',
|
|
643
|
+
'core.consult.danglingCredentialRef': 'the backup references {count} credentials not declared in the credentials section (if this machine lacks their values, they must be entered after import): {shown}{more}',
|
|
644
|
+
'core.consult.unencryptedSecrets': 'the snapshot contains unencrypted secrets (credential values are exposed in plaintext)',
|
|
645
|
+
'core.consult.sensitiveHits': 'detected {count} exposed sensitive fields (redacted)',
|
|
646
|
+
'core.consult.migratabilityNotEvaluated': 'migratability was not evaluated (dry-run not executed)',
|
|
647
|
+
'core.consult.migratabilityFailed': 'migratability check failed: the dry-run does not pass',
|
|
648
|
+
'core.consult.conflicts': '{count} conflicts need your decision on which side to keep (you can decide each one in the next step; the local side is kept by default)',
|
|
649
|
+
'core.consult.warnings': '{count} more items need attention (they do not affect whether the import succeeds)',
|
|
650
|
+
};
|
|
651
|
+
|
|
652
|
+
/** 显式语言取本目录文案(带 locale 形参的渲染函数用;不读全局语言运行时)。 */
|
|
653
|
+
export function coreText(lang: 'zh' | 'en', key: keyof typeof zh): string {
|
|
654
|
+
return lang === 'en' ? en[key] : zh[key];
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
registerMessageCatalog({ id: 'core', zh, en });
|
|
658
|
+
// 迁移链自带零依赖目录(架构边界禁止 migrations → core):这里作为 core → migrations 的
|
|
659
|
+
// 允许方向,把它的目录并入引擎目录,并把语言源接到引擎语言运行时上。
|
|
660
|
+
registerMessageCatalog({ id: 'core.migrations', zh: migrationZh, en: migrationEn });
|
|
661
|
+
setMigrationLanguageSource(() => getEngineLocale());
|