@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
package/package.json CHANGED
@@ -1,108 +1,109 @@
1
- {
2
- "name": "@sanqianx/project-knowledge",
3
- "version": "5.0.18",
4
- "description": "Knowledge base manager with Git integration, AI-driven analysis, and bilingual (zh-CN/en-US) knowledge output",
5
- "main": "_site/server.js",
6
- "scripts": {
7
- "start": "node _site/server.js",
8
- "test": "node _site/_test/run-all-tests.js",
9
- "release:sync": "node _site/scripts/sync-release-version.js --web-only",
10
- "vendor:modules": "node _site/scripts/vendor-modules.js",
11
- "runtime:verify": "node _site/scripts/verify-module-runtime.js --working-tree",
12
- "release:verify": "node _site/scripts/sync-release-version.js --check --web-only && node _site/scripts/verify-module-runtime.js && node _site/scripts/verify-product-runtime.js && node _site/_test/integration-adapters-test.js",
13
- "preversion": "npm run release:verify",
14
- "version": "node _site/scripts/sync-release-version.js --stage --web-only",
15
- "postversion": "npm run release:verify"
16
- },
17
- "bin": {
18
- "project-knowledge": "bin/project-knowledge.js",
19
- "project-knowledge-kb": "bin/project-knowledge-kb.js",
20
- "project-knowledge-mcp": "bin/project-knowledge-mcp.js",
21
- "project-knowledge-integrations": "bin/project-knowledge-integrations.js"
22
- },
23
- "engines": {
24
- "node": ">=22"
25
- },
26
- "files": [
27
- "_site/server.js",
28
- "ui/index.html",
29
- "ui/product.css",
30
- "ui/product.js",
31
- "ui/live-client.js",
32
- "ui/favicon.svg",
33
- "_site/lib/",
34
- "_modules/knowledge-engine/",
35
- "vendor-manifest.json",
36
- "module-runtime-manifest.json",
37
- "_site/scripts/",
38
- "_site/_test/*.js",
39
- "_site/_test/fixtures/",
40
- "_site/start.bat",
41
- "_site/stop.bat",
42
- "claude-prompts.json",
43
- "bin/",
44
- "plugins/",
45
- ".claude-plugin/",
46
- ".agents/plugins/",
47
- "templates/",
48
- "docs/assets/",
49
- "docs/README.zh-CN.md",
50
- "docs/project-registry-schema.md",
51
- "docs/team-knowledge-mode-a-plan.md",
52
- "docs/testing-strategy.md",
53
- "docs/leader-glm-workbench-playbook.md",
54
- "docs/release-5.0.16-acceptance.md",
55
- "docs/release-5.0.17-acceptance.md",
56
- "docs/fresh-v5-start.md",
57
- "README.md",
58
- "NOTICE",
59
- "CHANGELOG.md"
60
- ],
61
- "repository": {
62
- "type": "git",
63
- "url": "git+https://github.com/SanQianX/project-knowledge-base.git"
64
- },
65
- "keywords": [
66
- "knowledge-base",
67
- "git",
68
- "ai",
69
- "claude",
70
- "codex",
71
- "opencode",
72
- "mcp",
73
- "documentation",
74
- "scanner",
75
- "context-pack",
76
- "post-commit-hook"
77
- ],
78
- "author": "SanQianX",
79
- "license": "Apache-2.0",
80
- "dependencies": {
81
- "@anthropic-ai/claude-agent-sdk": "^0.2.141",
82
- "@grpc/grpc-js": "^1.14.5",
83
- "@grpc/proto-loader": "^0.8.1",
84
- "@huggingface/transformers": "3.8.1",
85
- "@lancedb/lancedb": "0.31.0",
86
- "@modelcontextprotocol/sdk": "1.29.0",
87
- "@sanqianx/ai-coding-event-bridge-console": "0.7.2",
88
- "@sanqianx/vector-hub": "1.0.8-rc.8",
89
- "buffer": "^6.0.3",
90
- "cheerio": "^1.2.0",
91
- "claude-ai-workbench": "npm:@sanqianx/claude-ai-workbench@0.13.2-rc.20",
92
- "cross-spawn": "7.0.6",
93
- "dotenv": "^17.4.2",
94
- "gpt-tokenizer": "^3.4.0",
95
- "http-proxy-agent": "7.0.2",
96
- "https-proxy-agent": "7.0.6",
97
- "json-colorizer": "^3.0.1",
98
- "jsonc-parser": "3.3.1",
99
- "openai": "^6.49.0",
100
- "socks-proxy-agent": "8.0.5",
101
- "turndown": "^7.2.4",
102
- "uuid": "^13.0.2",
103
- "wink-bm25-text-search": "^3.1.2",
104
- "wink-nlp": "^2.4.0",
105
- "ws": "^8.21.0",
106
- "yargs": "^18.1.0"
107
- }
108
- }
1
+ {
2
+ "name": "@sanqianx/project-knowledge",
3
+ "version": "5.0.19",
4
+ "description": "Knowledge base manager with Git integration, AI-driven analysis, and bilingual (zh-CN/en-US) knowledge output",
5
+ "main": "_site/server.js",
6
+ "scripts": {
7
+ "start": "node _site/server.js",
8
+ "test": "node _site/_test/run-all-tests.js",
9
+ "release:sync": "node _site/scripts/sync-release-version.js --web-only",
10
+ "vendor:modules": "node _site/scripts/vendor-modules.js",
11
+ "runtime:verify": "node _site/scripts/verify-module-runtime.js --working-tree",
12
+ "release:verify": "node _site/scripts/sync-release-version.js --check --web-only && node _site/scripts/verify-module-runtime.js && node _site/scripts/verify-product-runtime.js && node _site/_test/integration-adapters-test.js",
13
+ "preversion": "npm run release:verify",
14
+ "version": "node _site/scripts/sync-release-version.js --stage --web-only",
15
+ "postversion": "npm run release:verify"
16
+ },
17
+ "bin": {
18
+ "project-knowledge": "bin/project-knowledge.js",
19
+ "project-knowledge-kb": "bin/project-knowledge-kb.js",
20
+ "project-knowledge-mcp": "bin/project-knowledge-mcp.js",
21
+ "project-knowledge-integrations": "bin/project-knowledge-integrations.js"
22
+ },
23
+ "engines": {
24
+ "node": ">=22"
25
+ },
26
+ "files": [
27
+ "_site/server.js",
28
+ "ui/index.html",
29
+ "ui/product.css",
30
+ "ui/product.js",
31
+ "ui/live-client.js",
32
+ "ui/favicon.svg",
33
+ "_site/lib/",
34
+ "_modules/knowledge-engine/",
35
+ "vendor-manifest.json",
36
+ "module-runtime-manifest.json",
37
+ "_site/scripts/",
38
+ "_site/_test/*.js",
39
+ "_site/_test/fixtures/",
40
+ "_site/start.bat",
41
+ "_site/stop.bat",
42
+ "claude-prompts.json",
43
+ "bin/",
44
+ "plugins/",
45
+ ".claude-plugin/",
46
+ ".agents/plugins/",
47
+ "templates/",
48
+ "docs/assets/",
49
+ "docs/README.zh-CN.md",
50
+ "docs/project-registry-schema.md",
51
+ "docs/team-knowledge-mode-a-plan.md",
52
+ "docs/testing-strategy.md",
53
+ "docs/leader-glm-workbench-playbook.md",
54
+ "docs/release-5.0.16-acceptance.md",
55
+ "docs/release-5.0.17-acceptance.md",
56
+ "docs/release-5.0.19-acceptance.md",
57
+ "docs/fresh-v5-start.md",
58
+ "README.md",
59
+ "NOTICE",
60
+ "CHANGELOG.md"
61
+ ],
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "git+https://github.com/SanQianX/project-knowledge-base.git"
65
+ },
66
+ "keywords": [
67
+ "knowledge-base",
68
+ "git",
69
+ "ai",
70
+ "claude",
71
+ "codex",
72
+ "opencode",
73
+ "mcp",
74
+ "documentation",
75
+ "scanner",
76
+ "context-pack",
77
+ "post-commit-hook"
78
+ ],
79
+ "author": "SanQianX",
80
+ "license": "Apache-2.0",
81
+ "dependencies": {
82
+ "@anthropic-ai/claude-agent-sdk": "^0.2.141",
83
+ "@grpc/grpc-js": "^1.14.5",
84
+ "@grpc/proto-loader": "^0.8.1",
85
+ "@huggingface/transformers": "3.8.1",
86
+ "@lancedb/lancedb": "0.31.0",
87
+ "@modelcontextprotocol/sdk": "1.29.0",
88
+ "@sanqianx/ai-coding-event-bridge-console": "0.7.2",
89
+ "@sanqianx/vector-hub": "1.0.8-rc.8",
90
+ "buffer": "^6.0.3",
91
+ "cheerio": "^1.2.0",
92
+ "claude-ai-workbench": "npm:@sanqianx/claude-ai-workbench@0.13.2-rc.21",
93
+ "cross-spawn": "7.0.6",
94
+ "dotenv": "^17.4.2",
95
+ "gpt-tokenizer": "^3.4.0",
96
+ "http-proxy-agent": "7.0.2",
97
+ "https-proxy-agent": "7.0.6",
98
+ "json-colorizer": "^3.0.1",
99
+ "jsonc-parser": "3.3.1",
100
+ "openai": "^6.49.0",
101
+ "socks-proxy-agent": "8.0.5",
102
+ "turndown": "^7.2.4",
103
+ "uuid": "^13.0.2",
104
+ "wink-bm25-text-search": "^3.1.2",
105
+ "wink-nlp": "^2.4.0",
106
+ "ws": "^8.21.0",
107
+ "yargs": "^18.1.0"
108
+ }
109
+ }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "project-knowledge",
4
4
  "hooks": "./hooks/claude.json",
