@sanqianx/project-knowledge 5.0.18 → 5.0.19

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 (36) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +9 -0
  3. package/_modules/knowledge-engine/src/analysis-contract.js +4 -3
  4. package/_modules/knowledge-engine/src/coordinator.js +1 -0
  5. package/_modules/knowledge-engine/src/memories.js +10 -5
  6. package/_modules/knowledge-engine/src/memory-eligibility.js +74 -0
  7. package/_modules/knowledge-engine/src/retrieval-ranking.js +19 -1
  8. package/_modules/knowledge-engine/src/runtime/commit-conversation-binder.js +1 -0
  9. package/_modules/knowledge-engine/src/runtime/commit-prompt.js +12 -9
  10. package/_modules/knowledge-engine/src/runtime/conversation-store.js +2 -0
  11. package/_site/_test/candidate-bin-content-test.js +35 -0
  12. package/_site/_test/candidate-product-assets-test.js +13 -0
  13. package/_site/_test/conversation-origin-test.js +15 -0
  14. package/_site/_test/fixtures/retrieval-gold-queries.json +32 -0
  15. package/_site/_test/module-index-proxy-test.js +33 -0
  16. package/_site/_test/module-terminal-restart-test.js +63 -0
  17. package/_site/_test/registry-events-test.js +38 -0
  18. package/_site/_test/workbench-context-receipts-test.js +22 -0
  19. package/_site/lib/commit-conversation-binder.js +1 -0
  20. package/_site/lib/conversation-store.js +2 -0
  21. package/_site/lib/engine-connection.js +4 -1
  22. package/_site/lib/live-gateway.js +3 -1
  23. package/_site/lib/module-bridge.js +19 -10
  24. package/_site/lib/registry-events.js +16 -0
  25. package/_site/lib/server-app.js +10 -1
  26. package/_site/scripts/pack-module-candidates.js +21 -4
  27. package/_site/scripts/verify-retrieval-gold.js +83 -0
  28. package/docs/leader-glm-workbench-playbook.md +4 -1
  29. package/docs/release-5.0.19-acceptance.md +25 -0
  30. package/module-runtime-manifest.json +104 -102
  31. package/package.json +109 -108
  32. package/plugins/project-knowledge/.claude-plugin/plugin.json +1 -1
  33. package/plugins/project-knowledge/.codex-plugin/plugin.json +1 -1
  34. package/plugins/project-knowledge/.mcp.json +1 -1
  35. package/ui/product.js +29 -4
  36. package/vendor-manifest.json +9 -8
@@ -44,6 +44,8 @@ const AGENT_START_TIMEOUT_MS = 90000;
44
44
  // Registration drives a full embedding pass in vector-hub (remote API); a
45
45
  // fresh knowledge folder can easily exceed the interactive proxy budget.
46
46
  const REGISTER_TIMEOUT_MS = 60000;
47
+ // Match knowledge-engine's index request budget for synchronous embedding.
48
+ const INDEX_TIMEOUT_MS = 120000;
47
49
  // Native folder dialogs wait for the user without a bound.
48
50
  const PICKER_TIMEOUT_MS = 10 * 60 * 1000;
49
51
 
