@logictan/dsh-config-manager 0.1.60
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/LICENSE +21 -0
- package/README.md +105 -0
- package/cordis.patch.yml +21 -0
- package/lib/adapters/agent-instructions.d.ts +13 -0
- package/lib/adapters/agent-instructions.js +46 -0
- package/lib/adapters/agent-presets.d.ts +13 -0
- package/lib/adapters/agent-presets.js +14 -0
- package/lib/adapters/credentials.d.ts +37 -0
- package/lib/adapters/credentials.js +122 -0
- package/lib/adapters/file-collection.d.ts +15 -0
- package/lib/adapters/file-collection.js +127 -0
- package/lib/adapters/index.d.ts +57 -0
- package/lib/adapters/index.js +55 -0
- package/lib/adapters/link-report.d.ts +16 -0
- package/lib/adapters/link-report.js +47 -0
- package/lib/adapters/mcp.d.ts +28 -0
- package/lib/adapters/mcp.js +178 -0
- package/lib/adapters/plugin-files.d.ts +18 -0
- package/lib/adapters/plugin-files.js +142 -0
- package/lib/adapters/plugins.d.ts +41 -0
- package/lib/adapters/plugins.js +603 -0
- package/lib/adapters/pnpm-workspace.d.ts +26 -0
- package/lib/adapters/pnpm-workspace.js +147 -0
- package/lib/adapters/prompts.d.ts +30 -0
- package/lib/adapters/prompts.js +231 -0
- package/lib/adapters/providers.d.ts +34 -0
- package/lib/adapters/providers.js +155 -0
- package/lib/adapters/self.d.ts +17 -0
- package/lib/adapters/self.js +71 -0
- package/lib/adapters/sessions.d.ts +14 -0
- package/lib/adapters/sessions.js +15 -0
- package/lib/adapters/settings.d.ts +28 -0
- package/lib/adapters/settings.js +165 -0
- package/lib/adapters/skills.d.ts +13 -0
- package/lib/adapters/skills.js +14 -0
- package/lib/adapters/test-helpers.d.ts +125 -0
- package/lib/adapters/test-helpers.js +236 -0
- package/lib/adapters/ui.d.ts +27 -0
- package/lib/adapters/ui.js +89 -0
- package/lib/adapters/workspaces.d.ts +13 -0
- package/lib/adapters/workspaces.js +106 -0
- package/lib/client.d.ts +1026 -0
- package/lib/client.js +10047 -0
- package/lib/core/analyzer.d.ts +99 -0
- package/lib/core/analyzer.js +934 -0
- package/lib/core/backup.d.ts +138 -0
- package/lib/core/backup.js +513 -0
- package/lib/core/boot-rescue.d.ts +146 -0
- package/lib/core/boot-rescue.js +618 -0
- package/lib/core/cache-cleaner.d.ts +31 -0
- package/lib/core/cache-cleaner.js +95 -0
- package/lib/core/config-lifecycle.d.ts +180 -0
- package/lib/core/config-lifecycle.js +481 -0
- package/lib/core/config-snapshot.d.ts +135 -0
- package/lib/core/config-snapshot.js +424 -0
- package/lib/core/config-state.d.ts +70 -0
- package/lib/core/config-state.js +177 -0
- package/lib/core/consult-source.d.ts +58 -0
- package/lib/core/consult-source.js +260 -0
- package/lib/core/crash-report.d.ts +84 -0
- package/lib/core/crash-report.js +317 -0
- package/lib/core/exporter.d.ts +68 -0
- package/lib/core/exporter.js +375 -0
- package/lib/core/ghost-sweep.d.ts +19 -0
- package/lib/core/ghost-sweep.js +52 -0
- package/lib/core/importer.d.ts +60 -0
- package/lib/core/importer.js +29 -0
- package/lib/core/index.d.ts +14 -0
- package/lib/core/index.js +14 -0
- package/lib/core/journal.d.ts +197 -0
- package/lib/core/journal.js +418 -0
- package/lib/core/local-plugin-host.d.ts +35 -0
- package/lib/core/local-plugin-host.js +120 -0
- package/lib/core/local-plugin-pack.d.ts +135 -0
- package/lib/core/local-plugin-pack.js +278 -0
- package/lib/core/messages.d.ts +310 -0
- package/lib/core/messages.js +621 -0
- package/lib/core/migration-consult.d.ts +117 -0
- package/lib/core/migration-consult.js +363 -0
- package/lib/core/migration-history.d.ts +153 -0
- package/lib/core/migration-history.js +411 -0
- package/lib/core/model-tools.d.ts +50 -0
- package/lib/core/model-tools.js +148 -0
- package/lib/core/msg-types.d.ts +8 -0
- package/lib/core/msg-types.js +6 -0
- package/lib/core/phase3-child-crash.d.ts +1 -0
- package/lib/core/phase3-child-crash.js +87 -0
- package/lib/core/phase3-host.d.ts +138 -0
- package/lib/core/phase3-host.js +359 -0
- package/lib/core/phase3-prod-child.d.ts +1 -0
- package/lib/core/phase3-prod-child.js +35 -0
- package/lib/core/phase4-crash-child.d.ts +1 -0
- package/lib/core/phase4-crash-child.js +103 -0
- package/lib/core/plugin-cli.d.ts +150 -0
- package/lib/core/plugin-cli.js +497 -0
- package/lib/core/reconcile.d.ts +120 -0
- package/lib/core/reconcile.js +389 -0
- package/lib/core/recovery-orchestrator.d.ts +94 -0
- package/lib/core/recovery-orchestrator.js +327 -0
- package/lib/core/restore.d.ts +162 -0
- package/lib/core/restore.js +703 -0
- package/lib/core/rollback.d.ts +12 -0
- package/lib/core/rollback.js +145 -0
- package/lib/core/run-registry.d.ts +85 -0
- package/lib/core/run-registry.js +157 -0
- package/lib/core/startup-barrier.d.ts +53 -0
- package/lib/core/startup-barrier.js +77 -0
- package/lib/core/types.d.ts +515 -0
- package/lib/core/types.js +27 -0
- package/lib/core/undo.d.ts +73 -0
- package/lib/core/undo.js +87 -0
- package/lib/core/validator.d.ts +18 -0
- package/lib/core/validator.js +77 -0
- package/lib/core/verify-recovery.d.ts +21 -0
- package/lib/core/verify-recovery.js +256 -0
- package/lib/core/watcher.d.ts +101 -0
- package/lib/core/watcher.js +219 -0
- package/lib/index.d.ts +238 -0
- package/lib/index.js +2764 -0
- package/lib/migrations/index.d.ts +29 -0
- package/lib/migrations/index.js +56 -0
- package/lib/migrations/v1-to-v2.d.ts +9 -0
- package/lib/migrations/v1-to-v2.js +10 -0
- package/lib/profiles/index.d.ts +4 -0
- package/lib/profiles/index.js +5 -0
- package/lib/profiles/profile-manager.d.ts +106 -0
- package/lib/profiles/profile-manager.js +543 -0
- package/lib/schema/config.d.ts +28 -0
- package/lib/schema/config.js +165 -0
- package/lib/schema/index.d.ts +24 -0
- package/lib/schema/index.js +26 -0
- package/lib/schema/manifest.d.ts +28 -0
- package/lib/schema/manifest.js +109 -0
- package/lib/schema/tombstones.d.ts +46 -0
- package/lib/schema/tombstones.js +64 -0
- package/lib/schema/types.d.ts +232 -0
- package/lib/schema/types.js +8 -0
- package/lib/schema/versions.d.ts +27 -0
- package/lib/schema/versions.js +50 -0
- package/lib/security/encryption.d.ts +85 -0
- package/lib/security/encryption.js +279 -0
- package/lib/security/index.d.ts +16 -0
- package/lib/security/index.js +17 -0
- package/lib/security/integrity.d.ts +30 -0
- package/lib/security/integrity.js +78 -0
- package/lib/security/redaction.d.ts +26 -0
- package/lib/security/redaction.js +95 -0
- package/lib/security/secret-scanner.d.ts +86 -0
- package/lib/security/secret-scanner.js +404 -0
- package/lib/security/vault.d.ts +59 -0
- package/lib/security/vault.js +151 -0
- package/lib/security/zip-security.d.ts +27 -0
- package/lib/security/zip-security.js +154 -0
- package/lib/sync/autosync-config.d.ts +39 -0
- package/lib/sync/autosync-config.js +151 -0
- package/lib/sync/autosync-scheduler.d.ts +139 -0
- package/lib/sync/autosync-scheduler.js +564 -0
- package/lib/sync/fs.d.ts +18 -0
- package/lib/sync/fs.js +49 -0
- package/lib/sync/git/git-transport.d.ts +100 -0
- package/lib/sync/git/git-transport.js +437 -0
- package/lib/sync/github-auth.d.ts +131 -0
- package/lib/sync/github-auth.js +264 -0
- package/lib/sync/layout.d.ts +43 -0
- package/lib/sync/layout.js +203 -0
- package/lib/sync/snapshot-json.d.ts +9 -0
- package/lib/sync/snapshot-json.js +107 -0
- package/lib/sync/sync-config.d.ts +81 -0
- package/lib/sync/sync-config.js +281 -0
- package/lib/sync/sync-engine.d.ts +269 -0
- package/lib/sync/sync-engine.js +591 -0
- package/lib/sync/sync-history.d.ts +42 -0
- package/lib/sync/sync-history.js +78 -0
- package/lib/sync/sync-selection.d.ts +29 -0
- package/lib/sync/sync-selection.js +127 -0
- package/lib/sync/sync-session.d.ts +40 -0
- package/lib/sync/sync-session.js +54 -0
- package/lib/sync/sync-state.d.ts +37 -0
- package/lib/sync/sync-state.js +108 -0
- package/lib/sync/transport.d.ts +75 -0
- package/lib/sync/transport.js +55 -0
- package/lib/sync/ui-prefs.d.ts +34 -0
- package/lib/sync/ui-prefs.js +109 -0
- package/lib/sync/webdav/webdav-transport.d.ts +77 -0
- package/lib/sync/webdav/webdav-transport.js +451 -0
- package/lib/ui/errors.d.ts +19 -0
- package/lib/ui/errors.js +81 -0
- package/lib/ui/export-flow.d.ts +82 -0
- package/lib/ui/export-flow.js +98 -0
- package/lib/ui/i18n.d.ts +289 -0
- package/lib/ui/i18n.js +581 -0
- package/lib/ui/migration-consult-view.d.ts +91 -0
- package/lib/ui/migration-consult-view.js +115 -0
- package/lib/ui/progress.d.ts +38 -0
- package/lib/ui/progress.js +87 -0
- package/lib/ui/report.d.ts +23 -0
- package/lib/ui/report.js +153 -0
- package/lib/ui/test-helpers.d.ts +69 -0
- package/lib/ui/test-helpers.js +154 -0
- package/lib/ui/types.d.ts +257 -0
- package/lib/ui/types.js +21 -0
- package/lib/utils/atomic-write.d.ts +88 -0
- package/lib/utils/atomic-write.js +399 -0
- package/lib/utils/env-lock.d.ts +393 -0
- package/lib/utils/env-lock.js +930 -0
- package/lib/utils/hashing.d.ts +17 -0
- package/lib/utils/hashing.js +41 -0
- package/lib/utils/json.d.ts +24 -0
- package/lib/utils/json.js +76 -0
- package/lib/utils/logger.d.ts +39 -0
- package/lib/utils/logger.js +82 -0
- package/lib/utils/paths.d.ts +42 -0
- package/lib/utils/paths.js +189 -0
- package/lib/utils/proxy.d.ts +69 -0
- package/lib/utils/proxy.js +455 -0
- package/lib/utils/recursive-walk.d.ts +24 -0
- package/lib/utils/recursive-walk.js +134 -0
- package/lib/utils/zip.d.ts +54 -0
- package/lib/utils/zip.js +285 -0
- package/package.json +188 -0
- package/src/adapters/agent-instructions.ts +48 -0
- package/src/adapters/agent-presets.ts +14 -0
- package/src/adapters/credentials.test.ts +90 -0
- package/src/adapters/credentials.ts +143 -0
- package/src/adapters/file-collection.ts +137 -0
- package/src/adapters/files.test.ts +353 -0
- package/src/adapters/index.ts +94 -0
- package/src/adapters/link-report.test.ts +65 -0
- package/src/adapters/link-report.ts +61 -0
- package/src/adapters/mcp.test.ts +96 -0
- package/src/adapters/mcp.ts +185 -0
- package/src/adapters/plugin-files.ts +146 -0
- package/src/adapters/plugins.test.ts +326 -0
- package/src/adapters/plugins.ts +615 -0
- package/src/adapters/pnpm-workspace.test.ts +87 -0
- package/src/adapters/pnpm-workspace.ts +150 -0
- package/src/adapters/prompts.test.ts +110 -0
- package/src/adapters/prompts.ts +230 -0
- package/src/adapters/providers.test.ts +126 -0
- package/src/adapters/providers.ts +173 -0
- package/src/adapters/roundtrip.test.ts +190 -0
- package/src/adapters/self.test.ts +92 -0
- package/src/adapters/self.ts +75 -0
- package/src/adapters/sessions.ts +15 -0
- package/src/adapters/settings.test.ts +100 -0
- package/src/adapters/settings.ts +187 -0
- package/src/adapters/skills.ts +14 -0
- package/src/adapters/test-helpers.ts +248 -0
- package/src/adapters/ui.test.ts +57 -0
- package/src/adapters/ui.ts +108 -0
- package/src/adapters/workspaces.test.ts +106 -0
- package/src/adapters/workspaces.ts +109 -0
- package/src/client/ConfigManagerSection.tsx +90 -0
- package/src/client/api.ts +66 -0
- package/src/client/client-types.ts +18 -0
- package/src/client/common/ErrorBanner.tsx +73 -0
- package/src/client/common/Icon.tsx +129 -0
- package/src/client/common/Modal.tsx +173 -0
- package/src/client/common/ToastViewport.tsx +73 -0
- package/src/client/common/toast-store.test.ts +192 -0
- package/src/client/common/toast-store.ts +181 -0
- package/src/client/common/toast-types.ts +7 -0
- package/src/client/common/ui.tsx +342 -0
- package/src/client/config-manager.module.css +2971 -0
- package/src/client/css-modules.d.ts +8 -0
- package/src/client/index.ts +65 -0
- package/src/client/locales.ts +56 -0
- package/src/client/lucide-icons.d.ts +38 -0
- package/src/client/run-store.test.ts +223 -0
- package/src/client/run-store.ts +372 -0
- package/src/client/sync/SyncConfirmView.tsx +379 -0
- package/src/client/sync/SyncHistoryView.test.ts +40 -0
- package/src/client/sync/SyncHistoryView.tsx +220 -0
- package/src/client/sync/SyncSettingsView.tsx +1535 -0
- package/src/client/sync/history-model.test.ts +194 -0
- package/src/client/sync/history-model.ts +195 -0
- package/src/client/sync/sync-api.test.ts +585 -0
- package/src/client/sync/sync-api.ts +543 -0
- package/src/client/sync/sync-locales.ts +416 -0
- package/src/client/sync/sync-push-preview.test.ts +52 -0
- package/src/client/sync/sync-view-v2.test.ts +213 -0
- package/src/client/sync/sync-view.test.ts +487 -0
- package/src/client/sync/sync-view.ts +759 -0
- package/src/core/analyzer.ts +1068 -0
- package/src/core/backup.ts +605 -0
- package/src/core/boot-rescue.test.ts +847 -0
- package/src/core/boot-rescue.ts +737 -0
- package/src/core/cache-cleaner.test.ts +169 -0
- package/src/core/cache-cleaner.ts +121 -0
- package/src/core/config-lifecycle.test.ts +727 -0
- package/src/core/config-lifecycle.ts +573 -0
- package/src/core/config-snapshot.test.ts +369 -0
- package/src/core/config-snapshot.ts +522 -0
- package/src/core/config-state.test.ts +381 -0
- package/src/core/config-state.ts +207 -0
- package/src/core/consult-source.test.ts +199 -0
- package/src/core/consult-source.ts +293 -0
- package/src/core/crash-report.test.ts +380 -0
- package/src/core/crash-report.ts +369 -0
- package/src/core/exporter.ts +417 -0
- package/src/core/ghost-sweep.test.ts +94 -0
- package/src/core/ghost-sweep.ts +67 -0
- package/src/core/importer.ts +83 -0
- package/src/core/index.ts +56 -0
- package/src/core/journal.test.ts +257 -0
- package/src/core/journal.ts +518 -0
- package/src/core/local-plugin-host.ts +152 -0
- package/src/core/local-plugin-pack.test.ts +359 -0
- package/src/core/local-plugin-pack.ts +363 -0
- package/src/core/messages.test.ts +54 -0
- package/src/core/messages.ts +664 -0
- package/src/core/migration-consult.test.ts +315 -0
- package/src/core/migration-consult.ts +494 -0
- package/src/core/migration-history.test.ts +319 -0
- package/src/core/migration-history.ts +484 -0
- package/src/core/model-tools.test.ts +190 -0
- package/src/core/model-tools.ts +208 -0
- package/src/core/msg-types.ts +10 -0
- package/src/core/phase3-child-crash.ts +95 -0
- package/src/core/phase3-host.ts +411 -0
- package/src/core/phase3-p1.test.ts +212 -0
- package/src/core/phase3-p2b-fingerprint.test.ts +189 -0
- package/src/core/phase3-prod-child.ts +36 -0
- package/src/core/phase3-production-integration.test.ts +286 -0
- package/src/core/phase4-crash-child.ts +101 -0
- package/src/core/phase4-crash-injection.test.ts +166 -0
- package/src/core/plugin-cli.fs.test.ts +184 -0
- package/src/core/plugin-cli.test.ts +137 -0
- package/src/core/plugin-cli.ts +563 -0
- package/src/core/reconcile.test.ts +392 -0
- package/src/core/reconcile.ts +498 -0
- package/src/core/recovery-orchestrator.test.ts +145 -0
- package/src/core/recovery-orchestrator.ts +366 -0
- package/src/core/restore-manage.test.ts +94 -0
- package/src/core/restore.ts +849 -0
- package/src/core/rollback.ts +151 -0
- package/src/core/run-progress.test.ts +237 -0
- package/src/core/run-registry.test.ts +232 -0
- package/src/core/run-registry.ts +209 -0
- package/src/core/smoke.test.ts +842 -0
- package/src/core/startup-barrier.ts +99 -0
- package/src/core/types.ts +542 -0
- package/src/core/undo.ts +116 -0
- package/src/core/validator.ts +84 -0
- package/src/core/verify-recovery.ts +265 -0
- package/src/core/watcher.test.ts +326 -0
- package/src/core/watcher.ts +263 -0
- package/src/index.facade.test.ts +265 -0
- package/src/index.sync.test.ts +217 -0
- package/src/index.ts +2975 -0
- package/src/migrations/index.ts +71 -0
- package/src/migrations/v1-to-v2.ts +17 -0
- package/src/profiles/index.ts +8 -0
- package/src/profiles/profile-manager.test.ts +282 -0
- package/src/profiles/profile-manager.ts +630 -0
- package/src/schema/config.ts +165 -0
- package/src/schema/index.ts +71 -0
- package/src/schema/manifest-schema.test.ts +519 -0
- package/src/schema/manifest.ts +124 -0
- package/src/schema/tombstones.test.ts +131 -0
- package/src/schema/tombstones.ts +89 -0
- package/src/schema/types.ts +245 -0
- package/src/schema/versions.ts +55 -0
- package/src/security/encryption.ts +335 -0
- package/src/security/index.ts +16 -0
- package/src/security/integrity.ts +102 -0
- package/src/security/redaction.ts +101 -0
- package/src/security/secret-scanner.ts +445 -0
- package/src/security/security.test.ts +1215 -0
- package/src/security/vault.test.ts +164 -0
- package/src/security/vault.ts +198 -0
- package/src/security/zip-security.ts +180 -0
- package/src/sync/autosync-config.test.ts +147 -0
- package/src/sync/autosync-config.ts +179 -0
- package/src/sync/autosync-scheduler.test.ts +490 -0
- package/src/sync/autosync-scheduler.ts +646 -0
- package/src/sync/fs.ts +48 -0
- package/src/sync/git/git-transport.test.ts +673 -0
- package/src/sync/git/git-transport.ts +491 -0
- package/src/sync/github-auth.test.ts +280 -0
- package/src/sync/github-auth.ts +356 -0
- package/src/sync/layout.test.ts +270 -0
- package/src/sync/layout.ts +222 -0
- package/src/sync/snapshot-json.test.ts +119 -0
- package/src/sync/snapshot-json.ts +128 -0
- package/src/sync/sync-config.test.ts +310 -0
- package/src/sync/sync-config.ts +299 -0
- package/src/sync/sync-engine.test.ts +1074 -0
- package/src/sync/sync-engine.ts +754 -0
- package/src/sync/sync-history.test.ts +116 -0
- package/src/sync/sync-history.ts +120 -0
- package/src/sync/sync-selection.test.ts +186 -0
- package/src/sync/sync-selection.ts +143 -0
- package/src/sync/sync-session.test.ts +143 -0
- package/src/sync/sync-session.ts +77 -0
- package/src/sync/sync-state.test.ts +164 -0
- package/src/sync/sync-state.ts +131 -0
- package/src/sync/transport.test.ts +111 -0
- package/src/sync/transport.ts +118 -0
- package/src/sync/ui-prefs.test.ts +152 -0
- package/src/sync/ui-prefs.ts +135 -0
- package/src/sync/webdav/webdav-transport.test.ts +871 -0
- package/src/sync/webdav/webdav-transport.ts +535 -0
- package/src/ui/errors.test.ts +47 -0
- package/src/ui/errors.ts +100 -0
- package/src/ui/export-flow.test.ts +87 -0
- package/src/ui/export-flow.ts +156 -0
- package/src/ui/i18n.ts +590 -0
- package/src/ui/migration-consult-view.test.ts +151 -0
- package/src/ui/migration-consult-view.ts +178 -0
- package/src/ui/progress.test.ts +47 -0
- package/src/ui/progress.ts +102 -0
- package/src/ui/report.test.ts +101 -0
- package/src/ui/report.ts +146 -0
- package/src/ui/test-helpers.ts +184 -0
- package/src/ui/types.ts +325 -0
- package/src/utils/atomic-write.test.ts +312 -0
- package/src/utils/atomic-write.ts +422 -0
- package/src/utils/env-lock.test.ts +999 -0
- package/src/utils/env-lock.ts +1086 -0
- package/src/utils/hashing.ts +53 -0
- package/src/utils/json.ts +77 -0
- package/src/utils/logger.ts +114 -0
- package/src/utils/paths.ts +176 -0
- package/src/utils/proxy.test.ts +465 -0
- package/src/utils/proxy.ts +493 -0
- package/src/utils/recursive-walk.test.ts +148 -0
- package/src/utils/recursive-walk.ts +145 -0
- package/src/utils/zip.ts +332 -0
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
export const zh = {
|
|
2
|
+
// ---------- 导出 ----------
|
|
3
|
+
'export.encryptionRequired': '导出包含秘密需要注入 EncryptionProvider(m4 实现),拒绝明文导出秘密',
|
|
4
|
+
'export.sectionFailed': '分区 {adapter} 导出失败: {reason}',
|
|
5
|
+
'export.credentialsReadFailed': '读取凭据文件失败,跳过秘密导出: {reason}',
|
|
6
|
+
'export.vaultRefreshed': '凭据明文未进入备份,已镜像到本机 vault({count} 个文件,恢复时可回填)',
|
|
7
|
+
'export.vaultRefreshSkipped': 'vault 镜像跳过 {rel}: {reason}',
|
|
8
|
+
'export.vaultRefreshFailed': 'vault 镜像刷新失败(不影响导出): {reason}',
|
|
9
|
+
'export.fileSectionSecrets': '文件类分区 {section} 中检测到疑似凭据: {path}',
|
|
10
|
+
// ---------- 导入:ZIP 读入 / 完整性 / schema ----------
|
|
11
|
+
'import.readFailed': '无法读取备份文件 "{zip}": {reason}',
|
|
12
|
+
'import.noManifest': '备份缺少 manifest.json,不是有效的 DSH Config Manager 备份',
|
|
13
|
+
'import.manifestParseFailed': 'manifest.json 解析失败: {reason}',
|
|
14
|
+
'import.integrityFailed': '备份完整性校验失败: {entries}',
|
|
15
|
+
'import.schemaUnsupported': '备份 {version},无法导入(当前支持 v1)',
|
|
16
|
+
'import.executableWarning': '备份包含可执行文件 "{name}",本插件不会执行它',
|
|
17
|
+
'import.sectionParseFailed': '分区 {section} 数据解析失败: {reason}',
|
|
18
|
+
'import.sectionInvalid': '分区 {section} 数据无效: {issues}',
|
|
19
|
+
'import.adapterAnalyzeFailed': '{adapter}: 分析失败 {reason}',
|
|
20
|
+
'import.adapterValidationIssue': '{adapter}: {message}',
|
|
21
|
+
'import.versionUnsupported': '{version}:无法导入',
|
|
22
|
+
'import.missingSections': '备份声明了但缺少的分区: {sections}',
|
|
23
|
+
'import.unsupportedSections': '备份包含本版本不支持的分区: {sections}(已跳过,未导入)',
|
|
24
|
+
'import.unsupportedSectionVersion': '分区 {section} 的数据版本 {version} 高于本版本支持的 1(已跳过该分区)',
|
|
25
|
+
'import.checksumsMissing': '备份未提供完整性校验表,全部条目未被校验',
|
|
26
|
+
'import.extraEntries': 'ZIP 内含未登记进校验表的条目: {entries}(未被校验)',
|
|
27
|
+
'import.migrated': '备份 schema 已从 v{from} 迁移到 v{to}',
|
|
28
|
+
'import.migrateInvalidManifest': '迁移后的 manifest 不合法: {issues}',
|
|
29
|
+
'import.postValidationIssue': '导入后校验 {adapter}: {message}',
|
|
30
|
+
'import.postValidationFailed': '导入后校验 {adapter} 失败: {reason}',
|
|
31
|
+
'import.conflictKeepCurrent': '(用户选择保留当前)',
|
|
32
|
+
'import.conflictSkipExisting': '(skipExisting 策略)',
|
|
33
|
+
'import.conflictReplace': '(replace 策略)',
|
|
34
|
+
'import.secretMissingDesc': '凭据 {ref} 需要补录',
|
|
35
|
+
'import.secretNotProvided': '凭据未提供,需补录',
|
|
36
|
+
'import.notConfirmed': '导入未确认:必须显式 confirm 后才允许修改任何数据',
|
|
37
|
+
'import.encryptedPasswordRequired': '该备份已加密,必须提供解密密码才能导入(拒绝无密码导入)',
|
|
38
|
+
'import.encryptedPasswordWrong': '解密密码错误,请重试',
|
|
39
|
+
'import.notEncryptedContainer': '该文件不是加密备份容器,无法解锁',
|
|
40
|
+
'import.userSkipped': '用户跳过(导入中点击「跳过当前插件」)',
|
|
41
|
+
'import.userSkippedDetail': '插件 {name} 已由用户跳过,未安装',
|
|
42
|
+
'import.vaultRestored': '凭据文件 {rel} 已从本机 vault 回填',
|
|
43
|
+
'import.vaultMissing': '凭据文件 {rel} 不在本机 vault(跨机恢复需人工重填)',
|
|
44
|
+
'import.vaultBackfillFailed': 'vault 凭据回填失败(不影响导入结果): {reason}',
|
|
45
|
+
// ---------- 回滚 ----------
|
|
46
|
+
'rollback.ns.createdNoDelete': '该 namespace 由导入创建,DSH settings 无删除语义',
|
|
47
|
+
'rollback.ns.manualHint': 'namespace "{ref}" 需人工删除或合并',
|
|
48
|
+
'rollback.ns.conflictHint': 'settings namespace "{ref}" 需人工核对',
|
|
49
|
+
'rollback.cred.noReadback': 'DSH 不回读凭据值,无法自动恢复',
|
|
50
|
+
'rollback.cred.manualHint': '凭据 "{ref}" 请人工重新填写',
|
|
51
|
+
'rollback.patch.manualHint': 'patch 行 "{ref}" 需人工核对',
|
|
52
|
+
'rollback.file.manualHint': '文件 "{ref}" 需人工恢复',
|
|
53
|
+
'rollback.workspace.manualHint': 'workspace "{ref}" 需人工核对',
|
|
54
|
+
'rollback.unknownEntry': '未知快照条目类型 {kind}',
|
|
55
|
+
// ---------- 快照恢复(restore.ts + 宿主执行器) ----------
|
|
56
|
+
'restore.snapshotInvalid': '快照 {dir} 的 snapshot.json 不是合法对象',
|
|
57
|
+
'restore.invalidSnapshotId': 'snapshotId 非法(禁止路径分隔符)/ invalid snapshotId',
|
|
58
|
+
'restore.pathEscape': '路径越界: {path}',
|
|
59
|
+
'restore.snapshotUntrusted': '快照不可信,拒绝恢复({verdict}):{reason}',
|
|
60
|
+
'restore.blobPathEscape': 'blob 路径越界: {path}',
|
|
61
|
+
'restore.hostSkipEscape': '宿主文件路径越界,跳过: {path}',
|
|
62
|
+
'restore.hostSkipEscapeDetail': '快照登记路径越界,拒绝恢复',
|
|
63
|
+
'restore.hostNoBlobInfo': '宿主文件 {path} 缺少 blob 副本,跳过',
|
|
64
|
+
'restore.hostBlobMissing': '宿主文件 {path} 的 blob 缺失,跳过',
|
|
65
|
+
'restore.hostRestore': '整文件还原 {path}',
|
|
66
|
+
'restore.backupBeforeWrite': '还原前将备份当前文件到 pre-restore/',
|
|
67
|
+
'restore.writeDirect': '当前文件不存在,直接写入',
|
|
68
|
+
'restore.hostRemove': '移除快照时不存在、现已出现的文件 {path}',
|
|
69
|
+
'restore.backupBeforeRemove': '删除前将备份当前文件到 pre-restore/',
|
|
70
|
+
'restore.hostSkipAbsent': '宿主文件 {path} 快照时不存在且当前也不存在,无动作',
|
|
71
|
+
'restore.settingsNotBacked': 'settings 文件 {path} 未被快照登记,无法整文件还原',
|
|
72
|
+
'restore.settingsNotBackedDetail': '该快照未备份此 settings 文件(可能当时不存在或宿主未暴露 profile)',
|
|
73
|
+
'restore.noBaseline': '旧快照无 beforePlugins 基线,无法自动卸载插件',
|
|
74
|
+
'restore.noBaselineDetail': '请人工核对导入期间新增的插件并逐个移除',
|
|
75
|
+
'restore.pluginRemove': '卸载导入期间新增插件 {name}',
|
|
76
|
+
'restore.pluginRemoveEmptyBaseline': '快照基线为空(导入前可能未捕获插件清单),请确认后执行',
|
|
77
|
+
'restore.noAddedPlugins': '无导入期间新增插件(当前已装插件 ⊆ 快照基线)',
|
|
78
|
+
'restore.fileSkipEscape': '文件条目路径越界,跳过: {adapter}:{ref}',
|
|
79
|
+
'restore.fileBlobMissing': '文件 {path} 的 blob 缺失,跳过',
|
|
80
|
+
'restore.fileRestore': '还原文件 {path}({adapter})',
|
|
81
|
+
'restore.fileRemove': '删除导入写入的文件 {path}({adapter})',
|
|
82
|
+
'restore.fileSkipAbsent': '文件 {path} 快照时不存在且当前也不存在,无动作',
|
|
83
|
+
'restore.fileNoBlobInfo': '文件 {path} 缺少 blob 副本信息,跳过',
|
|
84
|
+
'restore.credentialHint': '凭据 {ref} 需人工补录',
|
|
85
|
+
'restore.credentialManualHint': '凭据 "{ref}" 请人工重新填写(DSH 不回读凭据值)',
|
|
86
|
+
'restore.nsAggregate': '{count} 条 settings namespace 条目:快照无 settings 整文件备份,离线无法恢复',
|
|
87
|
+
'restore.nsAggregateDetail': '需经在线回滚(rollback.ts)或人工核对 settings.yaml',
|
|
88
|
+
'restore.patchAggregate': '{count} 条 patch 行条目:快照无 cordis.patch.yml 整文件备份,离线无法恢复',
|
|
89
|
+
'restore.patchAggregateDetail': '需经在线回滚(rollback.ts)或人工核对 patch 文件',
|
|
90
|
+
'restore.workspaceAggregate': '{count} 条 workspace 记录条目:离线无法恢复(数据在 DSH storages)',
|
|
91
|
+
'restore.workspaceAggregateDetail': '需经在线回滚(rollback.ts)或人工核对 workspace 注册表',
|
|
92
|
+
'restore.credentialAbsentAggregate': '{count} 条凭据快照时未配置:若导入已创建,需人工在 DSH 中删除',
|
|
93
|
+
'restore.uninstallFailedCode': 'dsh plugin remove {name} 失败({code}):{message}',
|
|
94
|
+
'restore.uninstallFailedExit': 'dsh plugin remove {name} 失败(exit {code}):{tail}',
|
|
95
|
+
'restore.noOutput': '无输出',
|
|
96
|
+
'restore.pluginRemoveFailed': '卸载失败',
|
|
97
|
+
'restore.unknownAction': '未知动作 {kind}: {description}',
|
|
98
|
+
'restore.missingTargetBlob': '恢复动作缺少 target/blobPath',
|
|
99
|
+
'restore.missingTarget': '恢复动作缺少 target',
|
|
100
|
+
'restore.missingPluginName': '恢复动作缺少插件名',
|
|
101
|
+
'restore.ghostSweepSummary': '发现 {count} 个幽灵会话(备份有记录、磁盘无文件),需人工在 DSH 确认清理:{keys}',
|
|
102
|
+
// ---------- run 注册表 ----------
|
|
103
|
+
'run.conflict.export': '已有进行中的导出任务({runId}),请等待其完成后再试',
|
|
104
|
+
'run.conflict.import': '已有进行中的导入任务({runId}),请等待其完成后再试',
|
|
105
|
+
'run.notFound': 'run {runId} not found(可能已过保留期被清理)',
|
|
106
|
+
// ---------- 宿主(src/index.ts 门面与路由) ----------
|
|
107
|
+
'host.exportTimeout': '导出超时(5 分钟):导出过程未完成,请重试;若反复超时请检查 profile 依赖状态',
|
|
108
|
+
'host.syncPushTimeout': '同步推送超时(5 分钟):请检查网络与仓库可达性后重试',
|
|
109
|
+
'host.syncPullTimeout': '同步拉取超时(5 分钟):请检查网络与仓库可达性后重试',
|
|
110
|
+
'host.workspaceUnavailable': 'workspaceRegistry 服务不可用,无法写入工作区',
|
|
111
|
+
'host.patchUnsupported': 'dsh-config-manager 仅支持管理 {user} 与 profile 的 {profile}(收到 {file})',
|
|
112
|
+
'host.fsPathEscape': '路径越界: {path}',
|
|
113
|
+
'host.activationRowFailed': '插件 {pkg} 已安装,但激活行写入 profile 补丁失败:{reason}(重启后该插件可能未激活;修复后重试安装即可幂等补行)',
|
|
114
|
+
'host.syncTokenWriteFailed': 'token 写入 DSH credentials 失败:{reason}(请在 DSH 凭据管理里配置 {ref} 后重试)',
|
|
115
|
+
'host.githubMissingClientId': '未配置 GitHub OAuth client_id:请在插件配置中设置 githubClientId(GitHub → Settings → Developer settings → OAuth Apps 注册应用获取)',
|
|
116
|
+
'host.githubFlowGone': 'GitHub 登录流程不存在或已过期,请重新开始',
|
|
117
|
+
'host.restoreBlobEscape': 'blob 路径越界: {blob}',
|
|
118
|
+
'host.restoreUninstallFailed': 'dsh plugin remove {name} 失败(exit {code}):{tail}',
|
|
119
|
+
'host.restoreNoOutput': '无输出',
|
|
120
|
+
// ---------- 适配器:分区导出告警 ----------
|
|
121
|
+
'adapter.pluginListReadFailed': '插件清单读取失败: {reason}',
|
|
122
|
+
'adapter.patchReadFailed': 'patch 文件读取失败: {reason}',
|
|
123
|
+
'adapter.patchReadFailedPrompts': 'patch 文件读取失败,无法提取 prompts: {reason}',
|
|
124
|
+
'adapter.patchReadFailedMCP': 'patch 文件读取失败,无法提取 MCP: {reason}',
|
|
125
|
+
'adapter.pnpmReadFailed': 'pnpm-workspace.yaml 读取失败: {reason}',
|
|
126
|
+
'adapter.localPackFailed': '本地插件打包失败(已跳过,其余插件不受影响): {reason}',
|
|
127
|
+
'adapter.pluginLocalTarballHint': '(本地源插件,将用备份内自带的 tarball 安装)',
|
|
128
|
+
'adapter.providerNsReadFailed': 'provider namespace {ns} 读取失败(可能未配置): {reason}',
|
|
129
|
+
'adapter.credStatusReadFailed': '凭据 {ref} 状态读取失败: {reason}',
|
|
130
|
+
'adapter.settingsNsReadFailed': '设置 namespace {name} 读取失败: {reason}',
|
|
131
|
+
'adapter.dirEmpty': '{type} 目录为空或不存在',
|
|
132
|
+
'adapter.linksFollowed': '{type} 分区:已跟随 {count} 个链接目录收集内容(导入时按普通目录还原,链接结构不会重建)',
|
|
133
|
+
'adapter.linksSkipped': '{type} 分区:{count} 个链接被跳过,其内容**未进备份** —— {detail}',
|
|
134
|
+
'adapter.dirsUnreadable': '{type} 分区:{count} 个目录读取失败(权限/竞态),其内容**未进备份** —— {detail}',
|
|
135
|
+
'adapter.linkReason.loop': '自引用/重复链接',
|
|
136
|
+
'adapter.linkReason.outsideHome': '目标在 DSH home 之外',
|
|
137
|
+
'adapter.linkReason.broken': '断链',
|
|
138
|
+
'adapter.linkReason.unreadable': '目标既非文件也非目录',
|
|
139
|
+
'adapter.linkReason.tooDeep': '层级过深',
|
|
140
|
+
'adapter.noSettingsNamespaces': '未配置 settings namespace 清单,settings 分区为空',
|
|
141
|
+
// ---------- 适配器:计划项描述 ----------
|
|
142
|
+
'adapter.fileCreate': '创建{type}文件 {path}',
|
|
143
|
+
'adapter.fileSame': '文件 {path} 已一致',
|
|
144
|
+
'adapter.fileDiff': '文件 {path} 内容不同',
|
|
145
|
+
'adapter.pluginFileCreate': '创建插件配置文件 {path}',
|
|
146
|
+
'adapter.pluginFileReserved': '拒绝:{path} 落在内部 recovery/control-plane 保留区(快照/事务/锁/同步存储)',
|
|
147
|
+
'adapter.fileReserved': '拒绝:{path} 落在内部 recovery/control-plane 保留区(快照/事务/锁/同步存储)',
|
|
148
|
+
'adapter.mcpCreate': '创建 MCP server {serverName}',
|
|
149
|
+
'adapter.mcpSame': 'MCP server {serverName} 已一致',
|
|
150
|
+
'adapter.mcpDiff': 'MCP server {serverName} 与目标不同',
|
|
151
|
+
'adapter.pwCreate': '写入 pnpm-workspace.yaml(插件构建白名单/冷静期配置)',
|
|
152
|
+
'adapter.pwUpdate': '更新 pnpm-workspace.yaml(插件构建白名单/冷静期配置)',
|
|
153
|
+
'adapter.pluginInstall': '安装插件 {name}@{version}',
|
|
154
|
+
'adapter.pluginSame': '插件 {name} 已安装且版本一致',
|
|
155
|
+
'adapter.pluginDiff': '插件 {name} 版本不同',
|
|
156
|
+
'adapter.pluginVersionDetail': '当前 {current} vs 导入 {imported}',
|
|
157
|
+
'adapter.pluginBundleMember': '(bundle 成员,经聚合包安装)',
|
|
158
|
+
'adapter.pluginInstallOk': '插件 {name} 已安装{suffix}',
|
|
159
|
+
'adapter.pluginUpdateTriggered': '插件 {name} 已触发更新(npm 最新版){suffix}',
|
|
160
|
+
'adapter.pluginRestartSuffix': ',重启 dsh 后生效',
|
|
161
|
+
'adapter.pwMissing': '导入数据缺少 pnpm-workspace.yaml 内容',
|
|
162
|
+
'adapter.pluginInstallFailed': '插件 {name} 安装失败:{msg}。可手动安装:dsh plugin --profile {profile} add {name}(其余配置已导入;可修复依赖后在设置页重试或手动安装)',
|
|
163
|
+
'adapter.pluginUpdateFailed': '插件 {name} 更新失败:{msg}。可手动安装:dsh plugin --profile {profile} add {name}(其余配置已导入;可修复依赖后在设置页重试或手动安装)',
|
|
164
|
+
'adapter.patchLineCreate': '写入 patch 行 {lineId}',
|
|
165
|
+
'adapter.patchLineSame': 'patch 行 {lineId} 已一致',
|
|
166
|
+
'adapter.patchLineDiff': 'patch 行 {lineId} 与目标不同',
|
|
167
|
+
'adapter.promptSame': '提示词 {name} 已一致',
|
|
168
|
+
'adapter.promptDiff': '提示词 {name} 与目标不同',
|
|
169
|
+
'adapter.promptDiffWithLine': '提示词 {name} 与目标不同(目标位于行 {line})',
|
|
170
|
+
'adapter.promptCreate': '创建提示词 {name}(行 {line})',
|
|
171
|
+
'adapter.promptManual': '提示词 {name} 在目标无对应来源,请手动配置(DSH 无独立 prompt 存储)',
|
|
172
|
+
'adapter.providerUnregistered': 'Provider {route} 的命名空间 {ns} 在目标未注册(可能需要安装对应插件)',
|
|
173
|
+
'adapter.providerCreate': '创建 Provider {route}(namespace {ns})',
|
|
174
|
+
'adapter.providerSame': 'Provider {route} 已一致',
|
|
175
|
+
'adapter.providerDiff': 'Provider {route} 与目标不同',
|
|
176
|
+
'adapter.settingsUnregistered': '设置命名空间 {ns} 在目标未注册(可能需要安装提供它的插件)',
|
|
177
|
+
'adapter.settingsCreate': '创建设置 {name}',
|
|
178
|
+
'adapter.settingsSame': '设置 {name} 已一致',
|
|
179
|
+
'adapter.settingsDiff': '设置 {name} 与目标不同',
|
|
180
|
+
'adapter.workspaceCreate': '创建工作区 {title}({path})',
|
|
181
|
+
'adapter.workspaceSame': '工作区 {id} 已一致',
|
|
182
|
+
'adapter.workspaceDiff': '工作区 {id} 与目标不同',
|
|
183
|
+
'adapter.workspacePathMapping': '路径需映射: {path}',
|
|
184
|
+
'adapter.workspaceMissing': '导入数据缺少工作区 {ref}',
|
|
185
|
+
'adapter.credentialDescription': '凭据补录',
|
|
186
|
+
// ---------- 适配器:applyItem 结果消息 ----------
|
|
187
|
+
'adapter.missingTargetRef': '缺少 target.ref',
|
|
188
|
+
'adapter.dataMissingFile': '导入数据缺少文件 {ref}',
|
|
189
|
+
'adapter.patchMissing': '导入数据缺少 patch 行 {ref}',
|
|
190
|
+
'adapter.pwWritten': 'pnpm-workspace.yaml 已写入(插件安装将按该配置执行)',
|
|
191
|
+
'adapter.pwWriteFailed': 'pnpm-workspace.yaml 写入失败:{msg}(插件安装可能因此受阻,可修复后在设置页重试)',
|
|
192
|
+
'adapter.patchFileCreate': '写入 pnpm patch 文件 {path}',
|
|
193
|
+
'adapter.patchFileWriteFailed': 'pnpm patch 文件 {path} 写入失败:{reason}(对应的 patchedDependencies 声明会被移除)',
|
|
194
|
+
'adapter.patchFileMissing': 'pnpm patch 文件缺失,无法随备份迁移:{name} → {path}(该 patchedDependencies 条目导入时会被移除)',
|
|
195
|
+
'adapter.patchFileUnsafe': 'pnpm patch 路径不安全,已跳过:{name} → {path}',
|
|
196
|
+
'adapter.patchFileReadFailed': 'pnpm patch 文件读取失败:{name} → {path}({reason})',
|
|
197
|
+
'adapter.patchFileTooLarge': 'pnpm patch 文件过大,未随备份迁移:{name} → {path}(上限 {limit})',
|
|
198
|
+
'adapter.pwPatchesDropped': '已移除 {count} 条 patchedDependencies 声明(目标机没有对应 patch 文件,保留会让 pnpm 拒绝一切插件安装):{names}',
|
|
199
|
+
'adapter.pwPatchesDroppedDetail': '导入时会移除 {count} 条无法满足的 patchedDependencies 声明:{names}',
|
|
200
|
+
'adapter.pwPatchesUnsupported': 'patchedDependencies 为单行 flow 写法,无法安全剔除缺失条目;若目标机没有对应 patch 文件,pnpm 可能拒绝安装:{line}',
|
|
201
|
+
'adapter.pwWrittenPatchesDropped': 'pnpm-workspace.yaml 已写入,但移除了 {count} 条 patchedDependencies 声明(目标机没有对应 patch 文件):{names}',
|
|
202
|
+
'adapter.patchWritten': 'patch 行 {ref} 已写入(宿主热重载 patch,无需重启)',
|
|
203
|
+
'adapter.credentialValueMissing': '凭据值未提供(需补录)',
|
|
204
|
+
'adapter.promptWarningNoWrite': '提示项,无需写入',
|
|
205
|
+
'adapter.promptMissing': '导入数据缺少提示词 {id}',
|
|
206
|
+
'adapter.promptCreated': '提示词 {name} 已创建(行 {ref})',
|
|
207
|
+
'adapter.patchLineMissing': '目标 patch 行 {ref} 不存在,无法写入',
|
|
208
|
+
'adapter.promptWritten': '提示词 {name} 已写入 patch 行 {ref}',
|
|
209
|
+
'adapter.mcpMissing': '导入数据缺少 MCP server {serverName}',
|
|
210
|
+
'adapter.mcpWritten': 'MCP server {serverName} 已写入 patch(宿主热重载 patch,无需重启)',
|
|
211
|
+
'adapter.workspaceWriteFailed': '工作区 {ref} 未能写入:{msg}(需映射路径或先在目标创建目录)',
|
|
212
|
+
'adapter.providerMissing': '导入数据缺少 provider {route}',
|
|
213
|
+
'adapter.namespaceMissing': '导入数据缺少 namespace {ref}',
|
|
214
|
+
// ---------- 适配器:结构校验(validate) ----------
|
|
215
|
+
'adapter.validate.object': '{subject} 数据必须是对象',
|
|
216
|
+
'adapter.validate.fileSection': '文件分区数据必须是对象',
|
|
217
|
+
'adapter.validate.version': 'version 必须为 1(收到 {value})',
|
|
218
|
+
'adapter.validate.array': '{subject} 必须是数组',
|
|
219
|
+
'adapter.validate.string': '{subject} 必须是字符串',
|
|
220
|
+
'adapter.validate.localTarballPath': '本地插件 tarball 路径非法(须位于 local-plugins/ 之下且不含 ..): {path}',
|
|
221
|
+
'adapter.validate.missingObject': '缺少 {subject} 对象',
|
|
222
|
+
'adapter.validate.recordObject': '{subject} 记录必须是对象',
|
|
223
|
+
'adapter.validate.requiredField': '缺少 {subject}',
|
|
224
|
+
'adapter.validate.sourceNamespace': '缺少来源 namespace',
|
|
225
|
+
'adapter.validate.number': '{subject} 必须是数字',
|
|
226
|
+
'adapter.validate.nonEmptyRef': '{subject} 记录必须含非空 ref',
|
|
227
|
+
'adapter.validate.credentialRef': '凭据记录必须含非空 ref',
|
|
228
|
+
'adapter.validate.fileRelativePath': '文件记录必须含非空 relativePath',
|
|
229
|
+
'adapter.validate.promptIdentity': 'prompt 记录必须含字符串 name 与 text',
|
|
230
|
+
'adapter.validate.hasValueFalse': '值未导出,hasValue 必须为 false',
|
|
231
|
+
'adapter.validate.serverName': 'server 记录必须含非空 serverName',
|
|
232
|
+
'adapter.validate.workspaceIdentity': 'workspace 记录必须含字符串 id 与 path',
|
|
233
|
+
'adapter.validate.missingValue': '缺少 value',
|
|
234
|
+
// ---------- 远程同步 ----------
|
|
235
|
+
'sync.denySensitiveSection': '同步拒绝携带敏感分区 {section}(secret 值永不参与同步)',
|
|
236
|
+
'sync.sectionFailed': '分区 {adapter} 导出失败: {reason}',
|
|
237
|
+
'sync.unknownSection': '分区 {section} 不存在,已跳过,不参与同步',
|
|
238
|
+
'sync.noSections': '没有可同步的分区(全部导出失败)',
|
|
239
|
+
'sync.legacyEncryptedSnapshot': '快照 {id} 是旧版加密快照,当前同步通道不产生也不读取加密快照(请在旧版本中改用明文通道重新推送)',
|
|
240
|
+
'sync.remoteEmpty': '远端无快照',
|
|
241
|
+
'sync.missingImporter': 'SyncEngine 缺少 importer:pull 需要注入 Importer(analyzeImport/createImportPlan)',
|
|
242
|
+
'sync.missingCtx': 'SyncEngine 需要 ctx',
|
|
243
|
+
'sync.missingTransport': 'SyncEngine 需要完整 SyncTransport(list/upload/download/delete)',
|
|
244
|
+
'sync.missingStateDir': 'SyncEngine 需要 stateDir',
|
|
245
|
+
'sync.unchanged': '远端快照与本地一致(无变更)',
|
|
246
|
+
'sync.changesSummary': 'compatibility={compatibility},共 {count} 项变更',
|
|
247
|
+
'sync.configWhitespace': '仓库地址不能包含空白字符',
|
|
248
|
+
'sync.configUnparseable': '无法解析仓库地址: {url}',
|
|
249
|
+
'sync.configUserinfo': '请勿在仓库地址中包含用户名/密码(认证 token 请使用凭据字段,不会拼入地址)',
|
|
250
|
+
'sync.state.notObject': 'sync-state.json 损坏:必须是对象',
|
|
251
|
+
'sync.state.schemaUnsupported': 'sync-state.json schemaVersion 不支持: {version}(期望 {expected})',
|
|
252
|
+
'sync.state.lastSyncAt': 'sync-state.json 损坏:lastSyncAt 必须是字符串',
|
|
253
|
+
'sync.state.sections': 'sync-state.json 损坏:sections 必须是对象',
|
|
254
|
+
'sync.state.sectionRecord': 'sync-state.json 损坏:分区 {section} 记录必须是对象',
|
|
255
|
+
'sync.state.sectionFields': 'sync-state.json 损坏:分区 {section} 记录必须含字符串 hash/updatedAt',
|
|
256
|
+
'sync.state.transport': 'sync-state.json 损坏:transport 必须含字符串 type/ref',
|
|
257
|
+
'sync.git.repoUrlRequired': 'repoUrl 必须是非空字符串',
|
|
258
|
+
'sync.git.workDirRequired': 'workDir 必须是非空字符串',
|
|
259
|
+
'sync.git.credentialsRequired': 'credentials 必须提供 getToken()',
|
|
260
|
+
'sync.git.snapshotMissing': '快照 {id} 不存在(本地工作副本 {dir})',
|
|
261
|
+
'sync.git.snapshotCorrupt': '加密快照 {id} 损坏({dir}): {err}',
|
|
262
|
+
'sync.git.repoUnreachable': '仓库不可达或认证失败: {url}',
|
|
263
|
+
'sync.git.workDirNotRepo': 'workDir 不是 git 仓库(缺少 .git)且目录非空,无法 clone: {dir}',
|
|
264
|
+
'sync.git.pullFailed': 'git pull 失败: {err}',
|
|
265
|
+
'sync.git.cmdFailed': 'git {args} 失败 (exit {code}): {err}',
|
|
266
|
+
'sync.git.repoUrlInvalid': '无法解析 repoUrl(http(s) 仓库必须为合法 URL): {url}',
|
|
267
|
+
'sync.git.invalidSnapshotId': '非法快照 id: {id}(仅允许字母数字开头,字符限 . _ -)',
|
|
268
|
+
'sync.webdav.baseUrlRequired': 'baseUrl 必须是非空字符串',
|
|
269
|
+
'sync.webdav.baseUrlInvalid': '无法解析 baseUrl(必须为合法 http(s) URL): {url}',
|
|
270
|
+
'sync.webdav.baseUrlUserinfo': '请勿在 baseUrl 中包含用户名/密码(认证走凭据字段,不会拼入地址)',
|
|
271
|
+
'sync.webdav.usernameRequired': 'username 必须是非空字符串',
|
|
272
|
+
'sync.webdav.credentialsRequired': 'credentials 必须提供 getPassword()',
|
|
273
|
+
'sync.webdav.invalidSnapshotId': '非法快照 id: {id}(仅允许字母数字开头,字符限 . _ -)',
|
|
274
|
+
'sync.webdav.snapshotMissing': '快照 {id} 不存在({url})',
|
|
275
|
+
'sync.webdav.requestFailed': '{method} {url} 失败 (HTTP {status}): {err}',
|
|
276
|
+
'sync.webdav.requestError': '{method} {url} 请求出错: {err}',
|
|
277
|
+
'sync.webdav.timeout': '{method} {url} 请求超时({timeout}ms)',
|
|
278
|
+
'sync.webdav.tooManyRedirects': '{method} {url} 重定向超过 {n} 次上限,疑似跳转循环',
|
|
279
|
+
'sync.webdav.indexInvalid': '{url} 解析失败或结构非法: {err}',
|
|
280
|
+
'sync.webdav.snapshotInvalid': '快照 {id} 解析失败或结构非法: {err}',
|
|
281
|
+
'sync.pruneListFailed': '远端快照裁剪失败:无法列出远端快照,{reason}',
|
|
282
|
+
'sync.pruneDeleteFailed': '远端快照裁剪失败:删除快照 {id} 失败,{reason}',
|
|
283
|
+
// ---------- 配置市场(m-market:只读公开仓库目录读取 + 校验) ----------
|
|
284
|
+
'market.invalidItemId': '非法市场条目 id: {id}(仅允许字母数字开头,字符限 . _ -)',
|
|
285
|
+
'market.urlWhitespace': '市场仓库地址不能包含空白字符',
|
|
286
|
+
'market.urlUnparseable': '无法解析市场仓库地址: {url}',
|
|
287
|
+
'market.urlUserinfo': '请勿在市场仓库地址中包含用户名/密码(公开市场无需凭据;token 不会拼入地址)',
|
|
288
|
+
'market.repoUnreachable': '市场仓库不可达: {url}',
|
|
289
|
+
'market.cloneFailed': '市场仓库拉取(clone)失败: {err}',
|
|
290
|
+
'market.pullFailed': '市场仓库同步(pull)失败: {err}',
|
|
291
|
+
'market.workDirNotRepo': '市场工作目录非空且不是 git 仓库,无法 clone: {dir}',
|
|
292
|
+
'market.missingIndex': '市场缺少 index.json: {url}',
|
|
293
|
+
'market.missingManifest': '条目 {id} 缺少 manifest.json',
|
|
294
|
+
'market.missingZip': '条目 {id} 缺少 config.zip',
|
|
295
|
+
'market.zipTooLarge': 'config.zip 体积 {size} 超过上限 {limit} 字节',
|
|
296
|
+
'market.invalid': '条目 {id} 校验未通过: {errors}',
|
|
297
|
+
};
|
|
298
|
+
export const en = {
|
|
299
|
+
// ---------- export ----------
|
|
300
|
+
'export.encryptionRequired': 'Encrypted export requires an EncryptionProvider (m4); refusing to export secrets in plaintext',
|
|
301
|
+
'export.sectionFailed': 'Section {adapter} export failed: {reason}',
|
|
302
|
+
'export.credentialsReadFailed': 'Failed to read the credentials file; secrets export skipped: {reason}',
|
|
303
|
+
'export.vaultRefreshed': 'Credential plaintext did not enter the backup; mirrored to the local vault ({count} file(s), available for restore backfill)',
|
|
304
|
+
'export.vaultRefreshSkipped': 'Vault mirror skipped {rel}: {reason}',
|
|
305
|
+
'export.vaultRefreshFailed': 'Vault mirror refresh failed (export unaffected): {reason}',
|
|
306
|
+
'export.fileSectionSecrets': 'Suspected credential detected in file section {section}: {path}',
|
|
307
|
+
// ---------- import: ZIP / integrity / schema ----------
|
|
308
|
+
'import.readFailed': 'Cannot read backup file "{zip}": {reason}',
|
|
309
|
+
'import.noManifest': 'Backup is missing manifest.json — not a valid DSH Config Manager backup',
|
|
310
|
+
'import.manifestParseFailed': 'Failed to parse manifest.json: {reason}',
|
|
311
|
+
'import.integrityFailed': 'Backup integrity check failed: {entries}',
|
|
312
|
+
'import.schemaUnsupported': 'Backup {version} cannot be imported (current support: v1)',
|
|
313
|
+
'import.executableWarning': 'Backup contains an executable file "{name}"; this plugin will not run it',
|
|
314
|
+
'import.sectionParseFailed': 'Section {section} data parse failed: {reason}',
|
|
315
|
+
'import.sectionInvalid': 'Section {section} data is invalid: {issues}',
|
|
316
|
+
'import.adapterAnalyzeFailed': '{adapter}: analysis failed {reason}',
|
|
317
|
+
'import.adapterValidationIssue': '{adapter}: {message}',
|
|
318
|
+
'import.versionUnsupported': '{version}: cannot import',
|
|
319
|
+
'import.missingSections': 'Sections declared by the backup but missing: {sections}',
|
|
320
|
+
'import.unsupportedSections': 'Backup contains sections not supported by this version: {sections} (skipped, not imported)',
|
|
321
|
+
'import.unsupportedSectionVersion': 'Section {section} data version {version} is higher than the supported version 1 (section skipped)',
|
|
322
|
+
'import.checksumsMissing': 'Backup provides no integrity checksum table; no entry was verified',
|
|
323
|
+
'import.extraEntries': 'ZIP contains entries not registered in the checksum table: {entries} (not verified)',
|
|
324
|
+
'import.migrated': 'Backup schema migrated from v{from} to v{to}',
|
|
325
|
+
'import.migrateInvalidManifest': 'Migrated manifest is invalid: {issues}',
|
|
326
|
+
'import.postValidationIssue': 'Post-import validation {adapter}: {message}',
|
|
327
|
+
'import.postValidationFailed': 'Post-import validation {adapter} failed: {reason}',
|
|
328
|
+
'import.conflictKeepCurrent': ' (user chose to keep current)',
|
|
329
|
+
'import.conflictSkipExisting': ' (skipExisting strategy)',
|
|
330
|
+
'import.conflictReplace': ' (replace strategy)',
|
|
331
|
+
'import.secretMissingDesc': 'Credential {ref} needs to be re-entered',
|
|
332
|
+
'import.secretNotProvided': 'Credential not provided; requires re-entry',
|
|
333
|
+
'import.notConfirmed': 'Import not confirmed: explicit confirm is required before any data is modified',
|
|
334
|
+
'import.encryptedPasswordRequired': 'This backup is encrypted; the decryption password is required to import it (refusing password-less import)',
|
|
335
|
+
'import.encryptedPasswordWrong': 'Wrong decryption password, please try again',
|
|
336
|
+
'import.notEncryptedContainer': 'This file is not an encrypted backup container and cannot be unlocked',
|
|
337
|
+
'import.userSkipped': 'Skipped by user (clicked "Skip current plugin" during import)',
|
|
338
|
+
'import.userSkippedDetail': 'Plugin {name} was skipped by the user and not installed',
|
|
339
|
+
'import.vaultRestored': 'Credential file {rel} backfilled from the local vault',
|
|
340
|
+
'import.vaultMissing': 'Credential file {rel} is not in the local vault (cross-machine restore: re-enter manually)',
|
|
341
|
+
'import.vaultBackfillFailed': 'Vault credential backfill failed (import result unaffected): {reason}',
|
|
342
|
+
// ---------- rollback ----------
|
|
343
|
+
'rollback.ns.createdNoDelete': 'This namespace was created by the import; DSH settings have no delete semantics',
|
|
344
|
+
'rollback.ns.manualHint': 'namespace "{ref}" needs manual removal or merge',
|
|
345
|
+
'rollback.ns.conflictHint': 'settings namespace "{ref}" needs manual review',
|
|
346
|
+
'rollback.cred.noReadback': 'DSH never reads credential values back, so the original cannot be restored automatically',
|
|
347
|
+
'rollback.cred.manualHint': 'Credential "{ref}": please re-enter it manually',
|
|
348
|
+
'rollback.patch.manualHint': 'patch row "{ref}" needs manual review',
|
|
349
|
+
'rollback.file.manualHint': 'File "{ref}" needs manual restore',
|
|
350
|
+
'rollback.workspace.manualHint': 'workspace "{ref}" needs manual review',
|
|
351
|
+
'rollback.unknownEntry': 'Unknown snapshot entry kind {kind}',
|
|
352
|
+
// ---------- snapshot restore (restore.ts + host executor) ----------
|
|
353
|
+
'restore.snapshotInvalid': 'snapshot.json in {dir} is not a valid object',
|
|
354
|
+
'restore.invalidSnapshotId': 'invalid snapshotId (path separators forbidden)',
|
|
355
|
+
'restore.snapshotUntrusted': 'Snapshot untrusted, restore refused ({verdict}): {reason}',
|
|
356
|
+
'restore.pathEscape': 'Path outside home directory: {path}',
|
|
357
|
+
'restore.blobPathEscape': 'Blob path outside snapshot directory: {path}',
|
|
358
|
+
'restore.hostSkipEscape': 'Host file path outside home directory, skipped: {path}',
|
|
359
|
+
'restore.hostSkipEscapeDetail': 'Snapshot-recorded path escapes the home root; restore refused',
|
|
360
|
+
'restore.hostNoBlobInfo': 'Host file {path} has no blob copy, skipped',
|
|
361
|
+
'restore.hostBlobMissing': 'Blob for host file {path} is missing, skipped',
|
|
362
|
+
'restore.hostRestore': 'Restore whole file {path}',
|
|
363
|
+
'restore.backupBeforeWrite': 'The current file will be backed up to pre-restore/ first',
|
|
364
|
+
'restore.writeDirect': 'File does not exist now; writing directly',
|
|
365
|
+
'restore.hostRemove': 'Remove file {path} that did not exist at snapshot time but exists now',
|
|
366
|
+
'restore.backupBeforeRemove': 'The current file will be backed up to pre-restore/ before removal',
|
|
367
|
+
'restore.hostSkipAbsent': 'Host file {path} did not exist at snapshot time and does not exist now; no action',
|
|
368
|
+
'restore.settingsNotBacked': 'Settings file {path} was not recorded by the snapshot; whole-file restore unavailable',
|
|
369
|
+
'restore.settingsNotBackedDetail': 'This snapshot did not back up this settings file (it may not have existed, or the host profile was not exposed)',
|
|
370
|
+
'restore.noBaseline': 'Old snapshot has no beforePlugins baseline; plugin uninstall cannot be planned automatically',
|
|
371
|
+
'restore.noBaselineDetail': 'Please review plugins added during the import and remove them individually',
|
|
372
|
+
'restore.pluginRemove': 'Uninstall plugin {name} added during import',
|
|
373
|
+
'restore.pluginRemoveEmptyBaseline': 'Snapshot baseline is empty (plugin list may not have been captured before import); confirm before executing',
|
|
374
|
+
'restore.noAddedPlugins': 'No plugins added during import (all currently installed plugins ⊆ snapshot baseline)',
|
|
375
|
+
'restore.fileSkipEscape': 'File entry path outside home directory, skipped: {adapter}:{ref}',
|
|
376
|
+
'restore.fileBlobMissing': 'Blob for file {path} is missing, skipped',
|
|
377
|
+
'restore.fileRestore': 'Restore file {path} ({adapter})',
|
|
378
|
+
'restore.fileRemove': 'Remove file {path} written by the import ({adapter})',
|
|
379
|
+
'restore.fileSkipAbsent': 'File {path} did not exist at snapshot time and does not exist now; no action',
|
|
380
|
+
'restore.fileNoBlobInfo': 'File {path} has no blob copy information, skipped',
|
|
381
|
+
'restore.credentialHint': 'Credential {ref} needs manual re-entry',
|
|
382
|
+
'restore.credentialManualHint': 'Credential "{ref}": please re-enter it manually (DSH never reads credential values back)',
|
|
383
|
+
'restore.nsAggregate': '{count} settings namespace entries: snapshot has no whole-file settings backup, cannot restore offline',
|
|
384
|
+
'restore.nsAggregateDetail': 'Needs the online rollback path (rollback.ts) or manual review of settings.yaml',
|
|
385
|
+
'restore.patchAggregate': '{count} patch-row entries: snapshot has no whole-file cordis.patch.yml backup, cannot restore offline',
|
|
386
|
+
'restore.patchAggregateDetail': 'Needs the online rollback path (rollback.ts) or manual review of the patch file',
|
|
387
|
+
'restore.workspaceAggregate': '{count} workspace-record entries: cannot restore offline (data lives in DSH storages)',
|
|
388
|
+
'restore.workspaceAggregateDetail': 'Needs the online rollback path (rollback.ts) or manual review of the workspace registry',
|
|
389
|
+
'restore.credentialAbsentAggregate': '{count} credentials were not configured at snapshot time: if the import created them, remove them manually in DSH',
|
|
390
|
+
'restore.uninstallFailedCode': 'dsh plugin remove {name} failed ({code}): {message}',
|
|
391
|
+
'restore.uninstallFailedExit': 'dsh plugin remove {name} failed (exit {code}): {tail}',
|
|
392
|
+
'restore.noOutput': 'no output',
|
|
393
|
+
'restore.pluginRemoveFailed': 'Uninstall failed',
|
|
394
|
+
'restore.unknownAction': 'Unknown action {kind}: {description}',
|
|
395
|
+
'restore.missingTargetBlob': 'Restore action is missing target/blobPath',
|
|
396
|
+
'restore.missingTarget': 'Restore action is missing target',
|
|
397
|
+
'restore.missingPluginName': 'Restore action is missing the plugin name',
|
|
398
|
+
'restore.ghostSweepSummary': 'Found {count} ghost session(s) (recorded in the backup, missing on disk); please confirm and clean them up in DSH: {keys}',
|
|
399
|
+
// ---------- run registry ----------
|
|
400
|
+
'run.conflict.export': 'An export task is already running ({runId}); wait for it to finish before retrying',
|
|
401
|
+
'run.conflict.import': 'An import task is already running ({runId}); wait for it to finish before retrying',
|
|
402
|
+
'run.notFound': 'run {runId} not found (may have been pruned after the retention period)',
|
|
403
|
+
// ---------- host (src/index.ts facades & routes) ----------
|
|
404
|
+
'host.exportTimeout': 'Export timed out (5 min): the export did not complete, please retry; if it keeps timing out, check the profile dependency state',
|
|
405
|
+
'host.syncPushTimeout': 'Sync push timed out (5 min): check network and repository reachability, then retry',
|
|
406
|
+
'host.syncPullTimeout': 'Sync pull timed out (5 min): check network and repository reachability, then retry',
|
|
407
|
+
'host.workspaceUnavailable': 'workspaceRegistry service unavailable; cannot write the workspace',
|
|
408
|
+
'host.patchUnsupported': 'dsh-config-manager only manages {user} and the profile {profile} (received {file})',
|
|
409
|
+
'host.fsPathEscape': 'Path outside home directory: {path}',
|
|
410
|
+
'host.activationRowFailed': 'Plugin {pkg} is installed, but writing the activation row into the profile patch failed: {reason} (the plugin may be inactive until restart; retrying the install after fixing is idempotent)',
|
|
411
|
+
'host.syncTokenWriteFailed': 'Failed to write the token into DSH credentials: {reason} (configure {ref} in DSH credential management, then retry)',
|
|
412
|
+
'host.githubMissingClientId': 'GitHub OAuth client_id is not configured: set githubClientId in the plugin config (GitHub → Settings → Developer settings → OAuth Apps → register an app)',
|
|
413
|
+
'host.githubFlowGone': 'The GitHub sign-in flow does not exist or has expired; please start over',
|
|
414
|
+
'host.restoreBlobEscape': 'Blob path outside snapshot directory: {blob}',
|
|
415
|
+
'host.restoreUninstallFailed': 'dsh plugin remove {name} failed (exit {code}): {tail}',
|
|
416
|
+
'host.restoreNoOutput': 'no output',
|
|
417
|
+
// ---------- adapters: section export warnings ----------
|
|
418
|
+
'adapter.pluginListReadFailed': 'Failed to read the plugin list: {reason}',
|
|
419
|
+
'adapter.patchReadFailed': 'Failed to read the patch file: {reason}',
|
|
420
|
+
'adapter.patchReadFailedPrompts': 'Failed to read the patch file; prompts unavailable: {reason}',
|
|
421
|
+
'adapter.patchReadFailedMCP': 'Failed to read the patch file; MCP servers unavailable: {reason}',
|
|
422
|
+
'adapter.pnpmReadFailed': 'Failed to read pnpm-workspace.yaml: {reason}',
|
|
423
|
+
'adapter.localPackFailed': 'Failed to pack local plugin (skipped; other plugins unaffected): {reason}',
|
|
424
|
+
'adapter.pluginLocalTarballHint': ' (local-source plugin; will install from the tarball bundled in this backup)',
|
|
425
|
+
'adapter.providerNsReadFailed': 'provider namespace {ns} read failed (may be unconfigured): {reason}',
|
|
426
|
+
'adapter.credStatusReadFailed': 'Credential {ref} status read failed: {reason}',
|
|
427
|
+
'adapter.settingsNsReadFailed': 'settings namespace {name} read failed: {reason}',
|
|
428
|
+
'adapter.dirEmpty': '{type} directory is empty or missing',
|
|
429
|
+
'adapter.linksFollowed': '{type}: followed {count} linked directories (restored as plain directories on import; link structure is not recreated)',
|
|
430
|
+
'adapter.linksSkipped': '{type}: {count} links skipped and their content is NOT in this backup — {detail}',
|
|
431
|
+
'adapter.dirsUnreadable': '{type}: {count} director(ies) could not be read (permissions/race) and their content is NOT in this backup — {detail}',
|
|
432
|
+
'adapter.linkReason.loop': 'self-referencing/duplicate link',
|
|
433
|
+
'adapter.linkReason.outsideHome': 'target outside the DSH home',
|
|
434
|
+
'adapter.linkReason.broken': 'broken link',
|
|
435
|
+
'adapter.linkReason.unreadable': 'target is neither a regular file nor a directory',
|
|
436
|
+
'adapter.linkReason.tooDeep': 'nesting too deep',
|
|
437
|
+
'adapter.noSettingsNamespaces': 'No settings namespaces configured; the settings section is empty',
|
|
438
|
+
// ---------- adapters: plan item descriptions ----------
|
|
439
|
+
'adapter.fileCreate': 'Create {type} file {path}',
|
|
440
|
+
'adapter.fileSame': 'File {path} is already identical',
|
|
441
|
+
'adapter.fileDiff': 'File {path} differs',
|
|
442
|
+
'adapter.pluginFileCreate': 'Create plugin config file {path}',
|
|
443
|
+
'adapter.pluginFileReserved': 'Rejected: {path} falls inside the internal recovery/control-plane reserved namespace (snapshots/transactions/locks/sync)',
|
|
444
|
+
'adapter.fileReserved': 'Rejected: {path} falls inside the internal recovery/control-plane reserved namespace (snapshots/transactions/locks/sync)',
|
|
445
|
+
'adapter.mcpCreate': 'Create MCP server {serverName}',
|
|
446
|
+
'adapter.mcpSame': 'MCP server {serverName} is already identical',
|
|
447
|
+
'adapter.mcpDiff': 'MCP server {serverName} differs from the target',
|
|
448
|
+
'adapter.pwCreate': 'Write pnpm-workspace.yaml (plugin build whitelist / release-age settings)',
|
|
449
|
+
'adapter.pwUpdate': 'Update pnpm-workspace.yaml (plugin build whitelist / release-age settings)',
|
|
450
|
+
'adapter.pluginInstall': 'Install plugin {name}@{version}',
|
|
451
|
+
'adapter.pluginSame': 'Plugin {name} is installed and the version matches',
|
|
452
|
+
'adapter.pluginDiff': 'Plugin {name} version differs',
|
|
453
|
+
'adapter.pluginVersionDetail': 'current {current} vs backup {imported}',
|
|
454
|
+
'adapter.pluginBundleMember': ' (bundle member, installed via the aggregate package)',
|
|
455
|
+
'adapter.pluginInstallOk': 'Plugin {name} installed{suffix}',
|
|
456
|
+
'adapter.pluginUpdateTriggered': 'Plugin {name} update triggered (npm latest){suffix}',
|
|
457
|
+
'adapter.pluginRestartSuffix': '; takes effect after restarting dsh',
|
|
458
|
+
'adapter.pwMissing': 'Import data is missing pnpm-workspace.yaml content',
|
|
459
|
+
'adapter.pluginInstallFailed': 'Plugin {name} install failed: {msg}. You can install it manually: dsh plugin --profile {profile} add {name} (the rest of the config was imported; fix dependencies and retry from the settings page, or install by hand)',
|
|
460
|
+
'adapter.pluginUpdateFailed': 'Plugin {name} update failed: {msg}. You can install it manually: dsh plugin --profile {profile} add {name} (the rest of the config was imported; fix dependencies and retry from the settings page, or install by hand)',
|
|
461
|
+
'adapter.patchLineCreate': 'Write patch row {lineId}',
|
|
462
|
+
'adapter.patchLineSame': 'Patch row {lineId} is already identical',
|
|
463
|
+
'adapter.patchLineDiff': 'Patch row {lineId} differs from the target',
|
|
464
|
+
'adapter.promptSame': 'Prompt {name} is already identical',
|
|
465
|
+
'adapter.promptDiff': 'Prompt {name} differs from the target',
|
|
466
|
+
'adapter.promptDiffWithLine': 'Prompt {name} differs from the target (target lives at row {line})',
|
|
467
|
+
'adapter.promptCreate': 'Create prompt {name} (row {line})',
|
|
468
|
+
'adapter.promptManual': 'Prompt {name} has no matching source on the target; configure it manually (DSH has no standalone prompt storage)',
|
|
469
|
+
'adapter.providerUnregistered': 'Namespace {ns} of Provider {route} is not registered on the target (the providing plugin may need to be installed)',
|
|
470
|
+
'adapter.providerCreate': 'Create Provider {route} (namespace {ns})',
|
|
471
|
+
'adapter.providerSame': 'Provider {route} is already identical',
|
|
472
|
+
'adapter.providerDiff': 'Provider {route} differs from the target',
|
|
473
|
+
'adapter.settingsUnregistered': 'Settings namespace {ns} is not registered on the target (the providing plugin may need to be installed)',
|
|
474
|
+
'adapter.settingsCreate': 'Create settings {name}',
|
|
475
|
+
'adapter.settingsSame': 'Settings {name} are already identical',
|
|
476
|
+
'adapter.settingsDiff': 'Settings {name} differ from the target',
|
|
477
|
+
'adapter.workspaceCreate': 'Create workspace {title} ({path})',
|
|
478
|
+
'adapter.workspaceSame': 'Workspace {id} is already identical',
|
|
479
|
+
'adapter.workspaceDiff': 'Workspace {id} differs from the target',
|
|
480
|
+
'adapter.workspacePathMapping': 'Path needs mapping: {path}',
|
|
481
|
+
'adapter.workspaceMissing': 'Import data is missing workspace {ref}',
|
|
482
|
+
'adapter.credentialDescription': 'Re-enter credential',
|
|
483
|
+
// ---------- adapters: applyItem result messages ----------
|
|
484
|
+
'adapter.missingTargetRef': 'Missing target.ref',
|
|
485
|
+
'adapter.dataMissingFile': 'Import data is missing file {ref}',
|
|
486
|
+
'adapter.patchMissing': 'Import data is missing patch row {ref}',
|
|
487
|
+
'adapter.pwWritten': 'pnpm-workspace.yaml written (plugin installs will follow it)',
|
|
488
|
+
'adapter.pwWriteFailed': 'Failed to write pnpm-workspace.yaml: {msg} (plugin installs may be blocked; fix it and retry from the settings page)',
|
|
489
|
+
'adapter.patchFileCreate': 'Write pnpm patch file {path}',
|
|
490
|
+
'adapter.patchFileWriteFailed': 'Failed to write pnpm patch file {path}: {reason} (the matching patchedDependencies entry will be removed)',
|
|
491
|
+
'adapter.patchFileMissing': 'pnpm patch file missing, cannot be migrated: {name} → {path} (this patchedDependencies entry will be removed on import)',
|
|
492
|
+
'adapter.patchFileUnsafe': 'Unsafe pnpm patch path, skipped: {name} → {path}',
|
|
493
|
+
'adapter.patchFileReadFailed': 'Failed to read pnpm patch file: {name} → {path} ({reason})',
|
|
494
|
+
'adapter.patchFileTooLarge': 'pnpm patch file too large, not migrated: {name} → {path} (limit {limit})',
|
|
495
|
+
'adapter.pwPatchesDropped': 'Removed {count} patchedDependencies entries (the target has no matching patch file; keeping them would make pnpm reject every plugin install): {names}',
|
|
496
|
+
'adapter.pwPatchesDroppedDetail': '{count} unsatisfiable patchedDependencies entries will be removed on import: {names}',
|
|
497
|
+
'adapter.pwPatchesUnsupported': 'patchedDependencies uses single-line flow syntax, so missing entries cannot be removed safely; if the target lacks the patch files pnpm may refuse installs: {line}',
|
|
498
|
+
'adapter.pwWrittenPatchesDropped': 'pnpm-workspace.yaml written, but {count} patchedDependencies entries were removed (the target has no matching patch file): {names}',
|
|
499
|
+
'adapter.patchWritten': 'Patch row {ref} written (the host hot-reloads patches; no restart needed)',
|
|
500
|
+
'adapter.credentialValueMissing': 'Credential value not provided (re-entry required)',
|
|
501
|
+
'adapter.promptWarningNoWrite': 'Informational item; nothing to write',
|
|
502
|
+
'adapter.promptMissing': 'Import data is missing prompt {id}',
|
|
503
|
+
'adapter.promptCreated': 'Prompt {name} created (row {ref})',
|
|
504
|
+
'adapter.patchLineMissing': 'Target patch row {ref} does not exist; cannot write',
|
|
505
|
+
'adapter.promptWritten': 'Prompt {name} written to patch row {ref}',
|
|
506
|
+
'adapter.mcpMissing': 'Import data is missing MCP server {serverName}',
|
|
507
|
+
'adapter.mcpWritten': 'MCP server {serverName} written to the patch (the host hot-reloads patches; no restart needed)',
|
|
508
|
+
'adapter.workspaceWriteFailed': 'Workspace {ref} could not be written: {msg} (map the path or create the target directory first)',
|
|
509
|
+
'adapter.providerMissing': 'Import data is missing provider {route}',
|
|
510
|
+
'adapter.namespaceMissing': 'Import data is missing namespace {ref}',
|
|
511
|
+
// ---------- adapters: structural validation ----------
|
|
512
|
+
'adapter.validate.object': '{subject} data must be an object',
|
|
513
|
+
'adapter.validate.fileSection': 'File-section data must be an object',
|
|
514
|
+
'adapter.validate.version': 'version must be 1 (received {value})',
|
|
515
|
+
'adapter.validate.array': '{subject} must be an array',
|
|
516
|
+
'adapter.validate.string': '{subject} must be a string',
|
|
517
|
+
'adapter.validate.localTarballPath': 'Invalid local plugin tarball path (must live under local-plugins/ without ..): {path}',
|
|
518
|
+
'adapter.validate.missingObject': 'Missing {subject} object',
|
|
519
|
+
'adapter.validate.recordObject': '{subject} records must be objects',
|
|
520
|
+
'adapter.validate.requiredField': 'Missing {subject}',
|
|
521
|
+
'adapter.validate.sourceNamespace': 'Missing source namespace',
|
|
522
|
+
'adapter.validate.number': '{subject} must be a number',
|
|
523
|
+
'adapter.validate.nonEmptyRef': '{subject} records must have a non-empty ref',
|
|
524
|
+
'adapter.validate.credentialRef': 'Credential records must have a non-empty ref',
|
|
525
|
+
'adapter.validate.fileRelativePath': 'File records must have a non-empty relativePath',
|
|
526
|
+
'adapter.validate.promptIdentity': 'Prompt records must contain string name and text',
|
|
527
|
+
'adapter.validate.hasValueFalse': 'Values are never exported; hasValue must be false',
|
|
528
|
+
'adapter.validate.serverName': 'Server records must have a non-empty serverName',
|
|
529
|
+
'adapter.validate.workspaceIdentity': 'Workspace records must contain string id and path',
|
|
530
|
+
'adapter.validate.missingValue': 'Missing value',
|
|
531
|
+
// ---------- remote sync ----------
|
|
532
|
+
'sync.denySensitiveSection': 'Sync refuses to carry the sensitive section {section} (secret values never sync)',
|
|
533
|
+
'sync.sectionFailed': 'Section {adapter} export failed: {reason}',
|
|
534
|
+
'sync.unknownSection': 'Section {section} does not exist; skipped from sync',
|
|
535
|
+
'sync.noSections': 'No sections to sync (all exports failed)',
|
|
536
|
+
'sync.legacyEncryptedSnapshot': 'Snapshot {id} is a legacy encrypted snapshot; the sync channel neither produces nor reads encrypted snapshots (re-push over a plaintext channel on the old version)',
|
|
537
|
+
'sync.remoteEmpty': 'No snapshots on the remote',
|
|
538
|
+
'sync.missingImporter': 'SyncEngine is missing the importer: pull requires an Importer (analyzeImport/createImportPlan)',
|
|
539
|
+
'sync.missingCtx': 'SyncEngine requires ctx',
|
|
540
|
+
'sync.missingTransport': 'SyncEngine requires a complete SyncTransport (list/upload/download/delete)',
|
|
541
|
+
'sync.missingStateDir': 'SyncEngine requires stateDir',
|
|
542
|
+
'sync.unchanged': 'Remote snapshot matches local (no changes)',
|
|
543
|
+
'sync.changesSummary': 'compatibility={compatibility}, {count} change(s)',
|
|
544
|
+
'sync.configWhitespace': 'Repository URL must not contain whitespace',
|
|
545
|
+
'sync.configUnparseable': 'Cannot parse repository URL: {url}',
|
|
546
|
+
'sync.configUserinfo': 'Do not include a username/password in the repository URL (use the credential field for the auth token; it is never embedded in the URL)',
|
|
547
|
+
'sync.state.notObject': 'sync-state.json is corrupt: must be an object',
|
|
548
|
+
'sync.state.schemaUnsupported': 'sync-state.json schemaVersion not supported: {version} (expected {expected})',
|
|
549
|
+
'sync.state.lastSyncAt': 'sync-state.json is corrupt: lastSyncAt must be a string',
|
|
550
|
+
'sync.state.sections': 'sync-state.json is corrupt: sections must be an object',
|
|
551
|
+
'sync.state.sectionRecord': 'sync-state.json is corrupt: section {section} record must be an object',
|
|
552
|
+
'sync.state.sectionFields': 'sync-state.json is corrupt: section {section} record must contain string hash/updatedAt',
|
|
553
|
+
'sync.state.transport': 'sync-state.json is corrupt: transport must contain string type/ref',
|
|
554
|
+
'sync.git.repoUrlRequired': 'repoUrl must be a non-empty string',
|
|
555
|
+
'sync.git.workDirRequired': 'workDir must be a non-empty string',
|
|
556
|
+
'sync.git.credentialsRequired': 'credentials must provide getToken()',
|
|
557
|
+
'sync.git.snapshotMissing': 'Snapshot {id} does not exist (local working copy {dir})',
|
|
558
|
+
'sync.git.snapshotCorrupt': 'Encrypted snapshot {id} is corrupt ({dir}): {err}',
|
|
559
|
+
'sync.git.repoUnreachable': 'Repository unreachable or authentication failed: {url}',
|
|
560
|
+
'sync.git.workDirNotRepo': 'workDir is not a git repository (no .git) and the directory is not empty; cannot clone: {dir}',
|
|
561
|
+
'sync.git.pullFailed': 'git pull failed: {err}',
|
|
562
|
+
'sync.git.cmdFailed': 'git {args} failed (exit {code}): {err}',
|
|
563
|
+
'sync.git.repoUrlInvalid': 'Cannot parse repoUrl (http(s) repositories must be valid URLs): {url}',
|
|
564
|
+
'sync.git.invalidSnapshotId': 'Invalid snapshot id: {id} (must start with an alphanumeric; only . _ - allowed)',
|
|
565
|
+
'sync.webdav.baseUrlRequired': 'baseUrl must be a non-empty string',
|
|
566
|
+
'sync.webdav.baseUrlInvalid': 'Cannot parse baseUrl (must be a valid http(s) URL): {url}',
|
|
567
|
+
'sync.webdav.baseUrlUserinfo': 'Do not include a username/password in baseUrl (use the credential field for auth; never embedded in the URL)',
|
|
568
|
+
'sync.webdav.usernameRequired': 'username must be a non-empty string',
|
|
569
|
+
'sync.webdav.credentialsRequired': 'credentials must provide getPassword()',
|
|
570
|
+
'sync.webdav.invalidSnapshotId': 'Invalid snapshot id: {id} (must start with an alphanumeric; only . _ - allowed)',
|
|
571
|
+
'sync.webdav.snapshotMissing': 'Snapshot {id} does not exist ({url})',
|
|
572
|
+
'sync.webdav.requestFailed': '{method} {url} failed (HTTP {status}): {err}',
|
|
573
|
+
'sync.webdav.requestError': '{method} {url} request error: {err}',
|
|
574
|
+
'sync.webdav.timeout': '{method} {url} request timed out ({timeout}ms)',
|
|
575
|
+
'sync.webdav.tooManyRedirects': '{method} {url} too many redirects ({n} max), possible redirect loop',
|
|
576
|
+
'sync.webdav.indexInvalid': '{url} failed to parse or is structurally invalid: {err}',
|
|
577
|
+
'sync.webdav.snapshotInvalid': 'Snapshot {id} failed to parse or is structurally invalid: {err}',
|
|
578
|
+
'sync.pruneListFailed': 'Remote snapshot pruning failed: could not list remote snapshots, {reason}',
|
|
579
|
+
'sync.pruneDeleteFailed': 'Remote snapshot pruning failed: deleting snapshot {id} failed, {reason}',
|
|
580
|
+
// ---------- config marketplace (m-market: read-only public repo directory read + validation) ----------
|
|
581
|
+
'market.invalidItemId': 'Invalid marketplace item id: {id} (must start with an alphanumeric; only . _ - allowed)',
|
|
582
|
+
'market.urlWhitespace': 'Marketplace repository URL must not contain whitespace',
|
|
583
|
+
'market.urlUnparseable': 'Cannot parse marketplace repository URL: {url}',
|
|
584
|
+
'market.urlUserinfo': 'Do not include a username/password in the marketplace repository URL (public markets need no credential; the token is never embedded in the URL)',
|
|
585
|
+
'market.repoUnreachable': 'Marketplace repository unreachable: {url}',
|
|
586
|
+
'market.cloneFailed': 'Marketplace repository clone failed: {err}',
|
|
587
|
+
'market.pullFailed': 'Marketplace repository sync (pull) failed: {err}',
|
|
588
|
+
'market.workDirNotRepo': 'Marketplace working directory is not a git repo and is not empty; cannot clone: {dir}',
|
|
589
|
+
'market.missingIndex': 'Marketplace is missing index.json: {url}',
|
|
590
|
+
'market.missingManifest': 'Item {id} is missing manifest.json',
|
|
591
|
+
'market.missingZip': 'Item {id} is missing config.zip',
|
|
592
|
+
'market.zipTooLarge': 'config.zip size {size} exceeds the limit {limit} bytes',
|
|
593
|
+
'market.invalid': 'Item {id} failed verification: {errors}',
|
|
594
|
+
};
|
|
595
|
+
/** 插值:{param} → 形参值;缺参原样保留(便于排查)。 */
|
|
596
|
+
function interpolate(template, params) {
|
|
597
|
+
if (params === undefined)
|
|
598
|
+
return template;
|
|
599
|
+
return template.replace(/\{(\w+)\}/g, (match, key) => {
|
|
600
|
+
const value = params[key];
|
|
601
|
+
return value === undefined ? match : String(value);
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
/** 构造 MsgFunc:en → en 目录(缺键回退 zh);其余 → zh。 */
|
|
605
|
+
export function makeMsg(lang) {
|
|
606
|
+
const langKey = lang === 'en' ? 'en' : 'zh';
|
|
607
|
+
const dict = langKey === 'en' ? en : zh;
|
|
608
|
+
const fallback = langKey === 'en' ? zh : undefined;
|
|
609
|
+
return (key, params) => {
|
|
610
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
611
|
+
const template = dict[key] ?? fallback?.[key] ?? key;
|
|
612
|
+
return interpolate(template, params);
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
/** 缺省目录(zh):未注入 msg 的引擎/测试路径使用,行为与改造前完全一致。 */
|
|
616
|
+
export const zhMsg = makeMsg('zh');
|
|
617
|
+
/** 从「可能携带 msg 的对象」取翻译器;缺省 zh。 */
|
|
618
|
+
export function msgOf(ctx) {
|
|
619
|
+
return ctx?.msg ?? zhMsg;
|
|
620
|
+
}
|
|
621
|
+
//# sourceMappingURL=messages.js.map
|