5
- "version": "5.0.18",
5
+ "version": "5.0.19",
6
6
  "description": "Read durable project decisions and implementation history from Project Knowledge.",
7
7
  "author": {
8
8
  "name": "SanQianX",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "project-knowledge",
3
- "version": "5.0.18",
3
+ "version": "5.0.19",
4
4
  "description": "Read durable project decisions and implementation history from Project Knowledge.",
5
5
  "author": {
6
6
  "name": "SanQianX",
@@ -8,7 +8,7 @@
8
8
  "const fs=require('fs'),path=require('path'),os=require('os');const PKG='@sanqianx/project-knowledge',SC='project-knowledge/integration-runtime/v1';let f='';const root=process.env.CLAUDE_PLUGIN_ROOT||process.env.PLUGIN_ROOT;if(root){f=path.join(root,'scripts','mcp-launcher.cjs');if(!fs.existsSync(f))f=''}if(!f){const dd=process.env.KB_DATA_DIR||path.join(os.homedir(),'.project-knowledge-v5');try{const bp=path.join(dd,'integration-runtime.json');const st=fs.statSync(bp);if(st.isFile()&&st.size<=32768){const b=JSON.parse(fs.readFileSync(bp,'utf8'));if(b&&b.schema===SC&&b.packageName===PKG&&typeof b.packageRoot==='string'&&path.isAbsolute(b.packageRoot)){const c=path.join(b.packageRoot,'plugins','project-knowledge','scripts','mcp-launcher.cjs');const rr=fs.realpathSync(b.packageRoot),cr=fs.realpathSync(c);const rel=path.relative(rr,cr);if(rel&&rel!=='..'&&!rel.startsWith('..'+path.sep)&&!path.isAbsolute(rel)&&fs.statSync(cr).isFile())f=cr}}}catch(e){}}if(!f){console.error('[project-knowledge-mcp] 未能通过受信任插件根或已验证的安装绑定定位启动器,已停止;不访问网络,也不加载工作目录源码。');process.exit(127)}require(f);"
9
9
  ],
10
10
  "env": {
11
- "KB_PLUGIN_VERSION": "5.0.18"
11
+ "KB_PLUGIN_VERSION": "5.0.19"
12
12
  }
13
13
  }
