@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,26 +1,26 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const crypto = require('crypto');
|
|
6
|
-
|
|
7
|
-
function readJson(file, fallback) {
|
|
8
|
-
try { return JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
9
|
-
catch { return fallback; }
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function writeJson(file, value, mode = 0o600) {
|
|
13
|
-
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
14
|
-
const temp = `${file}.${process.pid}-${crypto.randomUUID()}.tmp`;
|
|
15
|
-
try {
|
|
16
|
-
fs.writeFileSync(temp, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', mode, flag: 'wx' });
|
|
17
|
-
// Never unlink the previous record if Windows refuses replacement.
|
|
18
|
-
// ENOSPC or a locked destination must preserve the last durable history.
|
|
19
|
-
fs.renameSync(temp, file);
|
|
20
|
-
try { fs.chmodSync(file, mode); } catch {}
|
|
21
|
-
} finally {
|
|
22
|
-
try { fs.unlinkSync(temp); } catch {}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
module.exports = { readJson, writeJson };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const crypto = require('crypto');
|
|
6
|
+
|
|
7
|
+
function readJson(file, fallback) {
|
|
8
|
+
try { return JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
9
|
+
catch { return fallback; }
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function writeJson(file, value, mode = 0o600) {
|
|
13
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
14
|
+
const temp = `${file}.${process.pid}-${crypto.randomUUID()}.tmp`;
|
|
15
|
+
try {
|
|
16
|
+
fs.writeFileSync(temp, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', mode, flag: 'wx' });
|
|
17
|
+
// Never unlink the previous record if Windows refuses replacement.
|
|
18
|
+
// ENOSPC or a locked destination must preserve the last durable history.
|
|
19
|
+
fs.renameSync(temp, file);
|
|
20
|
+
try { fs.chmodSync(file, mode); } catch {}
|
|
21
|
+
} finally {
|
|
22
|
+
try { fs.unlinkSync(temp); } catch {}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
module.exports = { readJson, writeJson };
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
const { readJson, writeJson } = require('./json-file');
|
|
3
|
-
class KnowledgeContext {
|
|
4
|
-
constructor({ engineUrl, fetchImpl = fetch, contextFile } = {}) { this.engineUrl = engineUrl; this.fetch = fetchImpl; this.contextFile = contextFile; this.contexts = new Map(); }
|
|
5
|
-
remember(sessionId, value) {
|
|
6
|
-
const { prompt, ...context } = value;
|
|
7
|
-
if (this.contextFile) {
|
|
8
|
-
const data = readJson(this.contextFile, { schema: 'session-knowledge-context/v1', sessions: {} });
|
|
9
|
-
data.sessions[sessionId] = context; writeJson(this.contextFile, data);
|
|
10
|
-
} else this.contexts.set(sessionId, context);
|
|
11
|
-
}
|
|
12
|
-
saved(sessionId) { return this.contextFile ? readJson(this.contextFile, { sessions: {} }).sessions[sessionId] : this.contexts.get(sessionId); }
|
|
13
|
-
forget(sessionId) {
|
|
14
|
-
if (this.contextFile) {
|
|
15
|
-
const data = readJson(this.contextFile, { schema: 'session-knowledge-context/v1', sessions: {} });
|
|
16
|
-
if (Object.hasOwn(data.sessions, sessionId)) { delete data.sessions[sessionId]; writeJson(this.contextFile, data); }
|
|
17
|
-
} else this.contexts.delete(sessionId);
|
|
18
|
-
}
|
|
19
|
-
async retrieve(repoPath, query, scope, metadata = {}) {
|
|
20
|
-
if (!this.engineUrl || !query) return { status: 'disabled', references: [], prompt: '' };
|
|
21
|
-
try {
|
|
22
|
-
const target = new URL(this.engineUrl);
|
|
23
|
-
if (!['http:', 'https:'].includes(target.protocol) || !['localhost', '127.0.0.1', '::1', '[::1]'].includes(target.hostname) || target.username || target.password || target.search || target.hash) throw new Error('KNOWLEDGE_UNAVAILABLE');
|
|
24
|
-
const response = await this.fetch(new URL('/api/context', target), { method: 'POST', redirect: 'error', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ repoPath, query, ...(scope ? { scope } : {}), client: 'workbench', sessionId: metadata.sessionId }), signal: AbortSignal.timeout(10000) });
|
|
25
|
-
if (response.status === 404) return { status: 'unregistered', references: [], prompt: '' };
|
|
26
|
-
if (!response.ok) throw new Error('KNOWLEDGE_UNAVAILABLE');
|
|
27
|
-
const found = await response.json();
|
|
28
|
-
if (found.ok !== true || !Array.isArray(found.references) || !Array.isArray(found.memories) || typeof found.prompt !== 'string' || found.prompt.length > 8000 || !['ready', 'empty', 'file-fallback'].includes(found.status)) throw new Error('KNOWLEDGE_UNAVAILABLE');
|
|
29
|
-
return { status: found.status, projectId: found.projectId, scope: found.scope, references: found.references, memoryCount: found.memories.length, memoryStatus: found.memoryStatus, truncated: found.truncated, requestId: found.requestId, retrievedAt: new Date().toISOString(), prompt: found.prompt ? `\n\n${found.prompt}` : '' };
|
|
30
|
-
} catch { return { status: 'unavailable', references: [], prompt: '\n\n知识库读取未完成,可继续开发;不要将读取失败当作没有相关知识。' }; }
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
module.exports = { KnowledgeContext };
|
|
1
|
+
'use strict';
|
|
2
|
+
const { readJson, writeJson } = require('./json-file');
|
|
3
|
+
class KnowledgeContext {
|
|
4
|
+
constructor({ engineUrl, fetchImpl = fetch, contextFile } = {}) { this.engineUrl = engineUrl; this.fetch = fetchImpl; this.contextFile = contextFile; this.contexts = new Map(); }
|
|
5
|
+
remember(sessionId, value) {
|
|
6
|
+
const { prompt, ...context } = value;
|
|
7
|
+
if (this.contextFile) {
|
|
8
|
+
const data = readJson(this.contextFile, { schema: 'session-knowledge-context/v1', sessions: {} });
|
|
9
|
+
data.sessions[sessionId] = context; writeJson(this.contextFile, data);
|
|
10
|
+
} else this.contexts.set(sessionId, context);
|
|
11
|
+
}
|
|
12
|
+
saved(sessionId) { return this.contextFile ? readJson(this.contextFile, { sessions: {} }).sessions[sessionId] : this.contexts.get(sessionId); }
|
|
13
|
+
forget(sessionId) {
|
|
14
|
+
if (this.contextFile) {
|
|
15
|
+
const data = readJson(this.contextFile, { schema: 'session-knowledge-context/v1', sessions: {} });
|
|
16
|
+
if (Object.hasOwn(data.sessions, sessionId)) { delete data.sessions[sessionId]; writeJson(this.contextFile, data); }
|
|
17
|
+
} else this.contexts.delete(sessionId);
|
|
18
|
+
}
|
|
19
|
+
async retrieve(repoPath, query, scope, metadata = {}) {
|
|
20
|
+
if (!this.engineUrl || !query) return { status: 'disabled', references: [], prompt: '' };
|
|
21
|
+
try {
|
|
22
|
+
const target = new URL(this.engineUrl);
|
|
23
|
+
if (!['http:', 'https:'].includes(target.protocol) || !['localhost', '127.0.0.1', '::1', '[::1]'].includes(target.hostname) || target.username || target.password || target.search || target.hash) throw new Error('KNOWLEDGE_UNAVAILABLE');
|
|
24
|
+
const response = await this.fetch(new URL('/api/context', target), { method: 'POST', redirect: 'error', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ repoPath, query, ...(scope ? { scope } : {}), client: 'workbench', sessionId: metadata.sessionId }), signal: AbortSignal.timeout(10000) });
|
|
25
|
+
if (response.status === 404) return { status: 'unregistered', references: [], prompt: '' };
|
|
26
|
+
if (!response.ok) throw new Error('KNOWLEDGE_UNAVAILABLE');
|
|
27
|
+
const found = await response.json();
|
|
28
|
+
if (found.ok !== true || !Array.isArray(found.references) || !Array.isArray(found.memories) || typeof found.prompt !== 'string' || found.prompt.length > 8000 || !['ready', 'empty', 'file-fallback'].includes(found.status)) throw new Error('KNOWLEDGE_UNAVAILABLE');
|
|
29
|
+
return { status: found.status, projectId: found.projectId, scope: found.scope, references: found.references, memoryCount: found.memories.length, memoryStatus: found.memoryStatus, truncated: found.truncated, requestId: found.requestId, retrievedAt: new Date().toISOString(), prompt: found.prompt ? `\n\n${found.prompt}` : '' };
|
|
30
|
+
} catch { return { status: 'unavailable', references: [], prompt: '\n\n知识库读取未完成,可继续开发;不要将读取失败当作没有相关知识。' }; }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
module.exports = { KnowledgeContext };
|