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.
Files changed (65) hide show
  1. package/docs/ROADMAP-NEXT.md +13 -13
  2. package/package.json +1 -1
  3. package/skills/release-checklist/SKILL.md +16 -3
  4. package/src/agent.js +102 -30
  5. package/src/audit.js +2 -2
  6. package/src/batch.js +74 -16
  7. package/src/cachestats.js +57 -11
  8. package/src/cli.js +29 -679
  9. package/src/commands/desktop.js +1 -1
  10. package/src/commands/key.js +1 -1
  11. package/src/commands/repl.js +711 -0
  12. package/src/commands/schedule.js +7 -7
  13. package/src/commands/skill.js +18 -16
  14. package/src/commands/sync.js +5 -5
  15. package/src/commands/update.js +22 -9
  16. package/src/commands/workspace.js +2 -2
  17. package/src/compact.js +6 -6
  18. package/src/config.js +7 -4
  19. package/src/context.js +11 -11
  20. package/src/cost-guard.js +15 -5
  21. package/src/credentials.js +6 -0
  22. package/src/hooks.js +11 -11
  23. package/src/mcp-presets.js +5 -5
  24. package/src/mcp.js +19 -19
  25. package/src/memory.js +16 -16
  26. package/src/model-discovery.js +16 -15
  27. package/src/models.js +4 -4
  28. package/src/notify.js +2 -2
  29. package/src/permissions.js +7 -3
  30. package/src/pricing.js +35 -1
  31. package/src/prompts.js +1 -1
  32. package/src/providers/index.js +7 -7
  33. package/src/providers/openai-compatible.js +8 -8
  34. package/src/routing.js +5 -5
  35. package/src/schedule.js +28 -28
  36. package/src/session-index.js +5 -1
  37. package/src/session.js +11 -2
  38. package/src/skill-lib.js +62 -3
  39. package/src/skill-registry.js +10 -9
  40. package/src/skills.js +10 -10
  41. package/src/sync-server.js +86 -3
  42. package/src/sync.js +53 -20
  43. package/src/tasks/worker.js +126 -0
  44. package/src/tasks.js +13 -13
  45. package/src/titles.js +5 -5
  46. package/src/tokenizer.js +22 -4
  47. package/src/tools/bash.js +12 -12
  48. package/src/tools/fs-tools.js +66 -9
  49. package/src/tools/index.js +77 -36
  50. package/src/ui.js +83 -6
  51. package/src/update.js +8 -8
  52. package/src/web/app.js +43 -0
  53. package/src/web/attachments.js +1 -1
  54. package/src/web/index.html +12 -0
  55. package/src/web/routes/api.js +38 -786
  56. package/src/web/routes/domains/config.js +280 -0
  57. package/src/web/routes/domains/misc.js +128 -0
  58. package/src/web/routes/domains/schedule.js +127 -0
  59. package/src/web/routes/domains/sessions.js +105 -0
  60. package/src/web/routes/domains/skills.js +79 -0
  61. package/src/web/routes/domains/sync.js +101 -0
  62. package/src/web/routes/domains/workspace.js +113 -0
  63. package/src/web/server.js +29 -14
  64. package/src/web/web-io.js +54 -12
  65. 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];