14
14
  }
package/ui/product.js CHANGED
@@ -21,6 +21,7 @@
21
21
  const badge = (text, status = '') => `<span class="status ${esc(status)}">${esc(text)}</span>`;
22
22
  let toastTimer, refreshTimer, preflightTimer, editingMemoryId, logStream, logEpoch = 0, referenceEpoch = 0, snapshotEpoch = 0, registryEpoch = 0, registryPromise = null, resumeImport = false, unbindProjectId = '', unbinding = false;
23
23
  let captureEpoch = 0, captureBusy = false;
24
+ let registryStream = null, registryReceipt = null, registryRefreshTimer;
24
25
  async function api(url, options = {}) {
25
26
  const { allowNotReady, timeoutMs = (options.method || 'GET') === 'GET' && !url.includes('pick-folder') ? 3000 : 0, ...init } = options;
26
27
  if (init.body && typeof init.body !== 'string') init.body = JSON.stringify(init.body);
@@ -43,8 +44,12 @@
43
44
  function frameContext(key) {
44
45
  const project = activeProject();
45
46
  const frame = frames[key];
47
+ if (!frame.ready) return;
46
48
  const ref = key === 'terminal' ? project?.modules.terminal.projectId || project?.workspacePath : key === 'eventBridge' ? project?.modules.eventBridge.projectId || project?.workspacePath : project?.projectId;
47
49
  frame.requestId = `${state.epoch}:${key}`;
50
+ const signature = JSON.stringify([state.epoch, ref || '', state.scope, document.documentElement.dataset.theme, frameVisible(key)]);
51
+ if (frame.contextSignature === signature) return;
52
+ frame.contextSignature = signature;
48
53
  post(key, { type: 'kb:theme', theme: document.documentElement.dataset.theme });
49
54
  post(key, { type: 'kb:scope', scope: state.scope });
50
55
  post(key, { type: 'kb:sidebar', visible: key === 'terminal' });
@@ -148,7 +153,10 @@
148
153
  $('memoryText').value = memory.text; $('memoryScope').value = memory.scopeType || 'global';
149
154
  updateMemoryTarget($('memoryScope').value, memory.scopeId || memory.brainId);
150
155
  $('memoryOriginal').textContent = `原始总结:${memory.originalText || memory.text}`;
151
- $('memoryEvidence').textContent = memory.evidence ? `${projectName(memory.evidence.projectId)} · ${memory.evidence.commitSha} / ${memory.evidence.entryId}` : '';
156
+ $('memoryEvidence').textContent = memory.evidence ? `${projectName(memory.evidence.projectId)} · ${memory.evidence.commitSha} / ${memory.evidence.entryId}${memory.sourceEventId || memory.evidence.sourceEventId ? ` · 用户事件 ${memory.sourceEventId || memory.evidence.sourceEventId}` : ''}` : '';
157
+ let eligibility = $('memoryEligibility');
158
+ if (!eligibility) { eligibility = document.createElement('p'); eligibility.id = 'memoryEligibility'; $('memoryEvidenceDetails').append(eligibility); }
159
+ eligibility.textContent = memory.eligibility ? `推荐理由:${memory.eligibility.reason || ''}\n范围依据:${memory.eligibility.scopeReason || ''}` : memory.status === 'candidate' ? '旧候选尚未按跨项目长期共识标准复核。' : '';
152
160
  $('memoryQuote').textContent = memory.evidence?.quote || '';
153
161
  $('memoryEvidenceDetails').hidden = memory.sourceType === 'manual'; $('manualMemoryHint').hidden = memory.sourceType !== 'manual';
154
162
  $('memoryFeedback').hidden = true; $('saveMemoryCandidate').hidden = memory.status !== 'candidate';
@@ -239,6 +247,21 @@
239
247
  stream.addEventListener('progress', () => { if (state.stream === stream) scheduleRefresh(); });
240
248
  stream.onerror = () => { if (state.stream === stream) $('activityConnection').textContent = '连接中断,正在恢复快照'; };
241
249
  }
250
+ function connectRegistryEvents() {
251
+ if (registryStream || !navigator.onLine) return;
252
+ const stream = registryStream = new ProgressSource('/api/registry/events');
253
+ const changed = event => {
254
+ if (registryStream !== stream) return;
255
+ let receipt; try { receipt = JSON.parse(event.data); } catch { return; }
256
+ const signature = `${receipt.instanceId}:${receipt.revision}`;
257
+ const previous = registryReceipt; registryReceipt = signature;
258
+ if (!previous || previous === signature) return;
259
+ clearTimeout(registryRefreshTimer);
260
+ registryRefreshTimer = setTimeout(() => { if (!document.hidden) void refreshRegistry(); }, 100);
261
+ };
262
+ stream.addEventListener('registry-snapshot', changed);
263
+ stream.addEventListener('registry-changed', changed);
264
+ }
242
265
  function refreshRegistry(force = false) {
243
266
  if (!navigator.onLine) return Promise.resolve();
244
267
  if (registryPromise && !force) return registryPromise;
@@ -612,19 +635,21 @@
612
635
  window.addEventListener('hashchange', () => setView(location.hash.slice(1)));
613
636
  window.addEventListener('offline', () => {
614
637
  snapshotEpoch++; clearTimeout(refreshTimer);
615
- state.stream?.close(); state.stream = null; logStream?.close(); logStream = null; logEpoch++;
638
+ state.stream?.close(); state.stream = null; registryStream?.close(); registryStream = null; logStream?.close(); logStream = null; logEpoch++;
616
639
  state.engineAvailable = false; $('activityConnection').textContent = '连接中断,恢复后自动读取快照';
617
640
  renderSystem(); render();
618
641
  });
619
642
  window.addEventListener('online', () => {
643
+ connectRegistryEvents();
620
644
  $('activityConnection').textContent = state.engineAvailable && state.stream?.readyState === EventSource.OPEN ? '已连接实时更新' : '正在恢复快照'; refreshRegistry();
621
645
  if ($('logsDialog').open) loadLogs().catch(error => toast(error.message));
622
646
  });
623
- window.addEventListener('beforeunload', () => { state.stream?.close(); logStream?.close(); });
647
+ window.addEventListener('beforeunload', () => { state.stream?.close(); registryStream?.close(); clearTimeout(registryRefreshTimer); logStream?.close(); });
648
+ document.addEventListener('visibilitychange', () => { if (!document.hidden) { connectRegistryEvents(); void refreshRegistry(); } });
624
649
  document.addEventListener('keydown', e => { if (e.key === 'Escape') closeSystem(); });
625
650
  document.documentElement.dataset.theme = localStorage.getItem('kb.theme') === 'dark' ? 'dark' : 'light';
626
651
  all('[data-scope]').forEach(button => button.classList.toggle('active', button.dataset.scope === state.scope));
627
652
  state.view = titles[location.hash.slice(1)] ? location.hash.slice(1) : 'home';
628
653
  setView(state.view); refreshRegistry();
629
- setInterval(() => { if (!document.hidden) refreshRegistry(); }, 30000);
654
+ connectRegistryEvents();
630
655
  })();
