@logictan/dsh-config-manager 0.1.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +105 -0
- package/cordis.patch.yml +21 -0
- package/lib/adapters/agent-instructions.d.ts +13 -0
- package/lib/adapters/agent-instructions.js +46 -0
- package/lib/adapters/agent-presets.d.ts +13 -0
- package/lib/adapters/agent-presets.js +14 -0
- package/lib/adapters/credentials.d.ts +37 -0
- package/lib/adapters/credentials.js +122 -0
- package/lib/adapters/file-collection.d.ts +15 -0
- package/lib/adapters/file-collection.js +127 -0
- package/lib/adapters/index.d.ts +57 -0
- package/lib/adapters/index.js +55 -0
- package/lib/adapters/link-report.d.ts +16 -0
- package/lib/adapters/link-report.js +47 -0
- package/lib/adapters/mcp.d.ts +28 -0
- package/lib/adapters/mcp.js +178 -0
- package/lib/adapters/plugin-files.d.ts +18 -0
- package/lib/adapters/plugin-files.js +142 -0
- package/lib/adapters/plugins.d.ts +41 -0
- package/lib/adapters/plugins.js +603 -0
- package/lib/adapters/pnpm-workspace.d.ts +26 -0
- package/lib/adapters/pnpm-workspace.js +147 -0
- package/lib/adapters/prompts.d.ts +30 -0
- package/lib/adapters/prompts.js +231 -0
- package/lib/adapters/providers.d.ts +34 -0
- package/lib/adapters/providers.js +155 -0
- package/lib/adapters/self.d.ts +17 -0
- package/lib/adapters/self.js +71 -0
- package/lib/adapters/sessions.d.ts +14 -0
- package/lib/adapters/sessions.js +15 -0
- package/lib/adapters/settings.d.ts +28 -0
- package/lib/adapters/settings.js +165 -0
- package/lib/adapters/skills.d.ts +13 -0
- package/lib/adapters/skills.js +14 -0
- package/lib/adapters/test-helpers.d.ts +125 -0
- package/lib/adapters/test-helpers.js +236 -0
- package/lib/adapters/ui.d.ts +27 -0
- package/lib/adapters/ui.js +89 -0
- package/lib/adapters/workspaces.d.ts +13 -0
- package/lib/adapters/workspaces.js +106 -0
- package/lib/client.d.ts +1026 -0
- package/lib/client.js +10047 -0
- package/lib/core/analyzer.d.ts +99 -0
- package/lib/core/analyzer.js +934 -0
- package/lib/core/backup.d.ts +138 -0
- package/lib/core/backup.js +513 -0
- package/lib/core/boot-rescue.d.ts +146 -0
- package/lib/core/boot-rescue.js +618 -0
- package/lib/core/cache-cleaner.d.ts +31 -0
- package/lib/core/cache-cleaner.js +95 -0
- package/lib/core/config-lifecycle.d.ts +180 -0
- package/lib/core/config-lifecycle.js +481 -0
- package/lib/core/config-snapshot.d.ts +135 -0
- package/lib/core/config-snapshot.js +424 -0
- package/lib/core/config-state.d.ts +70 -0
- package/lib/core/config-state.js +177 -0
- package/lib/core/consult-source.d.ts +58 -0
- package/lib/core/consult-source.js +260 -0
- package/lib/core/crash-report.d.ts +84 -0
- package/lib/core/crash-report.js +317 -0
- package/lib/core/exporter.d.ts +68 -0
- package/lib/core/exporter.js +375 -0
- package/lib/core/ghost-sweep.d.ts +19 -0
- package/lib/core/ghost-sweep.js +52 -0
- package/lib/core/importer.d.ts +60 -0
- package/lib/core/importer.js +29 -0
- package/lib/core/index.d.ts +14 -0
- package/lib/core/index.js +14 -0
- package/lib/core/journal.d.ts +197 -0
- package/lib/core/journal.js +418 -0
- package/lib/core/local-plugin-host.d.ts +35 -0
- package/lib/core/local-plugin-host.js +120 -0
- package/lib/core/local-plugin-pack.d.ts +135 -0
- package/lib/core/local-plugin-pack.js +278 -0
- package/lib/core/messages.d.ts +310 -0
- package/lib/core/messages.js +621 -0
- package/lib/core/migration-consult.d.ts +117 -0
- package/lib/core/migration-consult.js +363 -0
- package/lib/core/migration-history.d.ts +153 -0
- package/lib/core/migration-history.js +411 -0
- package/lib/core/model-tools.d.ts +50 -0
- package/lib/core/model-tools.js +148 -0
- package/lib/core/msg-types.d.ts +8 -0
- package/lib/core/msg-types.js +6 -0
- package/lib/core/phase3-child-crash.d.ts +1 -0
- package/lib/core/phase3-child-crash.js +87 -0
- package/lib/core/phase3-host.d.ts +138 -0
- package/lib/core/phase3-host.js +359 -0
- package/lib/core/phase3-prod-child.d.ts +1 -0
- package/lib/core/phase3-prod-child.js +35 -0
- package/lib/core/phase4-crash-child.d.ts +1 -0
- package/lib/core/phase4-crash-child.js +103 -0
- package/lib/core/plugin-cli.d.ts +150 -0
- package/lib/core/plugin-cli.js +497 -0
- package/lib/core/reconcile.d.ts +120 -0
- package/lib/core/reconcile.js +389 -0
- package/lib/core/recovery-orchestrator.d.ts +94 -0
- package/lib/core/recovery-orchestrator.js +327 -0
- package/lib/core/restore.d.ts +162 -0
- package/lib/core/restore.js +703 -0
- package/lib/core/rollback.d.ts +12 -0
- package/lib/core/rollback.js +145 -0
- package/lib/core/run-registry.d.ts +85 -0
- package/lib/core/run-registry.js +157 -0
- package/lib/core/startup-barrier.d.ts +53 -0
- package/lib/core/startup-barrier.js +77 -0
- package/lib/core/types.d.ts +515 -0
- package/lib/core/types.js +27 -0
- package/lib/core/undo.d.ts +73 -0
- package/lib/core/undo.js +87 -0
- package/lib/core/validator.d.ts +18 -0
- package/lib/core/validator.js +77 -0
- package/lib/core/verify-recovery.d.ts +21 -0
- package/lib/core/verify-recovery.js +256 -0
- package/lib/core/watcher.d.ts +101 -0
- package/lib/core/watcher.js +219 -0
- package/lib/index.d.ts +238 -0
- package/lib/index.js +2764 -0
- package/lib/migrations/index.d.ts +29 -0
- package/lib/migrations/index.js +56 -0
- package/lib/migrations/v1-to-v2.d.ts +9 -0
- package/lib/migrations/v1-to-v2.js +10 -0
- package/lib/profiles/index.d.ts +4 -0
- package/lib/profiles/index.js +5 -0
- package/lib/profiles/profile-manager.d.ts +106 -0
- package/lib/profiles/profile-manager.js +543 -0
- package/lib/schema/config.d.ts +28 -0
- package/lib/schema/config.js +165 -0
- package/lib/schema/index.d.ts +24 -0
- package/lib/schema/index.js +26 -0
- package/lib/schema/manifest.d.ts +28 -0
- package/lib/schema/manifest.js +109 -0
- package/lib/schema/tombstones.d.ts +46 -0
- package/lib/schema/tombstones.js +64 -0
- package/lib/schema/types.d.ts +232 -0
- package/lib/schema/types.js +8 -0
- package/lib/schema/versions.d.ts +27 -0
- package/lib/schema/versions.js +50 -0
- package/lib/security/encryption.d.ts +85 -0
- package/lib/security/encryption.js +279 -0
- package/lib/security/index.d.ts +16 -0
- package/lib/security/index.js +17 -0
- package/lib/security/integrity.d.ts +30 -0
- package/lib/security/integrity.js +78 -0
- package/lib/security/redaction.d.ts +26 -0
- package/lib/security/redaction.js +95 -0
- package/lib/security/secret-scanner.d.ts +86 -0
- package/lib/security/secret-scanner.js +404 -0
- package/lib/security/vault.d.ts +59 -0
- package/lib/security/vault.js +151 -0
- package/lib/security/zip-security.d.ts +27 -0
- package/lib/security/zip-security.js +154 -0
- package/lib/sync/autosync-config.d.ts +39 -0
- package/lib/sync/autosync-config.js +151 -0
- package/lib/sync/autosync-scheduler.d.ts +139 -0
- package/lib/sync/autosync-scheduler.js +564 -0
- package/lib/sync/fs.d.ts +18 -0
- package/lib/sync/fs.js +49 -0
- package/lib/sync/git/git-transport.d.ts +100 -0
- package/lib/sync/git/git-transport.js +437 -0
- package/lib/sync/github-auth.d.ts +131 -0
- package/lib/sync/github-auth.js +264 -0
- package/lib/sync/layout.d.ts +43 -0
- package/lib/sync/layout.js +203 -0
- package/lib/sync/snapshot-json.d.ts +9 -0
- package/lib/sync/snapshot-json.js +107 -0
- package/lib/sync/sync-config.d.ts +81 -0
- package/lib/sync/sync-config.js +281 -0
- package/lib/sync/sync-engine.d.ts +269 -0
- package/lib/sync/sync-engine.js +591 -0
- package/lib/sync/sync-history.d.ts +42 -0
- package/lib/sync/sync-history.js +78 -0
- package/lib/sync/sync-selection.d.ts +29 -0
- package/lib/sync/sync-selection.js +127 -0
- package/lib/sync/sync-session.d.ts +40 -0
- package/lib/sync/sync-session.js +54 -0
- package/lib/sync/sync-state.d.ts +37 -0
- package/lib/sync/sync-state.js +108 -0
- package/lib/sync/transport.d.ts +75 -0
- package/lib/sync/transport.js +55 -0
- package/lib/sync/ui-prefs.d.ts +34 -0
- package/lib/sync/ui-prefs.js +109 -0
- package/lib/sync/webdav/webdav-transport.d.ts +77 -0
- package/lib/sync/webdav/webdav-transport.js +451 -0
- package/lib/ui/errors.d.ts +19 -0
- package/lib/ui/errors.js +81 -0
- package/lib/ui/export-flow.d.ts +82 -0
- package/lib/ui/export-flow.js +98 -0
- package/lib/ui/i18n.d.ts +289 -0
- package/lib/ui/i18n.js +581 -0
- package/lib/ui/migration-consult-view.d.ts +91 -0
- package/lib/ui/migration-consult-view.js +115 -0
- package/lib/ui/progress.d.ts +38 -0
- package/lib/ui/progress.js +87 -0
- package/lib/ui/report.d.ts +23 -0
- package/lib/ui/report.js +153 -0
- package/lib/ui/test-helpers.d.ts +69 -0
- package/lib/ui/test-helpers.js +154 -0
- package/lib/ui/types.d.ts +257 -0
- package/lib/ui/types.js +21 -0
- package/lib/utils/atomic-write.d.ts +88 -0
- package/lib/utils/atomic-write.js +399 -0
- package/lib/utils/env-lock.d.ts +393 -0
- package/lib/utils/env-lock.js +930 -0
- package/lib/utils/hashing.d.ts +17 -0
- package/lib/utils/hashing.js +41 -0
- package/lib/utils/json.d.ts +24 -0
- package/lib/utils/json.js +76 -0
- package/lib/utils/logger.d.ts +39 -0
- package/lib/utils/logger.js +82 -0
- package/lib/utils/paths.d.ts +42 -0
- package/lib/utils/paths.js +189 -0
- package/lib/utils/proxy.d.ts +69 -0
- package/lib/utils/proxy.js +455 -0
- package/lib/utils/recursive-walk.d.ts +24 -0
- package/lib/utils/recursive-walk.js +134 -0
- package/lib/utils/zip.d.ts +54 -0
- package/lib/utils/zip.js +285 -0
- package/package.json +188 -0
- package/src/adapters/agent-instructions.ts +48 -0
- package/src/adapters/agent-presets.ts +14 -0
- package/src/adapters/credentials.test.ts +90 -0
- package/src/adapters/credentials.ts +143 -0
- package/src/adapters/file-collection.ts +137 -0
- package/src/adapters/files.test.ts +353 -0
- package/src/adapters/index.ts +94 -0
- package/src/adapters/link-report.test.ts +65 -0
- package/src/adapters/link-report.ts +61 -0
- package/src/adapters/mcp.test.ts +96 -0
- package/src/adapters/mcp.ts +185 -0
- package/src/adapters/plugin-files.ts +146 -0
- package/src/adapters/plugins.test.ts +326 -0
- package/src/adapters/plugins.ts +615 -0
- package/src/adapters/pnpm-workspace.test.ts +87 -0
- package/src/adapters/pnpm-workspace.ts +150 -0
- package/src/adapters/prompts.test.ts +110 -0
- package/src/adapters/prompts.ts +230 -0
- package/src/adapters/providers.test.ts +126 -0
- package/src/adapters/providers.ts +173 -0
- package/src/adapters/roundtrip.test.ts +190 -0
- package/src/adapters/self.test.ts +92 -0
- package/src/adapters/self.ts +75 -0
- package/src/adapters/sessions.ts +15 -0
- package/src/adapters/settings.test.ts +100 -0
- package/src/adapters/settings.ts +187 -0
- package/src/adapters/skills.ts +14 -0
- package/src/adapters/test-helpers.ts +248 -0
- package/src/adapters/ui.test.ts +57 -0
- package/src/adapters/ui.ts +108 -0
- package/src/adapters/workspaces.test.ts +106 -0
- package/src/adapters/workspaces.ts +109 -0
- package/src/client/ConfigManagerSection.tsx +90 -0
- package/src/client/api.ts +66 -0
- package/src/client/client-types.ts +18 -0
- package/src/client/common/ErrorBanner.tsx +73 -0
- package/src/client/common/Icon.tsx +129 -0
- package/src/client/common/Modal.tsx +173 -0
- package/src/client/common/ToastViewport.tsx +73 -0
- package/src/client/common/toast-store.test.ts +192 -0
- package/src/client/common/toast-store.ts +181 -0
- package/src/client/common/toast-types.ts +7 -0
- package/src/client/common/ui.tsx +342 -0
- package/src/client/config-manager.module.css +2971 -0
- package/src/client/css-modules.d.ts +8 -0
- package/src/client/index.ts +65 -0
- package/src/client/locales.ts +56 -0
- package/src/client/lucide-icons.d.ts +38 -0
- package/src/client/run-store.test.ts +223 -0
- package/src/client/run-store.ts +372 -0
- package/src/client/sync/SyncConfirmView.tsx +379 -0
- package/src/client/sync/SyncHistoryView.test.ts +40 -0
- package/src/client/sync/SyncHistoryView.tsx +220 -0
- package/src/client/sync/SyncSettingsView.tsx +1535 -0
- package/src/client/sync/history-model.test.ts +194 -0
- package/src/client/sync/history-model.ts +195 -0
- package/src/client/sync/sync-api.test.ts +585 -0
- package/src/client/sync/sync-api.ts +543 -0
- package/src/client/sync/sync-locales.ts +416 -0
- package/src/client/sync/sync-push-preview.test.ts +52 -0
- package/src/client/sync/sync-view-v2.test.ts +213 -0
- package/src/client/sync/sync-view.test.ts +487 -0
- package/src/client/sync/sync-view.ts +759 -0
- package/src/core/analyzer.ts +1068 -0
- package/src/core/backup.ts +605 -0
- package/src/core/boot-rescue.test.ts +847 -0
- package/src/core/boot-rescue.ts +737 -0
- package/src/core/cache-cleaner.test.ts +169 -0
- package/src/core/cache-cleaner.ts +121 -0
- package/src/core/config-lifecycle.test.ts +727 -0
- package/src/core/config-lifecycle.ts +573 -0
- package/src/core/config-snapshot.test.ts +369 -0
- package/src/core/config-snapshot.ts +522 -0
- package/src/core/config-state.test.ts +381 -0
- package/src/core/config-state.ts +207 -0
- package/src/core/consult-source.test.ts +199 -0
- package/src/core/consult-source.ts +293 -0
- package/src/core/crash-report.test.ts +380 -0
- package/src/core/crash-report.ts +369 -0
- package/src/core/exporter.ts +417 -0
- package/src/core/ghost-sweep.test.ts +94 -0
- package/src/core/ghost-sweep.ts +67 -0
- package/src/core/importer.ts +83 -0
- package/src/core/index.ts +56 -0
- package/src/core/journal.test.ts +257 -0
- package/src/core/journal.ts +518 -0
- package/src/core/local-plugin-host.ts +152 -0
- package/src/core/local-plugin-pack.test.ts +359 -0
- package/src/core/local-plugin-pack.ts +363 -0
- package/src/core/messages.test.ts +54 -0
- package/src/core/messages.ts +664 -0
- package/src/core/migration-consult.test.ts +315 -0
- package/src/core/migration-consult.ts +494 -0
- package/src/core/migration-history.test.ts +319 -0
- package/src/core/migration-history.ts +484 -0
- package/src/core/model-tools.test.ts +190 -0
- package/src/core/model-tools.ts +208 -0
- package/src/core/msg-types.ts +10 -0
- package/src/core/phase3-child-crash.ts +95 -0
- package/src/core/phase3-host.ts +411 -0
- package/src/core/phase3-p1.test.ts +212 -0
- package/src/core/phase3-p2b-fingerprint.test.ts +189 -0
- package/src/core/phase3-prod-child.ts +36 -0
- package/src/core/phase3-production-integration.test.ts +286 -0
- package/src/core/phase4-crash-child.ts +101 -0
- package/src/core/phase4-crash-injection.test.ts +166 -0
- package/src/core/plugin-cli.fs.test.ts +184 -0
- package/src/core/plugin-cli.test.ts +137 -0
- package/src/core/plugin-cli.ts +563 -0
- package/src/core/reconcile.test.ts +392 -0
- package/src/core/reconcile.ts +498 -0
- package/src/core/recovery-orchestrator.test.ts +145 -0
- package/src/core/recovery-orchestrator.ts +366 -0
- package/src/core/restore-manage.test.ts +94 -0
- package/src/core/restore.ts +849 -0
- package/src/core/rollback.ts +151 -0
- package/src/core/run-progress.test.ts +237 -0
- package/src/core/run-registry.test.ts +232 -0
- package/src/core/run-registry.ts +209 -0
- package/src/core/smoke.test.ts +842 -0
- package/src/core/startup-barrier.ts +99 -0
- package/src/core/types.ts +542 -0
- package/src/core/undo.ts +116 -0
- package/src/core/validator.ts +84 -0
- package/src/core/verify-recovery.ts +265 -0
- package/src/core/watcher.test.ts +326 -0
- package/src/core/watcher.ts +263 -0
- package/src/index.facade.test.ts +265 -0
- package/src/index.sync.test.ts +217 -0
- package/src/index.ts +2975 -0
- package/src/migrations/index.ts +71 -0
- package/src/migrations/v1-to-v2.ts +17 -0
- package/src/profiles/index.ts +8 -0
- package/src/profiles/profile-manager.test.ts +282 -0
- package/src/profiles/profile-manager.ts +630 -0
- package/src/schema/config.ts +165 -0
- package/src/schema/index.ts +71 -0
- package/src/schema/manifest-schema.test.ts +519 -0
- package/src/schema/manifest.ts +124 -0
- package/src/schema/tombstones.test.ts +131 -0
- package/src/schema/tombstones.ts +89 -0
- package/src/schema/types.ts +245 -0
- package/src/schema/versions.ts +55 -0
- package/src/security/encryption.ts +335 -0
- package/src/security/index.ts +16 -0
- package/src/security/integrity.ts +102 -0
- package/src/security/redaction.ts +101 -0
- package/src/security/secret-scanner.ts +445 -0
- package/src/security/security.test.ts +1215 -0
- package/src/security/vault.test.ts +164 -0
- package/src/security/vault.ts +198 -0
- package/src/security/zip-security.ts +180 -0
- package/src/sync/autosync-config.test.ts +147 -0
- package/src/sync/autosync-config.ts +179 -0
- package/src/sync/autosync-scheduler.test.ts +490 -0
- package/src/sync/autosync-scheduler.ts +646 -0
- package/src/sync/fs.ts +48 -0
- package/src/sync/git/git-transport.test.ts +673 -0
- package/src/sync/git/git-transport.ts +491 -0
- package/src/sync/github-auth.test.ts +280 -0
- package/src/sync/github-auth.ts +356 -0
- package/src/sync/layout.test.ts +270 -0
- package/src/sync/layout.ts +222 -0
- package/src/sync/snapshot-json.test.ts +119 -0
- package/src/sync/snapshot-json.ts +128 -0
- package/src/sync/sync-config.test.ts +310 -0
- package/src/sync/sync-config.ts +299 -0
- package/src/sync/sync-engine.test.ts +1074 -0
- package/src/sync/sync-engine.ts +754 -0
- package/src/sync/sync-history.test.ts +116 -0
- package/src/sync/sync-history.ts +120 -0
- package/src/sync/sync-selection.test.ts +186 -0
- package/src/sync/sync-selection.ts +143 -0
- package/src/sync/sync-session.test.ts +143 -0
- package/src/sync/sync-session.ts +77 -0
- package/src/sync/sync-state.test.ts +164 -0
- package/src/sync/sync-state.ts +131 -0
- package/src/sync/transport.test.ts +111 -0
- package/src/sync/transport.ts +118 -0
- package/src/sync/ui-prefs.test.ts +152 -0
- package/src/sync/ui-prefs.ts +135 -0
- package/src/sync/webdav/webdav-transport.test.ts +871 -0
- package/src/sync/webdav/webdav-transport.ts +535 -0
- package/src/ui/errors.test.ts +47 -0
- package/src/ui/errors.ts +100 -0
- package/src/ui/export-flow.test.ts +87 -0
- package/src/ui/export-flow.ts +156 -0
- package/src/ui/i18n.ts +590 -0
- package/src/ui/migration-consult-view.test.ts +151 -0
- package/src/ui/migration-consult-view.ts +178 -0
- package/src/ui/progress.test.ts +47 -0
- package/src/ui/progress.ts +102 -0
- package/src/ui/report.test.ts +101 -0
- package/src/ui/report.ts +146 -0
- package/src/ui/test-helpers.ts +184 -0
- package/src/ui/types.ts +325 -0
- package/src/utils/atomic-write.test.ts +312 -0
- package/src/utils/atomic-write.ts +422 -0
- package/src/utils/env-lock.test.ts +999 -0
- package/src/utils/env-lock.ts +1086 -0
- package/src/utils/hashing.ts +53 -0
- package/src/utils/json.ts +77 -0
- package/src/utils/logger.ts +114 -0
- package/src/utils/paths.ts +176 -0
- package/src/utils/proxy.test.ts +465 -0
- package/src/utils/proxy.ts +493 -0
- package/src/utils/recursive-walk.test.ts +148 -0
- package/src/utils/recursive-walk.ts +145 -0
- package/src/utils/zip.ts +332 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 缓存自动清理:只清「可重建 / 一次性」的临时文件与导出副本。
|
|
3
|
+
*
|
|
4
|
+
* 清理面(保留期内一律不删):
|
|
5
|
+
* - `tmp/`:过期 `.zip` 暂存 + SyncEngine 遗留的 `dsh-sync-pull-*` 目录;
|
|
6
|
+
* - `exports/`:过期的导出产物 ZIP(导出时用户已下载/另存到本地)。
|
|
7
|
+
*
|
|
8
|
+
* **不清理**:`snapshots/`(回滚安全网)与 `sync/`(同步状态/快照)—— 它们是用户数据。
|
|
9
|
+
*
|
|
10
|
+
* 失败语义:任何单项失败只计入 `errors`,不影响主流程(调用方仅记日志)。
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'node:fs/promises';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
/** 临时文件缺省保留期:24h(供刷新恢复等窗口继续消费) */
|
|
15
|
+
export const TMP_RETENTION_DEFAULT_MS = 24 * 60 * 60 * 1000;
|
|
16
|
+
/** 导出产物缺省保留期:7 天(导出时用户已通过浏览器下载/另存到本地,host 端副本按周回收) */
|
|
17
|
+
export const EXPORTS_RETENTION_DEFAULT_MS = 7 * 24 * 60 * 60 * 1000;
|
|
18
|
+
/** SyncEngine 在 zipDir(即 tmpDir)下 mkdtemp 的目录前缀(用完即删,崩溃残留由清理兜底) */
|
|
19
|
+
const SYNC_TMP_DIR_PREFIX = 'dsh-sync-pull-';
|
|
20
|
+
/** 目录是否超期(stat 失败保守视为未超期 → 不删) */
|
|
21
|
+
async function isExpired(target, retentionMs, nowMs) {
|
|
22
|
+
try {
|
|
23
|
+
const st = await fs.stat(target);
|
|
24
|
+
return nowMs - st.mtimeMs > retentionMs;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** 删除一个文件/目录并计入报告;目录的 freedBytes 统计为 0(递归统计不划算,用途仅是日志) */
|
|
31
|
+
async function removeEntry(target, label, result) {
|
|
32
|
+
try {
|
|
33
|
+
let size = 0;
|
|
34
|
+
try {
|
|
35
|
+
const st = await fs.stat(target);
|
|
36
|
+
size = st.isFile() ? st.size : 0;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
/* stat 失败仍尝试删除(rm 自己会兜底不存在) */
|
|
40
|
+
}
|
|
41
|
+
await fs.rm(target, { recursive: true, force: true });
|
|
42
|
+
result.removed += 1;
|
|
43
|
+
result.freedBytes += size;
|
|
44
|
+
result.detail.push(`${label} (${size} bytes)`);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
result.errors += 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 执行一次缓存清理(幂等;可重复调用)。
|
|
52
|
+
* 只清理超期(超过保留期)的缓存/临时条目,其余一律保留。
|
|
53
|
+
*/
|
|
54
|
+
export async function cleanupCaches(opts) {
|
|
55
|
+
const nowMs = (opts.now ?? Date.now)();
|
|
56
|
+
const tmpRetentionMs = opts.tmpRetentionMs ?? TMP_RETENTION_DEFAULT_MS;
|
|
57
|
+
const exportsRetentionMs = opts.exportsRetentionMs ?? EXPORTS_RETENTION_DEFAULT_MS;
|
|
58
|
+
const result = { removed: 0, freedBytes: 0, errors: 0, detail: [] };
|
|
59
|
+
// 1) tmpDir:过期 .zip(同步/解密暂存)与 SyncEngine 遗留的 dsh-sync-pull-* 目录
|
|
60
|
+
try {
|
|
61
|
+
const entries = await fs.readdir(opts.tmpDir, { withFileTypes: true });
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
const target = path.join(opts.tmpDir, entry.name);
|
|
64
|
+
const isTmpish = (entry.isFile() && entry.name.endsWith('.zip')) ||
|
|
65
|
+
(entry.isDirectory() && entry.name.startsWith(SYNC_TMP_DIR_PREFIX));
|
|
66
|
+
if (!isTmpish)
|
|
67
|
+
continue;
|
|
68
|
+
if (await isExpired(target, tmpRetentionMs, nowMs)) {
|
|
69
|
+
await removeEntry(target, `tmp/${entry.name}`, result);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// tmpDir 不存在/不可读 → 跳过(尽力而为)
|
|
75
|
+
result.errors += 1;
|
|
76
|
+
}
|
|
77
|
+
// 2) exportsDir:过期的导出产物 .zip(导出时已下载/另存到本地,host 端副本按保留期回收)
|
|
78
|
+
try {
|
|
79
|
+
const entries = await fs.readdir(opts.exportsDir, { withFileTypes: true });
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
if (!entry.isFile() || !entry.name.endsWith('.zip'))
|
|
82
|
+
continue;
|
|
83
|
+
const target = path.join(opts.exportsDir, entry.name);
|
|
84
|
+
if (await isExpired(target, exportsRetentionMs, nowMs)) {
|
|
85
|
+
await removeEntry(target, `exports/${entry.name}`, result);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// exportsDir 不存在/不可读 → 跳过
|
|
91
|
+
result.errors += 1;
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=cache-cleaner.js.map
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { type ConfigState } from './config-state.ts';
|
|
2
|
+
import { type ConfigSnapshotMeta, type ConfigSnapshotRestoreReport } from './config-snapshot.ts';
|
|
3
|
+
import { type ConfigSnapshotKind } from './undo.ts';
|
|
4
|
+
import { type TimerApi, type WatchFactory, type WatcherEvent } from './watcher.ts';
|
|
5
|
+
import type { ConfigAdapter, HostContext } from './types.ts';
|
|
6
|
+
import type { SectionId } from '../schema/types.ts';
|
|
7
|
+
/** 启动关键配置文件(相对 homeDir)——自动快照最需要覆盖的那一批 */
|
|
8
|
+
export declare const BOOT_CRITICAL_RELS: readonly string[];
|
|
9
|
+
/** profile 下启动关键配置文件(相对 homeDir) */
|
|
10
|
+
export declare function profileCriticalRels(profile: string): string[];
|
|
11
|
+
/** 需要监听变更的目录(绝对路径;去重) */
|
|
12
|
+
export declare function watchDirsFor(homeDir: string, profile: string): string[];
|
|
13
|
+
/** 回声候选文件(绝对路径):我们恢复时会写的配置面文件 */
|
|
14
|
+
export declare function echoCandidatePaths(homeDir: string, profile: string): string[];
|
|
15
|
+
export interface ConfigLifecycleOptions {
|
|
16
|
+
/** 配置快照根目录(建议 <dataDir>/config-snapshots) */
|
|
17
|
+
dir: string;
|
|
18
|
+
adapters: readonly ConfigAdapter[];
|
|
19
|
+
ctx: HostContext;
|
|
20
|
+
/** profile 名(决定监听目录与 profile 文件集) */
|
|
21
|
+
profile: string;
|
|
22
|
+
/** 分区应用顺序(回放用;建议传与导入管线一致的顺序) */
|
|
23
|
+
applyOrder?: readonly SectionId[];
|
|
24
|
+
/** 自动快照开关(缺省 true) */
|
|
25
|
+
autoEnabled?: boolean;
|
|
26
|
+
/** 防抖窗口(缺省 1500ms) */
|
|
27
|
+
debounceMs?: number;
|
|
28
|
+
/** 保留份数(缺省 auto 20 / pre-restore 10 / manual 不限) */
|
|
29
|
+
keepAuto?: number;
|
|
30
|
+
keepPreRestore?: number;
|
|
31
|
+
/** watch 工厂(缺省由宿主注入真 fs.watch;未注入则自动快照不启动) */
|
|
32
|
+
watchFactory?: WatchFactory;
|
|
33
|
+
/** 定时器注入(透传给 DebouncedWatcher;测试用假定时器即可完整驱动时序) */
|
|
34
|
+
timers?: TimerApi;
|
|
35
|
+
/** 采集时单分区失败回调(不阻断) */
|
|
36
|
+
onSectionError?: (section: SectionId, error: unknown) => void;
|
|
37
|
+
/** 自动快照落盘后的回调(宿主写审计史) */
|
|
38
|
+
onAutoSnapshot?: (meta: ConfigSnapshotMeta) => void;
|
|
39
|
+
/** 诊断日志(默认静默) */
|
|
40
|
+
onWarn?: (message: string, detail?: unknown) => void;
|
|
41
|
+
}
|
|
42
|
+
export interface LifecycleStatus {
|
|
43
|
+
canUndo: boolean;
|
|
44
|
+
canRedo: boolean;
|
|
45
|
+
total: number;
|
|
46
|
+
/** 最近一次自动快照时间(null = 从未) */
|
|
47
|
+
lastAutoAt: string | null;
|
|
48
|
+
/** 当前是否正在监听文件变更 */
|
|
49
|
+
watching: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface UndoOutcome {
|
|
52
|
+
ok: boolean;
|
|
53
|
+
/** 命中目标快照 id(成功时) */
|
|
54
|
+
targetId?: string;
|
|
55
|
+
/** 撤销前落下的「撤销前状态」快照 id(重做的依据) */
|
|
56
|
+
preSnapshotId?: string;
|
|
57
|
+
/** 失败原因(未命中/回放失败) */
|
|
58
|
+
reason?: string;
|
|
59
|
+
report?: ConfigSnapshotRestoreReport;
|
|
60
|
+
/** 被标记为「已跨过」的快照 id */
|
|
61
|
+
stepped?: string[];
|
|
62
|
+
}
|
|
63
|
+
export interface RedoOutcome {
|
|
64
|
+
ok: boolean;
|
|
65
|
+
targetId?: string;
|
|
66
|
+
reason?: string;
|
|
67
|
+
report?: ConfigSnapshotRestoreReport;
|
|
68
|
+
/** 重做后清除 stepped 标记的快照 id */
|
|
69
|
+
unstepped?: string[];
|
|
70
|
+
}
|
|
71
|
+
export interface SnapshotRequest {
|
|
72
|
+
kind: ConfigSnapshotKind;
|
|
73
|
+
reason: string;
|
|
74
|
+
trigger?: string;
|
|
75
|
+
note?: string;
|
|
76
|
+
tags?: string[];
|
|
77
|
+
/** 只采集这些分区(缺省全部) */
|
|
78
|
+
only?: readonly SectionId[];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 配置生命周期服务(宿主单例)。
|
|
82
|
+
* 所有公开方法都不抛:错误转为 `ok:false + reason`,避免拖垮宿主路由。
|
|
83
|
+
*/
|
|
84
|
+
export declare class ConfigLifecycle {
|
|
85
|
+
private readonly opts;
|
|
86
|
+
private readonly echo;
|
|
87
|
+
private watcher;
|
|
88
|
+
private lastAutoAt;
|
|
89
|
+
private flushRunning;
|
|
90
|
+
private disposed;
|
|
91
|
+
/**
|
|
92
|
+
* flush 进行中到达的事件批(见 onAutoFlush)。
|
|
93
|
+
* watcher 在回调前已把事件批从 pending 摘除,若直接丢弃就再也没有定时器补发,
|
|
94
|
+
* 那一次变更将永远不会被快照 —— 撤销会直接跳过它。
|
|
95
|
+
*/
|
|
96
|
+
private deferred;
|
|
97
|
+
/**
|
|
98
|
+
* 最近一次回放(撤销/重做)把配置写成的目标状态。
|
|
99
|
+
* 第二层回声防线的兜底:抑制窗口只能挡住**窗口内**的事件,窗口之后才投递的事件
|
|
100
|
+
* (macOS / 网络盘 / 杀毒扫描后重写)只能靠内容判定 —— 若此刻采集到的状态仍等于
|
|
101
|
+
* 刚写回的目标状态,那批事件就是恢复自写的回声,不得产生新快照(否则它比
|
|
102
|
+
* pre-restore 更新,会把重做通道堵死)。真实变更一旦落盘即清空。
|
|
103
|
+
*/
|
|
104
|
+
private lastReplayState;
|
|
105
|
+
/** 当前实际建立监听的目录(供 reconcileWatchSet 比对,避免无谓重建) */
|
|
106
|
+
private watchedDirs;
|
|
107
|
+
constructor(options: ConfigLifecycleOptions);
|
|
108
|
+
private warn;
|
|
109
|
+
get dir(): string;
|
|
110
|
+
get isWatching(): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* 采集各分区导出结果 + 分区指纹:**单次遍历**,不重复 export。
|
|
113
|
+
* 单分区失败 → 记入 failed 并跳过(不抛),使调用方能判断这次状态是否可信。
|
|
114
|
+
*/
|
|
115
|
+
private captureSections;
|
|
116
|
+
/** 采集当前配置状态(单分区失败跳过,不抛) */
|
|
117
|
+
capture(only?: readonly SectionId[]): Promise<ConfigState>;
|
|
118
|
+
/** 采集并落盘一个配置快照 */
|
|
119
|
+
snapshot(req: SnapshotRequest): Promise<ConfigSnapshotMeta>;
|
|
120
|
+
/**
|
|
121
|
+
* 用一个**已采集**的产物落盘快照。
|
|
122
|
+
* 为什么必须支持传入已采集结果:撤销的 pre-restore 快照必须与「据以挑选目标的
|
|
123
|
+
* 那次采集」是同一份观测 —— 否则二次采集之间用户又改了配置,pre-restore 记下的
|
|
124
|
+
* 就不是「撤销前状态」,重做会把用户没见过的内容写回去。
|
|
125
|
+
*/
|
|
126
|
+
private saveSnapshot;
|
|
127
|
+
list(): Promise<ConfigSnapshotMeta[]>;
|
|
128
|
+
prune(): Promise<string[]>;
|
|
129
|
+
status(): Promise<LifecycleStatus>;
|
|
130
|
+
/**
|
|
131
|
+
* 撤销:回退到与当前状态**内容不同**的最新快照。
|
|
132
|
+
* 撤销前先落 `pre-restore` 快照记录当前状态,使重做可逆。
|
|
133
|
+
*/
|
|
134
|
+
undo(): Promise<UndoOutcome>;
|
|
135
|
+
/** 重做:回到最近一次未消费的 pre-restore(其后若有新快照则拒绝)。 */
|
|
136
|
+
redo(): Promise<RedoOutcome>;
|
|
137
|
+
/**
|
|
138
|
+
* 回放指定快照(撤销/重做共用)。
|
|
139
|
+
* 全程在监听抑制窗口内,并在结束后登记回声指纹——两道防线都在这里落地。
|
|
140
|
+
*/
|
|
141
|
+
replay(id: string): Promise<ConfigSnapshotRestoreReport>;
|
|
142
|
+
/**
|
|
143
|
+
* 登记「刚写回的内容指纹」:恢复动作写完文件后调用。
|
|
144
|
+
* 只登记我们确实会写的配置面文件(存在才登记),避免把无关文件误判为回声而漏拍。
|
|
145
|
+
*/
|
|
146
|
+
recordEcho(): Promise<void>;
|
|
147
|
+
/**
|
|
148
|
+
* 事件批是否为「恢复自写的回声」。
|
|
149
|
+
* 判定:批内每个文件都必须已登记**且**内容仍等于登记值;任一文件内容变了、
|
|
150
|
+
* 未登记、或读不到(新增/删除)→ 真实变更。
|
|
151
|
+
*/
|
|
152
|
+
isEchoBatch(events: readonly WatcherEvent[]): Promise<boolean>;
|
|
153
|
+
/** 启动自动快照监听(幂等;未注入 watchFactory 或已关闭则空操作) */
|
|
154
|
+
startAutoSnapshot(): void;
|
|
155
|
+
/**
|
|
156
|
+
* 监听集自愈:启动之后才出现的目录(skills / .agent-presets 在全新安装里通常不存在)
|
|
157
|
+
* 在**下一次快照之后**自动纳入监听。
|
|
158
|
+
*
|
|
159
|
+
* 为什么需要它:startAutoSnapshot 每次进程只被调用一次(启动闸门),若只在那里过滤
|
|
160
|
+
* 一次,那两个目录在整个进程生命周期里都不会被监听 —— 与注释里的承诺不符(「注释承诺 >
|
|
161
|
+
* 实际防线」正是本仓库踩过的坑)。放在 flush 之后调用,既不打断进行中的采集,也不会
|
|
162
|
+
* 丢掉排队中的事件批。
|
|
163
|
+
*/
|
|
164
|
+
private reconcileWatchSet;
|
|
165
|
+
stopAutoSnapshot(): void;
|
|
166
|
+
/** 释放:停止监听(宿主 dispose 调用) */
|
|
167
|
+
dispose(): void;
|
|
168
|
+
/** 供宿主在路由层复用的抑制包装(例如 Profile 切换时) */
|
|
169
|
+
suppressWhileAsync<T>(fn: () => Promise<T>): Promise<T>;
|
|
170
|
+
/**
|
|
171
|
+
* 防抖到期后的自动快照。
|
|
172
|
+
*
|
|
173
|
+
* 并发保护是「排队」而不是「丢弃」:watcher 在回调前已经把事件批从 pending 摘除,
|
|
174
|
+
* 若这里直接 return,那批事件就再也没有定时器补发 —— 那次变更永远不会被快照,
|
|
175
|
+
* 撤销会直接跳过它(实测:连写 v2、v3 只落了 1 份快照,且 undo 无从回到 v2)。
|
|
176
|
+
*/
|
|
177
|
+
private onAutoFlush;
|
|
178
|
+
/** 处理一批事件:回声判定 → 采集 → 落盘。 */
|
|
179
|
+
private flushOnce;
|
|
180
|
+
}
|