@sanqianx/claude-ai-workbench 0.13.2 → 0.13.4
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 +201 -201
- package/README.md +156 -156
- package/apps/agent-terminal/app.css +652 -613
- package/apps/agent-terminal/app.js +143 -67
- package/apps/agent-terminal/conversation-composer.js +44 -0
- package/apps/agent-terminal/index.html +172 -170
- package/apps/agent-terminal/panel-host-proof.html +152 -152
- package/apps/agent-terminal/panel-proof-content.html +41 -41
- package/apps/agent-terminal/right-workspace-dock.css +189 -159
- package/apps/agent-terminal/right-workspace-dock.js +652 -521
- package/apps/agent-terminal/user-question-card.js +68 -0
- package/apps/ai-profile-settings-host/index.html +25 -25
- package/apps/ai-profile-settings-host/page.css +1 -1
- package/apps/ai-profile-settings-host/page.js +113 -113
- package/apps/minimal-test-host/README.md +15 -15
- package/apps/minimal-test-host/host.css +2 -2
- package/apps/minimal-test-host/host.js +35 -35
- package/apps/minimal-test-host/index.html +58 -58
- package/apps/minimal-test-host/optional-mock/fault-injection.js +15 -15
- package/docs/sdk/FILE_LAYOUT.md +31 -31
- package/docs/sdk/INTEGRATION.md +126 -126
- package/docs/sdk/README.md +21 -21
- package/docs/sdk/SESSION_EVENTS.md +15 -13
- package/docs/sdk/openapi.yaml +16 -1
- package/package.json +1 -1
- package/packages/client/README.md +29 -29
- package/packages/client/index.d.ts +122 -122
- package/packages/client/index.js +260 -260
- package/packages/client/package.json +2 -2
- package/packages/contracts/README.md +9 -9
- package/packages/contracts/index.d.ts +519 -517
- package/packages/contracts/index.js +312 -312
- package/packages/contracts/package.json +1 -1
- package/packages/core/README.md +8 -8
- package/packages/core/index.d.ts +76 -76
- package/packages/core/index.js +222 -222
- package/packages/core/package.json +2 -2
- package/packages/server/README.md +17 -17
- package/packages/server/bin/agent-terminal-server.js +42 -42
- package/packages/server/bin/claude-workbench.js +225 -225
- package/packages/server/index.d.ts +171 -171
- package/packages/server/index.js +230 -230
- package/packages/server/lib/agent-discovery.js +133 -133
- package/packages/server/lib/agent-registry.js +143 -143
- package/packages/server/lib/agent-spawn-env.js +17 -17
- package/packages/server/lib/attachment-store.js +78 -78
- package/packages/server/lib/bridges/app-server-bridge.js +373 -373
- package/packages/server/lib/bridges/opencode-server-bridge.js +506 -506
- package/packages/server/lib/capture-settings-store.js +35 -35
- package/packages/server/lib/claude-history-recovery.js +87 -87
- package/packages/server/lib/cli-session-recovery.js +28 -28
- package/packages/server/lib/context-resolver.js +55 -55
- package/packages/server/lib/conversation-capture.js +51 -51
- package/packages/server/lib/delegation-phase-store.js +357 -357
- package/packages/server/lib/delegation-store.js +474 -468
- package/packages/server/lib/diagnostics.js +32 -32
- package/packages/server/lib/drivers/cli-json-runner.js +974 -974
- package/packages/server/lib/drivers/codex-driver.js +1461 -1442
- package/packages/server/lib/drivers/opencode-driver.js +1554 -1554
- package/packages/server/lib/drivers/zcode-driver.js +1250 -1250
- package/packages/server/lib/drivers/zcode-profile-runtime.js +71 -71
- package/packages/server/lib/event-stream.js +138 -138
- package/packages/server/lib/folder-picker.js +623 -623
- package/packages/server/lib/http-handler.js +339 -339
- package/packages/server/lib/json-file.js +26 -26
- package/packages/server/lib/knowledge-context.js +33 -33
- package/packages/server/lib/model-detection.js +295 -295
- package/packages/server/lib/parent-context.js +44 -0
- package/packages/server/lib/profile-store.js +283 -283
- package/packages/server/lib/project-store.js +102 -102
- package/packages/server/lib/runtime-loader.js +120 -120
- package/packages/server/lib/session-archive-store.js +53 -53
- package/packages/server/lib/session-history.js +612 -612
- package/packages/server/lib/system-doctor.js +125 -125
- package/packages/server/lib/ui-preferences-store.js +48 -48
- package/packages/server/lib/user-questions.js +67 -0
- package/packages/server/lib/workbench-service.js +1696 -1675
- package/packages/server/package.json +2 -2
- package/packages/ui/README.md +30 -30
- package/packages/ui/ai-profile-settings.d.ts +45 -45
- package/packages/ui/ai-profile-settings.js +283 -283
- package/packages/ui/claude-terminal.d.ts +31 -31
- package/packages/ui/claude-terminal.js +343 -343
- package/packages/ui/index.d.ts +18 -18
- package/packages/ui/index.js +51 -51
- package/packages/ui/package.json +2 -2
- package/packages/ui/theme.css +13 -13
- package/src/assets/claude-prompts.json +21 -21
- package/src/backend/http/ai-profile-routes.js +61 -61
- package/src/backend/http/claude-routes.js +170 -170
- package/src/backend/http/node-helpers.js +45 -45
- package/src/backend/index.js +21 -21
- package/src/backend/lib/ai-adapter.js +144 -144
- package/src/backend/lib/ai-profile-store.js +259 -259
- package/src/backend/lib/ai-vendor-presets.js +83 -83
- package/src/backend/lib/ai-workspace.js +140 -140
- package/src/backend/lib/automation-config.js +253 -253
- package/src/backend/lib/claude-cli-runner.js +2408 -2392
- package/src/backend/lib/data-dir.js +169 -169
- package/src/backend/lib/llm-client.js +176 -176
- package/src/backend/lib/model-context-windows.js +82 -82
- package/src/backend/lib/native-task-control.js +217 -217
- package/src/backend/lib/native-task-history-index.js +475 -475
- package/src/backend/lib/native-task-history-reader.js +526 -526
- package/src/backend/lib/native-task-messages.js +457 -457
- package/src/backend/lib/native-task-registry.js +325 -325
- package/src/backend/lib/native-task-runtime.js +242 -242
- package/src/backend/lib/native-task-trace.js +440 -440
- package/src/backend/lib/native-task-transcript.js +393 -393
- package/src/backend/lib/prompt-registry.js +166 -166
- package/src/backend/lib/runtime-config.js +121 -121
- package/src/backend/lib/sdk-session-stream.js +143 -143
- package/src/backend/lib/sdk-turn-stream.js +16 -16
- package/src/backend/lib/store-scope.js +131 -131
- package/src/backend/lib/task-identity.js +104 -104
- package/src/backend/lib/task-state-projection.js +58 -58
- package/src/index.js +7 -7
- package/src/sdk-wave-a.ts +1 -1
- package/src/sdk-wave-b.ts +1 -1
- package/src/sdk-wave-c.ts +1 -1
- package/src/sdk-wave-d.ts +1 -1
- package/src/sdk-wave-e.ts +1 -1
|
@@ -1,169 +1,169 @@
|
|
|
1
|
-
// _site/lib/data-dir.js
|
|
2
|
-
//
|
|
3
|
-
// Resolves a stable, version-independent data directory for project-knowledge
|
|
4
|
-
// runtime state. Runtime data lives OUTSIDE the npm install directory so that
|
|
5
|
-
// `npm install -g project-knowledge` upgrades do not destroy user config
|
|
6
|
-
// (project registry, AI profiles with API keys, generated knowledge bases,
|
|
7
|
-
// logs, AI workspaces).
|
|
8
|
-
//
|
|
9
|
-
// Resolution order (highest priority first):
|
|
10
|
-
// 1. KB_DATA_DIR env var — used by tests and power users who want a custom
|
|
11
|
-
// location. Set to "." to use the current working directory.
|
|
12
|
-
// 2. <os.homedir()>/.project-knowledge — the default user-specific location.
|
|
13
|
-
//
|
|
14
|
-
// On first run after upgrade from a 1.x install, the legacy runtime files
|
|
15
|
-
// (which lived inside the npm package directory) are silently migrated into
|
|
16
|
-
// the new data dir. After that, all updates keep the data dir untouched and
|
|
17
|
-
// data survives every future `npm install -g project-knowledge`.
|
|
18
|
-
|
|
19
|
-
const fs = require('fs');
|
|
20
|
-
const path = require('path');
|
|
21
|
-
const { resolveDataDir } = require('./runtime-config');
|
|
22
|
-
|
|
23
|
-
let _resolved = null;
|
|
24
|
-
|
|
25
|
-
function getDataDir() {
|
|
26
|
-
const dataDir = resolveDataDir();
|
|
27
|
-
if (_resolved === dataDir) return _resolved;
|
|
28
|
-
try {
|
|
29
|
-
fs.mkdirSync(dataDir, { recursive: true });
|
|
30
|
-
} catch (err) {
|
|
31
|
-
// Best-effort. Callers will surface a write error when they actually
|
|
32
|
-
// try to write inside the dir; we don't want to crash here just because
|
|
33
|
-
// the user's homedir is read-only or the path is bogus.
|
|
34
|
-
}
|
|
35
|
-
_resolved = dataDir;
|
|
36
|
-
return dataDir;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Reset the cached resolution. Tests use this to switch KB_DATA_DIR between
|
|
40
|
-
// cases without re-requiring the module.
|
|
41
|
-
function _resetCache() {
|
|
42
|
-
_resolved = null;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function hasMigrated() {
|
|
46
|
-
return fs.existsSync(path.join(getDataDir(), 'projects.json'));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Legacy 1.x locations — these lived inside the npm package root. The
|
|
50
|
-
// package root for an installed package is the directory that contains
|
|
51
|
-
// _site/server.js, _site/lib/, package.json, etc.
|
|
52
|
-
const LEGACY_FILE_PATHS = [
|
|
53
|
-
'projects.json',
|
|
54
|
-
'ai-profiles.json',
|
|
55
|
-
'knowledge-store.json',
|
|
56
|
-
'logging.json',
|
|
57
|
-
'.jobs-log.json',
|
|
58
|
-
'claude-prompts.json',
|
|
59
|
-
'.hook-trigger-errors.log',
|
|
60
|
-
];
|
|
61
|
-
|
|
62
|
-
const LEGACY_DIR_PATHS = [
|
|
63
|
-
'projects', // generated KB trees
|
|
64
|
-
'logs', // structured logs
|
|
65
|
-
];
|
|
66
|
-
|
|
67
|
-
const LEGACY_AI_DIR = path.join('_site', '_ai'); // per-project AI workspaces lived under _site/_ai/
|
|
68
|
-
|
|
69
|
-
function copyDir(src, dest) {
|
|
70
|
-
fs.mkdirSync(dest, { recursive: true });
|
|
71
|
-
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
72
|
-
const from = path.join(src, entry.name);
|
|
73
|
-
const to = path.join(dest, entry.name);
|
|
74
|
-
if (entry.isDirectory()) copyDir(from, to);
|
|
75
|
-
else if (entry.isFile()) fs.copyFileSync(from, to);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function migrateFromLegacy({ legacyRoot, logger } = {}) {
|
|
80
|
-
// Test escape hatch. Set KB_SKIP_MIGRATION=1 to run against a clean data
|
|
81
|
-
// dir without pulling the user's real registry in from the package root.
|
|
82
|
-
if (process.env.KB_SKIP_MIGRATION === '1') {
|
|
83
|
-
return { ok: true, migrated: false, reason: 'skipped via KB_SKIP_MIGRATION=1' };
|
|
84
|
-
}
|
|
85
|
-
if (!legacyRoot) {
|
|
86
|
-
return { ok: true, migrated: false, reason: 'no legacy root provided' };
|
|
87
|
-
}
|
|
88
|
-
if (!fs.existsSync(legacyRoot)) {
|
|
89
|
-
return { ok: true, migrated: false, reason: 'legacy root does not exist' };
|
|
90
|
-
}
|
|
91
|
-
const dataDir = getDataDir();
|
|
92
|
-
// Safety check: if the legacy root equals the data dir, there's nothing
|
|
93
|
-
// to migrate (we'd be copying onto ourselves).
|
|
94
|
-
if (path.resolve(legacyRoot) === path.resolve(dataDir)) {
|
|
95
|
-
return { ok: true, migrated: false, reason: 'legacy root equals data dir' };
|
|
96
|
-
}
|
|
97
|
-
if (hasMigrated()) {
|
|
98
|
-
return { ok: true, migrated: false, reason: 'already migrated' };
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const result = {
|
|
102
|
-
ok: true,
|
|
103
|
-
migrated: false,
|
|
104
|
-
files: 0,
|
|
105
|
-
dirs: 0,
|
|
106
|
-
source: legacyRoot,
|
|
107
|
-
target: dataDir,
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
for (const rel of LEGACY_FILE_PATHS) {
|
|
111
|
-
const from = path.join(legacyRoot, rel);
|
|
112
|
-
const to = path.join(dataDir, rel);
|
|
113
|
-
if (fs.existsSync(from) && !fs.existsSync(to)) {
|
|
114
|
-
try {
|
|
115
|
-
fs.mkdirSync(path.dirname(to), { recursive: true });
|
|
116
|
-
fs.copyFileSync(from, to);
|
|
117
|
-
result.files++;
|
|
118
|
-
} catch (err) {
|
|
119
|
-
result.ok = false;
|
|
120
|
-
result.error = `failed to migrate ${rel}: ${err.message}`;
|
|
121
|
-
return result;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
for (const rel of LEGACY_DIR_PATHS) {
|
|
126
|
-
const from = path.join(legacyRoot, rel);
|
|
127
|
-
const to = path.join(dataDir, rel);
|
|
128
|
-
if (fs.existsSync(from) && !fs.existsSync(to)) {
|
|
129
|
-
try {
|
|
130
|
-
copyDir(from, to);
|
|
131
|
-
result.dirs++;
|
|
132
|
-
} catch (err) {
|
|
133
|
-
result.ok = false;
|
|
134
|
-
result.error = `failed to migrate ${rel}/: ${err.message}`;
|
|
135
|
-
return result;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
const aiFrom = path.join(legacyRoot, LEGACY_AI_DIR);
|
|
140
|
-
const aiTo = path.join(dataDir, '_ai');
|
|
141
|
-
if (fs.existsSync(aiFrom) && !fs.existsSync(aiTo)) {
|
|
142
|
-
try {
|
|
143
|
-
copyDir(aiFrom, aiTo);
|
|
144
|
-
result.dirs++;
|
|
145
|
-
} catch (err) {
|
|
146
|
-
result.ok = false;
|
|
147
|
-
result.error = `failed to migrate _site/_ai/: ${err.message}`;
|
|
148
|
-
return result;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (result.files > 0 || result.dirs > 0) {
|
|
153
|
-
result.migrated = true;
|
|
154
|
-
if (logger) {
|
|
155
|
-
logger(`migrated runtime data to ${dataDir} (${result.files} files, ${result.dirs} dirs from ${legacyRoot})`);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return result;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
module.exports = {
|
|
162
|
-
getDataDir,
|
|
163
|
-
hasMigrated,
|
|
164
|
-
migrateFromLegacy,
|
|
165
|
-
LEGACY_FILE_PATHS,
|
|
166
|
-
LEGACY_DIR_PATHS,
|
|
167
|
-
LEGACY_AI_DIR,
|
|
168
|
-
_resetCache,
|
|
169
|
-
};
|
|
1
|
+
// _site/lib/data-dir.js
|
|
2
|
+
//
|
|
3
|
+
// Resolves a stable, version-independent data directory for project-knowledge
|
|
4
|
+
// runtime state. Runtime data lives OUTSIDE the npm install directory so that
|
|
5
|
+
// `npm install -g project-knowledge` upgrades do not destroy user config
|
|
6
|
+
// (project registry, AI profiles with API keys, generated knowledge bases,
|
|
7
|
+
// logs, AI workspaces).
|
|
8
|
+
//
|
|
9
|
+
// Resolution order (highest priority first):
|
|
10
|
+
// 1. KB_DATA_DIR env var — used by tests and power users who want a custom
|
|
11
|
+
// location. Set to "." to use the current working directory.
|
|
12
|
+
// 2. <os.homedir()>/.project-knowledge — the default user-specific location.
|
|
13
|
+
//
|
|
14
|
+
// On first run after upgrade from a 1.x install, the legacy runtime files
|
|
15
|
+
// (which lived inside the npm package directory) are silently migrated into
|
|
16
|
+
// the new data dir. After that, all updates keep the data dir untouched and
|
|
17
|
+
// data survives every future `npm install -g project-knowledge`.
|
|
18
|
+
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const path = require('path');
|
|
21
|
+
const { resolveDataDir } = require('./runtime-config');
|
|
22
|
+
|
|
23
|
+
let _resolved = null;
|
|
24
|
+
|
|
25
|
+
function getDataDir() {
|
|
26
|
+
const dataDir = resolveDataDir();
|
|
27
|
+
if (_resolved === dataDir) return _resolved;
|
|
28
|
+
try {
|
|
29
|
+
fs.mkdirSync(dataDir, { recursive: true });
|
|
30
|
+
} catch (err) {
|
|
31
|
+
// Best-effort. Callers will surface a write error when they actually
|
|
32
|
+
// try to write inside the dir; we don't want to crash here just because
|
|
33
|
+
// the user's homedir is read-only or the path is bogus.
|
|
34
|
+
}
|
|
35
|
+
_resolved = dataDir;
|
|
36
|
+
return dataDir;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Reset the cached resolution. Tests use this to switch KB_DATA_DIR between
|
|
40
|
+
// cases without re-requiring the module.
|
|
41
|
+
function _resetCache() {
|
|
42
|
+
_resolved = null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function hasMigrated() {
|
|
46
|
+
return fs.existsSync(path.join(getDataDir(), 'projects.json'));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Legacy 1.x locations — these lived inside the npm package root. The
|
|
50
|
+
// package root for an installed package is the directory that contains
|
|
51
|
+
// _site/server.js, _site/lib/, package.json, etc.
|
|
52
|
+
const LEGACY_FILE_PATHS = [
|
|
53
|
+
'projects.json',
|
|
54
|
+
'ai-profiles.json',
|
|
55
|
+
'knowledge-store.json',
|
|
56
|
+
'logging.json',
|
|
57
|
+
'.jobs-log.json',
|
|
58
|
+
'claude-prompts.json',
|
|
59
|
+
'.hook-trigger-errors.log',
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const LEGACY_DIR_PATHS = [
|
|
63
|
+
'projects', // generated KB trees
|
|
64
|
+
'logs', // structured logs
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
const LEGACY_AI_DIR = path.join('_site', '_ai'); // per-project AI workspaces lived under _site/_ai/
|
|
68
|
+
|
|
69
|
+
function copyDir(src, dest) {
|
|
70
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
71
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
72
|
+
const from = path.join(src, entry.name);
|
|
73
|
+
const to = path.join(dest, entry.name);
|
|
74
|
+
if (entry.isDirectory()) copyDir(from, to);
|
|
75
|
+
else if (entry.isFile()) fs.copyFileSync(from, to);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function migrateFromLegacy({ legacyRoot, logger } = {}) {
|
|
80
|
+
// Test escape hatch. Set KB_SKIP_MIGRATION=1 to run against a clean data
|
|
81
|
+
// dir without pulling the user's real registry in from the package root.
|
|
82
|
+
if (process.env.KB_SKIP_MIGRATION === '1') {
|
|
83
|
+
return { ok: true, migrated: false, reason: 'skipped via KB_SKIP_MIGRATION=1' };
|
|
84
|
+
}
|
|
85
|
+
if (!legacyRoot) {
|
|
86
|
+
return { ok: true, migrated: false, reason: 'no legacy root provided' };
|
|
87
|
+
}
|
|
88
|
+
if (!fs.existsSync(legacyRoot)) {
|
|
89
|
+
return { ok: true, migrated: false, reason: 'legacy root does not exist' };
|
|
90
|
+
}
|
|
91
|
+
const dataDir = getDataDir();
|
|
92
|
+
// Safety check: if the legacy root equals the data dir, there's nothing
|
|
93
|
+
// to migrate (we'd be copying onto ourselves).
|
|
94
|
+
if (path.resolve(legacyRoot) === path.resolve(dataDir)) {
|
|
95
|
+
return { ok: true, migrated: false, reason: 'legacy root equals data dir' };
|
|
96
|
+
}
|
|
97
|
+
if (hasMigrated()) {
|
|
98
|
+
return { ok: true, migrated: false, reason: 'already migrated' };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const result = {
|
|
102
|
+
ok: true,
|
|
103
|
+
migrated: false,
|
|
104
|
+
files: 0,
|
|
105
|
+
dirs: 0,
|
|
106
|
+
source: legacyRoot,
|
|
107
|
+
target: dataDir,
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
for (const rel of LEGACY_FILE_PATHS) {
|
|
111
|
+
const from = path.join(legacyRoot, rel);
|
|
112
|
+
const to = path.join(dataDir, rel);
|
|
113
|
+
if (fs.existsSync(from) && !fs.existsSync(to)) {
|
|
114
|
+
try {
|
|
115
|
+
fs.mkdirSync(path.dirname(to), { recursive: true });
|
|
116
|
+
fs.copyFileSync(from, to);
|
|
117
|
+
result.files++;
|
|
118
|
+
} catch (err) {
|
|
119
|
+
result.ok = false;
|
|
120
|
+
result.error = `failed to migrate ${rel}: ${err.message}`;
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
for (const rel of LEGACY_DIR_PATHS) {
|
|
126
|
+
const from = path.join(legacyRoot, rel);
|
|
127
|
+
const to = path.join(dataDir, rel);
|
|
128
|
+
if (fs.existsSync(from) && !fs.existsSync(to)) {
|
|
129
|
+
try {
|
|
130
|
+
copyDir(from, to);
|
|
131
|
+
result.dirs++;
|
|
132
|
+
} catch (err) {
|
|
133
|
+
result.ok = false;
|
|
134
|
+
result.error = `failed to migrate ${rel}/: ${err.message}`;
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const aiFrom = path.join(legacyRoot, LEGACY_AI_DIR);
|
|
140
|
+
const aiTo = path.join(dataDir, '_ai');
|
|
141
|
+
if (fs.existsSync(aiFrom) && !fs.existsSync(aiTo)) {
|
|
142
|
+
try {
|
|
143
|
+
copyDir(aiFrom, aiTo);
|
|
144
|
+
result.dirs++;
|
|
145
|
+
} catch (err) {
|
|
146
|
+
result.ok = false;
|
|
147
|
+
result.error = `failed to migrate _site/_ai/: ${err.message}`;
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (result.files > 0 || result.dirs > 0) {
|
|
153
|
+
result.migrated = true;
|
|
154
|
+
if (logger) {
|
|
155
|
+
logger(`migrated runtime data to ${dataDir} (${result.files} files, ${result.dirs} dirs from ${legacyRoot})`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
module.exports = {
|
|
162
|
+
getDataDir,
|
|
163
|
+
hasMigrated,
|
|
164
|
+
migrateFromLegacy,
|
|
165
|
+
LEGACY_FILE_PATHS,
|
|
166
|
+
LEGACY_DIR_PATHS,
|
|
167
|
+
LEGACY_AI_DIR,
|
|
168
|
+
_resetCache,
|
|
169
|
+
};
|