@dzhechkov/harness-core 0.3.60 → 0.3.63

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/dist/index.d.ts CHANGED
@@ -23,6 +23,8 @@ export { pretrain } from './pretrain.js';
23
23
  export { loadPatterns, loadSessions, computePatternBoost, readLearningConfig, BOOST_CAP, recordPattern, loadStorePatternsSync, patternToRecord, recordToPattern, consolidateSessions, recallPatterns, pruneNoisePatterns } from './patterns.js';
24
24
  export type { PatternRecord, SessionRecord, LearningConfig, LoadOptions, ConsolidateResult, ConsolidateOptions, SqliteBackendMode, RecallHit, SessionsSource, PruneNoiseResult } from './patterns.js';
25
25
  export { runSetup, generateHooksConfig, generateAgentdbWriter, writerVersionOf, AGENTDB_WRITER_VERSION } from './setup.js';
26
+ export { statuslineData } from './statusline.js';
27
+ export type { StatuslineData } from './statusline.js';
26
28
  export { indexPatternsToAgentdb, resolveAgentdbPath } from './agentdb-index.js';
27
29
  export { putBookKnowledge, queryBookKnowledge, bookKbPath } from './book-kb.js';
28
30
  export type { BookKU, BookKUHit } from './book-kb.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ export { recommend } from './recommend.js';
20
20
  export { pretrain } from './pretrain.js';
21
21
  export { loadPatterns, loadSessions, computePatternBoost, readLearningConfig, BOOST_CAP, recordPattern, loadStorePatternsSync, patternToRecord, recordToPattern, consolidateSessions, recallPatterns, pruneNoisePatterns } from './patterns.js';
22
22
  export { runSetup, generateHooksConfig, generateAgentdbWriter, writerVersionOf, AGENTDB_WRITER_VERSION } from './setup.js';
23
+ export { statuslineData } from './statusline.js';
23
24
  export { indexPatternsToAgentdb, resolveAgentdbPath } from './agentdb-index.js';
24
25
  export { putBookKnowledge, queryBookKnowledge, bookKbPath } from './book-kb.js';
25
26
  export { brainHome, brainBooksPath, brainAgentdbPath, brainRegistryPath, readRegistry, writeRegistry, listBrain, promoteProjectToBrain, updateBrainSource, queryBrain, rerankHits, groundPrompt, buildPrimer, writePrimer, readBookKus, exportBrainSlice, importBrainSlice, registerKusToBrain, } from './brain.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAC9B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC;AAErF,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhP,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC3H,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3J,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAC9B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC;AAErF,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhP,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC3H,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3J,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `dz statusline` data source — the FAST, best-effort read behind the live
