dsh-config-manager 0.1.71 → 0.1.72
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 +111 -96
- package/README.zh-CN.md +207 -86
- package/lib/adapters/agent-instructions.js +1 -1
- package/lib/adapters/file-collection.js +1 -1
- package/lib/adapters/index.d.ts +1 -1
- package/lib/adapters/index.js +1 -1
- package/lib/adapters/link-report.d.ts +1 -0
- package/lib/adapters/link-report.js +27 -3
- package/lib/adapters/messages.d.ts +18 -0
- package/lib/adapters/messages.js +50 -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 +7 -1
- package/lib/adapters/self.js +1 -1
- package/lib/adapters/sessions.d.ts +1 -0
- package/lib/adapters/sessions.js +4 -2
- 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 +1349 -490
- package/lib/client.js +43047 -36738
- package/lib/core/backup-plan.js +30 -17
- package/lib/core/backup-verify.js +24 -23
- package/lib/core/backup.d.ts +5 -0
- package/lib/core/backup.js +51 -25
- package/lib/core/boot-rescue.js +4 -3
- package/lib/core/boot-safety.js +2 -1
- package/lib/core/command-rollback.d.ts +178 -0
- package/lib/core/command-rollback.js +289 -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 +292 -0
- package/lib/core/messages-core.js +615 -0
- package/lib/core/messages.d.ts +60 -2
- package/lib/core/messages.js +116 -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/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-ignore-rules.d.ts +31 -0
- package/lib/core/rollback-ignore-rules.js +140 -0
- package/lib/core/rollback-point.d.ts +1208 -0
- package/lib/core/rollback-point.js +2993 -0
- 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 +18 -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.js +7 -6
- 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 +223 -7
- package/lib/index.js +729 -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 +42 -0
- package/lib/routes/messages.js +100 -0
- package/lib/routes/profiles.js +12 -6
- package/lib/routes/recovery.js +378 -114
- package/lib/routes/snapshots.js +51 -4
- package/lib/routes/sync.js +68 -16
- 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 +41 -14
- package/lib/schema/section-registry.js +35 -29
- 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 +37 -15
- package/lib/sync/sync-engine.js +67 -37
- 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/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/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 +24 -20
- package/lib/ui/foreign-view.d.ts +5 -1
- package/lib/ui/foreign-view.js +26 -2
- package/lib/ui/i18n.d.ts +65 -0
- package/lib/ui/i18n.js +114 -0
- 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 +756 -0
- package/lib/ui/rollback-view.js +724 -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/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 +1 -1
- package/src/adapters/link-report.test.ts +22 -2
- package/src/adapters/link-report.ts +29 -4
- package/src/adapters/messages.ts +54 -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 +8 -2
- package/src/adapters/sessions.ts +4 -2
- package/src/adapters/settings.test.ts +38 -1
- 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 +391 -0
- package/src/client/chat/RollbackDiffTab.tsx +61 -0
- package/src/client/chat/RollbackFileIcon.tsx +96 -0
- package/src/client/chat/RollbackReviewDialog.tsx +591 -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 +173 -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 +164 -0
- package/src/client/chat/rollback-entry-view.test.ts +1469 -0
- package/src/client/chat/rollback-entry-view.ts +941 -0
- package/src/client/chat/sidebar-slots.ts +37 -0
- package/src/client/common/ConfirmDialog.tsx +7 -3
- package/src/client/common/ContentPicker.tsx +48 -10
- package/src/client/common/DiffTable.tsx +97 -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 +78 -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 +28 -0
- package/src/client/common/ui.tsx +73 -10
- package/src/client/config-manager.module.css +996 -21
- 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 +186 -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 +54 -5
- 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 +665 -0
- package/src/client/recovery/RollbackDiffPane.tsx +58 -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 +116 -6
- package/src/client/recovery/recovery-locales.test.ts +299 -0
- package/src/client/recovery/recovery-locales.ts +488 -149
- package/src/client/recovery/recovery-panel-layout.test.ts +132 -2
- package/src/client/recovery/rollback-file-changes.test.ts +73 -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/backup-plan.test.ts +28 -0
- package/src/core/backup-plan.ts +29 -17
- package/src/core/backup-verify.ts +24 -23
- package/src/core/backup.test.ts +76 -0
- package/src/core/backup.ts +55 -25
- 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 +402 -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 +657 -0
- package/src/core/messages.ts +123 -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/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-ignore-rules.ts +126 -0
- package/src/core/rollback-point.test.ts +2603 -0
- package/src/core/rollback-point.ts +3755 -0
- 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 +18 -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.ts +7 -6
- 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 +813 -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 +104 -0
- package/src/routes/profiles.ts +12 -6
- package/src/routes/recovery.test.ts +405 -1
- package/src/routes/recovery.ts +377 -109
- package/src/routes/snapshots.ts +51 -4
- package/src/routes/sync.ts +67 -16
- package/src/schema/config.ts +53 -20
- package/src/schema/index.ts +7 -5
- package/src/schema/manifest.ts +19 -18
- package/src/schema/messages.ts +120 -0
- package/src/schema/registry.test.ts +19 -5
- package/src/schema/section-registry.ts +64 -39
- 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-engine-download-tombstone.test.ts +1 -1
- package/src/sync/sync-engine.test.ts +226 -8
- package/src/sync/sync-engine.ts +103 -41
- 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/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/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 +24 -20
- package/src/ui/foreign-view.test.ts +43 -0
- package/src/ui/foreign-view.ts +30 -3
- package/src/ui/i18n.ts +125 -0
- 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 +819 -0
- package/src/ui/rollback-view.ts +1339 -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/types.ts +10 -4
- package/src/utils/atomic-write.ts +6 -5
- package/src/utils/bundle-scan.test.ts +2 -2
- package/src/utils/bundle-scan.ts +12 -1
- package/src/utils/env-lock.ts +83 -49
- package/src/utils/json.ts +7 -5
- package/src/utils/messages-utils.ts +232 -0
- package/src/utils/proxy.test.ts +25 -0
- package/src/utils/proxy.ts +19 -5
- package/src/utils/recursive-walk.test.ts +43 -0
- package/src/utils/recursive-walk.ts +75 -1
- package/src/utils/session-log-repair.ts +10 -9
- package/src/utils/zip.ts +27 -26
- package/lib/core/checkpoint.d.ts +0 -362
- package/lib/core/checkpoint.js +0 -1309
- package/src/core/checkpoint.test.ts +0 -665
- package/src/core/checkpoint.ts +0 -1614
package/lib/client.d.ts
CHANGED
|
@@ -178,6 +178,13 @@ interface ExportUnit {
|
|
|
178
178
|
* 包里 41 条)。非 sessions 分区 / 非子代理会话一律不设该字段(不猜)。
|
|
179
179
|
*/
|
|
180
180
|
parentSessionId?: string;
|
|
181
|
+
/**
|
|
182
|
+
* 空白会话(**从未提问过**;只有 sessions 分区的单元可能有值)。
|
|
183
|
+
*
|
|
184
|
+
* 用途:DSH 自己给这类会话的标题就是本地化的「新会话」(`session.new`),没有标题可显示。
|
|
185
|
+
* 只下发**事实**,不下发文案 —— 界面按当前语言显示(与 DSH 同口径),绝不用 uuid 冒充标题。
|
|
186
|
+
*/
|
|
187
|
+
blank?: boolean;
|
|
181
188
|
}
|
|
182
189
|
type PlanItemKind = 'Create' | 'Update' | 'Skip' | 'Conflict' | 'Install' | 'MissingSecret' | 'MissingDependency' | 'PathMapping' | 'Warning' | 'Error';
|
|
183
190
|
type ItemResolution = 'keepCurrent' | 'useImported' | 'review';
|
|
@@ -248,6 +255,8 @@ interface PlanItem {
|
|
|
248
255
|
label?: string;
|
|
249
256
|
/** 单元的**二级分组名**(可选,同 `/export-preview` 的 `ExportUnit.group` 语义;纯展示)。 */
|
|
250
257
|
group?: string;
|
|
258
|
+
/** 空白会话(从未提问;同 `ExportUnit.blank`,只下发事实、文案由界面本地化)。 */
|
|
259
|
+
blank?: boolean;
|
|
251
260
|
/** 本项对应的**工作区记录拥有的会话 id**(工作区计划项专用;issue #45 勾选联动)。 */
|
|
252
261
|
sessionIds?: string[];
|
|
253
262
|
/** 本工作区计划项 **path 的 cwd 目录键**(`projectKeyOf(path)`;issue #45 勾选联动第二判据)。 */
|
|
@@ -1179,10 +1188,10 @@ interface BackupFileMeta {
|
|
|
1179
1188
|
}
|
|
1180
1189
|
//#endregion
|
|
1181
1190
|
//#region src/core/disk-usage.d.ts
|
|
1182
|
-
/**
|
|
1183
|
-
declare const DISK_USAGE_AREAS: readonly [
|
|
1184
|
-
/**
|
|
1185
|
-
type
|
|
1191
|
+
/** 体检子区(顺序即报告/展示顺序:先备份产物,再缓存/暂存,末位为只读保护的附加区) */
|
|
1192
|
+
declare const DISK_USAGE_AREAS: readonly ["exports", "snapshots", "sync", "marketCache", "marketWork", "tmp", "logs", "bootState", "migrationHistory", "transactions", "locks", "vault", "rollback-points"];
|
|
1193
|
+
/** 全部体检子区 id(= `DISK_USAGE_AREAS` 的元素类型) */
|
|
1194
|
+
type DiskUsageScanArea = typeof DISK_USAGE_AREAS[number];
|
|
1186
1195
|
/** 子区回收策略语义(决定界面文案,不由界面自行判断) */
|
|
1187
1196
|
type DiskUsagePolicy =
|
|
1188
1197
|
/** 可随时重建/可重新下载:现在就能整块清掉(tmp、market/cache、market/work) */
|
|
@@ -1208,20 +1217,49 @@ interface DiskUsageAreaReport {
|
|
|
1208
1217
|
/** 已超过保留期的条目数(仅 retained) */
|
|
1209
1218
|
expiredCount?: number;
|
|
1210
1219
|
}
|
|
1220
|
+
/** 单条遗留数据的体检结果(只报告;`policy` 恒为 protected) */
|
|
1221
|
+
interface DiskUsageLegacyEntry {
|
|
1222
|
+
/** 稳定 id(与 `LEGACY_DATA_DIRS` 逐条对应) */
|
|
1223
|
+
id: string;
|
|
1224
|
+
/** 相对 dataDir 的路径(如 `checkpoints`) */
|
|
1225
|
+
relPath: string;
|
|
1226
|
+
/** 绝对路径(界面「在哪儿」展示) */
|
|
1227
|
+
path: string;
|
|
1228
|
+
/** 字节数(不存在/不可读 → 0,必须与 unreadable 一起看) */
|
|
1229
|
+
sizeBytes: number;
|
|
1230
|
+
/** 文件数(不存在/不可读 → 0) */
|
|
1231
|
+
fileCount: number;
|
|
1232
|
+
/** 读不到/不存在/被非目录占住 → true(界面必须显示「未统计」,绝不伪报 0 字节) */
|
|
1233
|
+
unreadable: boolean;
|
|
1234
|
+
/** 恒为 `protected`:只报告,绝不提供自动清理 */
|
|
1235
|
+
policy: 'protected';
|
|
1236
|
+
}
|
|
1237
|
+
/** 子区明细记录:`DISK_USAGE_AREAS` 的**每个**子区(含回滚点库等附加子区)逐键必填 ——
|
|
1238
|
+
* 报告运行时恒为完整结构,索引访问不可能拿到 undefined(`noUncheckedIndexedAccess` 下也成立,
|
|
1239
|
+
* 故只读消费者如离线救急台可直接 `report.areas[area]`,不需要缺失回退)。 */
|
|
1240
|
+
type DiskUsageAreasReport = Record<DiskUsageScanArea, DiskUsageAreaReport>;
|
|
1211
1241
|
/** 体检报告(路径字段供界面「在哪儿」展示;均为本机绝对路径,无敏感内容) */
|
|
1212
1242
|
interface DiskUsageReport {
|
|
1213
1243
|
/** dataDir(`$DSH_HOME/dsh-config-manager`) */
|
|
1214
1244
|
dataDir: string;
|
|
1215
|
-
/**
|
|
1245
|
+
/** 全部**子区**合计字节数(含回滚点库等附加子区;**不含**遗留数据 —— 见 legacy) */
|
|
1216
1246
|
totalBytes: number;
|
|
1217
|
-
/**
|
|
1247
|
+
/** 全部子区合计文件数(口径同 totalBytes) */
|
|
1218
1248
|
totalFiles: number;
|
|
1219
1249
|
/** 可立即清理(regenerable)子区合计字节数 */
|
|
1220
1250
|
reclaimableBytes: number;
|
|
1221
1251
|
/** 到达自动回收期的字节数(retained 子区) */
|
|
1222
1252
|
expiredBytes: number;
|
|
1223
|
-
/**
|
|
1224
|
-
areas:
|
|
1253
|
+
/** 各子区明细(恒含 `DISK_USAGE_AREAS` 的全部子区,逐键必填) */
|
|
1254
|
+
areas: DiskUsageAreasReport;
|
|
1255
|
+
/**
|
|
1256
|
+
* 遗留数据明细(插件**已不再读取**、也**不代删**;只报告)。
|
|
1257
|
+
* 结构可容纳多条(见 `LEGACY_DATA_DIRS`);**不计入 totalBytes**(子区合计与遗留数据
|
|
1258
|
+
* 分开列,界面才不会把「能解释来源的占用」和「遗留占用」混成一个数)。
|
|
1259
|
+
* 类型上可选只是为了让既有报告字面量(测试/旧调用方)继续成立 —— 宿主
|
|
1260
|
+
* `GET /disk-usage` 恒回传本字段(无遗留目录时为空数组)。
|
|
1261
|
+
*/
|
|
1262
|
+
legacy?: readonly DiskUsageLegacyEntry[];
|
|
1225
1263
|
/** 定时备份产物的保留口径(「保留最近 N 个」;界面用它解释为什么有的备份不会自动回收) */
|
|
1226
1264
|
backupRetention: {
|
|
1227
1265
|
keepLast: number;
|
|
@@ -1241,6 +1279,13 @@ type SessionHealthSeverity = 'blocksStartup' | 'unloadable' | 'nextRequestFails'
|
|
|
1241
1279
|
interface SessionHealthRowView {
|
|
1242
1280
|
unitId: string;
|
|
1243
1281
|
sessionId: string;
|
|
1282
|
+
/**
|
|
1283
|
+
* 对话标题(宿主从 DSH 会话缓存补;**可能缺省** —— 缓存没覆盖这条会话时就没有)。
|
|
1284
|
+
* 界面不得拿目录名伪装成标题,也不得编造:缺省 → 回落显示 sessionId。
|
|
1285
|
+
*/
|
|
1286
|
+
title?: string;
|
|
1287
|
+
/** 空白会话(从未提问过;宿主下发的事实)—— 界面显示本地化的「新会话」,不用 uuid 冒充标题。 */
|
|
1288
|
+
blank?: boolean;
|
|
1244
1289
|
projectKey: string;
|
|
1245
1290
|
severity: SessionHealthSeverity;
|
|
1246
1291
|
issues: {
|
|
@@ -1383,395 +1428,17 @@ interface SessionRepairRollbackResult {
|
|
|
1383
1428
|
sessionId?: string;
|
|
1384
1429
|
}
|
|
1385
1430
|
//#endregion
|
|
1386
|
-
//#region src/ui/
|
|
1431
|
+
//#region src/ui/i18n.d.ts
|
|
1387
1432
|
/**
|
|
1388
|
-
*
|
|
1433
|
+
* 客户端展示层(src/ui/*、src/client/common/*)的渲染文案目录(zh 源语言 / en 镜像)。
|
|
1389
1434
|
*
|
|
1390
|
-
*
|
|
1391
|
-
*
|
|
1392
|
-
|
|
1393
|
-
type PluginUpdateCheckResult = {
|
|
1394
|
-
ok: true;
|
|
1395
|
-
/** 当前运行的插件版本 */
|
|
1396
|
-
current: string;
|
|
1397
|
-
/** npm 上的 latest */
|
|
1398
|
-
latest: string;
|
|
1399
|
-
/** latest > current(严格更新才算;本地跑预发布版时不提示降级) */
|
|
1400
|
-
updateAvailable: boolean;
|
|
1401
|
-
/** 本次结论时间戳(ms;缓存命中时为首查时间) */
|
|
1402
|
-
checkedAt: number;
|
|
1403
|
-
/** 是否来自进程内缓存 */
|
|
1404
|
-
cached: boolean;
|
|
1405
|
-
} | {
|
|
1406
|
-
ok: false;
|
|
1407
|
-
current: string;
|
|
1408
|
-
/** 失败原因(网络 / 超时 / 响应畸形;可读、可重试、无敏感信息) */
|
|
1409
|
-
error: string;
|
|
1410
|
-
};
|
|
1411
|
-
/**
|
|
1412
|
-
* POST /update-apply 的结果(关于页「立即更新」)。
|
|
1435
|
+
* 与 core 的 messages.ts 分工:本目录负责「客户端纯渲染层」(ReportView / ErrorBanner /
|
|
1436
|
+
* ProgressBar / sync-view)产生的中文文案;core 侧引擎消息已随 API 数据源翻译。
|
|
1437
|
+
* 这些纯函数原先直接内嵌中文,现经 UiDict 注入:Client 挂载时按 ctx.locale 提供。
|
|
1413
1438
|
*
|
|
1414
|
-
*
|
|
1415
|
-
*
|
|
1416
|
-
*
|
|
1417
|
-
* 只有未知码才回落到宿主返回的原始错误文本。
|
|
1418
|
-
*/
|
|
1419
|
-
type PluginUpdateApplyResult = {
|
|
1420
|
-
ok: true;
|
|
1421
|
-
version: string;
|
|
1422
|
-
command: string;
|
|
1423
|
-
needsRestart: true;
|
|
1424
|
-
} | {
|
|
1425
|
-
ok: false;
|
|
1426
|
-
code: SelfUpdateFailureCode;
|
|
1427
|
-
error: string;
|
|
1428
|
-
};
|
|
1429
|
-
/** 手动清理可点选的动作:可重建区(tmp + 市场缓存/工作副本)/ 已到期的导出产物。 */
|
|
1430
|
-
type DiskUsageCleanCategory = 'tmp' | 'expired-exports';
|
|
1431
|
-
/** POST /disk-usage/cleanup 的回执(回执里带刷新后的报告,避免界面再发一次 GET)。 */
|
|
1432
|
-
interface DiskUsageCleanupResult {
|
|
1433
|
-
ok: boolean;
|
|
1434
|
-
/** 本次请求实际覆盖的动作 */
|
|
1435
|
-
requested: DiskUsageCleanCategory[];
|
|
1436
|
-
/** 被排除的动作(只请求了 tmp 时 = ['expired-exports'])——界面据此如实说明,不假装清过 */
|
|
1437
|
-
excluded: DiskUsageCleanCategory[];
|
|
1438
|
-
/** 删除条目数(文件 + 目录) */
|
|
1439
|
-
removed: number;
|
|
1440
|
-
/** 释放字节数(含目录递归,按清理前后子区体积差计) */
|
|
1441
|
-
freedBytes: number;
|
|
1442
|
-
/** 分区级释放量(子区 id → 字节;只含本次实际清理过的子区) */
|
|
1443
|
-
freedByArea: Partial<Record<string, number>>;
|
|
1444
|
-
/** 单项失败数(不影响其余清理) */
|
|
1445
|
-
errors: number;
|
|
1446
|
-
/** 逐条删除记录(相对 dataDir 的描述 + 字节数) */
|
|
1447
|
-
detail: string[];
|
|
1448
|
-
/** 清理后重新体检的报告 */
|
|
1449
|
-
report: DiskUsageReport;
|
|
1450
|
-
}
|
|
1451
|
-
/** recovery 决策(§5.2):rollback-recommended=恢复到 trusted snapshot;rollback-continue=续跑中断回滚;needs-attention=需人工调查。 */
|
|
1452
|
-
type RecoveryDecision = 'rollback-recommended' | 'rollback-continue' | 'needs-attention';
|
|
1453
|
-
/** post-recovery verification verdict(§6.3)。 */
|
|
1454
|
-
type RecoveryVerdict = 'MATCH' | 'PARTIAL_MATCH' | 'MISMATCH' | 'VERIFICATION_ERROR';
|
|
1455
|
-
/** GET /recovery/status 的单个 incident(未解决 operation)。 */
|
|
1456
|
-
interface RecoveryIncident {
|
|
1457
|
-
operationId: string;
|
|
1458
|
-
operationType: string;
|
|
1459
|
-
state: string;
|
|
1460
|
-
decision: RecoveryDecision;
|
|
1461
|
-
snapshotId: string | null;
|
|
1462
|
-
/** 已 redact 的原因文本。 */
|
|
1463
|
-
reason: string;
|
|
1464
|
-
createdAt: string;
|
|
1465
|
-
}
|
|
1466
|
-
/** GET /recovery/status 响应。 */
|
|
1467
|
-
interface RecoveryStatus {
|
|
1468
|
-
incidents: RecoveryIncident[];
|
|
1469
|
-
running: {
|
|
1470
|
-
runId: string;
|
|
1471
|
-
status: string;
|
|
1472
|
-
}[];
|
|
1473
|
-
/**
|
|
1474
|
-
* 环境锁状态摘要(issue #31)。纯残留锁**不是** journal:进程在 op 期间被杀时
|
|
1475
|
-
* `journalId: null`、`transactions/active/` 为空,incidents 恒为 [],而 423 文案却
|
|
1476
|
-
* 让用户去「事故恢复」处理 → 面板恒空、GUI 无出路。本字段让面板能显示可执行的锁事项。
|
|
1477
|
-
* 旧宿主不返回 → undefined(面板按「无锁事项」处理,不误报)。
|
|
1478
|
-
*/
|
|
1479
|
-
lock?: RecoveryLockStatus;
|
|
1480
|
-
/**
|
|
1481
|
-
* SAFE MODE 阻断态(issue #56)。此前 status 完全没有这个信息 ⇒ 「durable 标记还在、
|
|
1482
|
-
* active/ 却已空」时面板显示「暂无需要处理的恢复事项」,而所有写操作持续 423 —— 用户
|
|
1483
|
-
* 看不到任何线索,也没有任何出口。
|
|
1484
|
-
*
|
|
1485
|
-
* 旧宿主不返回 → undefined(面板按「未阻断」处理,不误报保护)。
|
|
1486
|
-
*/
|
|
1487
|
-
safeMode?: RecoverySafeModeStatus;
|
|
1488
|
-
/**
|
|
1489
|
-
* 中断的档案复制残留(cross-F3 / t54):目标目录带 `.dcm-copy-in-progress.json` 标记、
|
|
1490
|
-
* 却没有 package.json 的半截副本。它们既不在档案列表里、删除又报 notFound ——
|
|
1491
|
-
* 用户此前在「事故恢复」里既看不到、也没有任何处置入口。
|
|
1492
|
-
* 旧宿主不返回 → undefined(按「无残留」处理,不误报)。
|
|
1493
|
-
*/
|
|
1494
|
-
incompleteCopies?: RecoveryIncompleteCopy[];
|
|
1495
|
-
/**
|
|
1496
|
-
* t89:残留**枚举失败**(读 profiles 目录失败)时为 true —— 与「确实没有残留」
|
|
1497
|
-
* (字段缺省)区分开:此前两者在响应里完全同形(都是 `incompleteCopies: []`),
|
|
1498
|
-
* 界面便把「读不到」渲染成「暂无残留」。
|
|
1499
|
-
* 旧宿主不返回 → undefined(按「读到了」处理,绝不误报失败)。
|
|
1500
|
-
*/
|
|
1501
|
-
incompleteCopiesUnreadable?: boolean;
|
|
1502
|
-
}
|
|
1503
|
-
/**
|
|
1504
|
-
* 中断的档案复制残留(cross-F3 / t54):**只允许删除**。
|
|
1505
|
-
* 形态恒为 generic ⇒ 不可启动(没有 package.json,spawn 出去只会得到一个起不来的实例)。
|
|
1506
|
-
*/
|
|
1507
|
-
interface RecoveryIncompleteCopy {
|
|
1508
|
-
/** 目标档案名(= 目录名) */
|
|
1509
|
-
name: string;
|
|
1510
|
-
/** 目标目录绝对路径(界面渲染前过 `redact()`) */
|
|
1511
|
-
dir: string;
|
|
1512
|
-
/** 来源档案名(标记不可解析时为 null —— 界面不臆造) */
|
|
1513
|
-
sourceName: string | null;
|
|
1514
|
-
/** 复制开始时刻(ISO;标记不可解析时为 null) */
|
|
1515
|
-
startedAt: string | null;
|
|
1516
|
-
}
|
|
1517
|
-
/** SAFE MODE 阻断态摘要(只暴露结论与是否可解除)。 */
|
|
1518
|
-
interface RecoverySafeModeStatus {
|
|
1519
|
-
/** durable 标记当前是否在阻断写操作(与 mutation gate 的 isBlocked 同源)。 */
|
|
1520
|
-
blocked: boolean;
|
|
1521
|
-
/**
|
|
1522
|
-
* 是否「没有未解决 incident,可安全解除」——即「结案但保护仍开着」。
|
|
1523
|
-
* 面板仅在 blocked && clearable 时渲染「解除安全模式」入口;还有 NEEDS_ATTENTION
|
|
1524
|
-
* 事务时必须先处理它(宿主侧也会拒绝,界面不给假按钮)。
|
|
1525
|
-
*/
|
|
1526
|
-
clearable: boolean;
|
|
1527
|
-
}
|
|
1528
|
-
/** 环境锁状态摘要:**只暴露分类**(owner pid/op/hostname 属内部诊断,不进 UI/响应体)。 */
|
|
1529
|
-
interface RecoveryLockStatus {
|
|
1530
|
-
/** LockState:STALE_LOCK_DETECTED / UNKNOWN_STATE / LOCKED / FREE / LOCK_IO_ERROR / PERMISSION_ERROR */
|
|
1531
|
-
state: string;
|
|
1532
|
-
/** 是否需用户显式处理(残留锁/无法判定)。LOCKED 活锁为 false —— 它会自行释放,不该催用户回收。 */
|
|
1533
|
-
attention: boolean;
|
|
1534
|
-
}
|
|
1535
|
-
/** POST /recovery/lock/recover 响应(显式回收 stale 残留锁;拒绝时 ok=false)。 */
|
|
1536
|
-
interface RecoveryLockRecoverResult {
|
|
1537
|
-
ok: boolean;
|
|
1538
|
-
removed: boolean;
|
|
1539
|
-
state: string;
|
|
1540
|
-
}
|
|
1541
|
-
/**
|
|
1542
|
-
* POST /recovery/safe-mode/clear 响应(issue #56:显式解除 SAFE MODE)。
|
|
1543
|
-
* - 已解除 → `ok:true, cleared:true`;
|
|
1544
|
-
* - 本来就没阻断 → `ok:true, cleared:false, reason:'not-blocked'`(幂等,不是错误);
|
|
1545
|
-
* - 还有未解决 incident → `ok:false, cleared:false, reason:'unresolved-incidents', unresolved:N`。
|
|
1546
|
-
*/
|
|
1547
|
-
interface RecoverySafeModeClearResult {
|
|
1548
|
-
ok: boolean;
|
|
1549
|
-
cleared: boolean;
|
|
1550
|
-
reason?: string;
|
|
1551
|
-
unresolved?: number;
|
|
1552
|
-
}
|
|
1553
|
-
/** GET /recovery/:operationId/preview 响应(只读,零写入)。 */
|
|
1554
|
-
interface RecoveryPreview {
|
|
1555
|
-
operationId: string;
|
|
1556
|
-
operationType: string;
|
|
1557
|
-
state: string;
|
|
1558
|
-
decision: RecoveryDecision;
|
|
1559
|
-
snapshotId: string | null;
|
|
1560
|
-
snapshotVerdict: string | null;
|
|
1561
|
-
snapshotMeta: {
|
|
1562
|
-
id: string;
|
|
1563
|
-
createdAt: string;
|
|
1564
|
-
operationType?: string;
|
|
1565
|
-
} | null;
|
|
1566
|
-
environmentFingerprint: string;
|
|
1567
|
-
environmentCompatible: boolean;
|
|
1568
|
-
reason: string;
|
|
1569
|
-
createdAt: string;
|
|
1570
|
-
}
|
|
1571
|
-
/** POST /recovery/:operationId/verify 响应。 */
|
|
1572
|
-
interface RecoveryVerifyResult {
|
|
1573
|
-
ok: boolean;
|
|
1574
|
-
operationId: string;
|
|
1575
|
-
verdict: RecoveryVerdict;
|
|
1576
|
-
terminal: string;
|
|
1577
|
-
/** 每项检查结果(已 redact)。 */
|
|
1578
|
-
details: string[];
|
|
1579
|
-
/** 需人工处理项(已 redact)。 */
|
|
1580
|
-
manualHints: string[];
|
|
1581
|
-
}
|
|
1582
|
-
/** POST /recovery/:operationId/execute|retry 响应。 */
|
|
1583
|
-
interface RecoveryExecuteResult {
|
|
1584
|
-
ok: boolean;
|
|
1585
|
-
operationId: string;
|
|
1586
|
-
decision: RecoveryDecision;
|
|
1587
|
-
state: string;
|
|
1588
|
-
runId: string;
|
|
1589
|
-
}
|
|
1590
|
-
/** POST /recovery/:operationId/confirm 响应。 */
|
|
1591
|
-
interface RecoveryConfirmResult {
|
|
1592
|
-
ok: boolean;
|
|
1593
|
-
operationId: string;
|
|
1594
|
-
snapshotId: string;
|
|
1595
|
-
verdict: string;
|
|
1596
|
-
}
|
|
1597
|
-
/** POST /recovery/:operationId/dismiss 响应。 */
|
|
1598
|
-
interface RecoveryDismissResult {
|
|
1599
|
-
ok: boolean;
|
|
1600
|
-
operationId: string;
|
|
1601
|
-
dismissed: boolean;
|
|
1602
|
-
}
|
|
1603
|
-
/**
|
|
1604
|
-
* Recovery 端口契约(§10.3):recovery 无现有 port(ExportPort/ImportPort 只服务控制器)。
|
|
1605
|
-
* `recovery-api.ts` 实现之;`recovery-view.ts` 是纯渲染模型(非控制器),消费本端口返回的渲染数据。
|
|
1606
|
-
* 安全:所有 destructive 动作(confirm/execute/retry/dismiss)必须显式传 userConfirmed=true,
|
|
1607
|
-
* 由 Host 侧双重校验(请求体 + journal 状态机)。
|
|
1608
|
-
*/
|
|
1609
|
-
interface RecoveryPort {
|
|
1610
|
-
status(): Promise<RecoveryStatus>;
|
|
1611
|
-
preview(operationId: string): Promise<RecoveryPreview>;
|
|
1612
|
-
confirm(operationId: string, userConfirmed: boolean): Promise<RecoveryConfirmResult>;
|
|
1613
|
-
execute(operationId: string, userConfirmed: boolean): Promise<RecoveryExecuteResult>;
|
|
1614
|
-
verify(operationId: string): Promise<RecoveryVerifyResult>;
|
|
1615
|
-
retry(operationId: string, userConfirmed: boolean): Promise<RecoveryExecuteResult>;
|
|
1616
|
-
dismiss(operationId: string, userConfirmed: boolean): Promise<RecoveryDismissResult>;
|
|
1617
|
-
/**
|
|
1618
|
-
* POST /recovery/lock/recover(issue #31):显式回收 stale 残留配置锁。
|
|
1619
|
-
* 不带 operationId(残留锁没有 journal);宿主侧会重新证明确属 stale 才回收,
|
|
1620
|
-
* 无法证明(活锁/判定不确定/二次验证失败)→ 返回 ok=false 且不做任何改动。
|
|
1621
|
-
*/
|
|
1622
|
-
recoverStaleLock(userConfirmed: boolean): Promise<RecoveryLockRecoverResult>;
|
|
1623
|
-
/**
|
|
1624
|
-
* POST /recovery/safe-mode/clear(issue #56):显式解除仍然生效的 SAFE MODE 保护。
|
|
1625
|
-
* 不带 operationId(该状态下往往已无 active journal);宿主侧会重新判定
|
|
1626
|
-
* 「是否还有未解决的恢复事项」,有则拒绝(ok=false),绝不无条件清标记。
|
|
1627
|
-
*/
|
|
1628
|
-
clearSafeMode(userConfirmed: boolean): Promise<RecoverySafeModeClearResult>;
|
|
1629
|
-
/**
|
|
1630
|
-
* GET /recovery/sessions(T5,**只读**):本机存量会话的体检(损坏分类 + 可见性)。
|
|
1631
|
-
*
|
|
1632
|
-
* 为什么挂在 RecoveryPort 而不是新开一个端口:它与「我的对话去哪了」是同一件事,
|
|
1633
|
-
* 且宿主把它挂在既有 recovery prefix 路由下(不新增注册路由条目)。
|
|
1634
|
-
* `limit` 只影响回传浏览器的行数(摘要里的 total 仍是全量口径)。
|
|
1635
|
-
*/
|
|
1636
|
-
sessions(limit?: number): Promise<SessionHealthResponse>;
|
|
1637
|
-
/**
|
|
1638
|
-
* POST /recovery/sessions/repair(T8):应用内修复一份会话日志。
|
|
1639
|
-
*
|
|
1640
|
-
* apply=false 只预览(零写入);apply=true 时**必须**回传预览给出的 expect 指纹 ——
|
|
1641
|
-
* 宿主用它做 TOCTOU 判定(预览之后文件被改过就拒绝,绝不按旧计划写入)。
|
|
1642
|
-
* 执行器自带完整安全序列(写前校验 → 时间戳备份 → 原子换入 → 写后复验)。
|
|
1643
|
-
*/
|
|
1644
|
-
repairSession(unitId: string, apply: boolean, expect?: {
|
|
1645
|
-
size: number;
|
|
1646
|
-
mtimeMs: number;
|
|
1647
|
-
}, allowLossy?: boolean): Promise<SessionRepairResult>;
|
|
1648
|
-
/** POST /recovery/sessions/rollback(T8):按台账里的 repairId 回滚一次修复(客户端不传路径)。 */
|
|
1649
|
-
rollbackSessionRepair(repairId: string): Promise<SessionRepairRollbackResult>;
|
|
1650
|
-
}
|
|
1651
|
-
//#endregion
|
|
1652
|
-
//#region src/client/session-export/session-export-view.d.ts
|
|
1653
|
-
/**
|
|
1654
|
-
* 「下载原始日志 (ZIP)」入口的**纯展示模型**(F-2,框架无关、node 可测)。
|
|
1655
|
-
*
|
|
1656
|
-
* 本模块**不做任何 I/O 与 React**:输入是宿主探测回来的结构化事实,输出是组件直接渲染的三件事 ——
|
|
1657
|
-
* 是否可用、给用户看的原因、按钮的交互状态。判定集中在这里的原因很实在:这条入口最容易犯的错
|
|
1658
|
-
* **不是**功能错,而是**显隐判据错**(生态竞品普遍用已过时的 `status !== 501` 探测,在本机 DSH 上
|
|
1659
|
-
* 会因为服务缺失返 500 而**几乎恒显示**)。判据只能有一份,且必须可单测。
|
|
1660
|
-
*
|
|
1661
|
-
* 三态语义(与宿主 src/routes/session-export.ts 的 `SessionExportAvailability` 同源):
|
|
1662
|
-
* - `available` → 显示并可用;
|
|
1663
|
-
* - `unavailable` → **显示但禁用**,并给出可读原因(绝不静默、也绝不直接消失让用户以为没这功能);
|
|
1664
|
-
* - `unknown` → **保守显示为可用**(拿不到状态码时绝不猜成「不支持」——那会藏掉一个其实能用的功能)。
|
|
1665
|
-
*
|
|
1666
|
-
* 为什么 `unavailable` 是「禁用 + 说明」而不是「隐藏」:隐藏会让用户无从判断「是这台机器不支持」
|
|
1667
|
-
* 还是「插件没做这个功能」;禁用 + 一句话原因把这句话说清楚(与仓库「绝不静默」的既有取向一致)。
|
|
1668
|
-
*/
|
|
1669
|
-
/** 可用性三态(与宿主 src/routes/session-export.ts 的判定同源)。 */
|
|
1670
|
-
type SessionExportAvailability = 'available' | 'unavailable' | 'unknown';
|
|
1671
|
-
/** 成因(机器可读;界面映射成文案,**绝不渲染裸码**)。 */
|
|
1672
|
-
type SessionExportReason = 'service-missing' | 'auth-required' | 'read-failed' | 'network-error' | 'unexpected-status';
|
|
1673
|
-
/** 宿主探测回来的结构化事实(与 GET /session-export 的响应字段一一对应)。 */
|
|
1674
|
-
interface SessionExportProbe {
|
|
1675
|
-
availability: SessionExportAvailability;
|
|
1676
|
-
reason?: SessionExportReason;
|
|
1677
|
-
/** DSH 返回的状态码(0 = 没拿到响应) */
|
|
1678
|
-
status: number;
|
|
1679
|
-
/** 探测的路径(诊断用) */
|
|
1680
|
-
path: string;
|
|
1681
|
-
/** 探测时刻(ISO) */
|
|
1682
|
-
checkedAt: string;
|
|
1683
|
-
}
|
|
1684
|
-
//#endregion
|
|
1685
|
-
//#region src/foreign/types.d.ts
|
|
1686
|
-
/** 未能迁移的外部内容(响亮失败:宁可在计划里报出来,也不静默丢) */
|
|
1687
|
-
interface ForeignSkip {
|
|
1688
|
-
/** 稳定机器码(UI 用它映射文案;禁止渲染裸枚举) */
|
|
1689
|
-
code: ForeignSkipCode;
|
|
1690
|
-
/** 外部侧位置(server 名 / skill 名 / 文件名;**不含任何值**) */
|
|
1691
|
-
origin?: string;
|
|
1692
|
-
/** 机器可读的细分原因(如 no-frontmatter / yaml-error),同样交给 UI 映射 */
|
|
1693
|
-
detail?: string;
|
|
1694
|
-
/** 同码聚合时的条数 */
|
|
1695
|
-
count?: number;
|
|
1696
|
-
}
|
|
1697
|
-
type ForeignSkipCode =
|
|
1698
|
-
/** settings.json 的 hooks:DSH 无对等结构 */
|
|
1699
|
-
'unsupported-hooks' |
|
|
1700
|
-
/** commands/*.md(斜杠命令):与 DSH prompts 不是同一语义,本期不搬 */
|
|
1701
|
-
'unsupported-commands' |
|
|
1702
|
-
/** settings.json 的 env 里出现凭据名:只计数与记名,**值不读** */
|
|
1703
|
-
'credentials-not-migrated' |
|
|
1704
|
-
/** SKILL.md 缺失 */
|
|
1705
|
-
'skill-missing-file' |
|
|
1706
|
-
/** frontmatter 不是合法 YAML / 缺 name|description(DSH 会**静默丢弃**该 skill,这里必须报) */
|
|
1707
|
-
'skill-invalid-frontmatter' |
|
|
1708
|
-
/** 目录名/文件相对路径非法(含分隔符、.. 等),无法作为 skill 单元 */
|
|
1709
|
-
'skill-invalid-name' |
|
|
1710
|
-
/** MCP 条目既无 command 也无 url */
|
|
1711
|
-
'mcp-server-empty' |
|
|
1712
|
-
/** MCP type=sse(DSH 只支持 stdio / streamable-http)→ 按带 url 的 http 处理 */
|
|
1713
|
-
'mcp-type-sse-coerced' |
|
|
1714
|
-
/** MCP 值里发现凭据字段(值已丢弃,只留字段名与引用名) */
|
|
1715
|
-
'mcp-credential-redacted' |
|
|
1716
|
-
/** 外部文件读不到 / 超限 / 解析失败 */
|
|
1717
|
-
'source-unreadable' |
|
|
1718
|
-
/** 会话:目标机未提供 DSH 会话格式版本(不猜版本,宁可整批不转) */
|
|
1719
|
-
'session-format-version-unknown' |
|
|
1720
|
-
/** 会话:目标机格式版本不是本模块已实现的行式 */
|
|
1721
|
-
'session-format-unsupported' |
|
|
1722
|
-
/** 会话:记录里没有 cwd(DSH 要求「日志位置 == projectKey(cwd)/id」,没有 cwd 无法归位) */
|
|
1723
|
-
'session-missing-cwd' |
|
|
1724
|
-
/** 会话:文件名不能自证是安全路径段 */
|
|
1725
|
-
'session-unsafe-id' |
|
|
1726
|
-
/** 会话:没有任何可迁移的事件 */
|
|
1727
|
-
'session-empty' |
|
|
1728
|
-
/** 会话:存在解析不出来的行 */
|
|
1729
|
-
'session-unparsable' |
|
|
1730
|
-
/** 会话:某类 Claude 记录本期不迁移(sidechain / attachment / queue-operation / system …) */
|
|
1731
|
-
'unsupported-session-record' |
|
|
1732
|
-
/** 同 id 会话(包内重复 / 目标机已存在,含「另一 projectKey 下同 id」):**不覆盖、跳过并报码**(用户决策,§8.4) */
|
|
1733
|
-
'session-id-conflict' |
|
|
1734
|
-
/** 外部技能重名(压平分类后同名,或两次来源同名):先到先得,其余跳过并报码(§8.4) */
|
|
1735
|
-
'skill-id-conflict' |
|
|
1736
|
-
/** 该来源的对话存储形态本版不迁移(如 Hermes 的 SQLite state.db):只报告,绝不产出 sessions 分区 */
|
|
1737
|
-
'sessions-not-migrated' |
|
|
1738
|
-
/** 记忆文件只报告不导入(如 Hermes memories/MEMORY.md、USER.md):用户决策,正文绝不进包 */
|
|
1739
|
-
'memory-report-only' |
|
|
1740
|
-
/** 外部技能带分类层级(如 Hermes skills/<分类>/<技能>):压平为 DSH 单层 <技能>/SKILL.md 并报码 */
|
|
1741
|
-
'skill-category-flattened' |
|
|
1742
|
-
/** 旧式规则文件(如 .cursorrules):DSH 无对等结构,只报告 */
|
|
1743
|
-
'legacy-rules-file' |
|
|
1744
|
-
/** 多份指令源被合并为单个 AGENTS.md(DSH 只读一个全局指令文件):如实报告合并来源数 */
|
|
1745
|
-
'instructions-merged' |
|
|
1746
|
-
/** 命中更高优先级的指令文件(如 Codex 的 AGENTS.override.md 优先于 AGENTS.md):报告被选中的那一个 */
|
|
1747
|
-
'instructions-override-selected' |
|
|
1748
|
-
/** 配置文件存在但为 0 字节(如实测的 Antigravity mcp_config.json):报码,绝不产出空分区 */
|
|
1749
|
-
'source-empty-file' |
|
|
1750
|
-
/** 配置目录位置被环境变量/命令行覆盖(CLAUDE_CONFIG_DIR / HERMES_HOME / CODEX_HOME / COPILOT_HOME) */
|
|
1751
|
-
'source-location-overridden' |
|
|
1752
|
-
/**
|
|
1753
|
-
* 会话 cwd 由**源侧路径/编码目录名推导**(记录里没有 cwd 字段),且推导结果在本机**真实存在**
|
|
1754
|
-
* —— 才允许落盘(存在性检查把「猜」变成「有证据的推断」);不存在的推导一律按
|
|
1755
|
-
* `session-missing-cwd` 跳过,绝不产出一条指向不存在目录的会话。
|
|
1756
|
-
*/
|
|
1757
|
-
'session-cwd-derived' |
|
|
1758
|
-
/**
|
|
1759
|
-
* 该来源**没有自动根**(竞品 `defaultRoots.chatgpt = null`)—— 必须由用户显式给出导出文件
|
|
1760
|
-
* 路径;本机自动探测永远不会命中,如实报码而不是假装「未安装」。
|
|
1761
|
-
*/
|
|
1762
|
-
'source-needs-explicit-path';
|
|
1763
|
-
//#endregion
|
|
1764
|
-
//#region src/ui/i18n.d.ts
|
|
1765
|
-
/**
|
|
1766
|
-
* 客户端展示层(src/ui/*、src/client/common/*)的渲染文案目录(zh 源语言 / en 镜像)。
|
|
1767
|
-
*
|
|
1768
|
-
* 与 core 的 messages.ts 分工:本目录负责「客户端纯渲染层」(ReportView / ErrorBanner /
|
|
1769
|
-
* ProgressBar / sync-view)产生的中文文案;core 侧引擎消息已随 API 数据源翻译。
|
|
1770
|
-
* 这些纯函数原先直接内嵌中文,现经 UiDict 注入:Client 挂载时按 ctx.locale 提供。
|
|
1771
|
-
*
|
|
1772
|
-
* 纪律:
|
|
1773
|
-
* - TextKey 类型 = keyof typeof uiZh,en 缺键/多键即编译错误;
|
|
1774
|
-
* - {param} 插值,缺参原样保留。
|
|
1439
|
+
* 纪律:
|
|
1440
|
+
* - TextKey 类型 = keyof typeof uiZh,en 缺键/多键即编译错误;
|
|
1441
|
+
* - {param} 插值,缺参原样保留。
|
|
1775
1442
|
*/
|
|
1776
1443
|
declare const uiZh: {
|
|
1777
1444
|
readonly commonClose: '关闭';
|
|
@@ -1947,6 +1614,7 @@ declare const uiZh: {
|
|
|
1947
1614
|
readonly 'sync.neverSyncedShort': '从未同步';
|
|
1948
1615
|
readonly 'sync.pushFailed': '推送失败';
|
|
1949
1616
|
readonly 'sync.pushOk': '推送成功(快照 {id})';
|
|
1617
|
+
readonly 'sync.conflictUnresolved': '冲突项 {id} 必须先选择解决方式(保留当前 / 使用导入)';
|
|
1950
1618
|
readonly 'sync.pushPreviewHeadline': '将推送 {total} 个分区({changed} 个有变化)';
|
|
1951
1619
|
readonly 'sync.pushPreviewHint': '以上为只读预览,不会写入远端。确认后点击「推送」才真正上传。';
|
|
1952
1620
|
readonly 'sync.pushPreviewEncrypted': '加密快照:载荷将整体加密,各分区相对基线的变化不可比对。';
|
|
@@ -2146,6 +1814,11 @@ declare const uiZh: {
|
|
|
2146
1814
|
readonly 'diskUsage.col.policy': '回收策略';
|
|
2147
1815
|
readonly 'diskUsage.clean.reclaimableLabel': '可立即释放';
|
|
2148
1816
|
readonly 'diskUsage.clean.includeExpired': '同时回收过期备份文件';
|
|
1817
|
+
readonly 'diskUsage.area.rollbackPoints': '回滚点库';
|
|
1818
|
+
readonly 'diskUsage.area.rollbackPointsDesc': '每回合自动留点的快照(工作区 + 会话两态);只报告,不自动清理';
|
|
1819
|
+
readonly 'diskUsage.legacy.title': '遗留数据';
|
|
1820
|
+
readonly 'diskUsage.legacy.hint': '插件已不再读取这些目录,也不会自动删除它们;确认无用后可手动清理。它们不计入上方合计。';
|
|
1821
|
+
readonly 'diskUsage.legacy.label': '遗留数据';
|
|
2149
1822
|
readonly 'library.kind.snapshot': '本机快照';
|
|
2150
1823
|
readonly 'library.kind.backupFile': '备份文件';
|
|
2151
1824
|
readonly 'library.kind.remote': '远端快照';
|
|
@@ -2272,11 +1945,418 @@ declare const uiZh: {
|
|
|
2272
1945
|
readonly 'foreign.lossy.entry-backslash.detail': 'ZIP 条目名里出现在中段的反斜杠不会被拒绝:同一个包在 Windows 目标上会被当作路径分隔符(落成多级目录),在 POSIX 目标上只是一个普通字符。本实现刻意不改这一格式行为;界面无法逐条检查条目名,跨平台导入后请核对这类文件是否落在预期位置。';
|
|
2273
1946
|
readonly 'foreign.lossy.prompt-persona-reshape.title': 'prompts 的 systemPrompt 形状变化';
|
|
2274
1947
|
readonly 'foreign.lossy.prompt-persona-reshape.detail': '源里的 systemPrompt 是字符串,导入落盘时写成带 persona 字段的对象:persona 文本无损,字段形状改变。兼容性评分不会为这一条给出原因 —— 它不改变内容,只改变形态。';
|
|
1948
|
+
readonly 'export.category.settings': 'DSH 全局设置(namespace 分区,redacted)';
|
|
1949
|
+
readonly 'export.category.providers': 'LLM Provider / Model / 默认模型 / BaseURL';
|
|
1950
|
+
readonly 'export.category.plugins': '已安装插件清单与启用状态(不含二进制)';
|
|
1951
|
+
readonly 'export.category.pluginFiles': '插件自有配置文件(白名单 + plugin-config/ 目录,整文件复制)';
|
|
1952
|
+
readonly 'export.category.self': '本插件自身配置(同步/自动同步/分区选择/UI 偏好/市场;sync-*.json 等,不含凭据值)';
|
|
1953
|
+
readonly 'export.category.mcp': 'MCP 服务器组合配置(需重启生效)';
|
|
1954
|
+
readonly 'export.category.prompts': 'System Prompt / Plan Mode 提示';
|
|
1955
|
+
readonly 'export.category.skills': '用户技能文件(~/.dsh/skills)';
|
|
1956
|
+
readonly 'export.category.agentPresets': 'Agent 预设(~/.dsh/.agent-presets)';
|
|
1957
|
+
readonly 'export.category.agentInstructions': '全局指令文件(~/.dsh/AGENTS.md,注入每个会话)';
|
|
1958
|
+
readonly 'export.category.workspaces': '工作区记录(含绝对路径,需路径映射)';
|
|
1959
|
+
readonly 'export.category.ui': 'UI 类 settings namespace(localStorage 项仅说明)';
|
|
1960
|
+
readonly 'export.category.credentialsStatus': '凭据状态(configured 标记,永不导出值)';
|
|
1961
|
+
readonly 'export.category.sessions': '历史会话(默认关闭,含敏感内容)';
|
|
1962
|
+
readonly 'export.group.automationNote': 'DSH 当前无 Workflows / Commands 配置文件(运行时注册),无迁移内容';
|
|
1963
|
+
readonly 'report.unitSeparator': ',';
|
|
1964
|
+
readonly 'foreign.source.unknownWithId': '未识别的来源({id})';
|
|
1965
|
+
readonly 'import.analysisFailed': '备份分析失败';
|
|
1966
|
+
readonly 'import.analysisIncomplete': '尚未完成分析,请先选择备份文件';
|
|
1967
|
+
readonly 'import.notConfirmed': '导入未确认:必须确认后才允许修改任何数据';
|
|
1968
|
+
readonly 'import.retryNoResult': '没有可重试的导入结果';
|
|
1969
|
+
readonly 'import.retryNothing': '没有失败或跳过的项需要重试';
|
|
1970
|
+
readonly 'run.exportResultLost': '上次导出任务已结束但结果无法恢复,请重新导出';
|
|
1971
|
+
readonly 'run.importResultLost': '上次导入任务已结束或超过保留期,结果无法恢复,请重新导入';
|
|
1972
|
+
readonly 'run.restoreResultLost': '上次恢复任务已结束但结果无法恢复,请重新执行';
|
|
1973
|
+
readonly 'run.exportUnavailable': '导出失败(结果不可用)';
|
|
1974
|
+
readonly 'run.restoreUnavailable': '恢复失败(结果不可用)';
|
|
1975
|
+
readonly 'run.progressLost': '任务已结束或超过保留期,进度不可恢复';
|
|
1976
|
+
readonly 'run.restoreProgressLost': '恢复任务已结束或超过保留期,进度不可恢复';
|
|
2275
1977
|
};
|
|
2276
1978
|
type UiTextKey = keyof typeof uiZh;
|
|
2277
1979
|
/** UI 翻译函数:key → 当前语言文案({param} 插值;未知键回退 zh/键名)。 */
|
|
2278
1980
|
type UiT = (key: UiTextKey, params?: Record<string, string | number>) => string;
|
|
2279
1981
|
//#endregion
|
|
1982
|
+
//#region src/ui/types.d.ts
|
|
1983
|
+
/**
|
|
1984
|
+
* GET /update-check 的结果。
|
|
1985
|
+
*
|
|
1986
|
+
* 成功与失败都用 HTTP 200:离线 / registry 不可达**不是插件故障**,界面据 `ok` 决定显示
|
|
1987
|
+
* 「已是最新 / 有新版本 / 检查失败(可重试)」,而不是弹错误横幅。
|
|
1988
|
+
*/
|
|
1989
|
+
type PluginUpdateCheckResult = {
|
|
1990
|
+
ok: true;
|
|
1991
|
+
/** 当前运行的插件版本 */
|
|
1992
|
+
current: string;
|
|
1993
|
+
/** npm 上的 latest */
|
|
1994
|
+
latest: string;
|
|
1995
|
+
/** latest > current(严格更新才算;本地跑预发布版时不提示降级) */
|
|
1996
|
+
updateAvailable: boolean;
|
|
1997
|
+
/** 本次结论时间戳(ms;缓存命中时为首查时间) */
|
|
1998
|
+
checkedAt: number;
|
|
1999
|
+
/** 是否来自进程内缓存 */
|
|
2000
|
+
cached: boolean;
|
|
2001
|
+
} | {
|
|
2002
|
+
ok: false;
|
|
2003
|
+
current: string;
|
|
2004
|
+
/** 失败原因(网络 / 超时 / 响应畸形;可读、可重试、无敏感信息) */
|
|
2005
|
+
error: string;
|
|
2006
|
+
};
|
|
2007
|
+
/**
|
|
2008
|
+
* POST /update-apply 的结果(关于页「立即更新」)。
|
|
2009
|
+
*
|
|
2010
|
+
* 语义:用户**显式点击**后,宿主经官方 `dsh plugin` 通道把本插件安装为**钉住的精确版本**;
|
|
2011
|
+
* 成功只表示文件已换新,必须重启 DSH 才生效(needsRestart)。
|
|
2012
|
+
* 失败码与宿主共用同一份字面量(utils/shared-constants.ts),界面据码映射本地化文案,
|
|
2013
|
+
* 只有未知码才回落到宿主返回的原始错误文本。
|
|
2014
|
+
*/
|
|
2015
|
+
type PluginUpdateApplyResult = {
|
|
2016
|
+
ok: true;
|
|
2017
|
+
version: string;
|
|
2018
|
+
command: string;
|
|
2019
|
+
needsRestart: true;
|
|
2020
|
+
} | {
|
|
2021
|
+
ok: false;
|
|
2022
|
+
code: SelfUpdateFailureCode;
|
|
2023
|
+
error: string;
|
|
2024
|
+
};
|
|
2025
|
+
/** 手动清理可点选的动作:可重建区(tmp + 市场缓存/工作副本)/ 已到期的导出产物。 */
|
|
2026
|
+
type DiskUsageCleanCategory = 'tmp' | 'expired-exports';
|
|
2027
|
+
/** POST /disk-usage/cleanup 的回执(回执里带刷新后的报告,避免界面再发一次 GET)。 */
|
|
2028
|
+
interface DiskUsageCleanupResult {
|
|
2029
|
+
ok: boolean;
|
|
2030
|
+
/** 本次请求实际覆盖的动作 */
|
|
2031
|
+
requested: DiskUsageCleanCategory[];
|
|
2032
|
+
/** 被排除的动作(只请求了 tmp 时 = ['expired-exports'])——界面据此如实说明,不假装清过 */
|
|
2033
|
+
excluded: DiskUsageCleanCategory[];
|
|
2034
|
+
/** 删除条目数(文件 + 目录) */
|
|
2035
|
+
removed: number;
|
|
2036
|
+
/** 释放字节数(含目录递归,按清理前后子区体积差计) */
|
|
2037
|
+
freedBytes: number;
|
|
2038
|
+
/** 分区级释放量(子区 id → 字节;只含本次实际清理过的子区) */
|
|
2039
|
+
freedByArea: Partial<Record<string, number>>;
|
|
2040
|
+
/** 单项失败数(不影响其余清理) */
|
|
2041
|
+
errors: number;
|
|
2042
|
+
/** 逐条删除记录(相对 dataDir 的描述 + 字节数) */
|
|
2043
|
+
detail: string[];
|
|
2044
|
+
/** 清理后重新体检的报告 */
|
|
2045
|
+
report: DiskUsageReport;
|
|
2046
|
+
}
|
|
2047
|
+
/** recovery 决策(§5.2):rollback-recommended=恢复到 trusted snapshot;rollback-continue=续跑中断回滚;needs-attention=需人工调查。 */
|
|
2048
|
+
type RecoveryDecision = 'rollback-recommended' | 'rollback-continue' | 'needs-attention';
|
|
2049
|
+
/** post-recovery verification verdict(§6.3)。 */
|
|
2050
|
+
type RecoveryVerdict = 'MATCH' | 'PARTIAL_MATCH' | 'MISMATCH' | 'VERIFICATION_ERROR';
|
|
2051
|
+
/** GET /recovery/status 的单个 incident(未解决 operation)。 */
|
|
2052
|
+
interface RecoveryIncident {
|
|
2053
|
+
operationId: string;
|
|
2054
|
+
operationType: string;
|
|
2055
|
+
state: string;
|
|
2056
|
+
decision: RecoveryDecision;
|
|
2057
|
+
snapshotId: string | null;
|
|
2058
|
+
/** 已 redact 的原因文本。 */
|
|
2059
|
+
reason: string;
|
|
2060
|
+
createdAt: string;
|
|
2061
|
+
}
|
|
2062
|
+
/** GET /recovery/status 响应。 */
|
|
2063
|
+
interface RecoveryStatus {
|
|
2064
|
+
incidents: RecoveryIncident[];
|
|
2065
|
+
running: {
|
|
2066
|
+
runId: string;
|
|
2067
|
+
status: string;
|
|
2068
|
+
}[];
|
|
2069
|
+
/**
|
|
2070
|
+
* 环境锁状态摘要(issue #31)。纯残留锁**不是** journal:进程在 op 期间被杀时
|
|
2071
|
+
* `journalId: null`、`transactions/active/` 为空,incidents 恒为 [],而 423 文案却
|
|
2072
|
+
* 让用户去「事故恢复」处理 → 面板恒空、GUI 无出路。本字段让面板能显示可执行的锁事项。
|
|
2073
|
+
* 旧宿主不返回 → undefined(面板按「无锁事项」处理,不误报)。
|
|
2074
|
+
*/
|
|
2075
|
+
lock?: RecoveryLockStatus;
|
|
2076
|
+
/**
|
|
2077
|
+
* SAFE MODE 阻断态(issue #56)。此前 status 完全没有这个信息 ⇒ 「durable 标记还在、
|
|
2078
|
+
* active/ 却已空」时面板显示「暂无需要处理的恢复事项」,而所有写操作持续 423 —— 用户
|
|
2079
|
+
* 看不到任何线索,也没有任何出口。
|
|
2080
|
+
*
|
|
2081
|
+
* 旧宿主不返回 → undefined(面板按「未阻断」处理,不误报保护)。
|
|
2082
|
+
*/
|
|
2083
|
+
safeMode?: RecoverySafeModeStatus;
|
|
2084
|
+
/**
|
|
2085
|
+
* 中断的档案复制残留(cross-F3 / t54):目标目录带 `.dcm-copy-in-progress.json` 标记、
|
|
2086
|
+
* 却没有 package.json 的半截副本。它们既不在档案列表里、删除又报 notFound ——
|
|
2087
|
+
* 用户此前在「事故恢复」里既看不到、也没有任何处置入口。
|
|
2088
|
+
* 旧宿主不返回 → undefined(按「无残留」处理,不误报)。
|
|
2089
|
+
*/
|
|
2090
|
+
incompleteCopies?: RecoveryIncompleteCopy[];
|
|
2091
|
+
/**
|
|
2092
|
+
* t89:残留**枚举失败**(读 profiles 目录失败)时为 true —— 与「确实没有残留」
|
|
2093
|
+
* (字段缺省)区分开:此前两者在响应里完全同形(都是 `incompleteCopies: []`),
|
|
2094
|
+
* 界面便把「读不到」渲染成「暂无残留」。
|
|
2095
|
+
* 旧宿主不返回 → undefined(按「读到了」处理,绝不误报失败)。
|
|
2096
|
+
*/
|
|
2097
|
+
incompleteCopiesUnreadable?: boolean;
|
|
2098
|
+
}
|
|
2099
|
+
/**
|
|
2100
|
+
* 中断的档案复制残留(cross-F3 / t54):**只允许删除**。
|
|
2101
|
+
* 形态恒为 generic ⇒ 不可启动(没有 package.json,spawn 出去只会得到一个起不来的实例)。
|
|
2102
|
+
*/
|
|
2103
|
+
interface RecoveryIncompleteCopy {
|
|
2104
|
+
/** 目标档案名(= 目录名) */
|
|
2105
|
+
name: string;
|
|
2106
|
+
/** 目标目录绝对路径(界面渲染前过 `redact()`) */
|
|
2107
|
+
dir: string;
|
|
2108
|
+
/** 来源档案名(标记不可解析时为 null —— 界面不臆造) */
|
|
2109
|
+
sourceName: string | null;
|
|
2110
|
+
/** 复制开始时刻(ISO;标记不可解析时为 null) */
|
|
2111
|
+
startedAt: string | null;
|
|
2112
|
+
}
|
|
2113
|
+
/** SAFE MODE 阻断态摘要(只暴露结论与是否可解除)。 */
|
|
2114
|
+
interface RecoverySafeModeStatus {
|
|
2115
|
+
/** durable 标记当前是否在阻断写操作(与 mutation gate 的 isBlocked 同源)。 */
|
|
2116
|
+
blocked: boolean;
|
|
2117
|
+
/**
|
|
2118
|
+
* 是否「没有未解决 incident,可安全解除」——即「结案但保护仍开着」。
|
|
2119
|
+
* 面板仅在 blocked && clearable 时渲染「解除安全模式」入口;还有 NEEDS_ATTENTION
|
|
2120
|
+
* 事务时必须先处理它(宿主侧也会拒绝,界面不给假按钮)。
|
|
2121
|
+
*/
|
|
2122
|
+
clearable: boolean;
|
|
2123
|
+
}
|
|
2124
|
+
/** 环境锁状态摘要:**只暴露分类**(owner pid/op/hostname 属内部诊断,不进 UI/响应体)。 */
|
|
2125
|
+
interface RecoveryLockStatus {
|
|
2126
|
+
/** LockState:STALE_LOCK_DETECTED / UNKNOWN_STATE / LOCKED / FREE / LOCK_IO_ERROR / PERMISSION_ERROR */
|
|
2127
|
+
state: string;
|
|
2128
|
+
/** 是否需用户显式处理(残留锁/无法判定)。LOCKED 活锁为 false —— 它会自行释放,不该催用户回收。 */
|
|
2129
|
+
attention: boolean;
|
|
2130
|
+
}
|
|
2131
|
+
/** POST /recovery/lock/recover 响应(显式回收 stale 残留锁;拒绝时 ok=false)。 */
|
|
2132
|
+
interface RecoveryLockRecoverResult {
|
|
2133
|
+
ok: boolean;
|
|
2134
|
+
removed: boolean;
|
|
2135
|
+
state: string;
|
|
2136
|
+
}
|
|
2137
|
+
/**
|
|
2138
|
+
* POST /recovery/safe-mode/clear 响应(issue #56:显式解除 SAFE MODE)。
|
|
2139
|
+
* - 已解除 → `ok:true, cleared:true`;
|
|
2140
|
+
* - 本来就没阻断 → `ok:true, cleared:false, reason:'not-blocked'`(幂等,不是错误);
|
|
2141
|
+
* - 还有未解决 incident → `ok:false, cleared:false, reason:'unresolved-incidents', unresolved:N`。
|
|
2142
|
+
*/
|
|
2143
|
+
interface RecoverySafeModeClearResult {
|
|
2144
|
+
ok: boolean;
|
|
2145
|
+
cleared: boolean;
|
|
2146
|
+
reason?: string;
|
|
2147
|
+
unresolved?: number;
|
|
2148
|
+
}
|
|
2149
|
+
/** GET /recovery/:operationId/preview 响应(只读,零写入)。 */
|
|
2150
|
+
interface RecoveryPreview {
|
|
2151
|
+
operationId: string;
|
|
2152
|
+
operationType: string;
|
|
2153
|
+
state: string;
|
|
2154
|
+
decision: RecoveryDecision;
|
|
2155
|
+
snapshotId: string | null;
|
|
2156
|
+
snapshotVerdict: string | null;
|
|
2157
|
+
snapshotMeta: {
|
|
2158
|
+
id: string;
|
|
2159
|
+
createdAt: string;
|
|
2160
|
+
operationType?: string;
|
|
2161
|
+
} | null;
|
|
2162
|
+
environmentFingerprint: string;
|
|
2163
|
+
environmentCompatible: boolean;
|
|
2164
|
+
reason: string;
|
|
2165
|
+
createdAt: string;
|
|
2166
|
+
}
|
|
2167
|
+
/** POST /recovery/:operationId/verify 响应。 */
|
|
2168
|
+
interface RecoveryVerifyResult {
|
|
2169
|
+
ok: boolean;
|
|
2170
|
+
operationId: string;
|
|
2171
|
+
verdict: RecoveryVerdict;
|
|
2172
|
+
terminal: string;
|
|
2173
|
+
/** 每项检查结果(已 redact)。 */
|
|
2174
|
+
details: string[];
|
|
2175
|
+
/** 需人工处理项(已 redact)。 */
|
|
2176
|
+
manualHints: string[];
|
|
2177
|
+
}
|
|
2178
|
+
/** POST /recovery/:operationId/execute|retry 响应。 */
|
|
2179
|
+
interface RecoveryExecuteResult {
|
|
2180
|
+
ok: boolean;
|
|
2181
|
+
operationId: string;
|
|
2182
|
+
decision: RecoveryDecision;
|
|
2183
|
+
state: string;
|
|
2184
|
+
runId: string;
|
|
2185
|
+
}
|
|
2186
|
+
/** POST /recovery/:operationId/confirm 响应。 */
|
|
2187
|
+
interface RecoveryConfirmResult {
|
|
2188
|
+
ok: boolean;
|
|
2189
|
+
operationId: string;
|
|
2190
|
+
snapshotId: string;
|
|
2191
|
+
verdict: string;
|
|
2192
|
+
}
|
|
2193
|
+
/** POST /recovery/:operationId/dismiss 响应。 */
|
|
2194
|
+
interface RecoveryDismissResult {
|
|
2195
|
+
ok: boolean;
|
|
2196
|
+
operationId: string;
|
|
2197
|
+
dismissed: boolean;
|
|
2198
|
+
}
|
|
2199
|
+
/**
|
|
2200
|
+
* Recovery 端口契约(§10.3):recovery 无现有 port(ExportPort/ImportPort 只服务控制器)。
|
|
2201
|
+
* `recovery-api.ts` 实现之;`recovery-view.ts` 是纯渲染模型(非控制器),消费本端口返回的渲染数据。
|
|
2202
|
+
* 安全:所有 destructive 动作(confirm/execute/retry/dismiss)必须显式传 userConfirmed=true,
|
|
2203
|
+
* 由 Host 侧双重校验(请求体 + journal 状态机)。
|
|
2204
|
+
*/
|
|
2205
|
+
interface RecoveryPort {
|
|
2206
|
+
status(): Promise<RecoveryStatus>;
|
|
2207
|
+
preview(operationId: string): Promise<RecoveryPreview>;
|
|
2208
|
+
confirm(operationId: string, userConfirmed: boolean): Promise<RecoveryConfirmResult>;
|
|
2209
|
+
execute(operationId: string, userConfirmed: boolean): Promise<RecoveryExecuteResult>;
|
|
2210
|
+
verify(operationId: string): Promise<RecoveryVerifyResult>;
|
|
2211
|
+
retry(operationId: string, userConfirmed: boolean): Promise<RecoveryExecuteResult>;
|
|
2212
|
+
dismiss(operationId: string, userConfirmed: boolean): Promise<RecoveryDismissResult>;
|
|
2213
|
+
/**
|
|
2214
|
+
* POST /recovery/lock/recover(issue #31):显式回收 stale 残留配置锁。
|
|
2215
|
+
* 不带 operationId(残留锁没有 journal);宿主侧会重新证明确属 stale 才回收,
|
|
2216
|
+
* 无法证明(活锁/判定不确定/二次验证失败)→ 返回 ok=false 且不做任何改动。
|
|
2217
|
+
*/
|
|
2218
|
+
recoverStaleLock(userConfirmed: boolean): Promise<RecoveryLockRecoverResult>;
|
|
2219
|
+
/**
|
|
2220
|
+
* POST /recovery/safe-mode/clear(issue #56):显式解除仍然生效的 SAFE MODE 保护。
|
|
2221
|
+
* 不带 operationId(该状态下往往已无 active journal);宿主侧会重新判定
|
|
2222
|
+
* 「是否还有未解决的恢复事项」,有则拒绝(ok=false),绝不无条件清标记。
|
|
2223
|
+
*/
|
|
2224
|
+
clearSafeMode(userConfirmed: boolean): Promise<RecoverySafeModeClearResult>;
|
|
2225
|
+
/**
|
|
2226
|
+
* GET /recovery/sessions(T5,**只读**):本机存量会话的体检(损坏分类 + 可见性)。
|
|
2227
|
+
*
|
|
2228
|
+
* 为什么挂在 RecoveryPort 而不是新开一个端口:它与「我的对话去哪了」是同一件事,
|
|
2229
|
+
* 且宿主把它挂在既有 recovery prefix 路由下(不新增注册路由条目)。
|
|
2230
|
+
* `limit` 只影响回传浏览器的行数(摘要里的 total 仍是全量口径)。
|
|
2231
|
+
*/
|
|
2232
|
+
sessions(limit?: number): Promise<SessionHealthResponse>;
|
|
2233
|
+
/**
|
|
2234
|
+
* POST /recovery/sessions/repair(T8):应用内修复一份会话日志。
|
|
2235
|
+
*
|
|
2236
|
+
* apply=false 只预览(零写入);apply=true 时**必须**回传预览给出的 expect 指纹 ——
|
|
2237
|
+
* 宿主用它做 TOCTOU 判定(预览之后文件被改过就拒绝,绝不按旧计划写入)。
|
|
2238
|
+
* 执行器自带完整安全序列(写前校验 → 时间戳备份 → 原子换入 → 写后复验)。
|
|
2239
|
+
*/
|
|
2240
|
+
repairSession(unitId: string, apply: boolean, expect?: {
|
|
2241
|
+
size: number;
|
|
2242
|
+
mtimeMs: number;
|
|
2243
|
+
}, allowLossy?: boolean): Promise<SessionRepairResult>;
|
|
2244
|
+
/** POST /recovery/sessions/rollback(T8):按台账里的 repairId 回滚一次修复(客户端不传路径)。 */
|
|
2245
|
+
rollbackSessionRepair(repairId: string): Promise<SessionRepairRollbackResult>;
|
|
2246
|
+
}
|
|
2247
|
+
//#endregion
|
|
2248
|
+
//#region src/client/session-export/session-export-view.d.ts
|
|
2249
|
+
/**
|
|
2250
|
+
* 「下载原始日志 (ZIP)」入口的**纯展示模型**(F-2,框架无关、node 可测)。
|
|
2251
|
+
*
|
|
2252
|
+
* 本模块**不做任何 I/O 与 React**:输入是宿主探测回来的结构化事实,输出是组件直接渲染的三件事 ——
|
|
2253
|
+
* 是否可用、给用户看的原因、按钮的交互状态。判定集中在这里的原因很实在:这条入口最容易犯的错
|
|
2254
|
+
* **不是**功能错,而是**显隐判据错**(生态竞品普遍用已过时的 `status !== 501` 探测,在本机 DSH 上
|
|
2255
|
+
* 会因为服务缺失返 500 而**几乎恒显示**)。判据只能有一份,且必须可单测。
|
|
2256
|
+
*
|
|
2257
|
+
* 三态语义(与宿主 src/routes/session-export.ts 的 `SessionExportAvailability` 同源):
|
|
2258
|
+
* - `available` → 显示并可用;
|
|
2259
|
+
* - `unavailable` → **显示但禁用**,并给出可读原因(绝不静默、也绝不直接消失让用户以为没这功能);
|
|
2260
|
+
* - `unknown` → **保守显示为可用**(拿不到状态码时绝不猜成「不支持」——那会藏掉一个其实能用的功能)。
|
|
2261
|
+
*
|
|
2262
|
+
* 为什么 `unavailable` 是「禁用 + 说明」而不是「隐藏」:隐藏会让用户无从判断「是这台机器不支持」
|
|
2263
|
+
* 还是「插件没做这个功能」;禁用 + 一句话原因把这句话说清楚(与仓库「绝不静默」的既有取向一致)。
|
|
2264
|
+
*/
|
|
2265
|
+
/** 可用性三态(与宿主 src/routes/session-export.ts 的判定同源)。 */
|
|
2266
|
+
type SessionExportAvailability = 'available' | 'unavailable' | 'unknown';
|
|
2267
|
+
/** 成因(机器可读;界面映射成文案,**绝不渲染裸码**)。 */
|
|
2268
|
+
type SessionExportReason = 'service-missing' | 'auth-required' | 'read-failed' | 'network-error' | 'unexpected-status';
|
|
2269
|
+
/** 宿主探测回来的结构化事实(与 GET /session-export 的响应字段一一对应)。 */
|
|
2270
|
+
interface SessionExportProbe {
|
|
2271
|
+
availability: SessionExportAvailability;
|
|
2272
|
+
reason?: SessionExportReason;
|
|
2273
|
+
/** DSH 返回的状态码(0 = 没拿到响应) */
|
|
2274
|
+
status: number;
|
|
2275
|
+
/** 探测的路径(诊断用) */
|
|
2276
|
+
path: string;
|
|
2277
|
+
/** 探测时刻(ISO) */
|
|
2278
|
+
checkedAt: string;
|
|
2279
|
+
}
|
|
2280
|
+
//#endregion
|
|
2281
|
+
//#region src/foreign/types.d.ts
|
|
2282
|
+
/** 未能迁移的外部内容(响亮失败:宁可在计划里报出来,也不静默丢) */
|
|
2283
|
+
interface ForeignSkip {
|
|
2284
|
+
/** 稳定机器码(UI 用它映射文案;禁止渲染裸枚举) */
|
|
2285
|
+
code: ForeignSkipCode;
|
|
2286
|
+
/** 外部侧位置(server 名 / skill 名 / 文件名;**不含任何值**) */
|
|
2287
|
+
origin?: string;
|
|
2288
|
+
/** 机器可读的细分原因(如 no-frontmatter / yaml-error),同样交给 UI 映射 */
|
|
2289
|
+
detail?: string;
|
|
2290
|
+
/** 同码聚合时的条数 */
|
|
2291
|
+
count?: number;
|
|
2292
|
+
}
|
|
2293
|
+
type ForeignSkipCode =
|
|
2294
|
+
/** settings.json 的 hooks:DSH 无对等结构 */
|
|
2295
|
+
'unsupported-hooks' |
|
|
2296
|
+
/** commands/*.md(斜杠命令):与 DSH prompts 不是同一语义,本期不搬 */
|
|
2297
|
+
'unsupported-commands' |
|
|
2298
|
+
/** settings.json 的 env 里出现凭据名:只计数与记名,**值不读** */
|
|
2299
|
+
'credentials-not-migrated' |
|
|
2300
|
+
/** SKILL.md 缺失 */
|
|
2301
|
+
'skill-missing-file' |
|
|
2302
|
+
/** frontmatter 不是合法 YAML / 缺 name|description(DSH 会**静默丢弃**该 skill,这里必须报) */
|
|
2303
|
+
'skill-invalid-frontmatter' |
|
|
2304
|
+
/** 目录名/文件相对路径非法(含分隔符、.. 等),无法作为 skill 单元 */
|
|
2305
|
+
'skill-invalid-name' |
|
|
2306
|
+
/** MCP 条目既无 command 也无 url */
|
|
2307
|
+
'mcp-server-empty' |
|
|
2308
|
+
/** MCP type=sse(DSH 只支持 stdio / streamable-http)→ 按带 url 的 http 处理 */
|
|
2309
|
+
'mcp-type-sse-coerced' |
|
|
2310
|
+
/** MCP 值里发现凭据字段(值已丢弃,只留字段名与引用名) */
|
|
2311
|
+
'mcp-credential-redacted' |
|
|
2312
|
+
/** 外部文件读不到 / 超限 / 解析失败 */
|
|
2313
|
+
'source-unreadable' |
|
|
2314
|
+
/** 会话:目标机未提供 DSH 会话格式版本(不猜版本,宁可整批不转) */
|
|
2315
|
+
'session-format-version-unknown' |
|
|
2316
|
+
/** 会话:目标机格式版本不是本模块已实现的行式 */
|
|
2317
|
+
'session-format-unsupported' |
|
|
2318
|
+
/** 会话:记录里没有 cwd(DSH 要求「日志位置 == projectKey(cwd)/id」,没有 cwd 无法归位) */
|
|
2319
|
+
'session-missing-cwd' |
|
|
2320
|
+
/** 会话:文件名不能自证是安全路径段 */
|
|
2321
|
+
'session-unsafe-id' |
|
|
2322
|
+
/** 会话:没有任何可迁移的事件 */
|
|
2323
|
+
'session-empty' |
|
|
2324
|
+
/** 会话:存在解析不出来的行 */
|
|
2325
|
+
'session-unparsable' |
|
|
2326
|
+
/** 会话:某类 Claude 记录本期不迁移(sidechain / attachment / queue-operation / system …) */
|
|
2327
|
+
'unsupported-session-record' |
|
|
2328
|
+
/** 同 id 会话(包内重复 / 目标机已存在,含「另一 projectKey 下同 id」):**不覆盖、跳过并报码**(用户决策,§8.4) */
|
|
2329
|
+
'session-id-conflict' |
|
|
2330
|
+
/** 外部技能重名(压平分类后同名,或两次来源同名):先到先得,其余跳过并报码(§8.4) */
|
|
2331
|
+
'skill-id-conflict' |
|
|
2332
|
+
/** 该来源的对话存储形态本版不迁移(如 Hermes 的 SQLite state.db):只报告,绝不产出 sessions 分区 */
|
|
2333
|
+
'sessions-not-migrated' |
|
|
2334
|
+
/** 记忆文件只报告不导入(如 Hermes memories/MEMORY.md、USER.md):用户决策,正文绝不进包 */
|
|
2335
|
+
'memory-report-only' |
|
|
2336
|
+
/** 外部技能带分类层级(如 Hermes skills/<分类>/<技能>):压平为 DSH 单层 <技能>/SKILL.md 并报码 */
|
|
2337
|
+
'skill-category-flattened' |
|
|
2338
|
+
/** 旧式规则文件(如 .cursorrules):DSH 无对等结构,只报告 */
|
|
2339
|
+
'legacy-rules-file' |
|
|
2340
|
+
/** 多份指令源被合并为单个 AGENTS.md(DSH 只读一个全局指令文件):如实报告合并来源数 */
|
|
2341
|
+
'instructions-merged' |
|
|
2342
|
+
/** 命中更高优先级的指令文件(如 Codex 的 AGENTS.override.md 优先于 AGENTS.md):报告被选中的那一个 */
|
|
2343
|
+
'instructions-override-selected' |
|
|
2344
|
+
/** 配置文件存在但为 0 字节(如实测的 Antigravity mcp_config.json):报码,绝不产出空分区 */
|
|
2345
|
+
'source-empty-file' |
|
|
2346
|
+
/** 配置目录位置被环境变量/命令行覆盖(CLAUDE_CONFIG_DIR / HERMES_HOME / CODEX_HOME / COPILOT_HOME) */
|
|
2347
|
+
'source-location-overridden' |
|
|
2348
|
+
/**
|
|
2349
|
+
* 会话 cwd 由**源侧路径/编码目录名推导**(记录里没有 cwd 字段),且推导结果在本机**真实存在**
|
|
2350
|
+
* —— 才允许落盘(存在性检查把「猜」变成「有证据的推断」);不存在的推导一律按
|
|
2351
|
+
* `session-missing-cwd` 跳过,绝不产出一条指向不存在目录的会话。
|
|
2352
|
+
*/
|
|
2353
|
+
'session-cwd-derived' |
|
|
2354
|
+
/**
|
|
2355
|
+
* 该来源**没有自动根**(竞品 `defaultRoots.chatgpt = null`)—— 必须由用户显式给出导出文件
|
|
2356
|
+
* 路径;本机自动探测永远不会命中,如实报码而不是假装「未安装」。
|
|
2357
|
+
*/
|
|
2358
|
+
'source-needs-explicit-path';
|
|
2359
|
+
//#endregion
|
|
2280
2360
|
//#region src/ui/foreign-view.d.ts
|
|
2281
2361
|
/** `GET /foreign-sources` 返回的一条来源检测结果(与宿主 ForeignSourceStatus 同构) */
|
|
2282
2362
|
interface ForeignSourceStatusInput {
|
|
@@ -2433,6 +2513,8 @@ interface RestoreResponse {
|
|
|
2433
2513
|
runId?: string;
|
|
2434
2514
|
/** git 风格预览:逐动作的变更状态 + 行数统计(dryRun=true 时由宿主附带;旧宿主不返回) */
|
|
2435
2515
|
changeSummary?: RestoreChangeSummary;
|
|
2516
|
+
/** 恢复计划指纹(dryRun=true 时由宿主附带;执行时回传以发现「确认后磁盘又变了」;旧宿主不返回) */
|
|
2517
|
+
planFingerprint?: string;
|
|
2436
2518
|
}
|
|
2437
2519
|
/** Star 引导弹窗状态(GET /star-prompt;纯偏好,无 secret) */
|
|
2438
2520
|
interface StarPromptStatus {
|
|
@@ -2501,7 +2583,7 @@ declare class ConfigManagerApi {
|
|
|
2501
2583
|
exportPassword: string | null;
|
|
2502
2584
|
/** 客户端展示层翻译器(zh 源 / en 镜像,见 ui/i18n.ts)。 */
|
|
2503
2585
|
readonly t: UiT;
|
|
2504
|
-
constructor(t
|
|
2586
|
+
constructor(t: UiT);
|
|
2505
2587
|
/** 健康/版本检查(主页横幅:插件版本 / DSH 版本 / 平台) */
|
|
2506
2588
|
status(): Promise<ServiceStatus>;
|
|
2507
2589
|
/** Star 引导弹窗状态(进入页面时判定是否展示 / 是否补记首次使用时间)。 */
|
|
@@ -2602,8 +2684,16 @@ declare class ConfigManagerApi {
|
|
|
2602
2684
|
}>;
|
|
2603
2685
|
/** 列出全部快照元信息(createdAt 倒序;含 status/条目数/宿主文件数/插件数) */
|
|
2604
2686
|
snapshots(): Promise<SnapshotMeta[]>;
|
|
2687
|
+
/**
|
|
2688
|
+
* 同 `snapshots()`,但把「快照目录读不出来」的事实一并带回(宿主 out.unreadable 透传)。
|
|
2689
|
+
* 为什么需要:读不出来与「没有快照」必须分清 —— 只拿数组会让界面把 EACCES 渲染成空列表。
|
|
2690
|
+
*/
|
|
2691
|
+
snapshotsDetailed(): Promise<{
|
|
2692
|
+
snapshots: SnapshotMeta[];
|
|
2693
|
+
unreadable: string | null;
|
|
2694
|
+
}>;
|
|
2605
2695
|
/** 快照恢复:dryRun=true 只取动作计划(零写入);false 执行并返回诚实报告 */
|
|
2606
|
-
restoreSnapshot(snapshotId: string, dryRun: boolean): Promise<RestoreResponse>;
|
|
2696
|
+
restoreSnapshot(snapshotId: string, dryRun: boolean, planFingerprint?: string): Promise<RestoreResponse>;
|
|
2607
2697
|
/**
|
|
2608
2698
|
* git 风格恢复预览:单个文件的逐行差异(只读,零写入)。
|
|
2609
2699
|
* before = 当前磁盘文件 / after = 快照 blob;越界 / 二进制 / 超限经响应里的 reason 表达。
|
|
@@ -2887,6 +2977,33 @@ interface SyncStatusResponse {
|
|
|
2887
2977
|
autosync?: AutosyncStatusResponse;
|
|
2888
2978
|
/** 全部通道的自动同步状态(git/webdav 各自独立;UI 按当前 tab 取对应通道) */
|
|
2889
2979
|
autosyncByChannel?: Record<SyncTransportType, AutosyncStatusResponse>;
|
|
2980
|
+
/**
|
|
2981
|
+
* issue #79:git 工作副本与配置地址的关系(host 只读自检)。
|
|
2982
|
+
* - `{ facts }` = 自检成功(origin 是否已跟随 repoUrl)
|
|
2983
|
+
* - `{ error }` = 自检读不出来(git 不可用 / 工作副本异常)——**如实回传**,不伪装成「不存在」
|
|
2984
|
+
*/
|
|
2985
|
+
workDir?: {
|
|
2986
|
+
facts: SyncWorkDirFacts;
|
|
2987
|
+
} | {
|
|
2988
|
+
error: string;
|
|
2989
|
+
};
|
|
2990
|
+
}
|
|
2991
|
+
/** git 工作副本自检事实(与宿主 GitWorkDirFacts 同形;无任何敏感值)。 */
|
|
2992
|
+
interface SyncWorkDirFacts {
|
|
2993
|
+
/** 工作副本路径 */
|
|
2994
|
+
path: string;
|
|
2995
|
+
/** `.git` 是否存在 */
|
|
2996
|
+
exists: boolean;
|
|
2997
|
+
/** 当前 origin(读不出 → null) */
|
|
2998
|
+
origin: string | null;
|
|
2999
|
+
/** 单独配置的 push URL(未单独配置 → null) */
|
|
3000
|
+
pushUrl: string | null;
|
|
3001
|
+
/** fetch / push 地址是否都已跟随 repoUrl */
|
|
3002
|
+
match: boolean;
|
|
3003
|
+
/** 未上行的本地提交数(仅 detail 自检时给出,否则 null) */
|
|
3004
|
+
ahead: number | null;
|
|
3005
|
+
/** 工作树是否有未提交改动(仅 detail 自检时给出,否则 null) */
|
|
3006
|
+
dirty: boolean | null;
|
|
2890
3007
|
}
|
|
2891
3008
|
/** 同步密码的保存状态(只回布尔;密码值永不回传浏览器)。 */
|
|
2892
3009
|
interface SyncPasswordState {
|
|
@@ -3170,8 +3287,36 @@ interface ApplyItemsResponse {
|
|
|
3170
3287
|
adapter: string;
|
|
3171
3288
|
message?: string;
|
|
3172
3289
|
}[];
|
|
3290
|
+
/**
|
|
3291
|
+
* 「整体回滚是否完整」(诚实性,2026-10)。`rolledBack=true` 只说「触发了整体回滚」,
|
|
3292
|
+
* 不代表每一项都补偿成功(典型:原本已存在的凭据值 DSH 不可回读 → 无法自动恢复)。
|
|
3293
|
+
* 此时引擎把失败项并入 `warnings`,并置 `rollbackFull=false`;界面据此**不得**
|
|
3294
|
+
* 显示成「已整体回滚」,必须列出未恢复项。
|
|
3295
|
+
* 旧宿主不返回 → undefined(按旧的「已整体回滚」文案处理,不误报)。
|
|
3296
|
+
*/
|
|
3297
|
+
rollbackFull?: boolean;
|
|
3173
3298
|
result: unknown;
|
|
3174
3299
|
}
|
|
3300
|
+
/** POST /sync/rollback 响应:一键回滚的诚实结果(full=false 时 failed 列出未回滚项)。 */
|
|
3301
|
+
interface SyncRollbackResponse {
|
|
3302
|
+
ok: boolean;
|
|
3303
|
+
/** 是否**每一项**都补偿成功(false = 部分回滚,配置可能停留在中间状态) */
|
|
3304
|
+
full: boolean;
|
|
3305
|
+
/**
|
|
3306
|
+
* 未回滚项(full=false 时非空)。`reason` = 为什么没能恢复;`manualHint` = 人工怎么补
|
|
3307
|
+
* (如「请重新补录该凭据」)。旧宿主不返回 → undefined(按「无未回滚项」处理)。
|
|
3308
|
+
*/
|
|
3309
|
+
failed?: SyncRollbackFailedItem[];
|
|
3310
|
+
/** 同步历史写入失败(回滚本身已完成;仅提示) */
|
|
3311
|
+
historyWriteError?: string;
|
|
3312
|
+
}
|
|
3313
|
+
/** 单条未回滚项。 */
|
|
3314
|
+
interface SyncRollbackFailedItem {
|
|
3315
|
+
/** 形如 `<adapter>:<ref>` */
|
|
3316
|
+
item: string;
|
|
3317
|
+
reason: string;
|
|
3318
|
+
manualHint?: string;
|
|
3319
|
+
}
|
|
3175
3320
|
/** 统一间隔类型。 */
|
|
3176
3321
|
type AutosyncInterval = '5m' | '15m' | '30m' | '60m' | '6h' | '12h' | '24h';
|
|
3177
3322
|
/** 最近一次自动同步执行状态。 */
|
|
@@ -3183,6 +3328,14 @@ interface AutosyncStatusResponse {
|
|
|
3183
3328
|
lastRunAt?: string;
|
|
3184
3329
|
lastRunStatus?: AutosyncRunStatus;
|
|
3185
3330
|
lastRunMessage?: string;
|
|
3331
|
+
/**
|
|
3332
|
+
* issue #79:本轮跳过的**结构化原因码**(界面按码取字典,绝不渲染裸枚举)。
|
|
3333
|
+
* 取值与同步历史的 skipReason 同一套:conflict / mutation-locked / encrypted /
|
|
3334
|
+
* unconfigured / upToDate / unchanged。
|
|
3335
|
+
*/
|
|
3336
|
+
lastRunSkipReason?: string;
|
|
3337
|
+
/** 跳过涉及的分区数(当前仅 conflict:远端另有 N 个分区待确认) */
|
|
3338
|
+
lastRunSkipCount?: number;
|
|
3186
3339
|
consecutiveFailures: number;
|
|
3187
3340
|
/** 距上次自动同步已过 ms(host 计算,供 UI 倒计时/立即触发判断) */
|
|
3188
3341
|
elapsedMs: number;
|
|
@@ -3301,9 +3454,27 @@ interface GithubCreateRepositoryResponse {
|
|
|
3301
3454
|
/** 远程同步浏览器半数据入口(备份与迁移页第 4 个 tab 的注入业务面) */
|
|
3302
3455
|
declare class SyncApi {
|
|
3303
3456
|
readonly t: UiT;
|
|
3304
|
-
constructor(t
|
|
3305
|
-
/** 读取同步状态(配置 / 凭据 / 上次同步时间 /
|
|
3457
|
+
constructor(t: UiT);
|
|
3458
|
+
/** 读取同步状态(配置 / 凭据 / 上次同步时间 / 分区数 / 工作副本自检) */
|
|
3306
3459
|
status(): Promise<SyncStatusResponse>;
|
|
3460
|
+
/**
|
|
3461
|
+
* 重建 git 工作副本(issue #79 的自救入口)。
|
|
3462
|
+
*
|
|
3463
|
+
* - `relink`:只把 origin / push URL 重指向当前配置地址(非破坏性,不碰工作树与本地提交);
|
|
3464
|
+
* - `reclone`:删除工作副本后重新 clone(**丢弃未上行的本地提交**)→ 必须带 `confirm: true`。
|
|
3465
|
+
*
|
|
3466
|
+
* 写动作:host 侧过 mutation gate(SAFE MODE / 环境锁)。
|
|
3467
|
+
*/
|
|
3468
|
+
workdirReset(payload: {
|
|
3469
|
+
mode: 'relink' | 'reclone';
|
|
3470
|
+
confirm?: boolean;
|
|
3471
|
+
}): Promise<{
|
|
3472
|
+
ok: boolean;
|
|
3473
|
+
mode: string;
|
|
3474
|
+
workDir: {
|
|
3475
|
+
facts: SyncWorkDirFacts;
|
|
3476
|
+
};
|
|
3477
|
+
}>;
|
|
3307
3478
|
/**
|
|
3308
3479
|
* 分区条目清单(复用 /export-preview;**只读**,不写任何内容)。
|
|
3309
3480
|
*
|
|
@@ -3396,13 +3567,10 @@ declare class SyncApi {
|
|
|
3396
3567
|
ok: boolean;
|
|
3397
3568
|
lastSyncChannel?: SyncTransportType;
|
|
3398
3569
|
}>;
|
|
3399
|
-
/** 一键回滚:按 restoreId 调用 backup→rollback */
|
|
3570
|
+
/** 一键回滚:按 restoreId 调用 backup→rollback(full=false 时 failed 列出未回滚项与人工提示) */
|
|
3400
3571
|
rollback(payload: {
|
|
3401
3572
|
restoreId: string;
|
|
3402
|
-
}): Promise<
|
|
3403
|
-
ok: boolean;
|
|
3404
|
-
full: boolean;
|
|
3405
|
-
}>;
|
|
3573
|
+
}): Promise<SyncRollbackResponse>;
|
|
3406
3574
|
/** Phase 7 迁移前咨询(只读健康评分 + 建议):对远端快照生成咨询报告。 */
|
|
3407
3575
|
consult(input: {
|
|
3408
3576
|
type: 'remote-snapshot';
|
|
@@ -3560,7 +3728,7 @@ interface MarketPrepareResponse {
|
|
|
3560
3728
|
/** 配置市场浏览器半数据入口(备份与迁移页第 5 个 tab 的注入业务面) */
|
|
3561
3729
|
declare class MarketApi {
|
|
3562
3730
|
readonly t: UiT;
|
|
3563
|
-
constructor(t
|
|
3731
|
+
constructor(t: UiT);
|
|
3564
3732
|
/** 读取内置市场摘要(条目数 / 最近拉取时间;无任何凭据) */
|
|
3565
3733
|
status(): Promise<MarketStatusResponse>;
|
|
3566
3734
|
/** 拉取市场最新 index.json(内置单市场;返回目录条目 + 市场缓存摘要) */
|
|
@@ -3710,7 +3878,7 @@ interface MyItemsResponse {
|
|
|
3710
3878
|
*/
|
|
3711
3879
|
declare class MyConfigsApi {
|
|
3712
3880
|
readonly t: UiT;
|
|
3713
|
-
constructor(t
|
|
3881
|
+
constructor(t: UiT);
|
|
3714
3882
|
/** 读取登录态 + 用户配置仓库状态(token 失效 → Host 返回 401/未登录,UI 引导重新登录) */
|
|
3715
3883
|
meStatus(): Promise<MyMeStatusResponse>;
|
|
3716
3884
|
/** 一键上传:校验 → 建/复用仓库 → 写入用户仓库 → fork → 改官方 index → 提收录 PR */
|
|
@@ -3832,11 +4000,329 @@ interface SessionLayoutApplyView {
|
|
|
3832
4000
|
*/
|
|
3833
4001
|
type SessionLayoutResponse = SessionLayoutPlanView | SessionLayoutApplyView;
|
|
3834
4002
|
//#endregion
|
|
4003
|
+
//#region src/ui/rollback-view.d.ts
|
|
4004
|
+
/** 只保留两态(S2):工作区 + 会话。 */
|
|
4005
|
+
declare const ROLLBACK_STATES: readonly ['workspace', 'session'];
|
|
4006
|
+
type RollbackState = (typeof ROLLBACK_STATES)[number];
|
|
4007
|
+
/**
|
|
4008
|
+
* 回退范围三选一(冻结 wire contract 的 `mode`):
|
|
4009
|
+
* - `files+session`:工作区文件 + 会话(新子会话)一起回退;
|
|
4010
|
+
* - `files`:只回退工作区文件;
|
|
4011
|
+
* - `session`:只回退会话(fork 子会话)。
|
|
4012
|
+
*/
|
|
4013
|
+
declare const ROLLBACK_MODES: readonly ['files+session', 'files', 'session'];
|
|
4014
|
+
type RollbackMode = (typeof ROLLBACK_MODES)[number];
|
|
4015
|
+
interface RollbackGuidance {
|
|
4016
|
+
code: string;
|
|
4017
|
+
detail?: string;
|
|
4018
|
+
}
|
|
4019
|
+
type RollbackGuardPolicy = 'require' | 'warn' | 'off';
|
|
4020
|
+
/** 单段摘要(恒为 workspace / session 两项;state 用 string 以便未知值也能被映射成 unknown 键)。 */
|
|
4021
|
+
interface RollbackSegmentSummary {
|
|
4022
|
+
state: string;
|
|
4023
|
+
ok?: boolean;
|
|
4024
|
+
degraded?: boolean;
|
|
4025
|
+
capturedAt?: number;
|
|
4026
|
+
reasonCode?: string | null;
|
|
4027
|
+
/** 该段捕获的条目数(工作区文件数 / 会话 0|1) */
|
|
4028
|
+
entries?: number;
|
|
4029
|
+
bytes?: number;
|
|
4030
|
+
/** 会话段:游标(seq) */
|
|
4031
|
+
cursorBytes?: number | null;
|
|
4032
|
+
/** 该段**可回退**(有内容副本 / 有可写回条目) */
|
|
4033
|
+
restorable?: boolean;
|
|
4034
|
+
/** 留点时的**跳过条目总数**(工作区态:skipped + excludedDirs;会话态恒 0)—— S4「跳过并如实报告」 */
|
|
4035
|
+
skippedCount?: number;
|
|
4036
|
+
/** 该段捕获是否被上限截断(工作区态 = 单文件上限 / 字节预算 / 文件数预算任一命中) */
|
|
4037
|
+
truncated?: boolean;
|
|
4038
|
+
}
|
|
4039
|
+
interface RollbackPointSummary {
|
|
4040
|
+
id: string;
|
|
4041
|
+
createdAt: number;
|
|
4042
|
+
/** 自动留点归属的会话(自动点必有;无会话的旧记录为 null) */
|
|
4043
|
+
sessionId?: string | null;
|
|
4044
|
+
/** 会话单元 id(宿主回传的 <projectKey>/<sessionId>;用于分组表头) */
|
|
4045
|
+
unitId?: string | null;
|
|
4046
|
+
/**
|
|
4047
|
+
* 对话标题:宿主从 DSH 会话缓存补的**只读装饰**(与 /recovery/sessions 同一份索引)。
|
|
4048
|
+
* 读不到就**不带该字段** —— 界面回落显示 `sessionId`,绝不编造标题。
|
|
4049
|
+
*/
|
|
4050
|
+
title?: string | null;
|
|
4051
|
+
/** 该点对应的回合号(1-based;无法判定为 null) */
|
|
4052
|
+
turn?: number | null;
|
|
4053
|
+
/** fork 的 inclusive 边界 seq(null = 无前置边界) */
|
|
4054
|
+
boundarySeq?: number | null;
|
|
4055
|
+
/** auto = 回合结束自动留点;guard = 回退前救援点 */
|
|
4056
|
+
kind?: string;
|
|
4057
|
+
protected?: boolean;
|
|
4058
|
+
/** 两态缺一(缺省不允许回退) */
|
|
4059
|
+
incomplete?: boolean;
|
|
4060
|
+
note?: string | null;
|
|
4061
|
+
/** 两态 capturedAt 的跨度(诚实事实,无同点判定) */
|
|
4062
|
+
spreadMs?: number;
|
|
4063
|
+
segments?: RollbackSegmentSummary[];
|
|
4064
|
+
}
|
|
4065
|
+
interface RollbackStorageStatus {
|
|
4066
|
+
available: boolean;
|
|
4067
|
+
root?: string;
|
|
4068
|
+
detail?: string;
|
|
4069
|
+
guidance?: RollbackGuidance[];
|
|
4070
|
+
requirements?: readonly string[];
|
|
4071
|
+
}
|
|
4072
|
+
interface RollbackListResult {
|
|
4073
|
+
ok?: boolean;
|
|
4074
|
+
points: RollbackPointSummary[];
|
|
4075
|
+
storage: RollbackStorageStatus;
|
|
4076
|
+
error?: string;
|
|
4077
|
+
/** 全局留存上限(S6:50) */
|
|
4078
|
+
maxRecords?: number;
|
|
4079
|
+
/** 每会话留存上限(S6:20) */
|
|
4080
|
+
maxRecordsPerSession?: number;
|
|
4081
|
+
/** **全局**救援点留存上限(S6 第二道 guard 预算:50) */
|
|
4082
|
+
maxGuards?: number;
|
|
4083
|
+
}
|
|
4084
|
+
interface RollbackDetailResult {
|
|
4085
|
+
ok: boolean;
|
|
4086
|
+
id: string;
|
|
4087
|
+
point: RollbackPointSummary;
|
|
4088
|
+
storage: RollbackStorageStatus;
|
|
4089
|
+
}
|
|
4090
|
+
/** 计数或清单:宿主回传数字就取数字,回传清单就取长度(两者都是「有多少项」)。 */
|
|
4091
|
+
type RollbackCount = number | readonly string[];
|
|
4092
|
+
/**
|
|
4093
|
+
* 预览里「回退会改动的一个文件」的动作。
|
|
4094
|
+
*
|
|
4095
|
+
* 与引擎(`src/core/rollback-point.ts` 的 `RollbackPreviewFileStatus`)**逐字同形**:
|
|
4096
|
+
* · `overwrite` = 覆盖已有文件;`create` = 当前不存在(回退会重新创建);
|
|
4097
|
+
* · `delete` **不由 `files[]` 产出**:整文件删除走**另一条**清单
|
|
4098
|
+
* (`RollbackWorkspacePreview.removals` = 会删的,`createdSkipped` = 拒删的)——
|
|
4099
|
+
* 那些路径不在该点的记录里,所以既不进这份逐文件统计、也读不出前后对照。
|
|
4100
|
+
* 保留该取值只为契约形状向前兼容 —— 界面不得为它编文案。
|
|
4101
|
+
*/
|
|
4102
|
+
type RollbackPreviewFileStatus = 'overwrite' | 'create' | 'delete';
|
|
4103
|
+
/**
|
|
4104
|
+
* E1:逐文件的行级统计(简洁版预览弹窗 `preview.workspace.files` 的元素形状)。
|
|
4105
|
+
*
|
|
4106
|
+
* **只列真的会被改动的文件** —— 已与快照一致的条目一个都不列(「353 项里 0 项不同」⇒ 空数组)。
|
|
4107
|
+
* `added` / `removed` 可能是 `null`(单文件超上限 / 单张预览累计超限 / Myers 步数超限 /
|
|
4108
|
+
* 非文本 / 对象仓读不出),此时 `truncated` 为 true:界面说「行数未统计」,
|
|
4109
|
+
* **绝不写成 0**(0 是一个会被证伪的具体数字,而「不知道」不是)。
|
|
4110
|
+
*/
|
|
4111
|
+
interface RollbackPreviewFile {
|
|
4112
|
+
/** 绝对路径(界面只做展示)。 */
|
|
4113
|
+
path: string;
|
|
4114
|
+
status: RollbackPreviewFileStatus;
|
|
4115
|
+
/** 回退会让该文件**新增**的行数;null = 本次不给数字(见 truncated)。 */
|
|
4116
|
+
added: number | null;
|
|
4117
|
+
/** 回退会从该文件**删除**的行数;null = 同上。 */
|
|
4118
|
+
removed: number | null;
|
|
4119
|
+
/** true = 本次没有可信行数(added/removed 均为 null)。**宁可说「不知道」,也绝不谎报行数。** */
|
|
4120
|
+
truncated: boolean;
|
|
4121
|
+
}
|
|
4122
|
+
interface RollbackWorkspacePreview {
|
|
4123
|
+
/** 将被写回(覆盖)的条目数 */
|
|
4124
|
+
overwrite?: RollbackCount;
|
|
4125
|
+
/** 与当前内容不同、确实会被改动 */
|
|
4126
|
+
different?: RollbackCount;
|
|
4127
|
+
/** 记录里的文件当前已不存在(回退会重新创建) */
|
|
4128
|
+
missing?: RollbackCount;
|
|
4129
|
+
/**
|
|
4130
|
+
* 该点**未记录**的条目总数。**不是**「之后新建」,也**不是**「会被删除」——
|
|
4131
|
+
* 会被删的是 {@link removals} / {@link removalsCount}。
|
|
4132
|
+
*/
|
|
4133
|
+
createdAfter?: RollbackCount;
|
|
4134
|
+
/** 该点**未记录**的路径清单(含被拒删的;宿主上限 20 条)—— **不是**删除清单 */
|
|
4135
|
+
leftovers?: string[];
|
|
4136
|
+
leftoversTruncated?: boolean;
|
|
4137
|
+
/** **会被删除**的路径(= 未记录 + 过了安全判据;宿主上限 20 条) */
|
|
4138
|
+
removals?: string[];
|
|
4139
|
+
/** 会被删除的**真实总数**(不受清单上限影响) */
|
|
4140
|
+
removalsCount?: RollbackCount;
|
|
4141
|
+
/** 删除逐条清单不完整(条数超上限 / 遍历被截断) */
|
|
4142
|
+
removalsTruncated?: boolean;
|
|
4143
|
+
/** 按安全判据**拒删**的路径(.git / node_modules / 数据区 / 越界 / 过大 / 捕获不完整时的全部候选) */
|
|
4144
|
+
createdSkipped?: string[];
|
|
4145
|
+
/** 拒删路径的**真实总数** */
|
|
4146
|
+
createdSkippedCount?: RollbackCount;
|
|
4147
|
+
createdSkippedTruncated?: boolean;
|
|
4148
|
+
/**
|
|
4149
|
+
* 非 null = 该点捕获**不完整** ⇒ **一条都没删**(安全拒删:绝不误删既有文件)。
|
|
4150
|
+
* 界面必须如实说,绝不把它渲染成「无事可做 / 已一致」。
|
|
4151
|
+
*/
|
|
4152
|
+
createdRefusedReason?: string | null;
|
|
4153
|
+
/** 记录在案的分块(绝对路径;界面只做展示,不做判定) */
|
|
4154
|
+
chunks?: string[];
|
|
4155
|
+
/**
|
|
4156
|
+
* E1:逐文件的行级统计 —— **只含会被改动的文件**(内容已一致的条目一个都不列)。
|
|
4157
|
+
*
|
|
4158
|
+
* 可选(`?`)是**刻意的向后兼容**:老响应 / 老宿主不认识这个字段,缺省必须回落
|
|
4159
|
+
* 「没有这条信息」,而不是被当成「空数组=全部一致」或抛错 —— 界面据「字段是否存在」
|
|
4160
|
+
* 决定是否显示文件列表,绝不把「缺字段」与「确知为空」混成同一件事。
|
|
4161
|
+
*/
|
|
4162
|
+
files?: RollbackPreviewFile[];
|
|
4163
|
+
/** 捕获时被跳过的条目总数(skipped + excludedDirs;逐条列表的上限截断不影响本计数) */
|
|
4164
|
+
skippedCount?: RollbackCount;
|
|
4165
|
+
/** 捕获是否被上限截断(超单文件上限 / 字节预算 / 文件数预算任一命中即为 true) */
|
|
4166
|
+
truncated?: boolean;
|
|
4167
|
+
available?: boolean;
|
|
4168
|
+
reasonCode?: string | null;
|
|
4169
|
+
guidance?: RollbackGuidance[];
|
|
4170
|
+
}
|
|
4171
|
+
interface RollbackSessionPreview {
|
|
4172
|
+
/** 回退目标边界:目标回合开始前最后一个事件的 seq(fork 的 inclusive 边界;无边界为 null) */
|
|
4173
|
+
from?: number | null;
|
|
4174
|
+
/** 该回合 turn/end 的 seq(无边界为 null) */
|
|
4175
|
+
to?: number | null;
|
|
4176
|
+
/** 该点对应的回合号 */
|
|
4177
|
+
turns?: number;
|
|
4178
|
+
/** 当前事件游标(seq) */
|
|
4179
|
+
cursorSeq?: number | null;
|
|
4180
|
+
/** 当前日志字节数 */
|
|
4181
|
+
cursorNowBytes?: number | null;
|
|
4182
|
+
/** 目标边界的字节数 */
|
|
4183
|
+
cursorTargetBytes?: number | null;
|
|
4184
|
+
/** 该段是否可回退(无边界 / 副本缺失 → false) */
|
|
4185
|
+
restorable?: boolean;
|
|
4186
|
+
/** 日志刚被写过(仅供参考:fork 只读,不会覆盖日志) */
|
|
4187
|
+
active?: boolean;
|
|
4188
|
+
reasonCode?: string | null;
|
|
4189
|
+
available?: boolean;
|
|
4190
|
+
guidance?: RollbackGuidance[];
|
|
4191
|
+
}
|
|
4192
|
+
interface RollbackPreviewResult {
|
|
4193
|
+
ok: boolean;
|
|
4194
|
+
code?: string;
|
|
4195
|
+
detail?: string;
|
|
4196
|
+
id: string;
|
|
4197
|
+
storage: RollbackStorageStatus;
|
|
4198
|
+
workspace?: RollbackWorkspacePreview | null;
|
|
4199
|
+
session?: RollbackSessionPreview | null;
|
|
4200
|
+
/** 该点的两态摘要(宿主回传;缺失时界面用列表行里的同一份摘要) */
|
|
4201
|
+
point?: RollbackPointSummary | null;
|
|
4202
|
+
/** 宿主给出的权威判定(本层在此基础上再要求「至少有一段可回退」) */
|
|
4203
|
+
canRestore?: boolean;
|
|
4204
|
+
canRemove?: boolean;
|
|
4205
|
+
summary?: RollbackPointSummary;
|
|
4206
|
+
guidance?: RollbackGuidance[];
|
|
4207
|
+
warnings?: RollbackGuidance[];
|
|
4208
|
+
}
|
|
4209
|
+
/** 单文件差异里一侧(与引擎 `RollbackFileDiffSide` 逐字同形:字段名/含义都一致)。 */
|
|
4210
|
+
interface RollbackFileDiffSide {
|
|
4211
|
+
exists: boolean;
|
|
4212
|
+
bytes: number;
|
|
4213
|
+
/** 行数;null = 未读取(二进制 / 超限 / 不可读) */
|
|
4214
|
+
lines: number | null;
|
|
4215
|
+
binary: boolean;
|
|
4216
|
+
oversized: boolean;
|
|
4217
|
+
unreadable: boolean;
|
|
4218
|
+
}
|
|
4219
|
+
/** 无法逐行对比的原因(有值时 hunks 恒为空数组 —— 「不知道」不是「没有差异」)。 */
|
|
4220
|
+
type RollbackFileDiffReason = 'missing-blob' | 'binary' | 'too-large' | 'unreadable';
|
|
4221
|
+
/**
|
|
4222
|
+
* 单文件前后对照(引擎 `fileDiff` 的镜像;只列一条记录)。
|
|
4223
|
+
*
|
|
4224
|
+
* 方向:`before` = **当前磁盘**,`after` = **回退点快照**(点下回退之后该文件的样子)——
|
|
4225
|
+
* 与预览行数统计同一口径,界面左右双栏与之一致,别读反。
|
|
4226
|
+
*/
|
|
4227
|
+
interface RollbackFileDiffResult {
|
|
4228
|
+
ok: boolean;
|
|
4229
|
+
code?: string;
|
|
4230
|
+
detail?: string;
|
|
4231
|
+
id: string;
|
|
4232
|
+
path: string;
|
|
4233
|
+
status: RollbackPreviewFileStatus;
|
|
4234
|
+
before: RollbackFileDiffSide;
|
|
4235
|
+
after: RollbackFileDiffSide;
|
|
4236
|
+
hunks: DiffHunk[];
|
|
4237
|
+
added: number;
|
|
4238
|
+
removed: number;
|
|
4239
|
+
identical: boolean;
|
|
4240
|
+
degraded: boolean;
|
|
4241
|
+
reason?: RollbackFileDiffReason;
|
|
4242
|
+
}
|
|
4243
|
+
interface RollbackSegmentResult {
|
|
4244
|
+
state: string;
|
|
4245
|
+
status: string;
|
|
4246
|
+
reasonCode?: string;
|
|
4247
|
+
/** 逐条事实(技术细节,非用户可见文案) */
|
|
4248
|
+
detail?: string[];
|
|
4249
|
+
restored?: number;
|
|
4250
|
+
failed?: number;
|
|
4251
|
+
/** 该点**未记录**的路径(含被拒删的;宿主上限 20 条)。**不是**删除清单 —— 那一份是 removedPaths */
|
|
4252
|
+
leftovers?: string[];
|
|
4253
|
+
leftoversTruncated?: boolean;
|
|
4254
|
+
/** 本次真的删掉的「该点未记录」路径数(用户 2026-10-11 定案 A) */
|
|
4255
|
+
removed?: number;
|
|
4256
|
+
/** 已删除路径(有界清单;与预览的 workspace.removals 同源同序) */
|
|
4257
|
+
removedPaths?: string[];
|
|
4258
|
+
/** 想删但按安全判据拒删的路径(越界 / 数据区 / .git / node_modules / 过大 / 捕获不完整),如实报告 */
|
|
4259
|
+
createdSkipped?: string[];
|
|
4260
|
+
/** 拒删路径的**真实总数**(不受清单上限影响) */
|
|
4261
|
+
createdSkippedCount?: RollbackCount;
|
|
4262
|
+
createdSkippedTruncated?: boolean;
|
|
4263
|
+
/** 非 null = 该点捕获**不完整** ⇒ 一条都没删(安全拒删) */
|
|
4264
|
+
createdRefusedReason?: string | null;
|
|
4265
|
+
/** 工作区段:实际写回的字节数(宿主回传才有) */
|
|
4266
|
+
writtenBytes?: number;
|
|
4267
|
+
/** 兼容形态:宿主只回传计数时也算得出来 */
|
|
4268
|
+
createdAfter?: RollbackCount;
|
|
4269
|
+
createdAfterTruncated?: boolean;
|
|
4270
|
+
/** 会话段:回退产生的 fork 子会话 id */
|
|
4271
|
+
childSessionId?: string;
|
|
4272
|
+
guidance?: RollbackGuidance[];
|
|
4273
|
+
}
|
|
4274
|
+
interface RollbackRewindResult {
|
|
4275
|
+
ok: boolean;
|
|
4276
|
+
outcome: string;
|
|
4277
|
+
code: string;
|
|
4278
|
+
detail?: string;
|
|
4279
|
+
id?: string;
|
|
4280
|
+
segments?: RollbackSegmentResult[];
|
|
4281
|
+
/** 因前段失败 / 未请求而未执行的段(只可能是两态) */
|
|
4282
|
+
skippedSegments?: string[];
|
|
4283
|
+
/** 会话回退结果:fork 出来的子会话 id(S3;原会话日志只读,绝不改写) */
|
|
4284
|
+
childSessionId?: string;
|
|
4285
|
+
/** 回退前自动留的救援点 id(S5 guard) */
|
|
4286
|
+
guardPointId?: string;
|
|
4287
|
+
storage?: RollbackStorageStatus;
|
|
4288
|
+
guidance?: RollbackGuidance[];
|
|
4289
|
+
warnings?: RollbackGuidance[];
|
|
4290
|
+
}
|
|
4291
|
+
interface RollbackRemoveResult {
|
|
4292
|
+
ok: boolean;
|
|
4293
|
+
code: string;
|
|
4294
|
+
detail?: string;
|
|
4295
|
+
id: string;
|
|
4296
|
+
}
|
|
4297
|
+
/** 回退输入(冻结 wire contract 的 rewind body)。 */
|
|
4298
|
+
interface RollbackRewindOptions {
|
|
4299
|
+
/** fail-closed 确认门:必须**恰好** true(宿主缺省/假值一律 409 confirmation-required) */
|
|
4300
|
+
userConfirmed: boolean;
|
|
4301
|
+
mode?: RollbackMode;
|
|
4302
|
+
segments?: readonly RollbackState[];
|
|
4303
|
+
allowPartial?: boolean;
|
|
4304
|
+
preRewindGuard?: RollbackGuardPolicy;
|
|
4305
|
+
}
|
|
4306
|
+
/** 端口:由 src/client/recovery/recovery-api.ts 实现(Partial 消费,缺失时界面如实说能力缺失)。 */
|
|
4307
|
+
interface RollbackPointPort {
|
|
4308
|
+
rollbackPoints(): Promise<RollbackListResult>;
|
|
4309
|
+
rollbackPointStorage(): Promise<RollbackStorageStatus>;
|
|
4310
|
+
rollbackPoint(id: string): Promise<RollbackDetailResult>;
|
|
4311
|
+
rollbackPointPreview(id: string): Promise<RollbackPreviewResult>;
|
|
4312
|
+
/**
|
|
4313
|
+
* 只读:该点里**一个记录在案文件**的前后逐行对照(预览弹窗按需拉取;未命中记录一律拒绝)。
|
|
4314
|
+
* 可选实现:端口缺失该方法时,界面**不显示**「查看」(绝不给一个点了没反应的入口)。
|
|
4315
|
+
*/
|
|
4316
|
+
rollbackPointFileDiff?(id: string, path: string): Promise<RollbackFileDiffResult>;
|
|
4317
|
+
restoreRollbackPoint(id: string, opts: RollbackRewindOptions): Promise<RollbackRewindResult>;
|
|
4318
|
+
removeRollbackPoint(id: string, userConfirmed: boolean): Promise<RollbackRemoveResult>;
|
|
4319
|
+
}
|
|
4320
|
+
//#endregion
|
|
3835
4321
|
//#region src/client/recovery/recovery-api.d.ts
|
|
3836
|
-
/** Recovery 浏览器半数据入口(实现 RecoveryPort
|
|
3837
|
-
declare class RecoveryApi implements RecoveryPort {
|
|
4322
|
+
/** Recovery 浏览器半数据入口(实现 RecoveryPort 契约 + rollback-points 族)。 */
|
|
4323
|
+
declare class RecoveryApi implements RecoveryPort, RollbackPointPort {
|
|
3838
4324
|
readonly t: UiT;
|
|
3839
|
-
constructor(t
|
|
4325
|
+
constructor(t: UiT);
|
|
3840
4326
|
/** GET /recovery/status:列出未解决 operation + reconcile decision。 */
|
|
3841
4327
|
status(): Promise<RecoveryStatus>;
|
|
3842
4328
|
/**
|
|
@@ -3858,6 +4344,52 @@ declare class RecoveryApi implements RecoveryPort {
|
|
|
3858
4344
|
size: number;
|
|
3859
4345
|
mtimeMs: number;
|
|
3860
4346
|
}, allowLossy?: boolean): Promise<SessionRepairResult>;
|
|
4347
|
+
/**
|
|
4348
|
+
* GET /recovery/rollback-points:台账列表(按时间倒序)+ 存储栈状态 + 留存上限。
|
|
4349
|
+
*
|
|
4350
|
+
* 列表本身**只读**:SAFE MODE 下也能看(宿主侧只有 rewind / delete 被 423 拦下),
|
|
4351
|
+
* 因此界面必须能「看得见、但按钮说明为什么点不了」。
|
|
4352
|
+
* 存储栈不可用时宿主回 **503 + 同体**(`storage.available=false` + guidance);`getJson` 对非 2xx
|
|
4353
|
+
* 抛 `ConfigManagerApiError`(`status`=503,`code` 取响应体 code),调用方按 status 区分「读不出来」
|
|
4354
|
+
* 与「本来就没有」。
|
|
4355
|
+
*/
|
|
4356
|
+
rollbackPoints(): Promise<RollbackListResult>;
|
|
4357
|
+
/** GET /recovery/rollback-points/storage:存储栈探针(不可用 → 503 + guidance,同上)。 */
|
|
4358
|
+
rollbackPointStorage(): Promise<RollbackStorageStatus>;
|
|
4359
|
+
/** GET /recovery/rollback-points/<id>:单条详情(不存在 → 404 `record-not-found`)。 */
|
|
4360
|
+
rollbackPoint(id: string): Promise<RollbackDetailResult>;
|
|
4361
|
+
/**
|
|
4362
|
+
* GET /recovery/rollback-points/<id>/preview:**只读预览(零写入)**。
|
|
4363
|
+
*
|
|
4364
|
+
* 回传两态将覆盖多少项、其中多少项内容不同、多少项当前已不存在、多少项是该点**未记录**的
|
|
4365
|
+
* (`removals` = 会被删除的、`createdSkipped` = 按安全判据拒删的;两者都只是**读回来的清单**,
|
|
4366
|
+
* 本方法零写入),以及会话边界(from → to)与回合号;`canRestore` / `canRemove`
|
|
4367
|
+
* 是宿主给出的权威判定,界面据此决定按钮可用性(展示判定见 `src/ui/rollback-view.ts`)。
|
|
4368
|
+
*/
|
|
4369
|
+
rollbackPointPreview(id: string): Promise<RollbackPreviewResult>;
|
|
4370
|
+
/**
|
|
4371
|
+
* GET /recovery/rollback-points/<id>/file-diff?path=...:**单个记录在案文件**的前后逐行对照。
|
|
4372
|
+
*
|
|
4373
|
+
* 只读、零写入;路径以 query 传递(宿主内再收窄一次:未命中该点记录一律 `file-not-recorded`,
|
|
4374
|
+
* 一个字节都不读)。非 2xx(存储栈 503 / 参数 400)由 getJson 抛 ConfigManagerApiError,
|
|
4375
|
+
* 由调用方按 status + code 出文案。
|
|
4376
|
+
*/
|
|
4377
|
+
rollbackPointFileDiff(id: string, path: string): Promise<RollbackFileDiffResult>;
|
|
4378
|
+
/**
|
|
4379
|
+
* POST /recovery/rollback-points/<id>/rewind:回退(工作区文件覆盖 + 会话 fork 子会话)。
|
|
4380
|
+
*
|
|
4381
|
+
* **确认门是 fail-closed**:`userConfirmed` 必须**恰好** true(宿主缺省 / 假值一律
|
|
4382
|
+
* 409 `confirmation-required` + 零写入)。本方法绝不自动置 true —— 由确认弹窗的 onClick 传进来。
|
|
4383
|
+
* 409(confirmation-required / protected-point / record-incomplete)与 423(mutation-locked)
|
|
4384
|
+
* 都以 `ConfigManagerApiError` 抛出,`status` / `code` 保留,界面按 code 出文案(不靠状态码猜原因)。
|
|
4385
|
+
* 会话回退 **不改写原会话日志**:结果里回传 `childSessionId`(新子会话),原会话只读。
|
|
4386
|
+
*/
|
|
4387
|
+
restoreRollbackPoint(id: string, opts: RollbackRewindOptions): Promise<RollbackRewindResult>;
|
|
4388
|
+
/**
|
|
4389
|
+
* POST /recovery/rollback-points/<id>/delete:删除一个回滚点(保护点由宿主拒绝)。
|
|
4390
|
+
* body 必须 `userConfirmed: true`(未确认 → 409 `confirmation-required`);本方法不自动置 true。
|
|
4391
|
+
*/
|
|
4392
|
+
removeRollbackPoint(id: string, userConfirmed: boolean): Promise<RollbackRemoveResult>;
|
|
3861
4393
|
/** POST /recovery/sessions/rollback(T8):按台账 repairId 回滚(客户端不传路径)。 */
|
|
3862
4394
|
rollbackSessionRepair(repairId: string): Promise<SessionRepairRollbackResult>;
|
|
3863
4395
|
/**
|
|
@@ -3964,7 +4496,7 @@ type HistoryExportFormat = 'json' | 'markdown';
|
|
|
3964
4496
|
/** History 浏览器半数据入口。 */
|
|
3965
4497
|
declare class HistoryApi {
|
|
3966
4498
|
readonly t: UiT;
|
|
3967
|
-
constructor(t
|
|
4499
|
+
constructor(t: UiT);
|
|
3968
4500
|
private buildListUrl;
|
|
3969
4501
|
/** GET /history:按 kind/result/时间/分区 过滤读取历史。 */
|
|
3970
4502
|
list(params?: {
|
|
@@ -4022,7 +4554,7 @@ interface RescueActionResult {
|
|
|
4022
4554
|
/** 事故恢复(崩溃归因 + 救援模式)浏览器半数据入口。 */
|
|
4023
4555
|
declare class IncidentApi {
|
|
4024
4556
|
readonly t: UiT;
|
|
4025
|
-
constructor(t
|
|
4557
|
+
constructor(t: UiT);
|
|
4026
4558
|
/** GET /crash:上次启动是否异常 + 归因 + 建议动作 + 最后正常时刻。 */
|
|
4027
4559
|
crash(): Promise<CrashReport>;
|
|
4028
4560
|
/** GET /rescue:救援模式状态。 */
|
|
@@ -4073,7 +4605,7 @@ interface ConfigManagerSectionInjected {
|
|
|
4073
4605
|
* 字典 namespace 由 client/index.ts 注册(declare module 合并进 LocaleNamespaceMap)。
|
|
4074
4606
|
* 键集合通过 `ConfigManagerKey` 类型在注册处做编译期校验(缺键/多键即编译错误)。
|
|
4075
4607
|
*/
|
|
4076
|
-
declare const zh$
|
|
4608
|
+
declare const zh$4: {
|
|
4077
4609
|
readonly 'section.label': '备份与迁移';
|
|
4078
4610
|
readonly 'section.description': '导出 / 导入 / 迁移 DSH 配置(备份不含密钥,加密备份可选)';
|
|
4079
4611
|
readonly 'section.settings': '设置';
|
|
@@ -4092,11 +4624,20 @@ declare const zh$3: {
|
|
|
4092
4624
|
readonly 'section.sessions': '历史会话';
|
|
4093
4625
|
readonly 'section.self': '插件自身配置';
|
|
4094
4626
|
readonly 'view.about': '关于';
|
|
4627
|
+
readonly 'about.snippet.environment': '### 环境 / Environment';
|
|
4628
|
+
readonly 'about.releaseNotes.rateLimited': 'GitHub API 速率限制(Rate limit exceeded),请稍后再试或直接在 GitHub 上查看。';
|
|
4629
|
+
readonly 'about.releaseNotes.fetchFailed': 'GitHub API 请求失败 ({status} {statusText})';
|
|
4630
|
+
readonly 'about.snippet.plugin': '- 插件版本 / Plugin: {version}';
|
|
4631
|
+
readonly 'about.snippet.dsh': '- DSH 版本 / DSH: {version}';
|
|
4632
|
+
readonly 'about.snippet.platform': '- 平台 / Platform: {platform}';
|
|
4633
|
+
readonly 'about.snippet.pluginDir': '- 插件清单目录 / Plugin dir: {dir}';
|
|
4095
4634
|
readonly 'common.close': '关闭';
|
|
4096
4635
|
readonly 'common.cancel': '取消';
|
|
4636
|
+
readonly 'common.labelSeparator': ':';
|
|
4097
4637
|
readonly 'common.back': '上一步';
|
|
4098
4638
|
readonly 'common.next': '下一步';
|
|
4099
4639
|
readonly 'common.retry': '重试';
|
|
4640
|
+
readonly 'common.saveFailed': '浏览器存储写入失败:当前进度仍在本页内存中,刷新会丢失';
|
|
4100
4641
|
readonly 'common.loading': '加载中…';
|
|
4101
4642
|
readonly 'common.unknownError': '未知错误';
|
|
4102
4643
|
readonly 'common.parens': '({text})';
|
|
@@ -4143,6 +4684,8 @@ declare const zh$3: {
|
|
|
4143
4684
|
readonly 'overview.quick.sync': '远程同步';
|
|
4144
4685
|
readonly 'overview.activity.title': '最近活动';
|
|
4145
4686
|
readonly 'overview.activity.empty': '暂无操作记录(执行备份 / 导入 / 同步后在这里显示)';
|
|
4687
|
+
readonly 'overview.activity.unavailable': '活动记录读取失败(这不是「没有记录」)';
|
|
4688
|
+
readonly 'overview.loadFailed': '有 {count} 项数据读取失败:{message} —— 下面的指标可能不完整';
|
|
4146
4689
|
readonly 'overview.empty.title': '开始保护你的配置';
|
|
4147
4690
|
readonly 'overview.empty.body': '创建第一个备份或快照后,这里会展示配置健康状态与最近活动。';
|
|
4148
4691
|
readonly 'overview.empty.step1': '创建第一份备份';
|
|
@@ -4200,6 +4743,7 @@ declare const zh$3: {
|
|
|
4200
4743
|
readonly 'picker.expand': '展开';
|
|
4201
4744
|
readonly 'picker.collapse': '收起';
|
|
4202
4745
|
readonly 'picker.partial': '部分';
|
|
4746
|
+
readonly 'picker.blankSession': '新会话';
|
|
4203
4747
|
readonly 'picker.highRisk': '高风险';
|
|
4204
4748
|
readonly 'picker.highRiskHint': '该分区来自公共仓库、未经官方审核:勾选后会在本机安装插件 / 写入文件 / 注入全局指令。导入前会创建可回滚快照,风险由你确认。';
|
|
4205
4749
|
readonly 'picker.locked': '捆绑';
|
|
@@ -4819,6 +5363,10 @@ declare const zh$3: {
|
|
|
4819
5363
|
readonly 'library.refresh': '刷新';
|
|
4820
5364
|
readonly 'library.searchPlaceholder': '搜索文件名 / 备注 / 快照 id';
|
|
4821
5365
|
readonly 'library.sourceFailed': '{count} 个来源读取失败';
|
|
5366
|
+
readonly 'library.snapshotsUnreadable': '有快照目录读不出来(这不是「没有快照」)';
|
|
5367
|
+
readonly 'snapshots.planChanged': '环境在预览后发生了变化,恢复已取消 —— 请重新预览确认';
|
|
5368
|
+
readonly 'library.snapshotReferencedByRecovery': '该快照是事故恢复的回滚点,已拒绝删除(请先处理恢复事项)';
|
|
5369
|
+
readonly 'library.snapshotReferenceUnreadable': '读不到恢复引用清单,已保守拒绝删除(请重试)';
|
|
4822
5370
|
readonly 'library.retry': '重试';
|
|
4823
5371
|
readonly 'library.emptyFiltered': '没有匹配的产物';
|
|
4824
5372
|
readonly 'library.delete': '删除';
|
|
@@ -4835,6 +5383,7 @@ declare const zh$3: {
|
|
|
4835
5383
|
readonly 'palette.view.about': '关于';
|
|
4836
5384
|
readonly 'palette.rescue.recovery': '事故恢复';
|
|
4837
5385
|
readonly 'palette.rescue.mode': '救援模式';
|
|
5386
|
+
readonly 'palette.rescue.rollback': '回滚点(工作区 + 会话回退)';
|
|
4838
5387
|
readonly 'import.reason.schemaUnsupported': '包内 schema 版本 v{version} 超出本插件支持范围';
|
|
4839
5388
|
readonly 'import.reason.missingSections': '备份声明但包内缺失 {count} 个分区:{sections}';
|
|
4840
5389
|
readonly 'import.reason.sourceNewer': '备份来自更新的 DSH({source} → 本机 {target}):可能有本机不认识的配置';
|
|
@@ -4934,7 +5483,7 @@ declare const zh$3: {
|
|
|
4934
5483
|
readonly 'foreign.conflict.policy': '同 id 冲突:不覆盖本机既有内容,跳过并在报告里逐条说明';
|
|
4935
5484
|
};
|
|
4936
5485
|
/** 字典键联合(注册处 compile-time 校验) */
|
|
4937
|
-
type ConfigManagerKey = keyof typeof zh$
|
|
5486
|
+
type ConfigManagerKey = keyof typeof zh$4;
|
|
4938
5487
|
//#endregion
|
|
4939
5488
|
//#region src/client/sync/sync-locales.d.ts
|
|
4940
5489
|
/**
|
|
@@ -4942,7 +5491,7 @@ type ConfigManagerKey = keyof typeof zh$3;
|
|
|
4942
5491
|
* 独立命名空间、独立文件:不触碰共享的 locales.ts(并行会话已改),零冲突。
|
|
4943
5492
|
* 键集合经 `SyncKey` 类型在 client/index.ts 注册处做编译期校验。
|
|
4944
5493
|
*/
|
|
4945
|
-
declare const zh$
|
|
5494
|
+
declare const zh$3: {
|
|
4946
5495
|
readonly 'section.label': '远程同步';
|
|
4947
5496
|
readonly 'section.description': '通过 Git 私有仓库在设备间同步可移植配置(密钥默认不同步;勾选「导出密钥」并加密后可随加密快照迁移)';
|
|
4948
5497
|
readonly privateRepoHint: '安全要求:同步仓库必须为私有仓库(public 仓库会公开你的配置内容)。认证 token 仅用于仓库访问,绝不写入同步文件、提交内容或日志。';
|
|
@@ -4975,6 +5524,22 @@ declare const zh$2: {
|
|
|
4975
5524
|
readonly 'channel.configured': '已配置';
|
|
4976
5525
|
readonly 'channel.notConfigured': '未配置';
|
|
4977
5526
|
readonly 'channel.currentUrl': '当前地址';
|
|
5527
|
+
readonly 'workdir.title': '工作副本';
|
|
5528
|
+
readonly 'workdir.hint': '同步使用的 Git 工作副本。每次同步都会让它的 origin 跟随当前仓库地址;改地址后若仍失败,可在这里重指向或重新克隆。';
|
|
5529
|
+
readonly 'workdir.path': '路径';
|
|
5530
|
+
readonly 'workdir.origin': 'origin';
|
|
5531
|
+
readonly 'workdir.match': '已跟随仓库地址';
|
|
5532
|
+
readonly 'workdir.mismatch': '仍指向旧地址';
|
|
5533
|
+
readonly 'workdir.missing': '尚未创建(首次同步时克隆)';
|
|
5534
|
+
readonly 'workdir.unknown': '读不出工作副本状态';
|
|
5535
|
+
readonly 'workdir.relink': '重指向仓库地址';
|
|
5536
|
+
readonly 'workdir.reclone': '重新克隆工作副本';
|
|
5537
|
+
readonly 'workdir.recloneConfirmTitle': '重新克隆工作副本?';
|
|
5538
|
+
readonly 'workdir.recloneConfirmMessage': '将删除本机工作副本目录并从远端重新克隆。本机配置与远端快照都不受影响,但工作副本里尚未推送的本地提交会被丢弃 —— 需要时请先在同步页执行一次推送。';
|
|
5539
|
+
readonly 'workdir.recloneConfirm': '重新克隆';
|
|
5540
|
+
readonly 'toast.workdirRelinked': '工作副本已重指向当前仓库地址';
|
|
5541
|
+
readonly 'toast.workdirRecloned': '工作副本已重新克隆';
|
|
5542
|
+
readonly 'toast.workdirResetFailed': '重建工作副本失败';
|
|
4978
5543
|
readonly 'syncStatus.lastSync': '上次同步';
|
|
4979
5544
|
readonly 'syncStatus.sections': '可同步分区';
|
|
4980
5545
|
readonly 'syncStatus.state': '配置状态';
|
|
@@ -4988,6 +5553,13 @@ declare const zh$2: {
|
|
|
4988
5553
|
readonly 'webdav.passwordSaved': '凭据已配置';
|
|
4989
5554
|
readonly 'webdav.passwordPlaceholder': '密码(可选)';
|
|
4990
5555
|
readonly 'webdav.presetHint': '选择常见 WebDAV 服务器可快速填入地址;含 <占位符> 的模板请替换为你的真实服务器/用户名。';
|
|
5556
|
+
readonly 'webdav.preset.custom': 'Custom URL';
|
|
5557
|
+
readonly 'webdav.preset.jianguoyun': '坚果云 (Jianguoyun)';
|
|
5558
|
+
readonly 'webdav.preset.nextcloud': 'Nextcloud';
|
|
5559
|
+
readonly 'webdav.preset.owncloud': 'ownCloud';
|
|
5560
|
+
readonly 'webdav.preset.seafile': 'Seafile';
|
|
5561
|
+
readonly 'webdav.preset.synology': 'Synology NAS (WebDAV)';
|
|
5562
|
+
readonly 'webdav.preset.box': 'Box';
|
|
4991
5563
|
readonly 'github.title': 'GitHub 登录';
|
|
4992
5564
|
readonly 'github.description': '通过 GitHub OAuth 设备码流程授权:无需手动输入 token,在浏览器中确认授权后,token 自动写入 DSH credentials。';
|
|
4993
5565
|
readonly 'github.login': '使用 GitHub 登录';
|
|
@@ -5070,20 +5642,28 @@ declare const zh$2: {
|
|
|
5070
5642
|
readonly 'syncflow.rollback': '回滚到应用前';
|
|
5071
5643
|
readonly 'syncflow.rollingBack': '正在回滚…';
|
|
5072
5644
|
readonly 'syncflow.rollbackDone': '已回滚到应用前';
|
|
5645
|
+
readonly 'syncflow.rollbackPartialToast': '回滚未完成:{n} 项没能恢复';
|
|
5646
|
+
readonly 'syncflow.rollbackIncomplete': '回滚未完成:{n} 项无法自动恢复(配置可能停留在中间状态)';
|
|
5647
|
+
readonly 'syncflow.rollbackFailedItems': '未回滚项(需人工处理)';
|
|
5648
|
+
readonly 'syncflow.importRollbackIncomplete': '导入失败,且整体回滚未完成:有改动没能恢复(见下方告警)';
|
|
5073
5649
|
readonly 'syncflow.needsRestart': '部分改动需要重启 DSH 后生效';
|
|
5074
5650
|
readonly 'syncflow.pushPreviewTitle': '确认推送';
|
|
5075
5651
|
readonly 'syncflow.pushPreviewSections': '将推送的分区';
|
|
5652
|
+
readonly 'syncflow.pushChanged': '有改动';
|
|
5653
|
+
readonly 'syncflow.pushUnchanged': '无改动';
|
|
5076
5654
|
readonly 'syncflow.pushConfirm': '确认推送';
|
|
5077
5655
|
readonly 'syncflow.pushing': '正在推送…';
|
|
5078
5656
|
readonly 'syncflow.pushFirstBaseline': '远端暂无快照:本次将创建首个同步基线';
|
|
5079
5657
|
readonly 'mode.title': '同步分区';
|
|
5080
5658
|
readonly 'mode.hint': '点按钮在弹窗里勾选要同步的分区:勾选集合就是同步范围(默认已勾选推荐分区,可随时改)。';
|
|
5081
5659
|
readonly 'mode.selectedCount': '已勾选 {n} 个分区';
|
|
5082
|
-
readonly 'mode.sectionsHint': '
|
|
5660
|
+
readonly 'mode.sectionsHint': '默认可同步的是可移植分区;平台相关分区(MCP 服务器)与设备相关分区(插件文件、凭据状态、历史会话)只有你在这里主动勾选才参与同步。';
|
|
5083
5661
|
readonly 'mode.atLeastOne': '请至少勾选一个同步分区';
|
|
5084
5662
|
readonly 'mode.sectionPortable': '可移植';
|
|
5085
5663
|
readonly 'mode.sectionRecommended': '推荐';
|
|
5086
5664
|
readonly 'mode.sectionDeviceSpecific': '设备相关';
|
|
5665
|
+
readonly 'mode.sectionPlatformSpecific': '平台相关';
|
|
5666
|
+
readonly 'mode.mcpHint': 'MCP 服务器按 patch 行写回(导入时落回原层)。按包安装的 stdio 服务器(npx / uvx / pipx)配置本身可跨机;若 command / args / cwd 里是绝对路径,或目标机没装对应运行时,导入分析会给出提示 —— 配置会照常写入,但服务器在目标机可能起不来。';
|
|
5087
5667
|
readonly 'mode.sessionsLimit': '同步最近多少个会话';
|
|
5088
5668
|
readonly 'mode.sessionsLimitHint': '历史会话内容敏感,默认只带最近的 5 个(0 = 只勾选不带会话);单位是一个会话目录,同一会话的全部日志一起走。';
|
|
5089
5669
|
readonly 'mode.sessionsPick': '选择具体对话';
|
|
@@ -5092,6 +5672,7 @@ declare const zh$2: {
|
|
|
5092
5672
|
readonly 'mode.sessionsPickHint': '点名后只同步勾中的对话(优先于上面的数量上限);一个都不勾 = 回到「最近 N 个」模式。';
|
|
5093
5673
|
readonly 'mode.sessionsPickReset': '改为「最近 N 个」';
|
|
5094
5674
|
readonly 'mode.sessionsWorkspaceWarn': '已勾选历史对话,但没有勾选「工作区」分区:目标机上这些对话可能归属不到任何工作区而显示不出来。建议一并勾选「工作区」。';
|
|
5675
|
+
readonly 'mode.gistSessionsWarn': '当前通道是 GitHub Gist,且勾选了「历史会话」:gist 会一次取回全部文件内容、单文件超限即截断、文件数还有上限,大分区同步可能失败或内容被截断。建议改用 Git / WebDAV / 对象存储通道同步历史会话,或取消勾选该分区。';
|
|
5095
5676
|
readonly 'mode.persistHint': '分区选择已保存到本机:自动同步和手动推送都会使用此配置(重启后仍生效)。';
|
|
5096
5677
|
readonly 'mode.choose': '选择同步分区';
|
|
5097
5678
|
readonly 'mode.pickerTitle': '选择同步分区';
|
|
@@ -5139,6 +5720,9 @@ declare const zh$2: {
|
|
|
5139
5720
|
readonly 'autosync.skipped': '已跳过';
|
|
5140
5721
|
readonly 'autosync.failed': '失败';
|
|
5141
5722
|
readonly 'autosync.partial': '部分成功';
|
|
5723
|
+
readonly 'autosync.skipReasonLabel': '跳过原因';
|
|
5724
|
+
readonly 'autosync.skipReasonConflictCount': '{reason}(远端另有 {n} 个分区待确认,可在同步页手动处理)';
|
|
5725
|
+
readonly 'autosync.lastMessage': '本轮消息';
|
|
5142
5726
|
readonly 'history.title': '同步历史';
|
|
5143
5727
|
readonly 'history.empty': '尚无同步历史';
|
|
5144
5728
|
readonly 'history.emptyHint': '完成首次 push / 一键同步 / 自动同步后,这里会显示记录。';
|
|
@@ -5158,6 +5742,11 @@ declare const zh$2: {
|
|
|
5158
5742
|
readonly 'history.autosyncReasonNoRemote': '无远端快照';
|
|
5159
5743
|
readonly 'history.autosyncReasonNotConfigured': '未配置仓库';
|
|
5160
5744
|
readonly 'history.autosyncReasonNetwork': '网络问题';
|
|
5745
|
+
readonly 'history.autosyncReasonEncrypted': '远端快照已加密,自动同步跳过(请手动同步)';
|
|
5746
|
+
readonly 'history.autosyncReasonMutationLocked': '环境锁被占用(另一项任务进行中,或存在需回收的残留锁)';
|
|
5747
|
+
readonly 'history.autosyncReasonUnknown': '未知';
|
|
5748
|
+
readonly 'history.autosyncReasonUpToDate': '无变化(本地与远端一致)';
|
|
5749
|
+
readonly 'history.autosyncReasonUnchanged': '远端无新快照,无需合并';
|
|
5161
5750
|
readonly 'history.autosyncConflicted': '跳过冲突分区:{sections}';
|
|
5162
5751
|
readonly 'history.autosyncApplied': '应用分区:{sections}';
|
|
5163
5752
|
readonly 'history.autosyncError': '错误:{error}';
|
|
@@ -5195,6 +5784,9 @@ declare const zh$2: {
|
|
|
5195
5784
|
readonly 'snapshots.unreadableHint': '远端存在 {n} 个无法解析的快照,它们不会出现在列表里:{files}';
|
|
5196
5785
|
readonly 'load.failed': '加载同步状态失败';
|
|
5197
5786
|
readonly 'common.close': '关闭';
|
|
5787
|
+
readonly 'common.labelSeparator': ':';
|
|
5788
|
+
readonly 'common.parens': '({text})';
|
|
5789
|
+
readonly 'common.listSeparator': '、';
|
|
5198
5790
|
readonly 'common.retry': '重试';
|
|
5199
5791
|
readonly 'common.loading': '加载中…';
|
|
5200
5792
|
readonly 'common.infoHint': '查看说明';
|
|
@@ -5235,6 +5827,7 @@ declare const zh$2: {
|
|
|
5235
5827
|
readonly 'cloud.secretPlaceholder': '••••••••';
|
|
5236
5828
|
readonly 'cloud.gistId': 'Gist ID';
|
|
5237
5829
|
readonly 'cloud.gistIdHint': 'gist 地址末段的十六进制 id(如 https://gist.github.com/<用户>/<id>)。';
|
|
5830
|
+
readonly 'cloud.gistLargeSectionHint': 'gist 通道不做内容外置:一次请求就把全部文件内容取回、单文件超限会被截断,且文件数有上限 —— 历史会话这类大分区不适合走 gist,请改用 Git / WebDAV / 对象存储通道。';
|
|
5238
5831
|
readonly 'cloud.apiBaseUrl': 'API 根地址(可选)';
|
|
5239
5832
|
readonly 'cloud.apiBaseUrlHint': '留空 = https://api.github.com;GitHub Enterprise 可改为自建地址。';
|
|
5240
5833
|
readonly 'cloud.filePrefix': '文件名前缀(可选)';
|
|
@@ -5260,7 +5853,7 @@ declare const zh$2: {
|
|
|
5260
5853
|
readonly 'cloud.credentialsWriteFailed': '密钥写入 DSH 凭据失败(配置未保存)';
|
|
5261
5854
|
};
|
|
5262
5855
|
/** 字典键联合(注册处 compile-time 校验) */
|
|
5263
|
-
type SyncKey = keyof typeof zh$
|
|
5856
|
+
type SyncKey = keyof typeof zh$3;
|
|
5264
5857
|
//#endregion
|
|
5265
5858
|
//#region src/client/market/market-locales.d.ts
|
|
5266
5859
|
/**
|
|
@@ -5274,7 +5867,7 @@ type SyncKey = keyof typeof zh$2;
|
|
|
5274
5867
|
*
|
|
5275
5868
|
* 键集合经 `MarketKey` 类型在 client/index.ts 注册处做编译期校验。
|
|
5276
5869
|
*/
|
|
5277
|
-
declare const zh$
|
|
5870
|
+
declare const zh$2: {
|
|
5278
5871
|
readonly 'section.label': '配置市场';
|
|
5279
5872
|
readonly 'section.description': '浏览并下载社区共享的配置(公开 Git 仓库;下载内容一律视为不可信,导入前必经校验与确认)';
|
|
5280
5873
|
readonly 'config.title': '市场仓库';
|
|
@@ -5453,6 +6046,7 @@ declare const zh$1: {
|
|
|
5453
6046
|
readonly 'myconfigs.error.loadStatus': '登录状态读取失败';
|
|
5454
6047
|
readonly 'myconfigs.error.loadItems': '已上传列表读取失败';
|
|
5455
6048
|
readonly 'common.cancel': '取消';
|
|
6049
|
+
readonly 'common.labelSeparator': ':';
|
|
5456
6050
|
readonly 'common.close': '关闭';
|
|
5457
6051
|
readonly 'common.retry': '重试';
|
|
5458
6052
|
readonly 'common.loading': '加载中…';
|
|
@@ -5460,7 +6054,7 @@ declare const zh$1: {
|
|
|
5460
6054
|
readonly 'common.infoHint': '查看说明';
|
|
5461
6055
|
};
|
|
5462
6056
|
/** 字典键联合(注册处 compile-time 校验) */
|
|
5463
|
-
type MarketKey = keyof typeof zh$
|
|
6057
|
+
type MarketKey = keyof typeof zh$2;
|
|
5464
6058
|
//#endregion
|
|
5465
6059
|
//#region src/client/recovery/recovery-locales.d.ts
|
|
5466
6060
|
/**
|
|
@@ -5473,10 +6067,12 @@ type MarketKey = keyof typeof zh$1;
|
|
|
5473
6067
|
* Preview / Confirm / Execute / Verify / Retry / Dismiss / Quarantine / Snapshot / Operation /
|
|
5474
6068
|
* Environment / Manual Action Required。
|
|
5475
6069
|
*/
|
|
5476
|
-
declare const zh: {
|
|
6070
|
+
declare const zh$1: {
|
|
5477
6071
|
readonly 'common.cancel': '取消';
|
|
5478
6072
|
readonly 'common.retry': '重试';
|
|
5479
6073
|
readonly 'common.unknownError': '未知错误';
|
|
6074
|
+
readonly 'common.expand': '展开';
|
|
6075
|
+
readonly 'common.collapse': '收起';
|
|
5480
6076
|
readonly 'view.recovery': '恢复';
|
|
5481
6077
|
readonly 'recovery.banner': '配置修改已被保护:存在未完成的恢复事项。请先处理后继续。';
|
|
5482
6078
|
readonly 'recovery.bannerAction': '去处理';
|
|
@@ -5613,25 +6209,50 @@ declare const zh: {
|
|
|
5613
6209
|
readonly 'sessions.scan': '开始体检';
|
|
5614
6210
|
readonly 'sessions.noRoot': '本机没有会话数据目录(还没产生过会话,或 DSH home 不是这个)。';
|
|
5615
6211
|
readonly 'sessions.empty': '没有发现任何会话。';
|
|
5616
|
-
readonly 'sessions.
|
|
5617
|
-
readonly 'sessions.
|
|
5618
|
-
readonly 'sessions.
|
|
5619
|
-
readonly 'sessions.
|
|
5620
|
-
readonly 'sessions.
|
|
5621
|
-
readonly 'sessions.
|
|
6212
|
+
readonly 'sessions.metric.total': '会话总数';
|
|
6213
|
+
readonly 'sessions.metric.attention': '需要处理';
|
|
6214
|
+
readonly 'sessions.metric.format': '会话格式';
|
|
6215
|
+
readonly 'sessions.severityShort.blocksStartup': '阻断启动';
|
|
6216
|
+
readonly 'sessions.severityShort.unloadable': '不可加载';
|
|
6217
|
+
readonly 'sessions.severityShort.nextRequestFails': '下次请求失败';
|
|
6218
|
+
readonly 'sessions.severityShort.invisible': '看不见';
|
|
6219
|
+
readonly 'sessions.rescan': '重新体检';
|
|
6220
|
+
readonly 'sessions.section.attention': '需要处理的会话';
|
|
6221
|
+
readonly 'sessions.section.attentionNone': '列表里没有需要处理的会话。';
|
|
6222
|
+
readonly 'sessions.issues.more': '还有 {count} 条';
|
|
6223
|
+
readonly 'sessions.hidden.healthyShort': '另有 {count} 条正常会话(已隐藏)';
|
|
6224
|
+
readonly 'sessions.repair.availableShort': '可应用内修复 {count} 条';
|
|
6225
|
+
readonly 'sessions.repair.noneShort': '本次没有可应用内修复的会话。';
|
|
5622
6226
|
readonly 'sessions.unverified': '已做深度校验 {verified} 条,未做深度校验 {count} 条(未验证 ≠ 没问题)';
|
|
5623
6227
|
readonly 'sessions.untested': '另有 {count} 条超出扫描上限,本次未体检。';
|
|
5624
6228
|
readonly 'sessions.unreadableEntries': '有 {count} 个目录/文件读不出来(已如实计入,未当作正常)。';
|
|
5625
|
-
readonly 'sessions.
|
|
5626
|
-
readonly 'sessions.
|
|
5627
|
-
readonly 'sessions.
|
|
5628
|
-
readonly 'sessions.
|
|
6229
|
+
readonly 'sessions.issue.duplicateId': '同一会话 id 出现在多个工作区';
|
|
6230
|
+
readonly 'sessions.issue.locationMismatch': '日志位置与所属工作区不一致';
|
|
6231
|
+
readonly 'sessions.issue.headerUnreadable': '会话头读不出来';
|
|
6232
|
+
readonly 'sessions.issue.tornTail': '末尾帧被截断(DSH 会自愈)';
|
|
6233
|
+
readonly 'sessions.issue.corruptFrame': '容器里有非法帧';
|
|
6234
|
+
readonly 'sessions.issue.unparsableEvent': '有事件无法解析';
|
|
6235
|
+
readonly 'sessions.issue.replayDuplicateRows': '重复写入的行(可零损失清理)';
|
|
6236
|
+
readonly 'sessions.issue.syntheticCloser': '合成收尾块与真实续写冲突';
|
|
6237
|
+
readonly 'sessions.issue.seqGap': '事件序号有空洞';
|
|
6238
|
+
readonly 'sessions.issue.missingMessageId': '消息缺少 id';
|
|
6239
|
+
readonly 'sessions.issue.emptyToolCallId': '工具调用 id 为空';
|
|
6240
|
+
readonly 'sessions.issue.danglingToolCall': '工具调用没有配对结果';
|
|
6241
|
+
readonly 'sessions.issue.toolResultIdMismatch': '工具结果与调用 id 不一致';
|
|
6242
|
+
readonly 'sessions.issue.duplicateToolCallId': '同一步里工具调用 id 重复';
|
|
6243
|
+
readonly 'sessions.issue.invalidSettlement': '助手段落的结算字段非法';
|
|
6244
|
+
readonly 'sessions.issue.closedTurnContinued': '已关闭的轮次被继续';
|
|
6245
|
+
readonly 'sessions.issue.formatNewer': '会话格式高于本机 DSH(会被静默跳过)';
|
|
6246
|
+
readonly 'sessions.issue.unregisteredWorkspace': '没有工作区记录指向它';
|
|
6247
|
+
readonly 'sessions.issue.subagentWithoutParent': '子代理会话缺少父对话';
|
|
6248
|
+
readonly 'sessions.issue.unknown': '未识别的问题';
|
|
5629
6249
|
readonly 'sessions.severity.blocksStartup': '会让 DSH 起不来';
|
|
5630
6250
|
readonly 'sessions.severity.invisible': '看不见';
|
|
5631
6251
|
readonly 'sessions.severity.nextRequestFails': '下次请求会失败';
|
|
5632
6252
|
readonly 'sessions.severity.ok': '正常';
|
|
5633
6253
|
readonly 'sessions.severity.unloadable': '会话不可加载';
|
|
5634
6254
|
readonly 'sessions.subagent': '子代理';
|
|
6255
|
+
readonly 'sessions.blank': '新会话';
|
|
5635
6256
|
readonly 'sessions.truncated': '列表已截断:还有 {count} 条未显示(重新体检或按需缩小范围)。';
|
|
5636
6257
|
readonly 'sessions.repair.title': '怎么修';
|
|
5637
6258
|
readonly 'sessions.repair.desc': '容器非法 / header 不可读 / 格式超前这类应用内不动的问题,先在终端预览再落盘;需要写入时建议先关闭 DSH。';
|
|
@@ -5647,7 +6268,6 @@ declare const zh: {
|
|
|
5647
6268
|
readonly 'sessions.repair.none': '本次没有可应用内修复的会话。应用内可修:重放重复行 / 可证明的合成收尾块(零损失)、seq 空洞与不可解析行(截断,有损,需确认);其余问题见下方离线命令。';
|
|
5648
6269
|
readonly 'common.close': '关闭';
|
|
5649
6270
|
readonly 'sessions.dialog.open': '打开会话体检';
|
|
5650
|
-
readonly 'sessions.dialog.hint': '打开后扫描本机存量会话:哪些读不出来、哪些能应用内修复,都在弹窗里处理(扫描只读)。';
|
|
5651
6271
|
readonly 'sessions.dialog.lastScan': '上次扫描:共 {total} 条,需处理 {issues} 条,本机修复记录 {repairs} 条。';
|
|
5652
6272
|
readonly 'sessions.repair.action': '修复';
|
|
5653
6273
|
readonly 'sessions.repair.available': '有 {count} 条会话可应用内修复;点行内「修复」先看计划,或用右上角「一键修复全部」按顺序处理。';
|
|
@@ -5679,7 +6299,6 @@ declare const zh: {
|
|
|
5679
6299
|
readonly 'sessions.repair.history.unreadable': '修复台账读不出来,本次无法显示或回滚历史修复(备份文件仍在会话目录里)。';
|
|
5680
6300
|
readonly 'sessions.zip.action': '下载原始日志 (ZIP)';
|
|
5681
6301
|
readonly 'sessions.zip.hint': '由 DSH 自己打包这条会话的原始日志(含子会话与附件);不经过本插件,孤儿/多代日志一并带上。';
|
|
5682
|
-
readonly 'sessions.zip.checking': '正在检查导出能力…';
|
|
5683
6302
|
readonly 'sessions.zip.reason.serviceMissing': '当前 DSH 的会话导出通道不可用:持久化后端缺少必需的服务(session-query / session-persistence / attachments)。这条入口已停用(状态 {status})。';
|
|
5684
6303
|
readonly 'sessions.zip.reason.authRequired': '无法确认导出通道的可用性:本机自请求被认证挡在门外(状态 {status})。这不代表本机不支持导出 —— 请重启 DSH 后再试。';
|
|
5685
6304
|
readonly 'sessions.zip.reason.readFailed': '导出通道在线,但这条会话的日志读取失败(状态 {status})。请先用上方体检/修复处理这条会话。';
|
|
@@ -5713,63 +6332,187 @@ declare const zh: {
|
|
|
5713
6332
|
readonly 'sessions.repair.verify.unverified': '未验证:本机跑不了真 codec 复验,所以 DSH 现在能否读它并没有被证明 —— 未验证不等于已验证(写入是否生效另说)。';
|
|
5714
6333
|
readonly 'sessions.repair.verify.rollbackFailed': '危险态:复验失败后自动回滚没有成功,目标当前仍是修复后的字节,需要人工处理。';
|
|
5715
6334
|
readonly 'sessions.repair.rejectedNext': '原文件没有被改动。可以再点一次「开始体检」看最新状态;如果原因与「文件被改过/正在被写入」有关,等这条会话安静下来再试。';
|
|
5716
|
-
readonly '
|
|
5717
|
-
readonly '
|
|
5718
|
-
readonly '
|
|
5719
|
-
readonly '
|
|
5720
|
-
readonly '
|
|
5721
|
-
readonly '
|
|
5722
|
-
readonly '
|
|
5723
|
-
readonly '
|
|
5724
|
-
readonly '
|
|
5725
|
-
readonly '
|
|
5726
|
-
readonly '
|
|
5727
|
-
readonly '
|
|
5728
|
-
readonly '
|
|
5729
|
-
readonly '
|
|
5730
|
-
readonly '
|
|
5731
|
-
readonly '
|
|
5732
|
-
readonly '
|
|
5733
|
-
readonly '
|
|
5734
|
-
readonly '
|
|
5735
|
-
readonly '
|
|
5736
|
-
readonly '
|
|
5737
|
-
readonly '
|
|
5738
|
-
readonly '
|
|
5739
|
-
readonly '
|
|
5740
|
-
readonly '
|
|
5741
|
-
readonly '
|
|
5742
|
-
readonly '
|
|
5743
|
-
readonly '
|
|
5744
|
-
readonly '
|
|
5745
|
-
readonly '
|
|
5746
|
-
readonly '
|
|
5747
|
-
readonly '
|
|
5748
|
-
readonly '
|
|
5749
|
-
readonly '
|
|
5750
|
-
readonly '
|
|
5751
|
-
readonly '
|
|
5752
|
-
readonly '
|
|
5753
|
-
readonly '
|
|
5754
|
-
readonly '
|
|
5755
|
-
readonly '
|
|
5756
|
-
readonly '
|
|
5757
|
-
readonly '
|
|
5758
|
-
readonly '
|
|
5759
|
-
readonly '
|
|
5760
|
-
readonly '
|
|
5761
|
-
readonly '
|
|
5762
|
-
readonly '
|
|
5763
|
-
readonly '
|
|
5764
|
-
readonly '
|
|
5765
|
-
readonly '
|
|
5766
|
-
readonly '
|
|
5767
|
-
readonly '
|
|
5768
|
-
readonly '
|
|
5769
|
-
readonly '
|
|
5770
|
-
readonly '
|
|
5771
|
-
readonly '
|
|
5772
|
-
readonly '
|
|
6335
|
+
readonly 'rollback.title': '工作区 + 会话回滚';
|
|
6336
|
+
readonly 'rollback.desc': '每个回合结束自动留一个回滚点:工作区快照 + 会话游标,不需要手动拍点。回退只覆盖该点记录在案的工作区路径,并删除「能证明是留点之后新建」且通过安全判据的路径(.git / node_modules / 插件数据区 / 超出单文件上限一律拒删;留点时被预算挡下的既有文件也在证明名单里,不会被当成新建;证明名单本身不完整时一条都不删);会话回退在目标回合之前的稳定边界 fork 一个新子会话,原会话日志只读、绝不被改写。';
|
|
6337
|
+
readonly 'rollback.list.empty': '还没有回滚点';
|
|
6338
|
+
readonly 'rollback.summary': '共 {points} 个回滚点 · {sessions} 个会话';
|
|
6339
|
+
readonly 'rollback.refresh': '刷新';
|
|
6340
|
+
readonly 'rollback.dialog.title': '回滚点台账';
|
|
6341
|
+
readonly 'rollback.dialog.open': '查看回滚点';
|
|
6342
|
+
readonly 'rollback.sessions.title': '有回滚点的对话';
|
|
6343
|
+
readonly 'rollback.col.time': '时间';
|
|
6344
|
+
readonly 'rollback.col.session': '会话';
|
|
6345
|
+
readonly 'rollback.col.turn': '回合';
|
|
6346
|
+
readonly 'rollback.col.states': '两态';
|
|
6347
|
+
readonly 'rollback.turn': '第 {n} 回合';
|
|
6348
|
+
readonly 'rollback.turnUnknown': '回合未知';
|
|
6349
|
+
readonly 'rollback.badge.incomplete': '两态不全';
|
|
6350
|
+
readonly 'rollback.badge.protected': '受保护(只进不出)';
|
|
6351
|
+
readonly 'rollback.apiMissing': '当前宿主没有回滚点能力(插件版本过旧):界面不假装可用';
|
|
6352
|
+
readonly 'rollback.retention.hint': '自动点:每会话最多 {perSession} 个、全局最多 {total} 个,超出只淘汰最旧的自动点。回退前的救援点不占这两个额度、也不被它们淘汰,但用户删不掉,所以另有自己的两道上限:每会话最多 {guardsPerSession} 个、全局最多 {guards} 个(无论按哪道算,超出都淘汰最旧的救援点)。';
|
|
6353
|
+
readonly 'rollback.autopoint.hint': '回滚点由每个回合结束时自动留:工作区快照 + 会话游标(没有「手动拍点」入口)。';
|
|
6354
|
+
readonly 'rollback.state.workspace': '工作区';
|
|
6355
|
+
readonly 'rollback.state.session': '会话';
|
|
6356
|
+
readonly 'rollback.state.unknown': '未知状态';
|
|
6357
|
+
readonly 'rollback.mode.label': '回退范围';
|
|
6358
|
+
readonly 'rollback.mode.filesAndSession': '工作区文件 + 会话';
|
|
6359
|
+
readonly 'rollback.mode.filesOnly': '只回退工作区文件';
|
|
6360
|
+
readonly 'rollback.mode.sessionOnly': '只回退会话';
|
|
6361
|
+
readonly 'rollback.mode.unknown': '未知回退范围';
|
|
6362
|
+
readonly 'rollback.kind.auto': '自动留点';
|
|
6363
|
+
readonly 'rollback.kind.guard': '回退前救援点(可回退、不可删)';
|
|
6364
|
+
readonly 'rollback.kind.guardShort': '救援点';
|
|
6365
|
+
readonly 'rollback.kind.unknown': '未知来源';
|
|
6366
|
+
readonly 'rollback.code.ok': '成功';
|
|
6367
|
+
readonly 'rollback.code.deleted': '已删除';
|
|
6368
|
+
readonly 'rollback.code.confirmation-required': '需要显式确认才能回退';
|
|
6369
|
+
readonly 'rollback.code.protected-point': '该回滚点被拒绝:受保护点不可回退、不可删除;救援点可作为回退目标,但用户不可删除';
|
|
6370
|
+
readonly 'rollback.code.record-not-found': '找不到该回滚点';
|
|
6371
|
+
readonly 'rollback.code.record-incomplete': '该回滚点两态不全,缺省不允许回退';
|
|
6372
|
+
readonly 'rollback.code.invalid-input': '请求参数不合法';
|
|
6373
|
+
readonly 'rollback.code.created-removals-limit': '待删除的「留点之后新建」路径超过上限:为免只删一半,本次回退整体拒绝、一条都没动(工作区与会话都未被改动)';
|
|
6374
|
+
readonly 'rollback.code.no-boundary': '该回合之前没有可用的稳定边界(会话回退不可用)';
|
|
6375
|
+
readonly 'rollback.code.storage-unavailable': '回滚点存储不可用';
|
|
6376
|
+
readonly 'rollback.code.mutation-locked': '有另一个写操作正在进行(或已进安全模式):稍后重试';
|
|
6377
|
+
readonly 'rollback.code.method-not-allowed': '该端点不支持这个请求方法';
|
|
6378
|
+
readonly 'rollback.code.ledger-unreadable': '回滚点台账读不出来(已按空台账继续,未静默)';
|
|
6379
|
+
readonly 'rollback.code.ledger-write-failed': '回滚点台账写不进去';
|
|
6380
|
+
readonly 'rollback.code.invalid-path': '记录里的路径越界(不在记录在案的分块内),已拒绝该条';
|
|
6381
|
+
readonly 'rollback.code.object-missing': '内容副本缺失,已拒绝该条';
|
|
6382
|
+
readonly 'rollback.code.object-hash-mismatch': '内容副本与记录指纹不一致,已拒绝该条';
|
|
6383
|
+
readonly 'rollback.code.restore-failed': '回退失败(详见逐条细节)';
|
|
6384
|
+
readonly 'rollback.code.verify-failed': '回退后逐文件校验未通过,已整体回滚到回退前状态';
|
|
6385
|
+
readonly 'rollback.code.nothing-to-restore': '该回滚点没有可恢复的内容';
|
|
6386
|
+
readonly 'rollback.code.no-recorded-files': '该回退点没有记录任何文件';
|
|
6387
|
+
readonly 'rollback.code.file-not-recorded': '这个路径不在该回滚点的记录里';
|
|
6388
|
+
readonly 'rollback.code.guard-failed': '回退前的救援点没能留下,已中止(零写入)';
|
|
6389
|
+
readonly 'rollback.code.session-missing': '会话日志不存在';
|
|
6390
|
+
readonly 'rollback.code.session-out-of-root': '会话日志不在本机会话根内,已拒绝';
|
|
6391
|
+
readonly 'rollback.code.session-too-large': '会话日志超过上限:只记下了游标(回退不依赖副本)';
|
|
6392
|
+
readonly 'rollback.code.session-active': '这条对话正在运行(会话日志刚被写过):此时带文件段的回退会被拒绝、工作区一个字节都不动;只回溯消息不受影响(回退只 fork 子会话,不改写原日志)';
|
|
6393
|
+
readonly 'rollback.preview.sessionActive': '这条对话正在运行:本轮结束前只回溯消息(不改动工作区),避免与正在写盘的工具抢文件。等本轮结束后重新打开本弹窗,即可连文件一起回退。';
|
|
6394
|
+
readonly 'rollback.sessionActive.denied': '这条对话正在运行:本次一个文件都没有改动。请等本轮结束,或改成「只回溯消息」再试。';
|
|
6395
|
+
readonly 'rollback.code.session-fork-unavailable': '当前宿主没有提供会话 fork 能力,因此不能回退会话';
|
|
6396
|
+
readonly 'rollback.code.fork-failed': 'fork 子会话失败,会话段未回退';
|
|
6397
|
+
readonly 'rollback.code.capture-failed': '该态留点失败';
|
|
6398
|
+
readonly 'rollback.code.capture-truncated': '该态留点到达上限被截断(已如实标注)';
|
|
6399
|
+
readonly 'rollback.code.capture-degraded': '该态留点不完整(有链接或读不到的内容被跳过,已逐条留痕)';
|
|
6400
|
+
readonly 'rollback.code.no-chunks': '没有给出工作区路径分块';
|
|
6401
|
+
readonly 'rollback.code.chunk-not-absolute': '工作区分块必须是绝对路径';
|
|
6402
|
+
readonly 'rollback.code.chunk-not-found': '工作区分块不存在或不可用';
|
|
6403
|
+
readonly 'rollback.code.unknown': '未识别的错误码(技术细节见下方)';
|
|
6404
|
+
readonly 'rollback.guidance.mountStorage': '回滚点存储栈缺失:把 @deepseek-ai/dsh-storage、dsh-storage-json、dsh-storage-domain 组合进当前 profile 后重试';
|
|
6405
|
+
readonly 'rollback.guidance.fixDataDir': '插件数据目录不可写:{detail}';
|
|
6406
|
+
readonly 'rollback.guidance.readOnlyFallback': '存储不可用期间:留点与回退都会干净失败,但现状列表仍可查看(不会崩,也不会假装成功)';
|
|
6407
|
+
readonly 'rollback.guidance.probeDetail': '探测细节:{detail}';
|
|
6408
|
+
readonly 'rollback.guidance.workspaceRolledBack': '工作区写回失败后已整体回滚到回退前状态(会话段本次未执行)';
|
|
6409
|
+
readonly 'rollback.guidance.forkUnavailable': '当前宿主没有提供会话 fork 能力:会话段未回退(原会话日志未被改写)';
|
|
6410
|
+
readonly 'rollback.guidance.sessionForked': '已 fork 新子会话:{detail}(原会话日志只读、未被改写)';
|
|
6411
|
+
readonly 'rollback.guidance.sessionNotAttached': '新子会话没能挂回原工作区(会出现在侧栏「未分组」下;回退本身已生效)';
|
|
6412
|
+
readonly 'rollback.guidance.unknown': '未识别的指引(技术细节见下方)';
|
|
6413
|
+
readonly 'rollback.warn.ledgerUnreadable': '回滚点台账读不出来(已按空台账继续,未静默)';
|
|
6414
|
+
readonly 'rollback.warn.trackMissing': '有一态没留到:该态本次不能回退';
|
|
6415
|
+
readonly 'rollback.warn.trackDegraded': '有一态留得不完整(回退可能不完整)';
|
|
6416
|
+
readonly 'rollback.warn.protected': '该回滚点受保护(只进不出):不可回退、不可删除';
|
|
6417
|
+
readonly 'rollback.warn.guardFailed': '回退前的救援点没留成(已记告警后继续)';
|
|
6418
|
+
readonly 'rollback.warn.createdRefused': '本次不删除任何「留点后新建」的路径:捕获时的证明名单不完整(有整目录被忽略 / 路径索引缺失 / 目录读不出),无法证明哪些是新建的';
|
|
6419
|
+
readonly 'rollback.warn.unknown': '未识别的告警(技术细节见下方)';
|
|
6420
|
+
readonly 'rollback.preview': '预览回退';
|
|
6421
|
+
readonly 'rollback.preview.title': '回退预览';
|
|
6422
|
+
readonly 'rollback.preview.hint': '以下为只读预览(零写入)。确认后才会执行回退。';
|
|
6423
|
+
readonly 'rollback.preview.loading': '正在生成预览…';
|
|
6424
|
+
readonly 'rollback.preview.empty': '该回滚点没有可回退的内容。';
|
|
6425
|
+
readonly 'rollback.preview.none': '该点没有可回退的内容';
|
|
6426
|
+
readonly 'rollback.preview.reason.guard': '宿主这次没有允许回退该救援点(救援点通常可作为回退目标;详见下方细节)';
|
|
6427
|
+
readonly 'rollback.preview.reason.incomplete': '该点两态不全:需要显式允许部分回退';
|
|
6428
|
+
readonly 'rollback.preview.reason.hostRefused': '宿主拒绝了这次回退(原因见下方细节)';
|
|
6429
|
+
readonly 'rollback.preview.segments': '只勾可回退的段(只有工作区与会话两态)';
|
|
6430
|
+
readonly 'rollback.preview.overwrite': '覆盖 {n} 项';
|
|
6431
|
+
readonly 'rollback.preview.different': '其中 {n} 项内容不同';
|
|
6432
|
+
readonly 'rollback.preview.missing': '{n} 项当前已不存在(会被重新创建)';
|
|
6433
|
+
readonly 'rollback.preview.createdAfter': '{n} 项在留点时并不存在(留点之后新建;回退只会删除其中通过安全判据的)';
|
|
6434
|
+
readonly 'rollback.preview.removalsTitle': '回退会删除的文件';
|
|
6435
|
+
readonly 'rollback.preview.notice.skipped': '{n} 项在留点时被跳过(未记录;已计入证明名单 ⇒ 不参与删除判据)';
|
|
6436
|
+
readonly 'rollback.preview.notice.truncated': '该点捕获被上限截断(超单文件上限 / 字节预算 / 文件数预算);删除判据另看证明名单(路径索引)是否完整';
|
|
6437
|
+
readonly 'rollback.preview.files.title': '将被回退的文件:';
|
|
6438
|
+
readonly 'rollback.preview.files.empty': '工作区与该回退点一致,无需恢复';
|
|
6439
|
+
readonly 'rollback.preview.files.unavailable': '该回退点的工作区态没有可用的记录(原因:{reason}),无需恢复';
|
|
6440
|
+
readonly 'rollback.preview.files.unavailableSession': '该回退点的工作区态没有可用的记录(原因:{reason});会话仍会回退到该点之前';
|
|
6441
|
+
readonly 'rollback.preview.files.noFilesSession': '该回退点没有记录任何文件;会话仍会回退到该点之前';
|
|
6442
|
+
readonly 'rollback.preview.files.consistentSession': '工作区与该回退点一致(会话仍会回退到该点之前)';
|
|
6443
|
+
readonly 'rollback.preview.file.added': '+{n}';
|
|
6444
|
+
readonly 'rollback.preview.file.removed': '−{n}';
|
|
6445
|
+
/** 整文件删除(用户 2026-10-12 第 6 条):写「删除」而不是 `+0 −N` —— 那是两件事。 */
|
|
6446
|
+
readonly 'rollback.preview.file.deleted': '删除';
|
|
6447
|
+
readonly 'rollback.preview.file.unknown': '行数未统计';
|
|
6448
|
+
readonly 'rollback.preview.file.unknownHint': '这些文件的行数没有统计出来(文件过大、不是文本或内容副本读不出来)—— 回退仍会照常覆盖它们。';
|
|
6449
|
+
readonly 'rollback.diff.viewHint': '查看差异:{path}';
|
|
6450
|
+
readonly 'rollback.diff.loading': '正在读取差异…';
|
|
6451
|
+
readonly 'rollback.diff.before': '当前';
|
|
6452
|
+
readonly 'rollback.diff.after': '回退后';
|
|
6453
|
+
readonly 'rollback.diff.identical': '该文件与回退点内容一致,回退不会改动它';
|
|
6454
|
+
readonly 'rollback.diff.degraded': '差异规模较大,已按整块替换展示(仍是完整结果,只是不是最小的编辑脚本)';
|
|
6455
|
+
readonly 'rollback.diff.truncated': '只画了前 {shown} 行(共 {total} 行),数据本身是完整的';
|
|
6456
|
+
readonly 'rollback.diff.reason.missingBlob': '这份内容副本读不出来,无法逐行对照(回退仍会尝试写回它)';
|
|
6457
|
+
readonly 'rollback.diff.reason.binary': '不是文本文件,没有逐行差异可看';
|
|
6458
|
+
readonly 'rollback.diff.reason.tooLarge': '文件超过展示上限,没有逐行差异可看(回退仍会照常覆盖它)';
|
|
6459
|
+
readonly 'rollback.diff.reason.unreadable': '当前文件读不出来(权限不足,或它不是普通文件),无法逐行对照';
|
|
6460
|
+
readonly 'rollback.diff.reason.unknown': '无法逐行对照,原因未知(宿主没有给出原因)';
|
|
6461
|
+
readonly 'rollback.diff.failed': '差异读取失败';
|
|
6462
|
+
readonly 'rollback.preview.result.noop': '工作区与该回退点一致,无需恢复';
|
|
6463
|
+
readonly 'rollback.preview.result.noRecord': '该回退点没有可用的记录(原因:{reason}),无需恢复';
|
|
6464
|
+
readonly 'rollback.preview.result.noFiles': '该回退点没有记录任何文件,无需恢复';
|
|
6465
|
+
readonly 'rollback.preview.result.code': 'code:{code}';
|
|
6466
|
+
readonly 'rollback.preview.warningsTitle': '该点的告警';
|
|
6467
|
+
readonly 'rollback.preview.cursorBytes': '会话日志 {now} → {target} 字节';
|
|
6468
|
+
readonly 'rollback.group.label': '会话:{session}';
|
|
6469
|
+
readonly 'rollback.group.count': '{n} 个回滚点';
|
|
6470
|
+
readonly 'rollback.group.unknownSession': '未知会话';
|
|
6471
|
+
readonly 'rollback.row.files': '文件 {n} 个';
|
|
6472
|
+
readonly 'rollback.row.sessionCursor': '有会话游标';
|
|
6473
|
+
readonly 'rollback.row.noSessionCursor': '无会话游标(只能回退工作区)';
|
|
6474
|
+
readonly 'rollback.row.sessionShort': '会话可回退';
|
|
6475
|
+
readonly 'rollback.row.workspaceShort': '仅工作区';
|
|
6476
|
+
readonly 'rollback.row.notice.skipped': '{n} 项在留点时被跳过(未记录;已计入证明名单 ⇒ 不会被当成新建删掉)';
|
|
6477
|
+
readonly 'rollback.row.notice.truncated': '该点留点达到上限被截断(计数仍如实;删除判据另看证明名单是否完整)';
|
|
6478
|
+
readonly 'rollback.row.notice.skippedShort': '跳过 {n} 项';
|
|
6479
|
+
readonly 'rollback.row.notice.truncatedShort': '已截断';
|
|
6480
|
+
readonly 'rollback.preview.cursor': '会话边界 {from} → {to}';
|
|
6481
|
+
readonly 'rollback.preview.turns': '回退到第 {n} 回合之前';
|
|
6482
|
+
readonly 'rollback.preview.active': '该会话日志刚被写过(仅供参考:回退只 fork 子会话,不改写原日志)';
|
|
6483
|
+
readonly 'rollback.rewind': '回退到此处';
|
|
6484
|
+
readonly 'rollback.rewind.confirm': '我确认:按所选范围回退。工作区会写回该点记录在案的路径,并删除能证明是「留点之后新建」且通过安全判据的路径(.git / node_modules / 插件数据区 / 超出单文件上限一律拒删;证明名单不完整时一条都不删);会话在目标回合之前的稳定边界 fork 新子会话,原会话日志不改写。';
|
|
6485
|
+
readonly 'rollback.rewind.allowPartial': '允许部分回退(该回滚点两态不全)';
|
|
6486
|
+
readonly 'rollback.guard.require': '回退前必须留救援点(留不下就整体中止,零写入)';
|
|
6487
|
+
readonly 'rollback.guard.warn': '回退前留救援点(留不下记告警后继续)';
|
|
6488
|
+
readonly 'rollback.guard.off': '跳过回退前救援点';
|
|
6489
|
+
readonly 'rollback.guard.unknown': '未知的救援点策略';
|
|
6490
|
+
readonly 'rollback.rewind.result.title': '回退结果';
|
|
6491
|
+
readonly 'rollback.rewind.result.counts': '恢复 {restored} 项 / 删除 {removed} 项 / 失败 {failed} 项 / 留点时并不存在(之后新建)的共 {leftovers} 项';
|
|
6492
|
+
readonly 'rollback.rewind.result.child': '已回到该消息之前(当前对话:{id})';
|
|
6493
|
+
readonly 'rollback.rewind.archive.done': '原会话已收进「已归档」(需要时可在那儿恢复)';
|
|
6494
|
+
readonly 'rollback.rewind.freshSession': '这是这条对话的第一条消息之前:已为你新建一条空会话(这条消息的文字可从上面那条气泡复制)';
|
|
6495
|
+
readonly 'rollback.rewind.freshSessionFailed': '这是第一条消息之前、没有可回退的对话边界,而本客户端没能新建空会话 —— 请手动点「新会话」';
|
|
6496
|
+
readonly 'rollback.rewind.archive.unavailable': '本客户端没有可用的归档入口,所以原会话仍留在会话列表里(内容未被改写)';
|
|
6497
|
+
readonly 'rollback.rewind.archive.active': '原会话还有进行中的工作,暂时不能归档 —— 它仍留在会话列表里(内容未被改写)';
|
|
6498
|
+
readonly 'rollback.rewind.archive.failed': '原会话归档失败,它仍留在会话列表里(内容未被改写)';
|
|
6499
|
+
readonly 'rollback.rewind.result.guard': '回退前救援点:{id}';
|
|
6500
|
+
readonly 'rollback.rewind.result.skipped': '未执行的段:{list}';
|
|
6501
|
+
readonly 'rollback.segment.restored': '已恢复';
|
|
6502
|
+
readonly 'rollback.segment.skipped': '已跳过';
|
|
6503
|
+
readonly 'rollback.segment.failed': '失败';
|
|
6504
|
+
readonly 'rollback.segment.unknown': '未知状态';
|
|
6505
|
+
readonly 'rollback.outcome.restored': '全部恢复';
|
|
6506
|
+
readonly 'rollback.outcome.partial': '部分恢复';
|
|
6507
|
+
readonly 'rollback.outcome.failed': '回退失败';
|
|
6508
|
+
readonly 'rollback.outcome.denied': '已拒绝(零写入)';
|
|
6509
|
+
readonly 'rollback.outcome.unknown': '未知结论';
|
|
6510
|
+
readonly 'rollback.delete': '删除回滚点';
|
|
6511
|
+
readonly 'rollback.delete.done': '已删除回滚点';
|
|
6512
|
+
readonly 'rollback.delete.confirmTitle': '删除这个回滚点?';
|
|
6513
|
+
readonly 'rollback.delete.confirmMessage': '只删除台账记录与内容副本,不会改动工作区与会话。受保护点与回退前救援点由引擎一律拒绝删除;救援点超出每会话上限 20 个或全局上限 50 个时会自动淘汰最旧的。';
|
|
6514
|
+
readonly 'rollback.delete.protected': '该回滚点不可删除:受保护点与救援点一律被引擎拒绝(救援点超出每会话上限 20 个或全局上限 50 个时自动淘汰最旧的)';
|
|
6515
|
+
readonly 'rollback.storage.unavailable': '回滚点存储不可用(现状列表仍可查看)';
|
|
5773
6516
|
readonly 'recovery.incomplete.title': '未完成的档案副本';
|
|
5774
6517
|
readonly 'recovery.incomplete.hint': '这些目录带「复制进行中」标记但没有 package.json,是复制被中断留下的半截副本;不能启动,只能删除(只列出有标记的目录 —— 用户手工建的目录不会出现在这里)。';
|
|
5775
6518
|
readonly 'recovery.incomplete.from': '来源:{name}';
|
|
@@ -5841,14 +6584,128 @@ declare const zh: {
|
|
|
5841
6584
|
readonly 'sessions.layout.reason.unknown': '未知原因(未做任何改动)';
|
|
5842
6585
|
};
|
|
5843
6586
|
/** 字典键联合(注册处 compile-time 校验)。 */
|
|
5844
|
-
type RecoveryKey = keyof typeof zh;
|
|
6587
|
+
type RecoveryKey = keyof typeof zh$1;
|
|
5845
6588
|
//#endregion
|
|
5846
6589
|
//#region src/client/history/history-locales.d.ts
|
|
5847
6590
|
type KindKey = `history.kind.${MigrationKind}`;
|
|
5848
6591
|
type ResultKey = `history.result.${MigrationResult}`;
|
|
5849
|
-
type CommonKey = 'view.history' | 'history.title' | 'history.subtitle' | 'history.empty' | 'history.loading' | 'history.corruptedBanner' | 'history.corruptedCount' | 'history.stats.total' | 'history.stats.success' | 'history.stats.failed' | 'history.stats.skipped' | 'history.filter.kind' | 'history.filter.result' | 'history.filter.recent' | 'history.filter.recent.all' | 'history.filter.recent.50' | 'history.filter.recent.200' | 'history.filter.sections' | 'history.filter.title' | 'history.search.placeholder' | 'history.export.json' | 'history.export.markdown' | 'history.exported' | 'history.exporting' | 'history.exportError' | 'history.loadError' | 'history.reload' | 'history.table.time' | 'history.table.kind' | 'history.table.result' | 'history.table.sections' | 'history.table.summary' | 'history.updatedAt' | 'history.refresh'
|
|
6592
|
+
type CommonKey = 'view.history' | 'history.title' | 'history.subtitle' | 'history.empty' | 'history.loading' | 'history.corruptedBanner' | 'history.corruptedCount' | 'history.stats.total' | 'history.stats.success' | 'history.stats.failed' | 'history.stats.skipped' | 'history.filter.kind' | 'history.filter.result' | 'history.filter.recent' | 'history.filter.recent.all' | 'history.filter.recent.50' | 'history.filter.recent.200' | 'history.filter.sections' | 'history.filter.title' | 'history.search.placeholder' | 'history.export.json' | 'history.export.markdown' | 'history.exported' | 'history.exporting' | 'history.exportError' | 'history.loadError' | 'history.reload' | 'history.table.time' | 'history.table.kind' | 'history.table.result' | 'history.table.sections' | 'history.table.summary' | 'history.updatedAt' | 'history.refresh' |
|
|
6593
|
+
/** ⓘ 说明按钮的可访问名(与主字典 / market / sync / recovery 同口径,见 info-hint-guard t6-4) */
|
|
6594
|
+
'common.infoHint';
|
|
5850
6595
|
type HistoryKey = KindKey | ResultKey | CommonKey;
|
|
5851
6596
|
//#endregion
|
|
6597
|
+
//#region src/client/chat/chat-locales.d.ts
|
|
6598
|
+
/**
|
|
6599
|
+
* 聊天内「↺ 回退」入口(config-manager-chat)的独立字典:zh 为源语言,en 镜像每个键。
|
|
6600
|
+
* 独立命名空间、独立文件:不触碰共享的 locales.ts,也不与 recovery 字典混住。
|
|
6601
|
+
*
|
|
6602
|
+
* `ChatKey` 由 client/index.ts 在 ctx.locale.register 处做编译期校验(漏键/多键即编译失败)。
|
|
6603
|
+
*
|
|
6604
|
+
* 键域纪律(**为什么这本字典刻意只有几行**):
|
|
6605
|
+
* - 与设置页同一批 `rollback.*` 词汇(三选一 mode / code / outcome / segment / 预览计数 /
|
|
6606
|
+
* 结果行)由 **config-manager-recovery** 字典单一所有(T2 产出)。组件同时拿到
|
|
6607
|
+
* `t`(本字典)与 `rt`(recovery 字典):两个入口说同一句话,改一处两边一起变,
|
|
6608
|
+
* 这里**不复制**那些键值(复制即两处真相)。
|
|
6609
|
+
* - 本文件只写「聊天入口独有」的话:回合尾按钮、该回合还没有回滚点、子会话打开与降级。
|
|
6610
|
+
*
|
|
6611
|
+
* ⚠️ 新增本字典 = 新增一本目录,必须由 captain 登记进 i18n 守卫的归属清单
|
|
6612
|
+
* (`tests/helpers/i18n-scan.ts` 的 KNOWN_CATALOG_FILES + `tests/i18n-hardcoded-guard.test.ts`
|
|
6613
|
+
* S11 的 knownFiles 与 `all.length` 计数),否则 `node --test tests/i18n-hardcoded-guard.test.ts`
|
|
6614
|
+
* 会把本文件里的 zh 串判成硬编码缺陷(A1)。本任务的写作用域不含 tests/**,故登记动作归 captain。
|
|
6615
|
+
*/
|
|
6616
|
+
declare const zh: {
|
|
6617
|
+
/**
|
|
6618
|
+
* 回退入口的**无障碍文案**(2026-10-10 起屏幕上只有图标、没有文字标签;
|
|
6619
|
+
* 这颗按钮的 aria-label/title 用它,「回退按钮只有一个 icon」不等于「按钮没有名字」)。
|
|
6620
|
+
*/
|
|
6621
|
+
readonly 'chat.entry.label': '回退';
|
|
6622
|
+
/** 该回合还没有回滚点(留点发生在回合结束时) */
|
|
6623
|
+
readonly 'chat.entry.noPoint': '这个回合还没有回滚点';
|
|
6624
|
+
/** 打开对话框后先读台账 + 只读预览(零写入) */
|
|
6625
|
+
readonly 'chat.entry.loading': '正在读取回滚点与该回合的只读预览…';
|
|
6626
|
+
/** 子会话行的动作按钮 */
|
|
6627
|
+
readonly 'chat.open.child': '打开子会话';
|
|
6628
|
+
/** 自动打开的进行态 */
|
|
6629
|
+
readonly 'chat.open.opening': '正在打开子会话…';
|
|
6630
|
+
/** 降级①(T9-F1):**有**导航入口,但重拉列表后仍没有它 —— 这句话被证实过,不假装已打开 */
|
|
6631
|
+
readonly 'chat.open.degraded': '子会话 {id} 还没有出现在会话列表里,自动打开没有成功:请手动打开它(如实降级,不假装已打开)';
|
|
6632
|
+
/** 降级②(T9-F1):**有**入口、列表里也有(或列表读不出来),但这次导航调用失败 —— 与①是两个原因 */
|
|
6633
|
+
readonly 'chat.open.failed': '会话导航调用失败,子会话 {id} 没有自动打开(子会话已创建):请手动打开它';
|
|
6634
|
+
/** 降级③(T9-F1):**本客户端没有可用的会话导航入口**(DSH 版本不提供);绝不能说成「还没出现在列表里」 */
|
|
6635
|
+
readonly 'chat.open.unavailable': '本客户端没有可用的会话导航入口(当前 DSH 版本不提供),所以没有自动打开:子会话 {id} 已创建,请手动打开它';
|
|
6636
|
+
/** 不可回退但宿主没给原因键时的兜底(T9-F3):说「原因未知」,**不得**说成「没有可回退的内容」 */
|
|
6637
|
+
readonly 'chat.preview.reasonUnknown': '这个回滚点当前不可回退,但宿主没有给出原因(原因未知)';
|
|
6638
|
+
/** 预览对话框的说明行(Cursor「Confirm Undo」风格的第二张截图:一句话说清这次动作会做什么) */
|
|
6639
|
+
readonly 'chat.preview.summary': '这次回退会做以下改动:';
|
|
6640
|
+
/**
|
|
6641
|
+
* 顶部选择框(用户 2026-10-12 第 1 条):要不要**连文件一起**退回去。
|
|
6642
|
+
* 勾 = 文件 + 对话一起退(默认);取消 = 只退对话,工作区一个字节都不动。
|
|
6643
|
+
*/
|
|
6644
|
+
readonly 'chat.preview.revertFiles': '回退文件的更改';
|
|
6645
|
+
/**
|
|
6646
|
+
* 顶部**汇总**(2026-10-12 第二轮):这一屏的第一决策信息 —— 用户先判规模,再逐行核文件。
|
|
6647
|
+
* 三个数字的口径与「文件行」逐条一致(同一份 `rollbackPreviewScope`):
|
|
6648
|
+
* `{n}` 个文件 = 会被改动的文件数;`+A`/`−D` **只累加两侧都可信的行数**
|
|
6649
|
+
* (任一侧读不出来的文件两列都不计 —— 被计成 0 就是一个会被证伪的断言);
|
|
6650
|
+
* 删除集是**另一条**清单(`{n} 项删除`),单独计数、不与上面混加。
|
|
6651
|
+
* 注意:这不是「chat.preview.summary」那句话(那句描述性文案按 DESIGN §7 已下线,且被源级守卫钉住);
|
|
6652
|
+
* 这里是**数字**,数字留、句子走。
|
|
6653
|
+
*/
|
|
6654
|
+
readonly 'chat.preview.scope.files': '{n} 个文件';
|
|
6655
|
+
readonly 'chat.preview.scope.added': '+{n}';
|
|
6656
|
+
readonly 'chat.preview.scope.removed': '−{n}';
|
|
6657
|
+
readonly 'chat.preview.scope.deleted': '{n} 项删除';
|
|
6658
|
+
/** 取消勾选(只退对话)时的汇总:数字与用户无关,改写一句「文件不动」;清单仍在下面、且不再变半透明 */
|
|
6659
|
+
readonly 'chat.preview.scope.off': '只回退对话,文件不改动';
|
|
6660
|
+
/** 文件行上悬停出现的「查看」(在看得到的前提下才出现:没有侧栏能力时换成下面那句) */
|
|
6661
|
+
readonly 'chat.preview.view': '查看';
|
|
6662
|
+
/** 「查看」= 名字本身:无障碍名必须带**这个文件**的全路径(列表里同名按钮一屏好几个) */
|
|
6663
|
+
readonly 'chat.preview.viewHint': '查看差异:{path}';
|
|
6664
|
+
/** 没有右侧栏能力(旧 DSH / 侧栏服务缺失)→ 如实降级为弹窗内展示,不假装打开过 */
|
|
6665
|
+
readonly 'chat.preview.viewInline': '本客户端没有右侧栏,差异改为在这里展示';
|
|
6666
|
+
readonly 'chat.preview.viewFailed': '打开右侧栏失败:{detail}';
|
|
6667
|
+
/** 回退请求在途 */
|
|
6668
|
+
readonly 'chat.rewind.running': '正在回退…';
|
|
6669
|
+
/**
|
|
6670
|
+
* 简洁版预览对话框的**主按钮**文案(用户 2026-10-10:底部只有主按钮「回退」与「取消」)。
|
|
6671
|
+
* 与设置页回滚卡的 `rollback.rewind`('回退到此处')刻意分开:聊天入口的语境是
|
|
6672
|
+
* 「回到这条消息之前」,按钮只写「回退」——同一句话在两张卡上不再被两个语境共用。
|
|
6673
|
+
*/
|
|
6674
|
+
readonly 'chat.rewind.submit': '回退';
|
|
6675
|
+
/** 关闭对话框(Modal.Header 的 closeLabel 必须是已翻译文案) */
|
|
6676
|
+
readonly 'chat.close': '关闭';
|
|
6677
|
+
/** 复制动作(与 native 复制的 aria-label 同义) */
|
|
6678
|
+
readonly 'chat.entry.copy': '复制这条消息';
|
|
6679
|
+
/** 复制成功的 1 秒反馈 */
|
|
6680
|
+
readonly 'chat.entry.copied': '已复制';
|
|
6681
|
+
/** content 里我们无法理解的块(宿主叫「附加内容块」;这里必须原样兜底上屏,不得静默丢弃) */
|
|
6682
|
+
readonly 'chat.entry.extraBlock': '附加内容块';
|
|
6683
|
+
/** 兜底块过长时的截断说明({total} = 原始字符数) */
|
|
6684
|
+
readonly 'chat.entry.truncated': '已截断,共 {total} 字符';
|
|
6685
|
+
/** owner 没给图片渲染位(宿主版本差异):图片我们绝不自己渲染,如实说 */
|
|
6686
|
+
readonly 'chat.entry.noImageRenderer': '宿主没有提供图片渲染位,这条消息里的图片无法显示';
|
|
6687
|
+
/** 引用会话汇总行(宿主 ui-chat 的 message.referenceSummary,逐字同义;★ 非 ui-primitives 依赖) */
|
|
6688
|
+
readonly 'chat.entry.referenceSummary': '引用会话 · {labels}';
|
|
6689
|
+
/** 汇总行里多个 label 之间的分隔符(宿主 message.referenceSeparator:zh 用顿号、en 用逗号空格) */
|
|
6690
|
+
readonly 'chat.entry.referenceSeparator': '、';
|
|
6691
|
+
/** 禁用①:节点里取不到可核实的回合号(与宿主同一条读法:location.kind 必须是 turn/step) */
|
|
6692
|
+
readonly 'chat.entry.disabled.noTurn': '取不到可核实的回合号(当前 DSH 版本未提供),无法在聊天里回退';
|
|
6693
|
+
/** 禁用②:回合还在进行中 —— 真的还没到留点那一刻 */
|
|
6694
|
+
readonly 'chat.entry.disabled.turnOpen': '这个回合还没结束,还没有回滚点';
|
|
6695
|
+
/** 禁用③:缺少 sessionId,无法按「同会话」匹配 */
|
|
6696
|
+
readonly 'chat.entry.disabled.noSession': '取不到会话标识,无法匹配回滚点';
|
|
6697
|
+
/**
|
|
6698
|
+
* 禁用④:还没读到,或**收尾后的有界重试窗口还开着**(列表读到空只是暂态 —— 引擎在收尾后
|
|
6699
|
+
* 还要几秒才写完点,真机 7.8 s)。窗口内**不得**说「没有回滚点」,所以这里如实说「正在读取」。
|
|
6700
|
+
*/
|
|
6701
|
+
readonly 'chat.entry.disabled.pointsPending': '正在读取回滚点…';
|
|
6702
|
+
/** 禁用⑤:已读到列表、确实没有「同会话 + 同回合」的点 */
|
|
6703
|
+
readonly 'chat.entry.disabled.noPoint': '这个回合还没有回滚点';
|
|
6704
|
+
/** 禁用⑥:收尾状态既不是 closed 也不是 open(读不到 / unknown)——不能证明已收尾,也不说成没结束 */
|
|
6705
|
+
readonly 'chat.entry.disabled.turnUnknown': '这个回合的收尾状态未知,暂不可回退';
|
|
6706
|
+
};
|
|
6707
|
+
type ChatKey = keyof typeof zh;
|
|
6708
|
+
//#endregion
|
|
5852
6709
|
//#region src/client/ConfigManagerSection.d.ts
|
|
5853
6710
|
type ConfigManagerSectionProps = PropsRuntime<'settings.section'> & ConfigManagerSectionInjected & {
|
|
5854
6711
|
t: TranslateNS<'config-manager'>;
|
|
@@ -5925,6 +6782,8 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
|
5925
6782
|
'config-manager-recovery': RecoveryKey;
|
|
5926
6783
|
/** Migration History 区块文案(Phase 6)。 */
|
|
5927
6784
|
'config-manager-history': HistoryKey;
|
|
6785
|
+
/** 聊天内「↺ 回退」入口文案(T4;只放聊天入口独有的话)。 */
|
|
6786
|
+
'config-manager-chat': ChatKey;
|
|
5928
6787
|
}
|
|
5929
6788
|
}
|
|
5930
6789
|
/** 必需服务(fiber inject 等待 —— slots/locale 必须先就绪)。 */
|
|
@@ -5935,7 +6794,7 @@ export declare const inject: string[];
|
|
|
5935
6794
|
*/
|
|
5936
6795
|
export declare function apply(ctx: ClientContext): void;
|
|
5937
6796
|
//#endregion
|
|
5938
|
-
export type { AboutPanelProps, ConfigManagerApiError, ConfigManagerKey, ConfigManagerSectionProps, DownloadResult, ExportViewProps, HistoryKey, ImportWizardViewProps, MarketKey, MarketPanelProps, RecoveryKey, ServiceStatus, SyncKey, SyncPanelProps, UploadResponse };
|
|
6797
|
+
export type { AboutPanelProps, ChatKey, ConfigManagerApiError, ConfigManagerKey, ConfigManagerSectionProps, DownloadResult, ExportViewProps, HistoryKey, ImportWizardViewProps, MarketKey, MarketPanelProps, RecoveryKey, ServiceStatus, SyncKey, SyncPanelProps, UploadResponse };
|
|
5939
6798
|
|
|
5940
6799
|
return module.exports;
|
|
5941
6800
|
}
|