mingdao-harness 0.2.3 → 0.2.5
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/docs/ROADMAP-NEXT.md +13 -13
- package/package.json +1 -1
- package/skills/release-checklist/SKILL.md +16 -3
- package/src/agent.js +102 -30
- package/src/audit.js +2 -2
- package/src/batch.js +74 -16
- package/src/cachestats.js +57 -11
- package/src/cli.js +29 -679
- package/src/commands/desktop.js +1 -1
- package/src/commands/key.js +1 -1
- package/src/commands/repl.js +711 -0
- package/src/commands/schedule.js +7 -7
- package/src/commands/skill.js +18 -16
- package/src/commands/sync.js +5 -5
- package/src/commands/update.js +22 -9
- package/src/commands/workspace.js +2 -2
- package/src/compact.js +6 -6
- package/src/config.js +7 -4
- package/src/context.js +11 -11
- package/src/cost-guard.js +15 -5
- package/src/credentials.js +6 -0
- package/src/hooks.js +11 -11
- package/src/mcp-presets.js +5 -5
- package/src/mcp.js +19 -19
- package/src/memory.js +16 -16
- package/src/model-discovery.js +16 -15
- package/src/models.js +4 -4
- package/src/notify.js +2 -2
- package/src/permissions.js +7 -3
- package/src/pricing.js +35 -1
- package/src/prompts.js +1 -1
- package/src/providers/index.js +7 -7
- package/src/providers/openai-compatible.js +8 -8
- package/src/routing.js +5 -5
- package/src/schedule.js +28 -28
- package/src/session-index.js +5 -1
- package/src/session.js +11 -2
- package/src/skill-lib.js +62 -3
- package/src/skill-registry.js +10 -9
- package/src/skills.js +10 -10
- package/src/sync-server.js +86 -3
- package/src/sync.js +53 -20
- package/src/tasks/worker.js +126 -0
- package/src/tasks.js +13 -13
- package/src/titles.js +5 -5
- package/src/tokenizer.js +22 -4
- package/src/tools/bash.js +12 -12
- package/src/tools/fs-tools.js +66 -9
- package/src/tools/index.js +77 -36
- package/src/ui.js +83 -6
- package/src/update.js +8 -8
- package/src/web/app.js +43 -0
- package/src/web/attachments.js +1 -1
- package/src/web/index.html +12 -0
- package/src/web/routes/api.js +38 -786
- package/src/web/routes/domains/config.js +280 -0
- package/src/web/routes/domains/misc.js +128 -0
- package/src/web/routes/domains/schedule.js +127 -0
- package/src/web/routes/domains/sessions.js +105 -0
- package/src/web/routes/domains/skills.js +79 -0
- package/src/web/routes/domains/sync.js +101 -0
- package/src/web/routes/domains/workspace.js +113 -0
- package/src/web/server.js +29 -14
- package/src/web/web-io.js +54 -12
- package/src/workspace.js +14 -14
package/src/workspace.js
CHANGED
|
@@ -20,7 +20,7 @@ export function loadWorkspaces() {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
export function saveWorkspaces(ws) {
|
|
23
|
+
export function saveWorkspaces(/** @type {any} */ ws) {
|
|
24
24
|
try {
|
|
25
25
|
ensureHome();
|
|
26
26
|
// 原子写:临时文件 + rename,避免崩溃后注册表被冲空
|
|
@@ -31,7 +31,7 @@ export function saveWorkspaces(ws) {
|
|
|
31
31
|
} catch {}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export function addWorkspace(name, dir) {
|
|
34
|
+
export function addWorkspace(/** @type {any} */ name, /** @type {any} */ dir) {
|
|
35
35
|
const key = String(name).trim();
|
|
36
36
|
if (!key) return { error: '名称不能为空' };
|
|
37
37
|
if (/[\\/]/.test(key)) return { error: '名称不能包含路径分隔符' };
|
|
@@ -43,7 +43,7 @@ export function addWorkspace(name, dir) {
|
|
|
43
43
|
return { ok: true, name: key, dir: target };
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
export function removeWorkspace(name) {
|
|
46
|
+
export function removeWorkspace(/** @type {any} */ name) {
|
|
47
47
|
const ws = loadWorkspaces();
|
|
48
48
|
if (!ws[name]) return false;
|
|
49
49
|
delete ws[name];
|
|
@@ -51,7 +51,7 @@ export function removeWorkspace(name) {
|
|
|
51
51
|
return true;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
export function renameWorkspace(name, newName) {
|
|
54
|
+
export function renameWorkspace(/** @type {any} */ name, /** @type {any} */ newName) {
|
|
55
55
|
const key = String(newName).trim();
|
|
56
56
|
if (!key) return { error: '新名称不能为空' };
|
|
57
57
|
if (/[\\/]/.test(key)) return { error: '名称不能包含路径分隔符' };
|
|
@@ -66,15 +66,15 @@ export function renameWorkspace(name, newName) {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
// 修改目录:登记同名即可覆盖目录
|
|
69
|
-
export function setWorkspaceDir(name, dir) {
|
|
69
|
+
export function setWorkspaceDir(/** @type {any} */ name, /** @type {any} */ dir) {
|
|
70
70
|
return addWorkspace(name, dir);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
export function workspacePath(name) {
|
|
73
|
+
export function workspacePath(/** @type {any} */ name) {
|
|
74
74
|
return loadWorkspaces()[name]?.dir || null;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export function touchWorkspace(name) {
|
|
77
|
+
export function touchWorkspace(/** @type {any} */ name) {
|
|
78
78
|
const ws = loadWorkspaces();
|
|
79
79
|
if (!ws[name]) return false;
|
|
80
80
|
ws[name].lastUsed = Date.now();
|
|
@@ -89,14 +89,14 @@ export function listWorkspaces() {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// 当前目录是否已登记(供横幅/提示)
|
|
92
|
-
export function currentWorkspace(cwd) {
|
|
92
|
+
export function currentWorkspace(/** @type {any} */ cwd) {
|
|
93
93
|
const target = path.resolve(cwd);
|
|
94
94
|
const hit = listWorkspaces().find((w) => path.resolve(w.dir) === target);
|
|
95
95
|
return hit || null;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
// 按目录反查工作空间名(会话记录的是目录,展示时需要名字)
|
|
99
|
-
export function workspaceForDir(dir) {
|
|
99
|
+
export function workspaceForDir(/** @type {any} */ dir) {
|
|
100
100
|
if (!dir) return null;
|
|
101
101
|
const target = path.resolve(dir);
|
|
102
102
|
return listWorkspaces().find((w) => path.resolve(w.dir) === target) || null;
|
|
@@ -118,7 +118,7 @@ export function loadSessionWorkspaces() {
|
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
export function saveSessionWorkspaces(map) {
|
|
121
|
+
export function saveSessionWorkspaces(/** @type {any} */ map) {
|
|
122
122
|
try {
|
|
123
123
|
ensureHome();
|
|
124
124
|
const target = sessionWorkspacesFile();
|
|
@@ -128,17 +128,17 @@ export function saveSessionWorkspaces(map) {
|
|
|
128
128
|
} catch {}
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
-
export function getSessionWorkspace(sessionName) {
|
|
131
|
+
export function getSessionWorkspace(/** @type {any} */ sessionName) {
|
|
132
132
|
return loadSessionWorkspaces()[sessionName]?.dir || null;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
export function setSessionWorkspace(sessionName, dir, wsName = null) {
|
|
135
|
+
export function setSessionWorkspace(/** @type {any} */ sessionName, /** @type {any} */ dir, wsName = null) {
|
|
136
136
|
const map = loadSessionWorkspaces();
|
|
137
137
|
map[sessionName] = { dir: path.resolve(dir), name: wsName || workspaceForDir(dir)?.name || null, at: Date.now() };
|
|
138
138
|
saveSessionWorkspaces(map);
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
export function removeSessionWorkspace(sessionName) {
|
|
141
|
+
export function removeSessionWorkspace(/** @type {any} */ sessionName) {
|
|
142
142
|
const map = loadSessionWorkspaces();
|
|
143
143
|
if (!map[sessionName]) return false;
|
|
144
144
|
delete map[sessionName];
|
|
@@ -147,7 +147,7 @@ export function removeSessionWorkspace(sessionName) {
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
// 会话改名时迁移映射(记录保留)
|
|
150
|
-
export function moveSessionWorkspace(oldName, newName) {
|
|
150
|
+
export function moveSessionWorkspace(/** @type {any} */ oldName, /** @type {any} */ newName) {
|
|
151
151
|
const map = loadSessionWorkspaces();
|
|
152
152
|
if (!map[oldName]) return false;
|
|
153
153
|
map[newName] = map[oldName];
|