3
+ * self-learning panel Claude Code renders in its status bar (modeled on
4
+ * agentic-qe's "🎓 12 patterns" statusline, showing dz's OWN counts).
5
+ *
6
+ * Claude Code refreshes a `statusLine` command up to every ~300ms, so this MUST
7
+ * be fast (<~50ms) and MUST NEVER throw or hang — a broken statusline garbles the
8
+ * terminal bar. Every read is therefore:
9
+ * - **readonly + short busy_timeout** — a live MCP writer holding the store lock
10
+ * must never make the panel wait; we back off immediately, not block.
11
+ * - **best-effort** — any error (absent/corrupt `.dz`, missing native module,
12
+ * locked db) collapses to `0` / an omitted field, never an exception.
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ /** A snapshot of dz's self-learning state for one project (all fields best-effort). */
17
+ export interface StatuslineData {
18
+ /** Count of learned patterns in the project's unified memory store. */
19
+ readonly patterns: number;
20
+ /** Number of sources registered in the durable cross-project knowledge brain. */
21
+ readonly brainSources: number;
22
+ /** Hours since the last `dz consolidate` run, if a watermark is present. */
23
+ readonly consolidatedAgeH?: number;
24
+ }
25
+ /**
26
+ * Gather dz's self-learning counts for one project. FAST + best-effort: every read
27
+ * is guarded so a missing/corrupt `.dz`, absent native module, or locked store
28
+ * yields `0` / an omitted field — this function NEVER throws.
29
+ *
30
+ * @param projectRoot Absolute (or cwd-relative) project directory.
31
+ * @param now Injectable clock (epoch ms) for the consolidation age — defaults to `Date.now()`.
32
+ */
33
+ export declare function statuslineData(projectRoot: string, now?: number): StatuslineData;
34
+ //# sourceMappingURL=statusline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline.d.ts","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAsFD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,cAAc,CAmB5F"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * `dz statusline` data source — the FAST, best-effort read behind the live
3
+ * self-learning panel Claude Code renders in its status bar (modeled on
4
+ * agentic-qe's "🎓 12 patterns" statusline, showing dz's OWN counts).
5
+ *
6
+ * Claude Code refreshes a `statusLine` command up to every ~300ms, so this MUST
7
+ * be fast (<~50ms) and MUST NEVER throw or hang — a broken statusline garbles the
8
+ * terminal bar. Every read is therefore:
9
+ * - **readonly + short busy_timeout** — a live MCP writer holding the store lock
10
+ * must never make the panel wait; we back off immediately, not block.
11
+ * - **best-effort** — any error (absent/corrupt `.dz`, missing native module,
12
+ * locked db) collapses to `0` / an omitted field, never an exception.
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ import { existsSync, readFileSync, statSync } from 'node:fs';
17
+ import { join, resolve } from 'node:path';
18
+ import { createRequire } from 'node:module';
19
+ import { listBrain } from './brain.js';
20
+ /** Path of the SQLite pattern store (the Tier-3 backend). */
21
+ function sqlitePatternPath(projectRoot) {
22
+ return join(projectRoot, '.dz', 'memory', 'patterns.sqlite');
23
+ }
24
+ /** The `dz consolidate` watermark (max processed transcript timestamp). */
25
+ function consolidateWatermarkPath(projectRoot) {
26
+ return join(projectRoot, '.dz', 'memory', 'consolidate.json');
27
+ }
28
+ /**
29
+ * Count learned patterns via a direct **readonly** `COUNT(*)` with a short
30
+ * `busy_timeout` — no FTS rebuild, no schema write, no waiting on a live writer.
31
+ * Returns `undefined` (not `0`) when the fast path is unavailable so the caller
32
+ * can fall back to a readonly jsonl line-count; any error → `undefined`.
33
+ */
34
+ function countSqlitePatternsReadonly(sqlitePath) {
35
+ try {
36
+ const require = createRequire(import.meta.url);
37
+ const Database = require('better-sqlite3');
38
+ const db = new Database(sqlitePath, { readonly: true });
39
+ try {
40
+ db.pragma('busy_timeout = 100'); // back off fast — never block the 300ms refresh on a write lock
41
+ const row = db.prepare('SELECT COUNT(*) as cnt FROM memory_records').get();
42
+ return typeof row?.cnt === 'number' ? row.cnt : undefined;
43
+ }
44
+ finally {
45
+ db.close();
46
+ }
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ }
52
+ /**
53
+ * Count the legacy/default `.dz/patterns.jsonl` store by reading the FILE directly — READONLY, no
54
+ * backend open, no FTS rebuild, no schema write. Used only when the SQLite readonly COUNT is
55
+ * unavailable (no SQLite tier, or a transient lock). Best-effort → 0 on any error.
56
+ */
57
+ function countJsonlPatternsReadonly(projectRoot) {
58
+ const path = join(projectRoot, '.dz', 'patterns.jsonl');
59
+ if (!existsSync(path))
60
+ return 0;
61
+ try {
62
+ return readFileSync(path, 'utf-8').split('\n').filter((l) => l.trim() !== '').length;
63
+ }
64
+ catch {
65
+ return 0;
66
+ }
67
+ }
68
+ /**
69
+ * Learned-pattern count for the panel: the fast **readonly** SQLite `COUNT(*)`, else a **readonly**
70
+ * jsonl line-count, else `0`. NEVER opens the store read-write (the render path must not run the
71
+ * mutating FTS rebuild `loadStorePatternsSync` does). This counts the durable SQLite tier and so
72
+ * tracks `dz recall --all` in steady state (jsonl folds into SQLite on consolidate); it is a fast
73
+ * approximation, not a deduped union, by design — a status bar must stay readonly + sub-50ms.
74
+ */
75
+ function countLearnedPatterns(projectRoot) {
76
+ const sqlitePath = sqlitePatternPath(projectRoot);
77
+ if (existsSync(sqlitePath)) {
78
+ const fast = countSqlitePatternsReadonly(sqlitePath);
79
+ if (fast !== undefined)
80
+ return fast;
81
+ }
82
+ return countJsonlPatternsReadonly(projectRoot);
83
+ }
84
+ /** Hours since the last consolidation, or `undefined` when never consolidated / unreadable. */
85
+ function consolidatedAgeHours(projectRoot, now) {
86
+ const path = consolidateWatermarkPath(projectRoot);
87
+ if (!existsSync(path))
88
+ return undefined;
89
+ try {
90
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
91
+ const ts = typeof parsed.lastConsolidatedTs === 'string' ? Date.parse(parsed.lastConsolidatedTs) : Number.NaN;
92
+ if (Number.isNaN(ts))
93
+ return undefined;
94
+ return Math.max(0, Math.round((now - ts) / 3_600_000));
95
+ }
96
+ catch {
97
+ return undefined;
98
+ }
99
+ }
100
+ /**
101
+ * Gather dz's self-learning counts for one project. FAST + best-effort: every read
102
+ * is guarded so a missing/corrupt `.dz`, absent native module, or locked store
103
+ * yields `0` / an omitted field — this function NEVER throws.
104
+ *
105
+ * @param projectRoot Absolute (or cwd-relative) project directory.
106
+ * @param now Injectable clock (epoch ms) for the consolidation age — defaults to `Date.now()`.
107
+ */
108
+ export function statuslineData(projectRoot, now = Date.now()) {
109
+ const root = resolve(projectRoot);
110
+ let patterns = 0;
111
+ try {
112
+ patterns = countLearnedPatterns(root);
113
+ }
114
+ catch {
115
+ patterns = 0;
116
+ }
117
+ let brainSources = 0;
118
+ try {
119
+ brainSources = listBrain().length;
120
+ }
121
+ catch {
122
+ brainSources = 0;
123
+ }
124
+ const ageH = consolidatedAgeHours(root, now);
125
+ return ageH !== undefined ? { patterns, brainSources, consolidatedAgeH: ageH } : { patterns, brainSources };
126
+ }
127
+ //# sourceMappingURL=statusline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline.js","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/harness-core",
3
- "version": "0.3.60",
3
+ "version": "0.3.63",
4
4
  "description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,9 +30,9 @@
30
30
  "@dzhechkov/adapter-openclaude": "^0.1.0",
31
31
  "@dzhechkov/adapter-opencode": "^0.2.0",
32
32
  "yaml": "^2.0.0",
33
- "@dzhechkov/adapter-agents-md": "0.1.0",
34
- "@dzhechkov/core": "0.2.6",
33
+ "@dzhechkov/adapter-agents-md": "0.1.1",
35
34
  "@dzhechkov/adapter-copilot": "0.1.1",
35
+ "@dzhechkov/core": "0.2.6",
36
36
  "@dzhechkov/memory": "0.2.9"
37
37
  },