@@ -8,32 +8,33 @@
8
8
  "files": {
9
9
  "README.md": "677a7aaf8f6ae06477423be871306297ccfe9c3a39fa71d87cbfdbb3b83f5b7e",
10
10
  "package.json": "2e24f8fc1ac3269bdcbd9b7179edf3eff31758545e970c689ab5ae3cb1c49c41",
11
- "src/analysis-contract.js": "913a63b63fb4a4a9df071f95bbeb8f8c40ef87e2f8445ab0742086ced70ffbf7",
11
+ "src/analysis-contract.js": "6d4b9fde0e05d9a80d43e96d0c27febf082ecdb19312faf0280d6c9b16ac71b1",
12
12
  "src/analysis-output.js": "95a3c19dcc9ab85d1dba7fee5b9aec80f9c000dfba89da3fd0be25a81e2fb680",
13
13
  "src/analysis-worker.js": "a105cabe6e1573b2d986b1e7a5aaf615e2fb53524156fc8e4e2c0a71f2c97e55",
14
14
  "src/bin.js": "22208907431d0f3a971a669c7e5eb44b3b7af9bbb36fd7ba17c3b90c4288bd70",
15
15
  "src/bridge-client.js": "ae0dba21e4286694bcd9e064ca36564ec997969ae1eb1ce4f8a6665e447cbffe",
16
16
  "src/context.js": "edd9d4942f6039dd4aaadec88533042ae130f1b80d935d87f61b071904a6688c",
17
- "src/coordinator.js": "55cff6959c7ba068ea8f81dd26b57dd16ec72b7b91856a56b7fa07daea9a3c26",
17
+ "src/coordinator.js": "1fa012d7872e1375012ec3dcddfb6279de406529593eeb49deaa0be180eaff5b",
18
18
  "src/diagnostics.js": "f7b516ace61a1e9faaa6876930b9e2e258499a25857d1203f4e53d28bfd0fa1a",
19
19
  "src/headless-analyzer.js": "e01f81b8f24a4423c19dd8893be8c702a85edbdbb644322e3acab96c3ebaac7d",
20
20
  "src/index-request.js": "78f26b872299005499fff4f2d1f9e8f986784f2ff36a5cf2be2b1e7b7c7d9378",
21
21
  "src/knowledge-targets.js": "aa44ec285d16d7b1c0b63bf084058a1d6f867fa9929c753b6b0cbb24f7b20ee2",
22
- "src/memories.js": "bba8e19380e906a80fd3e5d2a7f809d940466924578c8187d1f376f906f10f2b",
22
+ "src/memories.js": "7ad6701033c9a98a0d918b9745c012f9e90b8de6db6e1d870e2ebf77000a1aac",
23
+ "src/memory-eligibility.js": "48af31f23f81140dbc706ff83a39ba9f411314d87d01e5accfaf419c7a74e0ea",
23
24
  "src/retrieval-policy.json": "3205fb4eb114a839a74f902e6fae6a61e1460958e5a9d7e29add32b60ba4e05a",
24
- "src/retrieval-ranking.js": "bc0ed48f6d1b4c8b9f8c7a0bb5a721ae3637a8b34efcd7c4c25356e46850a70d",
25
+ "src/retrieval-ranking.js": "061b64f5bffec3269851830b30ab51abc3260274e5207ea4864ae33d9cb22809",
25
26
  "src/retrieval.js": "32f17494eb838cc6b209df35dbe33a155c1728420c9e501a4974c4f2a1b33ceb",
26
27
  "src/runtime/README.md": "9be676eca76a7857b34d7357194e6f0ee733c22e61d962d53984715dbec7f673",
27
28
  "src/runtime/atomic-file.js": "9846b4b69db5ded811acf19a1181ef93615d93efaa542b858e552a7f3124ad23",
28
29
  "src/runtime/automation-config.js": "6498c5397be12b155829740595a1553d4dcd6eaa7db6ced3ef88fdc60218f00e",
29
- "src/runtime/commit-conversation-binder.js": "4f5a7a13c3dfac3765ad70e54de351f5d81e0ed4b2b2d7ecb90ef77cb29e0c15",
30
+ "src/runtime/commit-conversation-binder.js": "1b3539d9218cfb9867feec3c60b5632403b73433698fc96c61418a84fe83625a",
30
31
  "src/runtime/commit-processing-ledger.js": "455aa1ac4e212c0b63d9df99e49aa94703cd24145e41aa9794f16274b2ec2e18",
31
- "src/runtime/commit-prompt.js": "11856175a405c00514add6a540324a0efe3d7e5dd872c9e8a0b77f9f40abc551",
32
+ "src/runtime/commit-prompt.js": "db7b6942fc1a1a561c88b901075ccc2015e5cb4c2c3c673d62ac329459968494",
32
33
  "src/runtime/commit-reconciler.js": "41d0bafe43692cf37ac4e9c4b81a8bcfd828ca849cbe20d9fede237b6d001c69",
33
34
  "src/runtime/content-hash.js": "201ee7dcc054310f14097a00058cf9b28fa913367eef616e0fdd8facbf3c6c41",
34
35
  "src/runtime/contracts.js": "1088fd8bb36a5dc32a52496d54a6c7c5255c53ca5ff1fe90e42cfeb276e99044",
35
36
  "src/runtime/conversation-exclusions.js": "ef8545034b862d384fb460140490bb531b58d94992f5e2222ebaaa079b44fa63",
36
- "src/runtime/conversation-store.js": "644318f9c04376a3317ced240dd94afa99a79631f0ecc394c5aa298ae2bc0474",
37
+ "src/runtime/conversation-store.js": "9bdfab167e2803d14cc16e66bf253e13d67d2f85d567faec8a8b08fd9f9aafd0",
37
38
  "src/runtime/evidence-bundle.js": "33d4614849d5e1d69aba8b75c3a43c18b7b6f94e5c78654c82ef631331cc94cc",
38
39
  "src/runtime/git-runner.js": "b74fe197bd4dcf3e70635ef7b1f2615edf965c1d9a3ffe5406aabd41b76d74a9",
39
40
  "src/runtime/knowledge-promotion.js": "62fbd8282f83d666f0cae9c39c97a9a9b0175473356a0da0aa3805c757b0a9c1",
@@ -47,7 +48,7 @@
47
48
  "ui/app.js": "33a2ba38f0dafbbb2e30a1eb3fc93476bfcaf528e124e1a9b2edd2fb69221e9e",
48
49
  "ui/index.html": "ce3565cfefd4838b11d37a91a906ef26ca5a1834844fe3f7c897b56851a3c418"
49
50
  },
50
- "sourceCommit": "10c940a2425daaf27d24500c6f2ba21b79cb91d4"
51
+ "sourceCommit": "1bfa9a5a7be2719935295bd243d994ebf6c51226"
51
52
  }
52
53
  }
53
54
  }