dsh-config-manager 0.1.11 → 0.1.13
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 +30 -0
- package/README.zh-CN.md +30 -0
- package/lib/adapters/test-helpers.d.ts +4 -2
- package/lib/adapters/test-helpers.js +11 -3
- package/lib/adapters/test-helpers.js.map +1 -1
- package/lib/cli/index.d.ts +44 -0
- package/lib/cli/index.js +230 -0
- package/lib/cli/index.js.map +1 -0
- package/lib/client.d.ts +260 -5
- package/lib/client.js +2519 -820
- package/lib/client.js.map +1 -1
- package/lib/core/analyzer.d.ts +18 -1
- package/lib/core/analyzer.js +29 -0
- package/lib/core/analyzer.js.map +1 -1
- package/lib/core/backup.d.ts +3 -1
- package/lib/core/backup.js +70 -0
- package/lib/core/backup.js.map +1 -1
- package/lib/core/exporter.d.ts +11 -0
- package/lib/core/exporter.js +11 -0
- package/lib/core/exporter.js.map +1 -1
- package/lib/core/importer.d.ts +3 -0
- package/lib/core/importer.js +1 -0
- package/lib/core/importer.js.map +1 -1
- package/lib/core/index.d.ts +1 -0
- package/lib/core/index.js +1 -0
- package/lib/core/index.js.map +1 -1
- package/lib/core/restore.d.ts +92 -0
- package/lib/core/restore.js +505 -0
- package/lib/core/restore.js.map +1 -0
- package/lib/core/run-registry.d.ts +65 -0
- package/lib/core/run-registry.js +120 -0
- package/lib/core/run-registry.js.map +1 -0
- package/lib/core/types.d.ts +20 -0
- package/lib/core/types.js.map +1 -1
- package/lib/index.d.ts +45 -0
- package/lib/index.js +442 -8
- package/lib/index.js.map +1 -1
- package/lib/sync/fs.d.ts +18 -0
- package/lib/sync/fs.js +47 -0
- package/lib/sync/fs.js.map +1 -0
- package/lib/sync/git/git-transport.d.ts +87 -0
- package/lib/sync/git/git-transport.js +333 -0
- package/lib/sync/git/git-transport.js.map +1 -0
- package/lib/sync/layout.d.ts +29 -0
- package/lib/sync/layout.js +166 -0
- package/lib/sync/layout.js.map +1 -0
- package/lib/sync/sync-config.d.ts +16 -0
- package/lib/sync/sync-config.js +67 -0
- package/lib/sync/sync-config.js.map +1 -0
- package/lib/sync/sync-engine.d.ts +96 -0
- package/lib/sync/sync-engine.js +236 -0
- package/lib/sync/sync-engine.js.map +1 -0
- package/lib/sync/sync-state.d.ts +31 -0
- package/lib/sync/sync-state.js +103 -0
- package/lib/sync/sync-state.js.map +1 -0
- package/lib/sync/transport.d.ts +50 -0
- package/lib/sync/transport.js +22 -0
- package/lib/sync/transport.js.map +1 -0
- package/package.json +13 -1
- package/src/adapters/test-helpers.ts +10 -3
- package/src/cli/index.ts +278 -0
- package/src/client/ConfigManagerSection.tsx +49 -14
- package/src/client/api.ts +53 -5
- package/src/client/client-types.ts +0 -6
- package/src/client/common/ProgressBar.tsx +31 -19
- package/src/client/common/progress-view-edge.test.ts +60 -0
- package/src/client/common/progress-view.test.ts +79 -0
- package/src/client/common/progress-view.ts +94 -0
- package/src/client/config-manager.module.css +99 -20
- package/src/client/export/ExportView.tsx +63 -49
- package/src/client/import/ImportWizardView.tsx +107 -66
- package/src/client/index.ts +22 -0
- package/src/client/locales.ts +53 -0
- package/src/client/run-store.test.ts +500 -0
- package/src/client/run-store.ts +772 -0
- package/src/client/snapshots/SnapshotsPanel.tsx +240 -0
- package/src/client/sync/SyncSettingsView.tsx +261 -0
- package/src/client/sync/sync-api.test.ts +117 -0
- package/src/client/sync/sync-api.ts +132 -0
- package/src/client/sync/sync-locales.ts +77 -0
- package/src/client/sync/sync-view.test.ts +211 -0
- package/src/client/sync/sync-view.ts +202 -0
- package/src/core/analyzer.ts +50 -1
- package/src/core/backup.ts +78 -2
- package/src/core/exporter.ts +21 -0
- package/src/core/importer.ts +4 -0
- package/src/core/index.ts +5 -0
- package/src/core/restore.ts +587 -0
- package/src/core/run-progress.test.ts +237 -0
- package/src/core/run-registry.test.ts +139 -0
- package/src/core/run-registry.ts +166 -0
- package/src/core/smoke.test.ts +5 -0
- package/src/core/types.ts +22 -0
- package/src/index.ts +476 -8
- package/src/security/security.test.ts +5 -0
- package/src/sync/fs.ts +46 -0
- package/src/sync/git/git-transport.test.ts +456 -0
- package/src/sync/git/git-transport.ts +390 -0
- package/src/sync/layout.test.ts +226 -0
- package/src/sync/layout.ts +183 -0
- package/src/sync/sync-config.ts +72 -0
- package/src/sync/sync-engine.test.ts +299 -0
- package/src/sync/sync-engine.ts +318 -0
- package/src/sync/sync-state.test.ts +118 -0
- package/src/sync/sync-state.ts +123 -0
- package/src/sync/transport.test.ts +110 -0
- package/src/sync/transport.ts +73 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host 端 run 注册表(m1):记录导出/导入任务的运行状态与真实进度。
|
|
3
|
+
*
|
|
4
|
+
* 浏览器侧通过 `/api/dsh-config-manager/progress?runId=…` 与
|
|
5
|
+
* `/api/dsh-config-manager/runs` 轮询/恢复进度(m2 store 刷新恢复、m3 进度 UI
|
|
6
|
+
* 消费);本模块是 Host 侧的单一事实源,不依赖任何 DSH 运行时服务。
|
|
7
|
+
*
|
|
8
|
+
* 安全纪律:
|
|
9
|
+
* - runId 由 crypto.randomBytes(16) 生成(32 hex 字符),不可猜测;
|
|
10
|
+
* - RunState 只存非敏感摘要(分区/计数/详情文案),绝不写入密钥、密码、
|
|
11
|
+
* 秘密补录值或任何敏感内容;
|
|
12
|
+
* - result 只存可 JSON 序列化的业务结果(导出为 { zipPath, manifest, report },
|
|
13
|
+
* 导入为 ImportResult),不含秘密值。
|
|
14
|
+
*
|
|
15
|
+
* 生命周期:register(running)→ update(进度)→ finish(done+result)/
|
|
16
|
+
* fail(failed+error);超过保留期(默认 30 分钟)的 run 在任意读操作时惰性清理。
|
|
17
|
+
* 并发纪律:同一 kind 已有 running 的 run 时,register 抛 RunConflictError
|
|
18
|
+
* (宿主路由以 409 拒绝新任务,防止重复导出/导入)。
|
|
19
|
+
*/
|
|
20
|
+
import { randomBytes } from 'node:crypto';
|
|
21
|
+
/** 进行中同 kind 已有 run 时注册被拒(宿主路由 → 409)。 */
|
|
22
|
+
export class RunConflictError extends Error {
|
|
23
|
+
/** 已在进行中的 run id(供客户端定位既有任务)。 */
|
|
24
|
+
runId;
|
|
25
|
+
constructor(runId, kind) {
|
|
26
|
+
super(kind === 'export'
|
|
27
|
+
? `已有进行中的导出任务(${runId}),请等待其完成后再试`
|
|
28
|
+
: `已有进行中的导入任务(${runId}),请等待其完成后再试`);
|
|
29
|
+
this.name = 'RunConflictError';
|
|
30
|
+
this.runId = runId;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** 完成/失败后的默认保留时长(30 分钟)。 */
|
|
34
|
+
export const DEFAULT_RUN_RETENTION_MS = 30 * 60 * 1000;
|
|
35
|
+
/**
|
|
36
|
+
* 内存 run 注册表。Node 单线程 + 同步 Map 读写,无并发竞争;
|
|
37
|
+
* 所有公开读方法返回状态副本,防止外部直接篡改内部状态。
|
|
38
|
+
*/
|
|
39
|
+
export class RunRegistry {
|
|
40
|
+
runs = new Map();
|
|
41
|
+
retentionMs;
|
|
42
|
+
now;
|
|
43
|
+
constructor(opts = {}) {
|
|
44
|
+
this.retentionMs = opts.retentionMs ?? DEFAULT_RUN_RETENTION_MS;
|
|
45
|
+
this.now = opts.now ?? (() => Date.now());
|
|
46
|
+
}
|
|
47
|
+
/** 注册新 run;同 kind 已有 running 时抛 RunConflictError。 */
|
|
48
|
+
register(kind) {
|
|
49
|
+
this.prune();
|
|
50
|
+
for (const run of this.runs.values()) {
|
|
51
|
+
if (run.kind === kind && run.status === 'running')
|
|
52
|
+
throw new RunConflictError(run.runId, kind);
|
|
53
|
+
}
|
|
54
|
+
const now = this.now();
|
|
55
|
+
const state = {
|
|
56
|
+
runId: randomBytes(16).toString('hex'),
|
|
57
|
+
kind,
|
|
58
|
+
status: 'running',
|
|
59
|
+
section: null,
|
|
60
|
+
sectionTotal: null,
|
|
61
|
+
item: null,
|
|
62
|
+
itemTotal: null,
|
|
63
|
+
detail: null,
|
|
64
|
+
createdAt: now,
|
|
65
|
+
updatedAt: now,
|
|
66
|
+
};
|
|
67
|
+
this.runs.set(state.runId, state);
|
|
68
|
+
return { ...state };
|
|
69
|
+
}
|
|
70
|
+
/** 更新进度;run 不存在返回 undefined;已完成/失败后的晚到更新被忽略(防御异步回调竞态)。 */
|
|
71
|
+
update(runId, patch) {
|
|
72
|
+
const run = this.runs.get(runId);
|
|
73
|
+
if (run === undefined)
|
|
74
|
+
return undefined;
|
|
75
|
+
if (run.status !== 'running')
|
|
76
|
+
return { ...run };
|
|
77
|
+
Object.assign(run, patch, { updatedAt: this.now() });
|
|
78
|
+
return { ...run };
|
|
79
|
+
}
|
|
80
|
+
/** 读单个 run;超过保留期或不存在返回 undefined。 */
|
|
81
|
+
get(runId) {
|
|
82
|
+
this.prune();
|
|
83
|
+
const run = this.runs.get(runId);
|
|
84
|
+
return run === undefined ? undefined : { ...run };
|
|
85
|
+
}
|
|
86
|
+
/** 列出活跃(running)run(刷新恢复时经 /runs 重订阅用)。 */
|
|
87
|
+
listActive() {
|
|
88
|
+
this.prune();
|
|
89
|
+
return [...this.runs.values()].filter((r) => r.status === 'running').map((r) => ({ ...r }));
|
|
90
|
+
}
|
|
91
|
+
/** 标记完成并写入业务结果;run 不存在返回 undefined。 */
|
|
92
|
+
finish(runId, result) {
|
|
93
|
+
const run = this.runs.get(runId);
|
|
94
|
+
if (run === undefined)
|
|
95
|
+
return undefined;
|
|
96
|
+
run.status = 'done';
|
|
97
|
+
run.result = result;
|
|
98
|
+
run.updatedAt = this.now();
|
|
99
|
+
return { ...run };
|
|
100
|
+
}
|
|
101
|
+
/** 标记失败并写入错误消息;run 不存在返回 undefined。 */
|
|
102
|
+
fail(runId, error) {
|
|
103
|
+
const run = this.runs.get(runId);
|
|
104
|
+
if (run === undefined)
|
|
105
|
+
return undefined;
|
|
106
|
+
run.status = 'failed';
|
|
107
|
+
run.error = error;
|
|
108
|
+
run.updatedAt = this.now();
|
|
109
|
+
return { ...run };
|
|
110
|
+
}
|
|
111
|
+
/** 惰性清理:超过保留期的 run(含长期 running 的僵死任务)全部移除。 */
|
|
112
|
+
prune() {
|
|
113
|
+
const cutoff = this.now() - this.retentionMs;
|
|
114
|
+
for (const [id, run] of this.runs) {
|
|
115
|
+
if (run.updatedAt < cutoff)
|
|
116
|
+
this.runs.delete(id);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=run-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-registry.js","sourceRoot":"","sources":["../../src/core/run-registry.ts"],"names":[],"mappings":"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"}
|
package/lib/core/types.d.ts
CHANGED
|
@@ -130,6 +130,8 @@ export interface HostContext {
|
|
|
130
130
|
workspace: WorkspaceFacade;
|
|
131
131
|
patchFile: PatchFileFacade;
|
|
132
132
|
fs: FileSystemFacade;
|
|
133
|
+
/** 当前管理的 DSH profile 名(如 web);引擎用它定位 profiles/<profile>/cordis.patch.yml。宿主不暴露时缺省 */
|
|
134
|
+
profile?: string;
|
|
133
135
|
}
|
|
134
136
|
export type PlanItemKind = 'Create' | 'Update' | 'Skip' | 'Conflict' | 'Install' | 'MissingSecret' | 'MissingDependency' | 'PathMapping' | 'Warning' | 'Error';
|
|
135
137
|
export type ItemResolution = 'keepCurrent' | 'useImported' | 'review';
|
|
@@ -249,17 +251,35 @@ export interface SnapshotEntry {
|
|
|
249
251
|
/** 所属快照 id(file 条目回滚读取 blob 时使用) */
|
|
250
252
|
snapshotId?: string;
|
|
251
253
|
}
|
|
254
|
+
/** 快照生命周期状态(M1 增强;旧快照无此字段,视为未知/兼容) */
|
|
255
|
+
export type SnapshotStatus = 'pending' | 'done' | 'rolled-back';
|
|
256
|
+
/** 宿主整文件备份登记(M1):导入前对 $DSH_HOME 关键文件的整文件快照。
|
|
257
|
+
* relPath 相对 $DSH_HOME(如 settings.yaml / cordis.patch.yml / profiles/<p>/cordis.patch.yml),
|
|
258
|
+
* blobPath 为快照内 blob 路径(existed=false 时为空串,表示该文件当时不存在)。 */
|
|
259
|
+
export interface HostFileBackup {
|
|
260
|
+
relPath: string;
|
|
261
|
+
blobPath: string;
|
|
262
|
+
existed: boolean;
|
|
263
|
+
}
|
|
252
264
|
export interface Snapshot {
|
|
253
265
|
id: string;
|
|
254
266
|
createdAt: string;
|
|
255
267
|
sourceZip: string;
|
|
256
268
|
entries: SnapshotEntry[];
|
|
269
|
+
/** 生命周期状态:pending(已生成,导入未完成)/ done(导入成功)/ rolled-back(失败已回滚)。旧快照缺省 */
|
|
270
|
+
status?: SnapshotStatus;
|
|
271
|
+
/** 导入前已安装插件清单(M2 restore 撤销插件时与当前已装对比)。旧快照缺省 */
|
|
272
|
+
beforePlugins?: PluginInfo[];
|
|
273
|
+
/** 宿主整文件备份(settings.yaml / settings.json / cordis.patch.yml / profiles/<p>/cordis.patch.yml)。旧快照缺省 */
|
|
274
|
+
hostFileBackups?: HostFileBackup[];
|
|
257
275
|
}
|
|
258
276
|
/** 快照存储(默认文件实现见 core/backup.ts;测试可用内存实现) */
|
|
259
277
|
export interface SnapshotStore {
|
|
260
278
|
save(snapshot: Snapshot, blobs?: Map<string, Uint8Array>): Promise<string>;
|
|
261
279
|
load(id: string): Promise<Snapshot>;
|
|
262
280
|
readBlob(id: string, blobPath: string): Promise<Uint8Array>;
|
|
281
|
+
/** 标记快照生命周期状态(导入成功→done;失败回滚→rolled-back;持久化由实现负责) */
|
|
282
|
+
updateStatus(id: string, status: SnapshotStatus): Promise<void>;
|
|
263
283
|
}
|
|
264
284
|
export interface RollbackReport {
|
|
265
285
|
full: boolean;
|
package/lib/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AA6VA,4CAA4C;AAE5C,sBAAsB;AACtB,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD;QACE,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,+BAA+B;AAC/B,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,MAAM,CAAe;IAC9B,YAAY,OAAe,EAAE,MAAoB;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
|
package/lib/index.d.ts
CHANGED
|
@@ -33,7 +33,9 @@
|
|
|
33
33
|
* official `dsh plugin --profile <name>` CLI (pnpm forwarder) and read the
|
|
34
34
|
* profile's package.json / node_modules directly.
|
|
35
35
|
*/
|
|
36
|
+
import type { ServerResponse } from 'node:http';
|
|
36
37
|
import type { Context } from '@deepseek-ai/cordis';
|
|
38
|
+
import { type RestorePlan, type RestoreReport } from './core/restore.ts';
|
|
37
39
|
import { runDshPlugin } from './core/plugin-cli.ts';
|
|
38
40
|
import type { PatchFileFacade, PluginInfo, PluginsFacade } from './core/types.ts';
|
|
39
41
|
/** Stable cordis plugin name — must match the cordis.patch.yml row id. */
|
|
@@ -78,6 +80,49 @@ export declare class DshPluginsFacade implements PluginsFacade {
|
|
|
78
80
|
needsRestart: boolean;
|
|
79
81
|
}>;
|
|
80
82
|
}
|
|
83
|
+
/** 同步路由可预期的请求级错误(status 缺省 400;引擎/传输失败走 500) */
|
|
84
|
+
export declare class SyncRouteError extends Error {
|
|
85
|
+
readonly status: number;
|
|
86
|
+
constructor(message: string, status?: number);
|
|
87
|
+
}
|
|
88
|
+
/** 同步路由错误统一出口:SyncRouteError 用其 status,其余 500(GitTransport 错误消息已脱敏) */
|
|
89
|
+
export declare function writeSyncRouteError(res: ServerResponse, error: unknown): void;
|
|
90
|
+
/** POST /restore 请求体校验(纯函数;snapshotId 拒绝路径分隔符防 join 越界)。 */
|
|
91
|
+
export type BuildRestoreBodyResult = {
|
|
92
|
+
ok: true;
|
|
93
|
+
value: {
|
|
94
|
+
snapshotId: string;
|
|
95
|
+
dryRun: boolean;
|
|
96
|
+
};
|
|
97
|
+
} | {
|
|
98
|
+
ok: false;
|
|
99
|
+
error: string;
|
|
100
|
+
};
|
|
101
|
+
export declare function buildRestoreBody(body: unknown): BuildRestoreBodyResult;
|
|
102
|
+
/**
|
|
103
|
+
* 宿主侧恢复动作执行器(真实执行 restore 计划):
|
|
104
|
+
* 整文件/文件还原与删除走 ctx.fs(home-relative facade,越界由 facade 再拦一道),
|
|
105
|
+
* blob 读取与 pre-restore 副本走快照目录(node fs),插件卸载走官方 dsh plugin CLI。
|
|
106
|
+
*/
|
|
107
|
+
export interface RestoreExecutor {
|
|
108
|
+
/** 读快照目录内 blob(相对 snapshotDir) */
|
|
109
|
+
readBlob(blobPath: string): Promise<Uint8Array>;
|
|
110
|
+
/** 把当前 home 文件内容复制到 <snapshotDir>/pre-restore/(覆盖/删除前的双保险) */
|
|
111
|
+
savePreRestore(relPath: string): Promise<void>;
|
|
112
|
+
existsHome(relPath: string): Promise<boolean>;
|
|
113
|
+
writeHome(relPath: string, data: Uint8Array): Promise<void>;
|
|
114
|
+
removeHome(relPath: string): Promise<void>;
|
|
115
|
+
/** 卸载插件(官方通道);失败返回 { ok:false, message } */
|
|
116
|
+
uninstallPlugin(name: string): Promise<{
|
|
117
|
+
ok: boolean;
|
|
118
|
+
message?: string;
|
|
119
|
+
}>;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 按计划执行恢复动作(纯执行器;逐项 try/catch 不拖垮其余),
|
|
123
|
+
* 返回与 CLI 一致的诚实报告。顺序 = 计划顺序(整文件 → 插件 → file 补偿)。
|
|
124
|
+
*/
|
|
125
|
+
export declare function executeRestorePlan(plan: RestorePlan, exec: RestoreExecutor): Promise<RestoreReport>;
|
|
81
126
|
/**
|
|
82
127
|
* Mount the config-manager engine: host context, adapters, and the
|
|
83
128
|
* /api/dsh-config-manager routes (when a webServer is present).
|