38
38
  "devDependencies": {
package/src/index.ts CHANGED
@@ -28,6 +28,8 @@ export { pretrain } from './pretrain.js';
28
28
  export { loadPatterns, loadSessions, computePatternBoost, readLearningConfig, BOOST_CAP, recordPattern, loadStorePatternsSync, patternToRecord, recordToPattern, consolidateSessions, recallPatterns, pruneNoisePatterns } from './patterns.js';
29
29
  export type { PatternRecord, SessionRecord, LearningConfig, LoadOptions, ConsolidateResult, ConsolidateOptions, SqliteBackendMode, RecallHit, SessionsSource, PruneNoiseResult } from './patterns.js';
30
30
  export { runSetup, generateHooksConfig, generateAgentdbWriter, writerVersionOf, AGENTDB_WRITER_VERSION } from './setup.js';
31
+ export { statuslineData } from './statusline.js';
32
+ export type { StatuslineData } from './statusline.js';
31
33
  export { indexPatternsToAgentdb, resolveAgentdbPath } from './agentdb-index.js';
32
34
  export { putBookKnowledge, queryBookKnowledge, bookKbPath } from './book-kb.js';
33
35
  export type { BookKU, BookKUHit } from './book-kb.js';
@@ -0,0 +1,144 @@
1
+ /**
2
+ * `dz statusline` data source — the FAST, best-effort read behind the live
3
+ * self-learning panel Claude Code renders in its status bar (modeled on
4
+ * agentic-qe's "🎓 12 patterns" statusline, showing dz's OWN counts).
5
+ *
6
+ * Claude Code refreshes a `statusLine` command up to every ~300ms, so this MUST
7
+ * be fast (<~50ms) and MUST NEVER throw or hang — a broken statusline garbles the
8
+ * terminal bar. Every read is therefore:
9
+ * - **readonly + short busy_timeout** — a live MCP writer holding the store lock
10
+ * must never make the panel wait; we back off immediately, not block.
11
+ * - **best-effort** — any error (absent/corrupt `.dz`, missing native module,
12
+ * locked db) collapses to `0` / an omitted field, never an exception.
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+
17
+ import { existsSync, readFileSync, statSync } from 'node:fs';
18
+ import { join, resolve } from 'node:path';
19
+ import { createRequire } from 'node:module';
20
+
21
+ import { listBrain } from './brain.js';
22
+
23
+ /** A snapshot of dz's self-learning state for one project (all fields best-effort). */
24
+ export interface StatuslineData {
25
+ /** Count of learned patterns in the project's unified memory store. */
26
+ readonly patterns: number;
27
+ /** Number of sources registered in the durable cross-project knowledge brain. */
28
+ readonly brainSources: number;
29
+ /** Hours since the last `dz consolidate` run, if a watermark is present. */
30
+ readonly consolidatedAgeH?: number;
31
+ }
32
+
33
+ /** Path of the SQLite pattern store (the Tier-3 backend). */
34
+ function sqlitePatternPath(projectRoot: string): string {
35
+ return join(projectRoot, '.dz', 'memory', 'patterns.sqlite');
36
+ }
37
+
38
+ /** The `dz consolidate` watermark (max processed transcript timestamp). */
39
+ function consolidateWatermarkPath(projectRoot: string): string {
40
+ return join(projectRoot, '.dz', 'memory', 'consolidate.json');
41
+ }
42
+
43
+ interface ReadonlyCountDb {
44
+ pragma: (s: string) => void;
45
+ prepare: (q: string) => { get: (...a: unknown[]) => unknown };
46
+ close: () => void;
47
+ }
48
+
49
+ /**
50
+ * Count learned patterns via a direct **readonly** `COUNT(*)` with a short
51
+ * `busy_timeout` — no FTS rebuild, no schema write, no waiting on a live writer.
52
+ * Returns `undefined` (not `0`) when the fast path is unavailable so the caller
53
+ * can fall back to a readonly jsonl line-count; any error → `undefined`.
54
+ */
55
+ function countSqlitePatternsReadonly(sqlitePath: string): number | undefined {
56
+ try {
57
+ const require = createRequire(import.meta.url);
58
+ const Database = require('better-sqlite3') as new (p: string, o?: object) => ReadonlyCountDb;
59
+ const db = new Database(sqlitePath, { readonly: true });
60
+ try {
61
+ db.pragma('busy_timeout = 100'); // back off fast — never block the 300ms refresh on a write lock
62
+ const row = db.prepare('SELECT COUNT(*) as cnt FROM memory_records').get() as { cnt?: unknown };
63
+ return typeof row?.cnt === 'number' ? row.cnt : undefined;
64
+ } finally {
65
+ db.close();
66
+ }
67
+ } catch {
68
+ return undefined;
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Count the legacy/default `.dz/patterns.jsonl` store by reading the FILE directly — READONLY, no
74
+ * backend open, no FTS rebuild, no schema write. Used only when the SQLite readonly COUNT is
75
+ * unavailable (no SQLite tier, or a transient lock). Best-effort → 0 on any error.
76
+ */
77
+ function countJsonlPatternsReadonly(projectRoot: string): number {
78
+ const path = join(projectRoot, '.dz', 'patterns.jsonl');
79
+ if (!existsSync(path)) return 0;
80
+ try {
81
+ return readFileSync(path, 'utf-8').split('\n').filter((l) => l.trim() !== '').length;
82
+ } catch {
83
+ return 0;
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Learned-pattern count for the panel: the fast **readonly** SQLite `COUNT(*)`, else a **readonly**
89
+ * jsonl line-count, else `0`. NEVER opens the store read-write (the render path must not run the
90
+ * mutating FTS rebuild `loadStorePatternsSync` does). This counts the durable SQLite tier and so
91
+ * tracks `dz recall --all` in steady state (jsonl folds into SQLite on consolidate); it is a fast
92
+ * approximation, not a deduped union, by design — a status bar must stay readonly + sub-50ms.
93
+ */
94
+ function countLearnedPatterns(projectRoot: string): number {
95
+ const sqlitePath = sqlitePatternPath(projectRoot);
96
+ if (existsSync(sqlitePath)) {
97
+ const fast = countSqlitePatternsReadonly(sqlitePath);
98
+ if (fast !== undefined) return fast;
99
+ }
100
+ return countJsonlPatternsReadonly(projectRoot);
101
+ }
102
+
103
+ /** Hours since the last consolidation, or `undefined` when never consolidated / unreadable. */
104
+ function consolidatedAgeHours(projectRoot: string, now: number): number | undefined {
105
+ const path = consolidateWatermarkPath(projectRoot);
106
+ if (!existsSync(path)) return undefined;
107
+ try {
108
+ const parsed = JSON.parse(readFileSync(path, 'utf-8')) as { lastConsolidatedTs?: unknown };
109
+ const ts = typeof parsed.lastConsolidatedTs === 'string' ? Date.parse(parsed.lastConsolidatedTs) : Number.NaN;
110
+ if (Number.isNaN(ts)) return undefined;
111
+ return Math.max(0, Math.round((now - ts) / 3_600_000));
112
+ } catch {
113
+ return undefined;
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Gather dz's self-learning counts for one project. FAST + best-effort: every read
119
+ * is guarded so a missing/corrupt `.dz`, absent native module, or locked store
120
+ * yields `0` / an omitted field — this function NEVER throws.
121
+ *
122
+ * @param projectRoot Absolute (or cwd-relative) project directory.
123
+ * @param now Injectable clock (epoch ms) for the consolidation age — defaults to `Date.now()`.
124
+ */
125
+ export function statuslineData(projectRoot: string, now: number = Date.now()): StatuslineData {
126
+ const root = resolve(projectRoot);
127
+
128
+ let patterns = 0;
129
+ try {
130
+ patterns = countLearnedPatterns(root);
131
+ } catch {
132
+ patterns = 0;
133
+ }
134
+
135
+ let brainSources = 0;
136
+ try {
137
+ brainSources = listBrain().length;
138
+ } catch {
139
+ brainSources = 0;
140
+ }
141
+
142
+ const ageH = consolidatedAgeHours(root, now);
143
+ return ageH !== undefined ? { patterns, brainSources, consolidatedAgeH: ageH } : { patterns, brainSources };
144
+ }