@@ -188,7 +190,8 @@ class ModuleBridge {
188
190
  const targetUrl = new URL(target);
189
191
  const pathname = targetUrl.pathname;
190
192
  const isAgentStart = req.method === 'POST' && /^\/api\/claude-workbench\/v1\/sessions(?:\/[^/]+\/input)?\/?$/.test(pathname);
191
- const timeoutMs = isPicker ? PICKER_TIMEOUT_MS : isAgentStart ? AGENT_START_TIMEOUT_MS : PROXY_TIMEOUT_MS;
193
+ const isIndex = req.method === 'POST' && pathname === '/api/sync' && targetUrl.origin === new URL(this.vectorHubUrl).origin;
194
+ const timeoutMs = isPicker ? PICKER_TIMEOUT_MS : isAgentStart ? AGENT_START_TIMEOUT_MS : isIndex ? INDEX_TIMEOUT_MS : PROXY_TIMEOUT_MS;
192
195
  const startedAt = Date.now();
193
196
  let upstream;
194
197
  const controller = new AbortController();
@@ -266,14 +269,15 @@ class ModuleBridge {
266
269
  return this.proxy(req, res, target.href);
267
270
  }
268
271
 
269
- async _listTerminalProjects() {
272
+ async _listTerminalProjects({ requireAvailable = false } = {}) {
270
273
  try {
271
274
  const response = await this._fetch(`${this.terminalUrl}/api/claude-workbench/v1/projects`, { timeoutMs: 2500 });
272
- if (!response.ok) return [];
275
+ if (!response.ok) throw new Error('TERMINAL_REGISTRY_UNAVAILABLE');
273
276
  const payload = await response.json();
274
277
  const list = Array.isArray(payload) ? payload : payload.projects;
275
- return Array.isArray(list) ? list : [];
276
- } catch { return []; }
278
+ if (!Array.isArray(list)) throw new Error('TERMINAL_REGISTRY_INVALID');
279
+ return list;
280
+ } catch { return requireAvailable ? null : []; }
277
281
  }
278
282
 
279
283
  async _listVectorHubProjects() {
@@ -323,8 +327,8 @@ class ModuleBridge {
323
327
  const knowledgePath = String(config.knowledgePath || '');
324
328
  const state = this.projectStore ? this.projectStore.readState(projectId) : {};
325
329
  const wiring = state.modules || {};
326
- const terminal = byWorkspace.get(workspacePath.toLowerCase())
327
- || (wiring.terminal && wiring.terminal.projectId ? terminalProjects.find(p => p.id === wiring.terminal.projectId) : null)
330
+ const terminal = (wiring.terminal && wiring.terminal.projectId ? terminalProjects.find(p => p.id === wiring.terminal.projectId) : null)
331
+ || byWorkspace.get(workspacePath.toLowerCase())
328
332
  || null;
329
333
  const vectorHubName = (wiring.vectorHub && wiring.vectorHub.projectName) || projectId;
330
334
  const vectorHub = byName.get(vectorHubName) || null;
@@ -520,9 +524,13 @@ class ModuleBridge {
520
524
  return result;
521
525
  }
522
526
  // 幂等登记:终端已有同 rootPath 的项目时复用,绝不重复创建
523
- const existingTerminal = (await this._listTerminalProjects())
524
- .find(p => String(p.rootPath || '').toLowerCase() === String(workspacePath || '').toLowerCase());
525
- if (existingTerminal) {
527
+ const terminalProjects = await this._listTerminalProjects({ requireAvailable: true });
528
+ const existingTerminal = terminalProjects?.find(p => String(p.rootPath || '').toLowerCase() === String(workspacePath || '').toLowerCase());
529
+ if (terminalProjects === null) {
530
+ // Startup/reconnect failures do not prove the workspace is absent. Keep
531
+ // its saved context so a retry cannot strand existing sessions/drafts.
532
+ result.terminal = { ok: false, status: 'pending' };
533
+ } else if (existingTerminal) {
526
534
  result.terminal = { ok: true, projectId: existingTerminal.id, status: 'registered', reused: true };
527
535
  } else {
528
536
  try {
@@ -821,6 +829,7 @@ class ModuleBridge {
821
829
  this.logger.warn('modules.supervisor', 'Module process could not start.', { context: { name: spec.name, code: error.code || 'SPAWN_FAILED' } });
822
830
  });
823
831
  child.on('exit', code => {
832
+ this.onStateChange?.(spec.name);
824
833
  this.supervised = this.supervised.filter(existing => existing !== child);
825
834
  attempts += 1;
826
835
  if (attempts > 5 || this.stopped) {
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+ const { randomUUID } = require('node:crypto');
3
+
4
+ class RegistryEvents {
5
+ constructor() { this.instanceId = randomUUID(); this.revision = 0; this.listeners = new Set(); }
6
+ publish(areas = ['projects', 'brain', 'health']) {
7
+ const event = { type: 'registry-changed', instanceId: this.instanceId, revision: ++this.revision, areas };
8
+ for (const listener of this.listeners) { try { listener(event); } catch { /* disconnected client */ } }
9
+ }
10
+ subscribe(listener) {
11
+ this.listeners.add(listener);
12
+ listener({ type: 'registry-snapshot', instanceId: this.instanceId, revision: this.revision });
13
+ return () => this.listeners.delete(listener);
14
+ }
15
+ }
16
+ module.exports = { RegistryEvents };
@@ -512,6 +512,7 @@ function createRuntime(options = {}) {
512
512
  analysisOwner: options.analysisOwner || 'legacy', ownership: { owner: options.analysisOwner || 'legacy', ready: false },
513
513
  rootDir, dataPath, layout, settingsStore, registryStore, projectStore, logger, logRepository,
514
514
  activeTasks, bridgeAdapter, bridgeConsumerService, conversationStore, conversationQuery, indexAdapter, indexService, promotionService, reconciler, lifecycleService, requirementRecorder, knowledgeRuntime, moduleBridge,
515
+ registryEvents: new (require('./registry-events').RegistryEvents)(),
515
516
  };
516
517
  }
517
518
 
@@ -867,6 +868,9 @@ function createRequestHandler(runtime, options = {}) {
867
868
  res.setHeader('X-Operation-Id', requestOperationId);
868
869
  res.once('finish', () => {
869
870
  if (requestFailed || res.statusCode >= 400) return;
871
+ if (['POST', 'PATCH', 'PUT', 'DELETE'].includes(req.method)
872
+ && /^\/api\/(?:projects(?:\/|$)|domains(?:\/|$)|brain$|settings$|modules\/configure$)/.test(requestPathname)
873
+ && requestPathname !== '/api/projects/preflight-import') runtime.registryEvents?.publish();
870
874
  Promise.resolve(runtime.logger.info('http.request_completed', 'HTTP request completed.', {
871
875
  operationId: requestOperationId,
872
876
  phase: 'completed',
@@ -890,6 +894,9 @@ function createRequestHandler(runtime, options = {}) {
890
894
  const url = new URL(req.url, `http://${req.headers.host || `${host}:${port}`}`);
891
895
  const method = req.method || 'GET';
892
896
  const pathname = url.pathname;
897
+ if (method === 'GET' && pathname === '/api/registry/events') {
898
+ return streamSse(res, write => runtime.registryEvents.subscribe(write));
899
+ }
893
900
 
894
901
  const moduleUi = pathname.match(/^\/modules\/(terminal|vectorhub|eventbridge|engine)\/(.*)$/);
895
902
  if (moduleUi && method === 'GET') return runtime.moduleBridge.proxyModuleUi(req, res, moduleUi[1], moduleUi[2], url.search);
@@ -1542,7 +1549,8 @@ async function startServer(options = {}) {
1542
1549
  const configurationTimer = setInterval(() => { connectEngine(runtime).catch(() => {}); }, 30000);
1543
1550
  configurationTimer.unref?.();
1544
1551
  let readyTimer;
1545
- runtime.moduleBridge.onReady = () => { clearTimeout(readyTimer); readyTimer = setTimeout(() => { runtime.projectConnections?.clear(); connectEngine(runtime).catch(() => {}); }, 100); };
1552
+ runtime.moduleBridge.onReady = () => { runtime.registryEvents?.publish(['health', 'projects']); clearTimeout(readyTimer); readyTimer = setTimeout(() => { runtime.projectConnections?.clear(); connectEngine(runtime).catch(() => {}); }, 100); };
1553
+ runtime.moduleBridge.onStateChange = () => runtime.registryEvents?.publish(['health']);
1546
1554
  connectEngine(runtime).catch(() => {});
1547
1555
 
1548
1556
  // T3.5 进程编排:拉起包内自带的模块服务并守护(默认开启,KB_MODULES_AUTOSTART=0 关闭)
@@ -1582,6 +1590,7 @@ async function startServer(options = {}) {
1582
1590
  clearInterval(maintenanceTimer);
1583
1591
  clearInterval(configurationTimer);
1584
1592
  clearTimeout(readyTimer); runtime.moduleBridge.onReady = null;
1593
+ runtime.moduleBridge.onStateChange = null;
1585
1594
  runtime.engineConnectionClosed = true;
1586
1595
  runtime.liveGateway?.close();
1587
1596
  await runtime.logger.info('server.shutdown_started', 'Server shutdown started.', { phase: 'shutdown', context: { reason } });
@@ -19,6 +19,24 @@ function run(command, args, cwd) {
19
19
  return result.stdout;
20
20
  }
21
21
  function safeRelative(file) { return typeof file === 'string' && !path.isAbsolute(file) && !/[\\\x00-\x1f]/.test(file) && !file.split('/').some(p => p === '..' || p === '.'); }
22
+ function installedFileBytes(pkg, relative, bytes) {
23
+ const bins = typeof pkg.bin === 'string' ? [pkg.bin] : Object.values(pkg.bin || {});
24
+ const isBin = bins.some(file => String(file).replace(/\\/g, '/').replace(/^\.\//, '') === relative);
25
+ // npm bin-links removes CRLF from the shebang only, on every platform.
26
+ // Hash the installed bytes; keep body line endings and ordinary files exact.
27
+ if (isBin && /^#![^\n]+\r\n/.test(bytes.subarray(0, 2048).toString('utf8'))) return Buffer.from(bytes.toString('utf8').replace(/^(#![^\n]+)\r\n/, '$1\n'));
28
+ return bytes;
29
+ }
30
+ function productFiles(directory) {
31
+ const previous = JSON.parse(fs.readFileSync(path.join(directory, 'module-runtime-manifest.json'), 'utf8'));
32
+ const files = new Set(['ui/index.html', 'ui/product.js', 'ui/live-client.js', 'ui/product.css', 'ui/favicon.svg', ...Object.keys(previous.productFiles || {})]);
33
+ return Object.fromEntries([...files].map(file => {
34
+ if (!safeRelative(file)) throw new Error('Unsafe product asset path');
35
+ const target = path.join(directory, file);
36
+ if (fs.lstatSync(target).isSymbolicLink()) throw new Error('Symlink in product assets');
37
+ return [file, hash(fs.readFileSync(target))];
38
+ }));
39
+ }
22
40
  function verifyInstalled(manifest, installedRoot) {
23
41
  for (const [key, module] of Object.entries(manifest.modules)) {
24
42
  const directory = path.join(installedRoot, 'node_modules', module.installName);
@@ -46,15 +64,14 @@ function pack(sources) {
46
64
  if (!safeRelative(entry.path)) throw new Error('Unsafe npm package path');
47
65
  const file = path.join(source, entry.path);
48
66
  if (fs.lstatSync(file).isSymbolicLink()) throw new Error(`Symlink in module package: ${key}/${entry.path}`);
49
- files[entry.path] = hash(fs.readFileSync(file));
67
+ files[entry.path] = hash(installedFileBytes(pkg, entry.path, fs.readFileSync(file)));
50
68
  }
51
69
  if (definition.required.some(file => !files[file])) throw new Error(`Incomplete module runtime: ${key}`);
52
70
  manifest.modules[key] = { name: pkg.name, installName: definition.installName, version: pkg.version, tarball: result.filename, sha256: hash(fs.readFileSync(path.join(output, result.filename))), files };
53
71
  process.stdout.write(`Packed ${key} ${pkg.version}: ${result.files.length} files\n`);
54
72
  }
55
73
  const manifestPath = path.join(output, 'module-candidates.json'); AtomicFile.writeJsonAtomic(manifestPath, manifest);
56
- const productFiles = Object.fromEntries(['ui/index.html', 'ui/product.js', 'ui/live-client.js', 'ui/product.css', 'ui/favicon.svg'].map(file => [file, hash(fs.readFileSync(path.join(root, file)))]));
57
- AtomicFile.writeJsonAtomic(path.join(root, 'module-runtime-manifest.json'), { schema: 'project-knowledge/module-content/v1', productFiles, modules: Object.fromEntries(Object.entries(manifest.modules).map(([key, module]) => [key, { name: module.name, installName: module.installName, version: module.version, files: module.files }])) });
74
+ AtomicFile.writeJsonAtomic(path.join(root, 'module-runtime-manifest.json'), { schema: 'project-knowledge/module-content/v1', productFiles: productFiles(root), modules: Object.fromEntries(Object.entries(manifest.modules).map(([key, module]) => [key, { name: module.name, installName: module.installName, version: module.version, files: module.files }])) });
58
75
  process.stdout.write(`MODULE_CANDIDATES ${manifestPath}\n`);
59
76
  return manifestPath;
60
77
  }
@@ -69,4 +86,4 @@ if (require.main === module) {
69
86
  }
70
87
  } catch (error) { process.stderr.write(`${error.message}\n`); process.exitCode = 1; }
71
88
  }
72
- module.exports = { verifyInstalled, safeRelative };
89
+ module.exports = { verifyInstalled, safeRelative, productFiles, installedFileBytes };
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+ const fs = require('node:fs');
3
+ const path = require('node:path');
4
+ const crypto = require('node:crypto');
5
+
6
+ async function verify({ url, projects, fixtureRoot, queries, reportPath }) {
7
+ const root = path.resolve(fixtureRoot);
8
+ const inside = file => { const relative = path.relative(root, path.resolve(file)); return relative && !relative.startsWith('..') && !path.isAbsolute(relative); };
9
+ const report = { passed: false, source: 'real engine and configured remote embeddings', startedAt: new Date().toISOString(), cases: [], metrics: {} };
10
+ const save = () => fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));
11
+ let semanticHits = 0, vectorCases = 0, checkedCitations = 0, badCitations = 0, scopeLeaks = 0, deepReads = 0, snippetFactHits = 0;
12
+ for (const q of queries) {
13
+ const project = projects[q.project];
14
+ if (!project || !inside(project.knowledgePath)) throw new Error('gold corpus must be bound to an explicit isolated fixture root');
15
+ const item = { id: q.id, kind: q.kind, query: q.query, passed: false };
16
+ let hidden, target;
17
+ try {
18
+ if (q.kind === 'stale') {
19
+ target = path.resolve(project.knowledgePath, q.entry);
20
+ if (!inside(target) || fs.lstatSync(target).isSymbolicLink()) throw new Error('unsafe stale-test path');
21
+ hidden = path.join(root, `gold-hidden-${q.id}.md`);
22
+ if (fs.existsSync(hidden)) throw new Error('prior interrupted stale test needs recovery');
23
+ fs.renameSync(target, hidden);
24
+ }
25
+ const response = await fetch(new URL('/api/engine/search', url), { method: 'POST', headers: { 'Content-Type': 'application/json' },
26
+ body: JSON.stringify({ projectId: project.projectId, scope: 'project', query: q.query, limit: 5 }), signal: AbortSignal.timeout(20000) });
27
+ const result = await response.json();
28
+ if (!response.ok) throw new Error(`search failed with HTTP ${response.status}`);
29
+ const rows = result.results || [];
30
+ item.health = result.health;
31
+ item.matchStatus = result.matchStatus;
32
+ item.results = rows;
33
+ let citationErrors = 0, leaks = 0;
34
+ for (const row of rows) {
35
+ checkedCitations++;
36
+ if (row.scope_project_id !== project.projectId) { leaks++; continue; }
37
+ const file = path.resolve(project.knowledgePath, row.entry_id);
38
+ if (!inside(file) || !fs.existsSync(file)) { citationErrors++; continue; }
39
+ const body = fs.readFileSync(file, 'utf8').replace(/\r\n/g, '\n');
40
+ const snippet = String(row.chunk_text || '').replace(/\r\n/g, '\n');
41
+ const hash = crypto.createHash('sha256').update(snippet).digest('hex');
42
+ if (!snippet.trim() || !body.includes(snippet) || hash !== row.content_hash) citationErrors++;
43
+ }
44
+ badCitations += citationErrors; scopeLeaks += leaks;
45
+ const documentHit = rows.some(row => row.entry_id === q.entry);
46
+ const snippetFactHit = rows.some(row => row.entry_id === q.entry && (!q.fact || String(row.chunk_text).toLowerCase().includes(q.fact.toLowerCase())));
47
+ let factRetrieved = snippetFactHit;
48
+ if (q.fact && documentHit && !snippetFactHit) {
49
+ // Search locates documents; an agent may then get the selected entry.
50
+ // Record this separately rather than claiming a snippet contained it.
51
+ const detail = await fetch(new URL('/api/engine/get', url), { method: 'POST', headers: { 'Content-Type': 'application/json' },
52
+ body: JSON.stringify({ projectId: project.projectId, entryId: q.entry, scope: 'project' }), signal: AbortSignal.timeout(10000) });
53
+ const full = await detail.json();
54
+ const text = full.chunks?.map(chunk => chunk.chunk_text).join('\n') || '';
55
+ const source = fs.readFileSync(path.resolve(project.knowledgePath, q.entry), 'utf8');
56
+ factRetrieved = detail.ok && text === source && text.toLowerCase().includes(q.fact.toLowerCase());
57
+ item.followupRead = { entry: q.entry, passed: factRetrieved, sha256: crypto.createHash('sha256').update(text).digest('hex') };
58
+ deepReads++;
59
+ }
60
+ item.documentHit = documentHit; item.snippetFactHit = snippetFactHit;
61
+ const vector = rows.some(row => row.match_channels?.includes('index:vector-hub')) && result.health?.vectorMode === 'verified-chunks';
62
+ if (q.kind === 'semantic') { if (documentHit) semanticHits++; if (vector) vectorCases++; if (snippetFactHit) snippetFactHits++; }
63
+ item.passed = !citationErrors && !leaks && (q.empty ? rows.length === 0
64
+ : q.kind === 'stale' ? rows.every(row => row.entry_id !== q.entry)
65
+ : q.kind === 'isolation' ? true : documentHit && factRetrieved && (q.kind !== 'semantic' || vector));
66
+ item.citationErrors = citationErrors; item.scopeLeaks = leaks;
67
+ } catch (error) { item.error = error.message; }
68
+ finally { if (hidden && fs.existsSync(hidden)) { if (fs.existsSync(target)) throw new Error('stale-test source changed concurrently; backup retained'); fs.renameSync(hidden, target); } }
69
+ report.cases.push(item); save();
70
+ console.log(`${item.passed ? 'PASS' : 'FAIL'} ${q.id} ${q.kind}`);
71
+ }
72
+ report.metrics = { semanticRecallAt5: semanticHits / queries.filter(q => q.kind === 'semantic').length, semanticSnippetFactCoverage: snippetFactHits / 10, followupEntryReads: deepReads, semanticVectorCases: vectorCases, checkedCitations, badCitations, scopeLeaks };
73
+ report.passed = report.cases.every(c => c.passed) && report.metrics.semanticRecallAt5 >= 0.9 && vectorCases === 10 && !badCitations && !scopeLeaks;
74
+ report.finishedAt = new Date().toISOString(); save();
75
+ return report;
76
+ }
77
+
78
+ if (require.main === module) {
79
+ const env = JSON.parse(fs.readFileSync(path.resolve(process.argv[2]), 'utf8'));
80
+ const queries = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../_test/fixtures/retrieval-gold-queries.json'), 'utf8'));
81
+ verify({ ...env, queries, reportPath: path.resolve(process.argv[3]) }).then(report => { console.log(JSON.stringify(report.metrics)); process.exitCode = report.passed ? 0 : 1; }).catch(error => { console.error(error.message); process.exitCode = 1; });
82
+ }
83
+ module.exports = { verify };
@@ -26,6 +26,7 @@ Leader 负责知识检索、关键开发、接口决策、打包升级和最终
26
26
  "aiProfileId": "glm",
27
27
  "model": "glm-5.3",
28
28
  "agentId": "claude-code",
29
+ "inputOrigin": "agent-delegation",
29
30
  "permissionMode": "bypassPermissions"
30
31
  }
31
32
  ```
@@ -56,12 +57,14 @@ Leader 负责知识检索、关键开发、接口决策、打包升级和最终
56
57
 
57
58
  补丁方式约束包括报告和原生 Agent 的记忆文件,不只是仓库源码。任务经验写入指定验收目录;不得自行编辑用户 memory。若发现越界,先核对会话是否已经结束,再按实际编辑记录恢复自己造成的差异,不能删除或覆盖原有用户内容。任务合同同时给出已验证的 Node 二进制、npm-cli 与仓库外临时目录,避免重复下载运行时或让测试继承 Workbench 的服务配置。
58
59
 
59
- `POST /api/terminal/sessions/<id>/input` 的正文为 `{"text":"<任务合同>"}`。保存 accepted 回执及 sessionId。返回忙碌或网络异常时,先读快照确认是否已接受,不盲目重发。相同批次只有一次有效派发。
60
+ `POST /api/terminal/sessions/<id>/input` 的正文为 `{"text":"<任务合同>","options":{"inputOrigin":"agent-delegation","effort":"low"}}`。Leader 派单必须标明来源,不能因为接口消息角色为 user 就当作真人长期偏好。旧来源不明的记录不自动推荐为长期记忆。保存 accepted 回执及 sessionId。返回忙碌或网络异常时,先读快照确认是否已接受,不盲目重发。相同批次只有一次有效派发。
60
61
 
61
62
  ## 跟踪、断线与长任务
62
63
 
63
64
  - 执行中优先 `GET /api/terminal/sessions?contextId=<项目 ID>` 读取轻量状态,不反复加载数千条事件;终态或诊断时再用 `GET /api/terminal/sessions/<id>` 读取快照、权限与相关事件。
64
65
  - `GET /api/terminal/sessions/<id>/events?after=<sequence>` 续接 SSE;保存已处理序号,重连不得重复消费。
66
+ - 会话列表使用 `/api/terminal/sessions/changes?contextId=<项目 ID>` 订阅摘要变更;独立 Workbench 使用一个 `contextId=*` SSE 覆盖全部项目。静置时不轮询列表,游标失效只补读一次快照。
67
+ - 主回复的 `claude/turn-end` 与后台任务状态分开判断。真实 GLM 的 SDK 总 result 可能等待后台任务结束,不能据此锁住已经结束主回复的输入框。任务卡片只使用实际任务事件和快照,不能从代理的文字声明推断任务已经启动。
65
68
  - `GET /api/terminal/sessions/<id>/knowledge` 查看本次知识上下文。准备/输出日志不等于模型实际收到,原生送达仍需独立证据。
66
69
  - 事件类型带驱动前缀,例如 `claude/tool-use`、`claude/result`、`claude/error`;不能只匹配无前缀的 `result`。
67
70
  - 断线后先恢复快照,再续接事件;事件缺口不以空数组冒充完成。不得重复创建会话或发送已接受的任务。
@@ -0,0 +1,25 @@
1
+ # 5.0.19 工作台会话、后台任务与共享记忆验收
2
+
3
+ 本版本包含 Workbench 0.13.2-rc.21,vendored engine 源码提交 `1bfa9a5a7be2719935295bd243d994ebf6c51226`,vector-hub 1.0.8-rc.8 与 event-bridge 0.7.2。引擎以包内文件哈希和源码提交标识本轮修复,不依赖兄弟源码目录。此次为网页/CLI npm 发布,桌面安装包未升级。
4
+
5
+ 发布时额外复现了 Windows CRLF shebang 被 npm 安装规范化后与源码哈希不一致的问题。新增实际 npm pack/install 回归,内容清单只对声明的 bin 首行使用 npm 相同行为,保留脚本正文和普通文件的原字节;外壳测试因此增加到 152 个文件,最终发布门禁结果在 registry 验收完成后追加。
6
+
7
+ 保留首次发布回归的 150 通过/2 失败记录:打包安装用例从本机 npmmirror 获取尚未同步的 Workbench rc.21 返回 ETARGET;路径一致性用例与 Leader 切换依赖的操作重叠,临时无法加载 zod/v4,冻结依赖后单独复测通过。发布复测显式使用官方 registry,测试期间不再变更 node_modules;未删除断言或把第一次失败计为通过。
8
+
9
+ 发布前已完成的验收:
10
+
11
+ | 范围 | 结果 |
12
+ |---|---|
13
+ | 双 Node 22/24 | Workbench 426/426,外壳完整测试文件 151/151;引擎 199 通过、2 既有环境跳过、0 失败 |
14
+ | 真实 GLM-5.3 | 两个后台代理实际开始、工具活动和完成;主回复结束、两个后台任务仍在运行时追加输入 202;同项目 A/B 执行重叠,停止 B 不影响 A |
15
+ | 浏览器 | A 草稿 1111、B 草稿 2222;切换、刷新和服务重启后恢复;附件只在所属会话的当前页面内存保留 |
16
+ | 按需更新 | 独立本地候选静置 92.128 秒,浏览器数据请求 0,侧栏节点增删 0;断网重连恢复原会话与任务卡 |
17
+ | 向量检索 | 固定查询 30/30,10 个语义案例均有真实向量通道证据,Recall@5=100%,109 处正文/哈希引用一致、0 越界;片段事实覆盖率 80%,3 次读取已召回正文补齐 |
18
+ | 真提交知识闭环 | 修复提交 2ee54555ccce74f6574e9e6dcdb19eb7cf869b02 通过实际 Hook 入口重放到隔离 journal,真实分析、晋升、索引成功;下一轮 GLM 会话 sess-f94f11402342 无源码读取而实际引用并采用对应知识 |
19
+ | 旧候选保护 | 49 条逐条只读审计:0 直接保留、9 改写后待用户确认、40 忽略长期记忆推荐;原候选和已确认记忆未改动 |
20
+
21
+ 后台任务验收会话 `sess-40aa210031f2`,并行停止验收 A=`sess-8a635ad8d49f`、B=`sess-98a2df6fbd99`;独立安装本地候选后台会话 `sess-d233c508997b`。真实驱动覆盖 Claude SDK 的 GLM-5.3;其他 CLI、乱序/重复事件、游标失效、进程截断和权限路由用自动化注入验证,未冒称完成所有供应商及真实强杀/权限弹窗的人工矩阵。
22
+
23
+ 原始证据保存在本工作站 `D:/SanQian.Xu/.glm-plan-evidence/workbench-2026-10-16/`。该目录包含隔离运行配置,不作为 npm 内容;交付 ZIP 仅选择制品与证据,不含凭据。原 Workbench 6 个未提交文件完整保留,新版发布在独立工作树同步版本。
24
+
25
+ npm 发布流程为先上传 next,再从官方 registry 使用独立安装与缓存复验依赖版本、制品 integrity、模块和产品文件哈希、CLI 及真实页面,成功后将主包 latest 指向 5.0.19。此文档在 npm 包中是打包时快照,正式 registry 安装收据在完成后追加到仓库当前文档,不修改已发布版本制品。
@@ -2,123 +2,125 @@
2
2
  "schema": "project-knowledge/module-content/v1",
3
3
  "productFiles": {
4
4
  "ui/index.html": "737b8f5c745270797950c5975f458a13ffe1ea738f921e814bfbbe5e56813fed",
5
- "ui/product.js": "da7ea12a394212766cb0994fe0026ab2cccbba866063cdcc4c1662573e3c6dfa",
5
+ "ui/product.js": "855f13e63664156e55b794b0c254f7aaa45681c0a031495da2aae820db635249",
6
+ "ui/live-client.js": "0d81fa894c629bb839e1931fc3c5ebad4d831aae8232d6ce8c0f542e9e3559e8",
6
7
  "ui/product.css": "4f300b08c086a939831d7ee69df01f23641457c0d606af29e9d4ce8a6d28bc9d",
7
8
  "ui/favicon.svg": "c48be946b224112ebb0238b44263f7a61bda31e531afa895c2e9801c0ff24f32",
8
9
  "plugins/project-knowledge/hooks/claude.json": "d61510327e3e1facbb4c645228e9f50cad05a88b33d80c4c22e5ba9f8b9f5359",
9
10
  "plugins/project-knowledge/hooks/codex.json": "216e03c07295606ef6ebb2c4f669ad0d790b5e7c4f3f34600488033db75e4239",
10
11
  "plugins/project-knowledge/scripts/context-hook.cjs": "da666153ad5723592cce42d25337ae649f7d93e43fab76b3c6d1263933de063f",
11
12
  "plugins/project-knowledge/scripts/mcp-launcher.cjs": "7c68830b5c73eb53ef030756a4de33987f7eab6b1a6cc15602835aac3f954893",
12
- "plugins/project-knowledge/.claude-plugin/plugin.json": "40a10c34cbc5adb4a6a8a2d5f2d9ecad81705a23b884ae5fb0c3d86e75d7b1c8",
13
- "plugins/project-knowledge/.codex-plugin/plugin.json": "6be99f95fb81d225d07ba76c08af8f0dcc12d0eb705b105e38178e530fca076e",
14
- "plugins/project-knowledge/.mcp.json": "c6077d29401f0f85b19830358e5be2f4667b100834ec265b0f39b96049b87e1e",
15
- "ui/live-client.js": "0d81fa894c629bb839e1931fc3c5ebad4d831aae8232d6ce8c0f542e9e3559e8"
13
+ "plugins/project-knowledge/.claude-plugin/plugin.json": "71a2693a98a05bef7290c4dcc8020745057b36045cfd93540dae70e4bde0a018",
14
+ "plugins/project-knowledge/.codex-plugin/plugin.json": "b87bdcd44f5e3a5c7a5f44e4f4bc9c77dd28ee9080a0e54a7445316b1f0d534f",
15
+ "plugins/project-knowledge/.mcp.json": "0714e6a89f92eaf93508e08ad1aa3917982bf3cfea3969aabef27cf518e0a795"
16
16
  },
17
17
  "modules": {
18
18
  "terminal": {
19
19
  "name": "@sanqianx/claude-ai-workbench",
20
20
  "installName": "claude-ai-workbench",
21
- "version": "0.13.2-rc.20",
21
+ "version": "0.13.2-rc.21",
22
22
  "files": {
23
- "LICENSE": "c1b9df1275e769f3dbab000d1e457a2d4b0f28eb5da6c77e48dc37eeba202ed7",
24
- "README.md": "43938c8a64397d340dcf633edc40a7cea7dd8a95b5f82cf612b2c15b66c380b6",
25
- "apps/agent-terminal/app.css": "b939cc7a287dcbb4f6810072a62528dda90106ffad52e20a59f708625e861cbd",
26
- "apps/agent-terminal/app.js": "f40bc7699d1bc0f9a192f1e4b8d89d07219de95cc6a935dc602211000b654b38",
27
- "apps/agent-terminal/index.html": "2d8fc4c9aebcc6b9ebb58afb7b4a88762873d2efc7bea902d201bce033c0ff6b",
28
- "apps/ai-profile-settings-host/index.html": "bc158f68954506d2b8e43c690f28dbe931eff9a02b1524855ac17e74ea4df736",
29
- "apps/ai-profile-settings-host/page.css": "8b75cbf7f1ea5aaa92f2889390720ece310a8fd4b9ca38c890fa447d4323a557",
30
- "apps/ai-profile-settings-host/page.js": "f42755a3ed17bd7e00919cee56875b04035aa3c5526fce889f8ba52f4278a8b8",
31
- "apps/minimal-test-host/host.css": "b870f0816a1fcd27b73ed20b4785b46f95729e55a6a5a56624234c74a012a915",
32
- "apps/minimal-test-host/host.js": "dd18df55686f9f1a0eb6ba0713cdc3ae5b3e304aec0a2504d62c962b775778e7",
33
- "apps/minimal-test-host/index.html": "a43ca39a89d9877bc658efc02f9de26ecd68356bd35078dfa440e11b7ba11394",
34
- "apps/minimal-test-host/optional-mock/fault-injection.js": "4749c8210e5a2b9eab5c8b8188b9c9b2ce9dfc9bcb5eeb0d2d745042453f87f5",
35
- "apps/minimal-test-host/README.md": "fa73136f4ee3865c2d91eb97b2e8c03679aa4688e44c1e1c8ec6e27d604b0de5",
36
- "docs/sdk/FILE_LAYOUT.md": "17882f96505c8161bfb66876684b9d2d3f50021a111b8b844502d3cb4e97870a",
37
- "docs/sdk/INTEGRATION.md": "d4c0c80d2d2fc610205102d703a429bfaa20f9f3a48f1718f5bab02ee90138df",
38
- "docs/sdk/openapi.yaml": "5b8927539fc508cdfa78f2e2dee425a38e184d96611eed12793aa46f5c1a380e",
39
- "docs/sdk/README.md": "7ab591d39c36a3b84cfdf487ff567040ec453975f3ef0fba86dc822094667b61",
40
- "package.json": "d1c85780360972401fe6f25d4827a4e1d38f44282a50f8db4f385ae13f4a41ae",
41
- "packages/client/index.d.ts": "587a66845052dc5cc03c4f41d678808140ea258fdf914be1c6dd2f6c07c1aff1",
42
- "packages/client/index.js": "6c7abce75086b68c18b9fdab372eff8b70d4bb81da6e7e0f46e4af57de0c523d",
43
- "packages/client/package.json": "dc9494cfa25fe3fc9f2b6afb461c5fb5219de6a7e3b8a679e8ce8e382e21035e",
44
- "packages/client/README.md": "342dff9b1dcbc85fccc9b980ed3e4e455aa71133af1d0805b8431ea2ac564ef8",
45
- "packages/contracts/index.d.ts": "109ed9559b23f92b3840c484b9dd7f293a46866a3937a52e631e52692bb41927",
46
- "packages/contracts/index.js": "5eeb195d9c4cc54dab064510684ae1350d325fbaf47ff824dad4a04a5bb67d11",
47
- "packages/contracts/package.json": "d84fa4155a4df36561357bda427613ac7aa70cf6d9fbf230ea1c58a2133dc4a7",
48
- "packages/contracts/README.md": "44d83a3cc508cec6c5c20dfa1f2c08d5ea03e3afb2853639fdc0a9cc8eb5b9c8",
49
- "packages/core/index.d.ts": "c95b24a13f8aeeb128497833cf298790563baca6036ea5d29a9d8daff53199d7",
50
- "packages/core/index.js": "825640d0edc7dd130f22da1f580d2cda355566a40b0b36e42e5f38909605bbfa",
51
- "packages/core/package.json": "63c76e10913540ce7fec9cdb76ddec67748df5ba8b21d5d8d3e5ed11a6b0876e",
52
- "packages/core/README.md": "e222c546104a168f1038d95c6c4efb8e5603edd6145ab2cab79cab977fb710e5",
53
- "packages/server/bin/agent-terminal-server.js": "043dff4d76e3fd213b666a55e581ed1e72f9e5b8de6cb798fbf42bd39ed26861",
54
- "packages/server/bin/claude-workbench-server.js": "b03c730b6d86faf6974afea26c74109d59b1bbc1ecc656c1d6270258708694ac",
55
- "packages/server/bin/claude-workbench.js": "98dbd550d4d657056a75a190e7ee0dffd9f760fba58783f3ffb8d389ad7a32de",
56
- "packages/server/index.d.ts": "5083eae083b4a0784299a7be5f409bf581a4dddf515db6c2099f293958985bfa",
57
- "packages/server/index.js": "8786d5f764990fadfd20b21d3c5dfecfa1bddd755a65018745460c3b51f54397",
58
- "packages/server/lib/agent-discovery.js": "c332e12b2b3736156b3e96a2683108944b5f7fd66abca1854bf75ff260729db8",
59
- "packages/server/lib/agent-registry.js": "ef14c8ab8f5af56499a0cf1f7167a9495fc1745ef190e5d7b0298659a04a15ff",
60
- "packages/server/lib/agent-spawn-env.js": "f34f672a6153c8454615c440f41b4c81582c4b7f74f6dace4e26c43df9dba6cf",
61
- "packages/server/lib/attachment-store.js": "5c92c45c7ec5a8b0ee9c14edb42eeda5fce93d8e654718dcd75c12e3f0bfa6e7",
62
- "packages/server/lib/bridges/app-server-bridge.js": "c860c6b9e0f63ead9f4f289dad1fe05fc93314e89b29cdf7722fba0472c9af11",
63
- "packages/server/lib/bridges/opencode-server-bridge.js": "23b6065599bece60cc8d3d4779be90d62a6936ec437424287cc87325d250e02b",
64
- "packages/server/lib/capture-settings-store.js": "eb18885d7bedd3e353287dd7d1cf81e815e5d65d5d82170aa8fe5506a03de8bd",
65
- "packages/server/lib/claude-history-recovery.js": "a1c15ef2c863d85ab6447d6b70bda0d69ed1a65dd14e375cb2cad1252068a17e",
66
- "packages/server/lib/cli-session-recovery.js": "e66dc0ad83af18841bf3a598bb27932af42a20cf9395c16dcbaf9b022a5201b5",
67
- "packages/server/lib/context-resolver.js": "d3060bfe35fb184e521847fc0900cf6114f8ebf3120ce13ed39dfc224af54660",
68
- "packages/server/lib/conversation-capture.js": "9f3ee29003eaea4778dc1e4b7e23e868f2ba0268bd43db07317acba62f48a094",
69
- "packages/server/lib/diagnostics.js": "b45687fcc07f8baeb33ffd08efdc875494d4e3205887514fdfd7e1ce6370753b",
23
+ "LICENSE": "de260a483f1c8a229d61d833aaabad9f9a7438f3384c59abefa50182cb798199",
24
+ "README.md": "aac0a5a6bc9b0ec860d5273530975c0f9e0993f05424517c8edb879d02aa0db7",
25
+ "apps/agent-terminal/app.css": "1989662d054b31f6e3fcd16bb8eb6f842405660151551026ce95daf8927b626b",
26
+ "apps/agent-terminal/app.js": "9808737ab42487da0a3c5cbdf305b3a1d76de28fc76c77d05fd962ae3d09d37a",
27
+ "apps/agent-terminal/index.html": "5ba290f2277cb947a4599c1fdd95ccb44e3da700f077c24a7de30ffb0555de48",
28
+ "apps/ai-profile-settings-host/index.html": "ab98983ac6038fe169efa7430668c3c82b454f23b9964a8adbd4d82cd05d69ef",
29
+ "apps/ai-profile-settings-host/page.css": "fae27a697afaee7046c0e45f5c98070fd047c7d226b63e16a6bf3f2b7bb524ce",
30
+ "apps/ai-profile-settings-host/page.js": "986c1f4c5ed9b93d8cbdd94e5b5a6af79203e1416ca7c16508630415a8bb682c",
31
+ "apps/minimal-test-host/host.css": "633de38f9d054792be6cdcbcacfdf383d2f8d9f6ffb7a53dbeb1f451878411de",
32
+ "apps/minimal-test-host/host.js": "b24822372079a4e1b443657b4cbfa5c5a6cea63a183d418e570d600242b49c13",
33
+ "apps/minimal-test-host/index.html": "e301b3fe8cf041addee094e7e65939467385921e6f0f842562a5a6825cc8eff4",
34
+ "apps/minimal-test-host/optional-mock/fault-injection.js": "49f0a5f629e8d6e2e87eb80cad9b5f516c5e6a7794c856a15126714df9961515",
35
+ "apps/minimal-test-host/README.md": "8f47acf0c32ce57ba511757b783e63638959a90d6d126fd6bf5204e9c7bebc69",
36
+ "docs/sdk/FILE_LAYOUT.md": "0b0c6bca066b09c605f84ac3f6c4fda0a409d0a9d65093f0760eae45a26ec30c",
37
+ "docs/sdk/INTEGRATION.md": "aa8e6ef40af78562ad3dd73cbba1a840a6041ac7eab86b70f48e13ff9cc52663",
38
+ "docs/sdk/openapi.yaml": "b10e656e7f412c17ef18e2281057a2ae94f328631e9a601bbf4b9d52f1692217",
39
+ "docs/sdk/README.md": "3d95a0d76cc48cff47779caef2ed0d1f5b76f3591216c6ebf7a06895b7c1a964",
40
+ "docs/sdk/SESSION_EVENTS.md": "5e36797fbef7656b289df9369f498388b79efde31fc8b584cce871795885165f",
41
+ "package.json": "046e2b34bddaebaaf4bcefaa1544724094dcc3112575d36d3c900075663fe37d",
42
+ "packages/client/index.d.ts": "c1fdfa7c9165940381af14549a1f7f347d6912daf349d1adb5f9283b3148c9ed",
43
+ "packages/client/index.js": "591dac2c6a8a31dd260f682313b31dc9ffa92eb27d67b058324f5c256c82e932",
44
+ "packages/client/package.json": "5307c474e787070ae39aa61fa50fda32e38a2b6a2a4c2c96eaea39aeff3a99d0",
45
+ "packages/client/README.md": "be2c174260104b850bd7b471fdec47038dbc7b883f7aae3f561cfdcd04e6fcc8",
46
+ "packages/contracts/index.d.ts": "3940b3f40829084b777a505be88aac5b3151ad3740c54b9c0b8e1b278553c22a",
47
+ "packages/contracts/index.js": "f671aee2b088999f5f1aa721b550bc64fb8ae86d765ef7730afada7a361a655b",
48
+ "packages/contracts/package.json": "e1b2a1c225d9bca584f1c054b2db5caa9a719ee98f26a87110541b221ed9a1cb",
49
+ "packages/contracts/README.md": "b1a0a90d07e7540503d4da45026f4135c83840a73005e4f07de8b13d5b077233",
50
+ "packages/core/index.d.ts": "1387be7298aa2e76fca729275445de4bc813d749781f4a6ad13e07ff5567873e",
51
+ "packages/core/index.js": "1e56043598cc26761569a8e3d1ae502447a512b59bbaaa26d30e0413e1523ae8",
52
+ "packages/core/package.json": "a22268d79eea648d8a8249ef70563022c7b6b9d4297dab06df4393bc1cbe9787",
53
+ "packages/core/README.md": "ba3d1bde0153afcd9bcb366803e4da3627815bd641eebf60c19a64ceda7d3005",
54
+ "packages/server/bin/agent-terminal-server.js": "ba76c9f9ceb8ddb3736905d20afbba556370918f684181ad90610f227fd1a1eb",
55
+ "packages/server/bin/claude-workbench-server.js": "aa0e3d0b58201b975afcc69e4bb5d04be5c9b3e08e7a6a2575cd95a70d476bc9",
56
+ "packages/server/bin/claude-workbench.js": "814623a85c0edb31ae1c39073fdfcda386d32460bedd2d3e2d26cb468a0f7b35",
57
+ "packages/server/index.d.ts": "9b43affec378dc89b515d71414bc9f6fc26980ca7bf9b684becb96d93c70d11d",
58
+ "packages/server/index.js": "f199573269eb3c56f5dbdd952fed265956ddbe3027399232829cc50099200ca0",
59
+ "packages/server/lib/agent-discovery.js": "d279ede551f307c7d92427d64062b502335af426a0ae7404fec555311a9b2b43",
60
+ "packages/server/lib/agent-registry.js": "0e4a7fa4adc4ee9a1bb391663136e7d64ca94d60337fba152cd7851de3cc3661",
61
+ "packages/server/lib/agent-spawn-env.js": "c6d372a533adb4dc4677b46b351ffdd9cc5229dddaaed092698d0926b8d35784",
62
+ "packages/server/lib/attachment-store.js": "60455754d2c421233708d09610c2d899820dd8953388904395cd7ea080ac5e19",
63
+ "packages/server/lib/bridges/app-server-bridge.js": "6a8a725ce9b8b1f6e75c126f068df1a05fe51b37e8543897380f12d60327e712",
64
+ "packages/server/lib/bridges/opencode-server-bridge.js": "514d432515a1eca8dce3ab2c87a569c4a4d8a16c733a693fbbeeb7ade9f3058b",
65
+ "packages/server/lib/capture-settings-store.js": "1a2c84c01c577d199f723c7be1409ca6d8e013e01c089a8ec260d70423608671",
66
+ "packages/server/lib/claude-history-recovery.js": "0b888e57846d40753e75deafb6894459fd7a52ee2cc1286fd1b76480058387d7",
67
+ "packages/server/lib/cli-session-recovery.js": "9bb267bd38783731f9af9730bc13ed5b24c0f8a796e44cdd730afb63408ed39e",
68
+ "packages/server/lib/context-resolver.js": "c3e3a25de2a38b7b4d09f5ae384663fb671ac364af1fc884877c17f66e7fb1c2",
69
+ "packages/server/lib/conversation-capture.js": "a86e6254d4799d151c5c19328c7247a111736f4a27250e2baa46369aa5fad0bc",
70
+ "packages/server/lib/diagnostics.js": "bc29ca5cb7759465e80256802fbf34cfd527bac95a57dd1e4384a7a7d239c36c",
70
71
  "packages/server/lib/drivers/cli-json-runner.js": "3802a9066bd78062c40441d43b23bf97333ec742f877c59f4426e4cb118e8e54",
71
- "packages/server/lib/drivers/codex-driver.js": "a9fb31e5a3a34d24f976e275546721f968e7a8af901019c6d5fab10ebfa5b9e4",
72
+ "packages/server/lib/drivers/codex-driver.js": "542be69cee306abbba72a9c3d02f98abaaafe0a74c616258ea2b84b2cf2e5935",
72
73
  "packages/server/lib/drivers/opencode-driver.js": "b7e0a338b32c2616fa3ce1fa438be5abc9794218eb1744b3a6eac877122a8c28",
73
- "packages/server/lib/drivers/zcode-driver.js": "cb25b9d84e1bb8fb2b12aa4add656af2448c090cd99210e9dca9f55657764504",
74
- "packages/server/lib/drivers/zcode-profile-runtime.js": "77c5ac83551cc424375918863d4a31039984492c3a1c987a615a072ac7cb1f14",
75
- "packages/server/lib/event-stream.js": "3e6cf39b4599a3b1c9897da31d73c28b288a3d57f7a177ed90618de91977d3c4",
74
+ "packages/server/lib/drivers/zcode-driver.js": "b09246d6640d3986fc629f0861e4fc25c0ec8114109360f3cb3a8df9127182f9",
75
+ "packages/server/lib/drivers/zcode-profile-runtime.js": "23881a8d447f0e4803ab0d8d8963dd665993243df0a30c405e2fbab53b647777",
76
+ "packages/server/lib/event-stream.js": "1db039b1779c85262e4883b80201753a854e424783b4c43edbd1e2c6df862182",
76
77
  "packages/server/lib/folder-picker.js": "70f55df999262b90433f2b4251aa69dd70a23b55a84756b5f1d24dbeacfbda31",
77
- "packages/server/lib/http-handler.js": "b1cecf569507e802512f870deae4f9f252aa8e7964ff4b80d13dbf41bfb51a08",
78
- "packages/server/lib/json-file.js": "4252b57abcd0aafa45c584bac98fcbaf09174774addbb5a4798b381a7aeb35cc",
79
- "packages/server/lib/knowledge-context.js": "c3d8a9545547c636e6cdf908be53bef4968e674d2aab235562e762e25c210c06",
80
- "packages/server/lib/model-detection.js": "fa52213200c1f1a1f00e463ada57c415bf1bd4e2aedfebd04de50750509d06cf",
81
- "packages/server/lib/profile-store.js": "70a9ff6aa31fe438ba8431f3e461f72e5d977f3510f2c42d39e9133e2f3491a8",
82
- "packages/server/lib/project-store.js": "5225c78f3216340f01b99356496c8e2c2d9cfc6247954a3f00b273dd2cc5b692",
83
- "packages/server/lib/session-archive-store.js": "d3335b832a6e9fb9792991056f6596a997a4959efa6e62b60fb60133fb724196",
84
- "packages/server/lib/session-history.js": "7836167666d8032b9894a241ca42befa33fd034d7c9bd894a6399f57f31a2906",
85
- "packages/server/lib/system-doctor.js": "d098a046f425e90ef25209be69d78beefdfd9c2af92f08068a9bfc52053a8f7d",
86
- "packages/server/lib/ui-preferences-store.js": "e108cb22e7cc1f3438704913d5401e01de2c0e717eb2abd3bdc4727209393819",
87
- "packages/server/lib/workbench-service.js": "12477e3556b4c3d49adc3b69c0783f79335d87fbfc727ba5a19c598e2a4118d4",
88
- "packages/server/package.json": "9db1e779858b4eecc6e0b20771dce2ed67fddb5ab8bb7bbabcd82967285a7718",
89
- "packages/server/README.md": "a34cfaa4f4e859008b44e2be8e1aafb56e97fe83e6129c968a8562945fa843f3",
90
- "packages/ui/ai-profile-settings.d.ts": "0551b6c6eda6d18ea89a976daddf01b2161195f4874fe2d67a57cd9ecc6ce643",
91
- "packages/ui/ai-profile-settings.js": "e92bbac67a1199d473e4e44b32d1cc76c5b6c79306d4fef9d9067a1bb6ec42ca",
92
- "packages/ui/claude-terminal.d.ts": "2e8b4ae14f69ec791e2aacbec48ea2bc6e0076e0445a38e99cc477cf2e0a3011",
93
- "packages/ui/claude-terminal.js": "96bd217a4a7e4792ae3fbaaf46249ecee13b0f4e01fc6d25a1b8b22d8f8fe00c",
94
- "packages/ui/index.d.ts": "e547ab39640fe7519fb367b78442dc8a2c51b2efd17b66f8b0a003b154b36ead",
95
- "packages/ui/index.js": "f4394aabd395938f5c3fe587e430471d4033e83945a9b9c7e0149ad4040982c9",
96
- "packages/ui/package.json": "7d789ede8445dc1a3d1a41f4b4e16b56998ed2f58d4706abe696b2f3af0d6441",
97
- "packages/ui/README.md": "793c4a9c286fee23f39062a1976ca3afe9d2816dcdb55e156ba940e1ef514f89",
98
- "packages/ui/theme.css": "8f03a081272a7db11b196f7a70d0fafb1f8d954778f329f1ba53d110d9d5fd98",
99
- "src/assets/claude-prompts.json": "cb111f2e0a45afe8a31c251a504d1ab5375966ed61291660e61fd2efd77f6d9f",
100
- "src/backend/http/ai-profile-routes.js": "4b13a8e9ccbb0317f2ae7b3d468c060c33a9e1ffa49b781a495193a8eebaca68",
101
- "src/backend/http/claude-routes.js": "63730f0a5b5798152017f9b8679828ec25984a0c88d4ca883012841c13989c82",
102
- "src/backend/http/node-helpers.js": "da365da8223ee999e6addb3c2607f286bbe1ebf8e88423c7fdaf130de88c5d78",
103
- "src/backend/index.js": "b94cfffde773555041d7c524eaf676f5010b1688929e327c5967bacbe5942bf6",
104
- "src/backend/lib/ai-adapter.js": "7e6c6645c6d7e3d9dece10be75a1f6e54e37c6aa4d24167faff83dd2cc2c98d0",
105
- "src/backend/lib/ai-profile-store.js": "373e82d24b3b94017aceffdd49a7ce983cc8044871e5dcc245a4834e646e33c5",
106
- "src/backend/lib/ai-vendor-presets.js": "02c6de9c2e89ad0286426e8eb4900c3c6a4960ef0e8f9d27ffb5836062abfbb2",
107
- "src/backend/lib/ai-workspace.js": "969917f26cd0b0a272932714819d838a2bab2a5aac5c4e946647dfa3afa479bf",
108
- "src/backend/lib/automation-config.js": "c23b868bbcfbcece4465c9c939faccaef582667e858f3f36fc7b6d19bcd545e6",
109
- "src/backend/lib/claude-cli-runner.js": "d9b76e0a9450b041dcfceb8ff442185dc805245714e7bb489d744b50513b66cd",
110
- "src/backend/lib/data-dir.js": "a62d96d1ab538e37690ad31fe4f51e84120b55b6bc767661ed98ad9242f879db",
111
- "src/backend/lib/llm-client.js": "76d1a73fbea445b5ac34c23d1a3b084e0884c5efed6f7d3b9ed76d406d2cd038",
112
- "src/backend/lib/model-context-windows.js": "f64f7c995143407b7390105087e3ebcd56a5a3ba2fd3019478a86f9e3c6b7896",
113
- "src/backend/lib/prompt-registry.js": "9af496af837c7ae98cea2c5f55e81485dcaedf6f27c94b1d6d0384de897f94b9",
114
- "src/backend/lib/runtime-config.js": "8335525d2aff757f8022ab037dd00eb7bef7ff87a75ac946d599c2666b092323",
115
- "src/backend/lib/sdk-turn-stream.js": "3177bbec81cc0d4b1b578305056e4547b26069dde4f0133766a8a16fa3d8f923",
116
- "src/index.js": "12e436e628ccdaaed1975602507427b8b3fe3493d70beb54023e02a5d19c4fc9",
117
- "src/sdk-wave-a.ts": "dc6c049b4e6f7a8c4a240b02498e6b247b679f34aefc7ff5b71322d96987de5f",
118
- "src/sdk-wave-b.ts": "63c7a01b7f003f46439b23d584a01f9c362cc86b368381b96c6b6a83db1ba97a",
119
- "src/sdk-wave-c.ts": "e69aa2cd61174baf790fe2f703e0e364d1228a55d9a7d0be9a2030d7500b9843",
120
- "src/sdk-wave-d.ts": "6b04f955b70ed3dbe9df02012e99f05d977530dbac038b8eae5039131c7a6093",
121
- "src/sdk-wave-e.ts": "31acfa15505c6b08f4da253bc21e94859d7972576dcd760effeba4656a36577f"
78
+ "packages/server/lib/http-handler.js": "4d8e0afbc53decc0b05578f380e8d7ca0f1bae6a83e00ada88a7827abe1e1f6e",
79
+ "packages/server/lib/json-file.js": "c1034f052e3882b62d501edcda18b76e7edd485a82f0dd009efd186d7a8d533a",
80
+ "packages/server/lib/knowledge-context.js": "f51441942897ef437e21ca344053a657f1047d224d01b4c95c4ba4afd65e2bf7",
81
+ "packages/server/lib/model-detection.js": "2091ad1c426a4a7b9c7bd803febb6b1c8a944afb357570c133c58a9436164663",
82
+ "packages/server/lib/profile-store.js": "1120791dd2517bd249caec4c43f19df6509b07d49bbc79a3edb1197d99cdfefa",
83
+ "packages/server/lib/project-store.js": "736a21596d695f32d60632686406ccd137388e479b7f02b2252d71a329b02083",
84
+ "packages/server/lib/session-archive-store.js": "1bf2756b2fb3920639b91c6e4c45836b917fe2999731b9d77ab67d9c502acc2d",
85
+ "packages/server/lib/session-history.js": "84ced98a0b7a041a4dcf5e86383f6f0e3bf57bf2fbc82f6b700f0d8caf3a24a9",
86
+ "packages/server/lib/system-doctor.js": "af55a726220892ccb2d3d645ef1b2c2976c7712acbc3f6a3a32087d3979b89ab",
87
+ "packages/server/lib/ui-preferences-store.js": "55b73c53c12d8f151468607f47c84facd5970604279effb7f0386f40e91dfbd7",
88
+ "packages/server/lib/workbench-service.js": "099350078d9c11f7f97db5af72514f7906a834ba2b472077f33005e8f0d86a79",
89
+ "packages/server/package.json": "3a3e9984e73e9e93515cd100a8cf3c7911c5dc8df5bc17283fb8742d4811a1b4",
90
+ "packages/server/README.md": "0d78908cd40a84cb96eca01a42ee1ad2d8abc9c05b1490f5ebe2cd30d7e84e1d",
91
+ "packages/ui/ai-profile-settings.d.ts": "460c5d1d5ddf328dcd60a5f51485c3c700a4892922b68da4dc89424116a85dbf",
92
+ "packages/ui/ai-profile-settings.js": "1d95d4e18f919149871a2c9a6746db9db0e1f3600bd18b4b6e8713220feb975c",
93
+ "packages/ui/claude-terminal.d.ts": "8e4bfc2819ab9fde8364d5b3dd1fccef870c71f279d2bae9a161d005f9a480f6",
94
+ "packages/ui/claude-terminal.js": "7a8e52a9296273c2aa30aac3cfbec2541bc5e0eb57fc44666e876f8253a481a3",
95
+ "packages/ui/index.d.ts": "8f6c415651370d7d796de289e789eea40817ce00e56d8f7f9ca816a25c52771b",
96
+ "packages/ui/index.js": "f981b039a935ab1e0af9dc876701b56d8eddb459c3b5178f384f6d7e47e249f0",
97
+ "packages/ui/package.json": "a87fd215f68f1ab789433b977923e8520dcbac4ca3dec6fc3e47399d5028e841",
98
+ "packages/ui/README.md": "f831eaa4d064931fd11466d7fcd91c5481e399d63b3f03583984c3ee8aecce83",
99
+ "packages/ui/theme.css": "e300d5bfda335466a6fb33e4927ee5ecc738b4d07837a149aff4c4a0f3072631",
100
+ "src/assets/claude-prompts.json": "78369214ea6f9725f36842ce299bcb61610870770df83f63cfa54f357c8964b9",
101
+ "src/backend/http/ai-profile-routes.js": "a874d9f638138baab144f739163f66e8c188e95c6f2278280538e169d6a84976",
102
+ "src/backend/http/claude-routes.js": "8766066653bc3e1012ae062858bafd87a82a3db124e21ef33482aaec1da60adb",
103
+ "src/backend/http/node-helpers.js": "6029f7a017be1f52d0a8b0aca29b127df9a396df052bbadc7277a7c947959691",
104
+ "src/backend/index.js": "9e0376316098bc622970ef6e35cc1f2a90ad4b9df83f37e179a43cc8a4a1822e",
105
+ "src/backend/lib/ai-adapter.js": "287f6f4c13594621480965ab256b0ff4992417871b34e453983c9706fd8aa042",
106
+ "src/backend/lib/ai-profile-store.js": "1e82523616d4b23702bb70f97b7b609afa8d1ea9e5ae7e101a18971607166cb2",
107
+ "src/backend/lib/ai-vendor-presets.js": "298ead7ba72b1ae70ffaf13fac3dae774a8bf87ebc880b6306e29e796717cef0",
108
+ "src/backend/lib/ai-workspace.js": "d0f5211df8c6f63e708ecd381f6e0702bede0307d8075fb8255cde8ebffb8eda",
109
+ "src/backend/lib/automation-config.js": "62611e062b2673b89a58ea35596d3aae537a9187e2ea3514d9262f99020351cf",
110
+ "src/backend/lib/claude-cli-runner.js": "da5c3a6dee9b9b46b80c2cc48521e577e934cb13e8f44d11cc1c6a473b14e5ab",
111
+ "src/backend/lib/data-dir.js": "4daa0b0a71c9f2a84f931330623c5f0adb7dbee2fdeb597a23b2edd213619cc5",
112
+ "src/backend/lib/llm-client.js": "8c71857d072f03b53feda87751185b8bd0649e57e653c976d0f80cc3bd6e22c1",
113
+ "src/backend/lib/model-context-windows.js": "4612975165ee3319aba51e46566c556e18a6cfd2e5e3efd1e64077905c363373",
114
+ "src/backend/lib/prompt-registry.js": "88ca170f4ac04e47e7cf85816511797634cc39b97ecf095548ee0772799de5e9",
115
+ "src/backend/lib/runtime-config.js": "050bbfadb7bfa0f47786beb6dfd80f240ed3e64f265d7457ba85f8c31f8e458f",
116
+ "src/backend/lib/sdk-session-stream.js": "f00d185a374f978f2eed63990158a711ebd13a7bbb153119a47f3e0e68ab1e00",
117
+ "src/backend/lib/sdk-turn-stream.js": "f18301b9a660aaac4b09613750bf5645d338aa83d2001cb113a281b7c68c3b8c",
118
+ "src/index.js": "40801aa5fc71a239e057a735264134df8cbcb29db200322700427be9718a6312",
119
+ "src/sdk-wave-a.ts": "5660f617af8d64696476315299332c0f45d88f47c83305e32c698092338d5b2b",
120
+ "src/sdk-wave-b.ts": "de927fe52372e8454f66b764cb268d0b372d227702a1dfba60270e1bba156124",
121
+ "src/sdk-wave-c.ts": "d169796348a85626650eba6d3577d7251c37164210f15f1168fceddcf56b5b72",
122
+ "src/sdk-wave-d.ts": "7c85bad58a79e18d277def040c50f30065c193e9440ae9fbcda259c653ff4c65",
123
+ "src/sdk-wave-e.ts": "87269a774575c0543f632b34a4a04cf67037e4b39be09aa778d997e4ac665564"
122
124
  }
123
125
  },
124
126
  "vectorHub": {