@kybernesis/brain-core 0.14.0 → 0.16.0
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/README.md +17 -0
- package/dist/claude-call.d.ts +11 -0
- package/dist/claude-call.d.ts.map +1 -1
- package/dist/claude-call.js +41 -2
- package/dist/claude-call.js.map +1 -1
- package/dist/fact-extractor.js +1 -1
- package/dist/fact-extractor.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/queue.d.ts +23 -2
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +71 -4
- package/dist/queue.js.map +1 -1
- package/dist/relationship-extractor.d.ts +1 -1
- package/dist/relationship-extractor.d.ts.map +1 -1
- package/dist/relationship-extractor.js +2 -4
- package/dist/relationship-extractor.js.map +1 -1
- package/dist/store-conversation.d.ts +16 -1
- package/dist/store-conversation.d.ts.map +1 -1
- package/dist/store-conversation.js +95 -32
- package/dist/store-conversation.js.map +1 -1
- package/dist/telemetry.d.ts +104 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +100 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/vectors.d.ts +20 -0
- package/dist/vectors.d.ts.map +1 -1
- package/dist/vectors.js +74 -1
- package/dist/vectors.js.map +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -36,6 +36,19 @@ await hybridSearch(tenant, 'what did we decide about Q3?');
|
|
|
36
36
|
await getEntityContext(tenant, 'Ada');
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
+
Prefer one object per brain? Wrap a tenant once with `createLocalBrainProvider` — a
|
|
40
|
+
bound-tenant facade over the same operations, so you don't thread `tenant` through every call:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { createLocalBrainProvider } from '@kybernesis/brain-core';
|
|
44
|
+
|
|
45
|
+
const brain = createLocalBrainProvider(tenant);
|
|
46
|
+
await brain.remember({ prompt, response, channel: 'chat' });
|
|
47
|
+
await brain.query('what did we decide about Q3?');
|
|
48
|
+
await brain.graph();
|
|
49
|
+
await brain.stats();
|
|
50
|
+
```
|
|
51
|
+
|
|
39
52
|
## The three seams
|
|
40
53
|
|
|
41
54
|
The kernel is wired through three module-level setters. Each degrades gracefully when unset.
|
|
@@ -58,6 +71,10 @@ A flat set of async functions over a `TenantContext`, grouped by subsystem:
|
|
|
58
71
|
- **Vectors** — `indexChunk`, `semanticSearch`, `vectorStats` (need the embedding seam).
|
|
59
72
|
- **Retrieval** — `hybridSearch`, `factFirstSearch`, `formatRecall`.
|
|
60
73
|
- **Sleep** — `runSleepCycleNow`, `recoverStaleSleepRuns` (background consolidation/reasoning).
|
|
74
|
+
- **BrainProvider facade** — `createLocalBrainProvider(t)` returns a bound-tenant
|
|
75
|
+
[`BrainProvider`](../brain-contracts) (Layer-2, ADR-0016): the same operations as one async
|
|
76
|
+
object, with no `TenantContext` threaded per call. The high-level seam a future remote
|
|
77
|
+
provider also implements.
|
|
61
78
|
|
|
62
79
|
All schemas, field shapes, and constants come from
|
|
63
80
|
[`@kybernesis/brain-contracts`](../brain-contracts).
|
package/dist/claude-call.d.ts
CHANGED
|
@@ -13,6 +13,17 @@ export interface ClaudeCallOpts {
|
|
|
13
13
|
model?: string;
|
|
14
14
|
maxTokens?: number;
|
|
15
15
|
system?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Seam-level bound (KYB-187). Default `BRAIN_LLM_TIMEOUT_MS` or 30s. Passed
|
|
18
|
+
* DOWN to the provider (the subprocess provider kills the process) AND
|
|
19
|
+
* enforced here as a `withTimeout` backstop, so a hung/mis-wired provider
|
|
20
|
+
* can never stall an ingest — extraction just degrades to "no entities".
|
|
21
|
+
*/
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
/** For per-tenant telemetry attribution. */
|
|
24
|
+
tenantSlug?: string;
|
|
25
|
+
/** For telemetry (e.g. 'extract-relationships'). */
|
|
26
|
+
label?: string;
|
|
16
27
|
[key: string]: unknown;
|
|
17
28
|
}
|
|
18
29
|
export interface LLMProvider {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-call.d.ts","sourceRoot":"","sources":["../src/claude-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"claude-call.d.ts","sourceRoot":"","sources":["../src/claude-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACrE;AAgCD,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAmB;AACvE,wBAAgB,gBAAgB,IAAI,IAAI,CAAsB;AAE9D,gDAAgD;AAChD,wBAAgB,YAAY,IAAI,OAAO,CAA+B;AAEtE;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBlG;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,IAAI,EACpC,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAcnB"}
|
package/dist/claude-call.js
CHANGED
|
@@ -9,8 +9,34 @@
|
|
|
9
9
|
* setLLMProvider(createSubprocessProvider()); // at app startup
|
|
10
10
|
* resetLLMProvider(); // in afterEach
|
|
11
11
|
*/
|
|
12
|
+
import { emitTelemetry } from './telemetry.js';
|
|
12
13
|
// Module-level injectable provider (ADR-0009)
|
|
13
14
|
let _provider = null;
|
|
15
|
+
// Node coerces any setTimeout delay > 2^31-1 (or Infinity) to 1ms — so an
|
|
16
|
+
// oversized "disable the timeout" value would instead time out every call at
|
|
17
|
+
// ~1ms and silently stop all enrichment. Clamp, like queue.ts does (KYB-181).
|
|
18
|
+
const MAX_LLM_TIMEOUT_MS = 2_147_483_647;
|
|
19
|
+
function normalizeTimeout(raw, fallback) {
|
|
20
|
+
if (raw === undefined || !Number.isFinite(raw))
|
|
21
|
+
return fallback;
|
|
22
|
+
const floored = Math.floor(raw);
|
|
23
|
+
if (floored < 1)
|
|
24
|
+
return fallback;
|
|
25
|
+
return Math.min(floored, MAX_LLM_TIMEOUT_MS);
|
|
26
|
+
}
|
|
27
|
+
const DEFAULT_LLM_TIMEOUT_MS = normalizeTimeout(Number(process.env.BRAIN_LLM_TIMEOUT_MS), 30_000);
|
|
28
|
+
/** Sentinel so a seam timeout is classifiable as `stage: 'timeout'`. */
|
|
29
|
+
class LLMTimeoutError extends Error {
|
|
30
|
+
constructor(ms) { super(`llm call timed out after ${ms}ms`); this.name = 'LLMTimeoutError'; }
|
|
31
|
+
}
|
|
32
|
+
/** Reject `p` after `ms` if it hasn't settled (does not cancel the underlying work). */
|
|
33
|
+
function withTimeout(p, ms) {
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
const timer = setTimeout(() => reject(new LLMTimeoutError(ms)), ms);
|
|
36
|
+
timer.unref?.();
|
|
37
|
+
p.then((v) => { clearTimeout(timer); resolve(v); }, (e) => { clearTimeout(timer); reject(e); });
|
|
38
|
+
});
|
|
39
|
+
}
|
|
14
40
|
export function setLLMProvider(p) { _provider = p; }
|
|
15
41
|
export function resetLLMProvider() { _provider = null; }
|
|
16
42
|
/** Returns true when a provider is wired in. */
|
|
@@ -23,11 +49,24 @@ export function llmAvailable() { return _provider !== null; }
|
|
|
23
49
|
export async function callClaude(prompt, opts = {}) {
|
|
24
50
|
if (!_provider)
|
|
25
51
|
return null;
|
|
52
|
+
const timeoutMs = normalizeTimeout(opts.timeoutMs, DEFAULT_LLM_TIMEOUT_MS);
|
|
53
|
+
const slug = opts.tenantSlug;
|
|
54
|
+
const label = opts.label ?? 'llm';
|
|
55
|
+
const start = Date.now();
|
|
26
56
|
try {
|
|
27
|
-
|
|
57
|
+
// Pass the bound down so the provider can actually cancel (the subprocess
|
|
58
|
+
// provider kills the process on its own `timeoutMs`); withTimeout is the
|
|
59
|
+
// belt-and-braces backstop if the provider ignores it.
|
|
60
|
+
const res = await withTimeout(Promise.resolve(_provider.call(prompt, { ...opts, timeoutMs })), timeoutMs);
|
|
61
|
+
if (slug)
|
|
62
|
+
emitTelemetry({ kind: 'llm.success', slug, label, durationMs: Date.now() - start, ts: new Date().toISOString() });
|
|
63
|
+
return res;
|
|
28
64
|
}
|
|
29
65
|
catch (err) {
|
|
30
|
-
|
|
66
|
+
const stage = err instanceof LLMTimeoutError ? 'timeout' : 'error';
|
|
67
|
+
if (slug)
|
|
68
|
+
emitTelemetry({ kind: 'llm.failure', slug, label, stage, error: String(err), ts: new Date().toISOString() });
|
|
69
|
+
console.warn('[brain-core/claude-call] callClaude failed', { stage, timeoutMs, err: String(err) });
|
|
31
70
|
return null;
|
|
32
71
|
}
|
|
33
72
|
}
|
package/dist/claude-call.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-call.js","sourceRoot":"","sources":["../src/claude-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"claude-call.js","sourceRoot":"","sources":["../src/claude-call.ts"],"names":[],"mappings":"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"}
|
package/dist/fact-extractor.js
CHANGED
|
@@ -44,7 +44,7 @@ export async function extractFactsRealtime(t, conversationId, text, options = {}
|
|
|
44
44
|
const rawContent = text.slice(0, 2000);
|
|
45
45
|
const safeContent = rawContent.replace(/<\/conversation>/gi, '');
|
|
46
46
|
const wrapped = `<conversation>\n${safeContent}\n</conversation>`;
|
|
47
|
-
const response = await callClaude(REALTIME_FACT_PROMPT + wrapped, { maxTokens: 256 });
|
|
47
|
+
const response = await callClaude(REALTIME_FACT_PROMPT + wrapped, { maxTokens: 256, tenantSlug: t.slug, label: 'extract-facts' });
|
|
48
48
|
if (!response)
|
|
49
49
|
return 0;
|
|
50
50
|
const rawFactsRaw = extractJsonArray(response);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fact-extractor.js","sourceRoot":"","sources":["../src/fact-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc;IACrD,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS;CACzC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG;;;;;;;;;;;CAW5B,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,CAAgB,EAChB,cAAsB,EACtB,IAAY,EACZ,UAYI,EAAE;IAEN,MAAM,EACJ,QAAQ,GAAG,EAAE,EACb,UAAU,GAAG,cAAc,cAAc,EAAE,EAC3C,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACpC,UAAU,GAAG,MAAM,EACnB,WAAW,GACZ,GAAG,OAAO,CAAC;IAEZ,4DAA4D;IAC5D,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAExD,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE1B,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,IAAI,CAAC;QACH,mEAAmE;QACnE,qEAAqE;QACrE,6CAA6C;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,mBAAmB,WAAW,mBAAmB,CAAC;QAElE,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,oBAAoB,GAAG,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fact-extractor.js","sourceRoot":"","sources":["../src/fact-extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,8 +9,8 @@ export { sanitizeFtsQuery } from './fts-sanitizer.js';
|
|
|
9
9
|
export { setStorageProvider, resetStorageProvider, storageProviderIsExplicit, getStorage, } from './storage.js';
|
|
10
10
|
export { setLLMProvider, resetLLMProvider, llmAvailable, callClaude, callClaudeJSON, } from './claude-call.js';
|
|
11
11
|
export type { LLMProvider, ClaudeCallOpts } from './claude-call.js';
|
|
12
|
-
export { indexChunk, semanticSearch, vectorStats, setEmbeddingProvider, resetEmbeddingProvider, embeddingAvailable, EMBEDDING_DIM, } from './vectors.js';
|
|
13
|
-
export type { SearchResult, IndexChunkMeta, EmbeddingProvider, IndexChunkResult, } from './vectors.js';
|
|
12
|
+
export { indexChunk, indexChunks, semanticSearch, vectorStats, setEmbeddingProvider, resetEmbeddingProvider, embeddingAvailable, EMBEDDING_DIM, } from './vectors.js';
|
|
13
|
+
export type { SearchResult, IndexChunkMeta, EmbeddingProvider, IndexChunkResult, IndexChunkInput, } from './vectors.js';
|
|
14
14
|
export { runSleepCycleNow, recoverStaleSleepRuns, DEFAULT_CONFIG as SLEEP_DEFAULT_CONFIG, } from './sleep/index.js';
|
|
15
15
|
export type { SleepConfig, RunMetrics as SleepRunMetrics } from './sleep/index.js';
|
|
16
16
|
export { jaccardSimilarity, jaccardSimilarityArrays } from './sleep/utils/jaccard.js';
|
|
@@ -33,6 +33,8 @@ export { hybridSearch } from './hybrid-search.js';
|
|
|
33
33
|
export type { HybridSearchResult, HybridSearchOptions } from './hybrid-search.js';
|
|
34
34
|
export { storeConversation, filterNoiseEntities, isStoreActive, } from './store-conversation.js';
|
|
35
35
|
export type { ConversationInput } from './store-conversation.js';
|
|
36
|
+
export { setTelemetryProvider, resetTelemetryProvider, getHealth, resetHealth, } from './telemetry.js';
|
|
37
|
+
export type { BrainTelemetryEvent, TelemetrySink, BrainHealth } from './telemetry.js';
|
|
36
38
|
export { formatRecall, formatTimelineRich, formatSearchRich, } from './ops.js';
|
|
37
39
|
export type { TimelineFormatOpts, SearchFormatOpts } from './ops.js';
|
|
38
40
|
export { diffFilePaths, reconcile } from './reconcile.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAElE,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,SAAS,EACT,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ export { ensureFactsTable, storeFact, retractFact, reinforceFact, getFactById, g
|
|
|
5
5
|
export { sanitizeFtsQuery } from './fts-sanitizer.js';
|
|
6
6
|
export { setStorageProvider, resetStorageProvider, storageProviderIsExplicit, getStorage, } from './storage.js';
|
|
7
7
|
export { setLLMProvider, resetLLMProvider, llmAvailable, callClaude, callClaudeJSON, } from './claude-call.js';
|
|
8
|
-
export { indexChunk, semanticSearch, vectorStats, setEmbeddingProvider, resetEmbeddingProvider, embeddingAvailable, EMBEDDING_DIM, } from './vectors.js';
|
|
8
|
+
export { indexChunk, indexChunks, semanticSearch, vectorStats, setEmbeddingProvider, resetEmbeddingProvider, embeddingAvailable, EMBEDDING_DIM, } from './vectors.js';
|
|
9
9
|
export { runSleepCycleNow, recoverStaleSleepRuns, DEFAULT_CONFIG as SLEEP_DEFAULT_CONFIG, } from './sleep/index.js';
|
|
10
10
|
export { jaccardSimilarity, jaccardSimilarityArrays } from './sleep/utils/jaccard.js';
|
|
11
11
|
export { runReasoningStep } from './sleep/steps/reasoning.js';
|
|
@@ -18,6 +18,10 @@ export { factFirstSearch } from './fact-retrieval.js';
|
|
|
18
18
|
export { effectiveConfidence, halfLifeForCategory, FACT_HALF_LIVES_DAYS, DEFAULT_HALF_LIFE_DAYS, } from './fact-decay.js';
|
|
19
19
|
export { hybridSearch } from './hybrid-search.js';
|
|
20
20
|
export { storeConversation, filterNoiseEntities, isStoreActive, } from './store-conversation.js';
|
|
21
|
+
// ─── Health telemetry (KYB-183 local half, pulled forward by KYB-187) ─────────
|
|
22
|
+
// Cortex EMITS; the host ROUTES. setTelemetryProvider = push sink; getHealth =
|
|
23
|
+
// pull snapshot ("is this brain healthy / is its queue stalled?").
|
|
24
|
+
export { setTelemetryProvider, resetTelemetryProvider, getHealth, resetHealth, } from './telemetry.js';
|
|
21
25
|
export { formatRecall, formatTimelineRich, formatSearchRich, } from './ops.js';
|
|
22
26
|
// ─── Reconcile core (Spec C) ──────────────────────────────────────────────────
|
|
23
27
|
// The boundary: hosts walk disk + hash (contentHash); the brain answers its
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,SAAS,EACT,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/queue.d.ts
CHANGED
|
@@ -5,9 +5,30 @@
|
|
|
5
5
|
* tenant's serial channel. better-sqlite3 + WAL is multi-reader-safe but
|
|
6
6
|
* single-writer — concurrent writes risk corruption. This queue makes the
|
|
7
7
|
* "daemon is the sole writer per tenant" invariant load-bearing in code.
|
|
8
|
+
*
|
|
9
|
+
* Each job is now BOUNDED by a timeout (KYB-181): a job that never settles
|
|
10
|
+
* (hung LLM/embed/DB await) is evicted — its promise rejects, the tail
|
|
11
|
+
* advances, depth decrements — so the queue keeps draining instead of
|
|
12
|
+
* freezing the tenant forever.
|
|
13
|
+
*
|
|
14
|
+
* The job receives an AbortSignal that fires on eviction. Honoring it
|
|
15
|
+
* (polling `signal.aborted` between steps) NARROWS the window in which a
|
|
16
|
+
* detached, evicted job could still write — it does NOT cancel an in-flight
|
|
17
|
+
* await, so a genuinely hung SDK call runs on until it settles on its own,
|
|
18
|
+
* and a write can still land inside the await that was in flight when the
|
|
19
|
+
* timer fired. better-sqlite3 writes are synchronous, so the residual is at
|
|
20
|
+
* worst a logical out-of-order/duplicate write, never corruption. Threading
|
|
21
|
+
* the signal into the SDK calls for true cancellation is deferred (see the
|
|
22
|
+
* KYB-181 spec "one caveat that matters").
|
|
8
23
|
*/
|
|
9
|
-
type Job<T> = () => Promise<T>;
|
|
10
|
-
|
|
24
|
+
type Job<T> = (signal: AbortSignal) => Promise<T>;
|
|
25
|
+
interface EnqueueOptions {
|
|
26
|
+
/** For logs/telemetry, e.g. "watched-folder:CONTEXT.md". */
|
|
27
|
+
label?: string;
|
|
28
|
+
/** Override the per-job timeout for this call; default JOB_TIMEOUT_MS. */
|
|
29
|
+
timeoutMs?: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function enqueueWrite<T>(slug: string, job: Job<T>, opts?: EnqueueOptions): Promise<T>;
|
|
11
32
|
export declare function queueDepth(slug: string): number;
|
|
12
33
|
export {};
|
|
13
34
|
//# sourceMappingURL=queue.d.ts.map
|
package/dist/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAElD,UAAU,cAAc;IACtB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoCD,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EACX,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,CAAC,CAAC,CA2CZ;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
package/dist/queue.js
CHANGED
|
@@ -5,19 +5,86 @@
|
|
|
5
5
|
* tenant's serial channel. better-sqlite3 + WAL is multi-reader-safe but
|
|
6
6
|
* single-writer — concurrent writes risk corruption. This queue makes the
|
|
7
7
|
* "daemon is the sole writer per tenant" invariant load-bearing in code.
|
|
8
|
+
*
|
|
9
|
+
* Each job is now BOUNDED by a timeout (KYB-181): a job that never settles
|
|
10
|
+
* (hung LLM/embed/DB await) is evicted — its promise rejects, the tail
|
|
11
|
+
* advances, depth decrements — so the queue keeps draining instead of
|
|
12
|
+
* freezing the tenant forever.
|
|
13
|
+
*
|
|
14
|
+
* The job receives an AbortSignal that fires on eviction. Honoring it
|
|
15
|
+
* (polling `signal.aborted` between steps) NARROWS the window in which a
|
|
16
|
+
* detached, evicted job could still write — it does NOT cancel an in-flight
|
|
17
|
+
* await, so a genuinely hung SDK call runs on until it settles on its own,
|
|
18
|
+
* and a write can still land inside the await that was in flight when the
|
|
19
|
+
* timer fired. better-sqlite3 writes are synchronous, so the residual is at
|
|
20
|
+
* worst a logical out-of-order/duplicate write, never corruption. Threading
|
|
21
|
+
* the signal into the SDK calls for true cancellation is deferred (see the
|
|
22
|
+
* KYB-181 spec "one caveat that matters").
|
|
8
23
|
*/
|
|
24
|
+
import { emitTelemetry } from './telemetry.js';
|
|
9
25
|
const queues = new Map();
|
|
10
|
-
|
|
26
|
+
// Generous: a big file does many sequential embeds pre-KYB-182. After KYB-182
|
|
27
|
+
// (batched embeds) jobs are fast and this is huge headroom.
|
|
28
|
+
const DEFAULT_JOB_TIMEOUT_MS = 90_000;
|
|
29
|
+
// Node's setTimeout silently wraps any delay > 2^31-1 (~24.85 days) to 1ms —
|
|
30
|
+
// so an operator setting a "very large to effectively disable" value would
|
|
31
|
+
// instead evict every job on the first tick. Clamp to the ceiling.
|
|
32
|
+
const MAX_JOB_TIMEOUT_MS = 2_147_483_647;
|
|
33
|
+
/**
|
|
34
|
+
* Normalize a caller/env-supplied timeout: reject non-finite, ≤0 and sub-1ms
|
|
35
|
+
* (which floor to 0 and then clamp to 1ms — a near-instant eviction footgun),
|
|
36
|
+
* and cap oversized values at Node's setTimeout ceiling. Both the env default
|
|
37
|
+
* and the per-call `opts.timeoutMs` override route through this so the two
|
|
38
|
+
* entry points agree on what a bad value does.
|
|
39
|
+
*/
|
|
40
|
+
function normalizeTimeout(raw, fallback) {
|
|
41
|
+
if (raw === undefined || !Number.isFinite(raw))
|
|
42
|
+
return fallback;
|
|
43
|
+
const floored = Math.floor(raw);
|
|
44
|
+
if (floored < 1)
|
|
45
|
+
return fallback;
|
|
46
|
+
return Math.min(floored, MAX_JOB_TIMEOUT_MS);
|
|
47
|
+
}
|
|
48
|
+
const JOB_TIMEOUT_MS = normalizeTimeout(Number(process.env.BRAIN_QUEUE_JOB_TIMEOUT_MS), DEFAULT_JOB_TIMEOUT_MS);
|
|
49
|
+
export function enqueueWrite(slug, job, opts = {}) {
|
|
11
50
|
const state = queues.get(slug) ?? { tail: Promise.resolve(), depth: 0 };
|
|
12
51
|
state.depth += 1;
|
|
52
|
+
const timeoutMs = normalizeTimeout(opts.timeoutMs, JOB_TIMEOUT_MS);
|
|
53
|
+
const label = opts.label ?? 'write';
|
|
13
54
|
const run = state.tail.then(() => {
|
|
14
|
-
|
|
15
|
-
|
|
55
|
+
const ac = new AbortController();
|
|
56
|
+
let timer;
|
|
57
|
+
const timeout = new Promise((_, reject) => {
|
|
58
|
+
timer = setTimeout(() => {
|
|
59
|
+
ac.abort(); // ask the job to stop before its next DB write
|
|
60
|
+
// Structured eviction event → host telemetry (KYB-183): names WHICH
|
|
61
|
+
// job hung, so a stall is visible without reading logs.
|
|
62
|
+
emitTelemetry({ kind: 'queue.evicted', slug, label, timeoutMs, ts: new Date().toISOString() });
|
|
63
|
+
// Carry slug+label on the Error itself, not just the log line below,
|
|
64
|
+
// so a caller that catches/re-logs it can still name the stuck job.
|
|
65
|
+
reject(new Error(`job evicted after ${timeoutMs}ms [${slug}/${label}]`));
|
|
66
|
+
}, timeoutMs);
|
|
67
|
+
timer.unref?.();
|
|
68
|
+
});
|
|
69
|
+
return Promise.race([job(ac.signal), timeout])
|
|
70
|
+
.catch((err) => {
|
|
71
|
+
// KYB-183 seed: structured, says WHICH job hung — the diagnostic we
|
|
72
|
+
// lacked on 2026-06-30.
|
|
73
|
+
console.warn('[brain-core/queue] write failed/evicted', {
|
|
74
|
+
slug,
|
|
75
|
+
label,
|
|
76
|
+
timeoutMs,
|
|
77
|
+
err: String(err),
|
|
78
|
+
});
|
|
16
79
|
throw err;
|
|
17
|
-
})
|
|
80
|
+
})
|
|
81
|
+
.finally(() => {
|
|
82
|
+
if (timer)
|
|
83
|
+
clearTimeout(timer);
|
|
18
84
|
state.depth -= 1;
|
|
19
85
|
});
|
|
20
86
|
});
|
|
87
|
+
// tail advances even on evict → the queue can never wedge behind a hung job.
|
|
21
88
|
state.tail = run.catch(() => undefined);
|
|
22
89
|
queues.set(slug, state);
|
|
23
90
|
return run;
|
package/dist/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ export interface RelationshipExtractionResult {
|
|
|
30
30
|
* Uses Claude Haiku for fast, cost-effective extraction.
|
|
31
31
|
* `t` is accepted for signature parity with other brain-core modules.
|
|
32
32
|
*/
|
|
33
|
-
export declare function extractRelationships(
|
|
33
|
+
export declare function extractRelationships(t: TenantContext, text: string, options?: {
|
|
34
34
|
maxTokens?: number;
|
|
35
35
|
}): Promise<RelationshipExtractionResult>;
|
|
36
36
|
/** Format a relationship verb for display in recall output. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-extractor.d.ts","sourceRoot":"","sources":["../src/relationship-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/F,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IAC3C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IAC3C,YAAY,EAAE,gBAAgB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IACpD,aAAa,EAAE,qBAAqB,EAAE,CAAC;CACxC;AAgED;;;;GAIG;AACH,wBAAsB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"relationship-extractor.d.ts","sourceRoot":"","sources":["../src/relationship-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/F,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IAC3C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC;IAC3C,YAAY,EAAE,gBAAgB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IACpD,aAAa,EAAE,qBAAqB,EAAE,CAAC;CACxC;AAgED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,CAAC,EAAE,aAAa,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,4BAA4B,CAAC,CA+BvC;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,gBAAgB,EAC9B,SAAS,EAAE,UAAU,GAAG,UAAU,GACjC,MAAM,CAoBR"}
|
|
@@ -70,13 +70,11 @@ const VALID_RELATIONSHIP_TYPES = new Set([
|
|
|
70
70
|
* Uses Claude Haiku for fast, cost-effective extraction.
|
|
71
71
|
* `t` is accepted for signature parity with other brain-core modules.
|
|
72
72
|
*/
|
|
73
|
-
export async function extractRelationships(
|
|
74
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
75
|
-
_t, text, options = {}) {
|
|
73
|
+
export async function extractRelationships(t, text, options = {}) {
|
|
76
74
|
const maxTokens = options.maxTokens ?? 4096;
|
|
77
75
|
try {
|
|
78
76
|
const truncated = text.length > 4000 ? text.slice(0, 4000) + '\n\n[Text truncated...]' : text;
|
|
79
|
-
const response = await callClaude(`Extract entities and relationships from this conversation:\n\n${truncated}`, { system: EXTRACTION_PROMPT, maxTokens });
|
|
77
|
+
const response = await callClaude(`Extract entities and relationships from this conversation:\n\n${truncated}`, { system: EXTRACTION_PROMPT, maxTokens, tenantSlug: t.slug, label: 'extract-relationships' });
|
|
80
78
|
if (!response)
|
|
81
79
|
return { entities: [], relationships: [] };
|
|
82
80
|
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-extractor.js","sourceRoot":"","sources":["../src/relationship-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAgB9C,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8FAqDoE,CAAC;AAE/F,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/F,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAS;IAC/C,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS;IAC1E,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY;IACnE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS;CAC9C,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB
|
|
1
|
+
{"version":3,"file":"relationship-extractor.js","sourceRoot":"","sources":["../src/relationship-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,10 +13,25 @@ export declare function filterNoiseEntities(entities: Array<{
|
|
|
13
13
|
type: string;
|
|
14
14
|
}>;
|
|
15
15
|
export type { ConversationInput };
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Returns true if a storeConversation call is winning the tenant's write
|
|
18
|
+
* queue race.
|
|
19
|
+
*
|
|
20
|
+
* CAVEAT (KYB-181): depth is decremented when a job settles OR is evicted for
|
|
21
|
+
* timing out. An evicted job is detached and may still be mid-run — it polls
|
|
22
|
+
* `signal.aborted` between steps but cannot cancel an in-flight await — so
|
|
23
|
+
* `isStoreActive` returning false means "no job is winning the race," NOT a
|
|
24
|
+
* hard guarantee that no writer is in flight. A consumer gating a
|
|
25
|
+
* read-after-write, snapshot, sleep cycle or shutdown/flush on this should
|
|
26
|
+
* treat it as best-effort, not a barrier, for the (rare) post-eviction window.
|
|
27
|
+
*/
|
|
17
28
|
export declare function isStoreActive(t: TenantContext): boolean;
|
|
18
29
|
export declare function storeConversation(t: TenantContext, input: ConversationInput, options?: {
|
|
19
30
|
entityStoplist?: string[];
|
|
20
31
|
skipEmbeddings?: boolean;
|
|
21
32
|
}): Promise<void>;
|
|
33
|
+
export declare function storeConversationImpl(t: TenantContext, input: ConversationInput, options: {
|
|
34
|
+
entityStoplist?: string[];
|
|
35
|
+
skipEmbeddings?: boolean;
|
|
36
|
+
}, signal?: AbortSignal): Promise<void>;
|
|
22
37
|
//# sourceMappingURL=store-conversation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-conversation.d.ts","sourceRoot":"","sources":["../src/store-conversation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"store-conversation.d.ts","sourceRoot":"","sources":["../src/store-conversation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAqCpF,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,aAAa,GAAE,MAAM,EAAO,GAC3B,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUvC;AAoCD,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAWlC;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAEvD;AAID,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,aAAa,EAChB,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACpE,OAAO,CAAC,IAAI,CAAC,CAUf;AAKD,wBAAsB,qBAAqB,CACzC,CAAC,EAAE,aAAa,EAChB,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,EAQhE,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Lf"}
|
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
import { randomUUID } from 'node:crypto';
|
|
8
8
|
import { SOURCE_CONFIDENCE } from '@kybernesis/brain-contracts';
|
|
9
9
|
import { enqueueWrite, queueDepth } from './queue.js';
|
|
10
|
+
import { emitTelemetry } from './telemetry.js';
|
|
10
11
|
import { addConversationToTimeline, findRecentDuplicate, incrementTimelineEventCount } from './timeline.js';
|
|
11
12
|
import { findOrCreateEntity, addEntityMention, linkEntitiesWithType } from './entity-graph.js';
|
|
12
13
|
import { extractRelationships } from './relationship-extractor.js';
|
|
13
|
-
import { indexChunk } from './vectors.js';
|
|
14
|
+
import { indexChunk, indexChunks } from './vectors.js';
|
|
14
15
|
import { extractFactsRealtime } from './fact-extractor.js';
|
|
15
16
|
// ─── Noise entity filtering ────────────────────────────────────────────────────
|
|
16
17
|
const NOISE_ENTITY_PATTERNS = [
|
|
@@ -88,15 +89,41 @@ function channelToSourceType(channel) {
|
|
|
88
89
|
default: return 'chat';
|
|
89
90
|
}
|
|
90
91
|
}
|
|
91
|
-
/**
|
|
92
|
+
/**
|
|
93
|
+
* Returns true if a storeConversation call is winning the tenant's write
|
|
94
|
+
* queue race.
|
|
95
|
+
*
|
|
96
|
+
* CAVEAT (KYB-181): depth is decremented when a job settles OR is evicted for
|
|
97
|
+
* timing out. An evicted job is detached and may still be mid-run — it polls
|
|
98
|
+
* `signal.aborted` between steps but cannot cancel an in-flight await — so
|
|
99
|
+
* `isStoreActive` returning false means "no job is winning the race," NOT a
|
|
100
|
+
* hard guarantee that no writer is in flight. A consumer gating a
|
|
101
|
+
* read-after-write, snapshot, sleep cycle or shutdown/flush on this should
|
|
102
|
+
* treat it as best-effort, not a barrier, for the (rare) post-eviction window.
|
|
103
|
+
*/
|
|
92
104
|
export function isStoreActive(t) {
|
|
93
105
|
return queueDepth(t.slug) > 0;
|
|
94
106
|
}
|
|
95
107
|
// ─── Main ─────────────────────────────────────────────────────────────────────
|
|
96
108
|
export function storeConversation(t, input, options = {}) {
|
|
97
|
-
|
|
109
|
+
// Label the queued job with the source file (when present) so an eviction
|
|
110
|
+
// log names WHICH ingest hung (KYB-181 diagnostic).
|
|
111
|
+
const fp = input.metadata?.['file_path'];
|
|
112
|
+
const label = typeof fp === 'string' ? `${input.channel}:${fp}` : input.channel;
|
|
113
|
+
return enqueueWrite(t.slug, (signal) => storeConversationImpl(t, input, options, signal), { label });
|
|
98
114
|
}
|
|
99
|
-
|
|
115
|
+
// Exported for the ingest-ordering test only (proves a pre-aborted job STILL
|
|
116
|
+
// writes its timeline row but skips enrichment, KYB-187); NOT re-exported from
|
|
117
|
+
// index.ts, so it is not public surface.
|
|
118
|
+
export async function storeConversationImpl(t, input, options,
|
|
119
|
+
// Fires if the write queue evicts this job for running too long (KYB-181).
|
|
120
|
+
// The timeline write (Step 2) is UNCONDITIONAL — the file must land even under
|
|
121
|
+
// eviction (KYB-187). Only the best-effort ENRICHMENT steps (extraction,
|
|
122
|
+
// entity graph, facts, embeds) poll `signal.aborted` and skip when evicted.
|
|
123
|
+
// The signal isn't threaded into the awaited SDK/DB calls, so a detached
|
|
124
|
+
// post-eviction job's residual is a logical out-of-order write, never
|
|
125
|
+
// corruption (sync sqlite writes).
|
|
126
|
+
signal) {
|
|
100
127
|
const conversationId = randomUUID();
|
|
101
128
|
const timestamp = input.timestamp || new Date().toISOString();
|
|
102
129
|
const sourcePath = `channel://${input.channel}/${conversationId}`;
|
|
@@ -123,16 +150,32 @@ async function storeConversationImpl(t, input, options) {
|
|
|
123
150
|
connection_id: typeof meta['connection_id'] === 'string' ? meta['connection_id'] : undefined,
|
|
124
151
|
source_did: typeof meta['source_did'] === 'string' ? meta['source_did'] : undefined,
|
|
125
152
|
};
|
|
126
|
-
//
|
|
153
|
+
// ── Ingest ordering (KYB-187) ──────────────────────────────────────────────
|
|
154
|
+
// The 2026-06-30 drop had TWO halves: extraction (a Claude call) was UNBOUNDED
|
|
155
|
+
// and ran BEFORE an abort-guarded timeline write — so a hung extraction was
|
|
156
|
+
// evicted at 90s and the guard then skipped the write, dropping the file. Both
|
|
157
|
+
// halves are fixed:
|
|
158
|
+
// (a) extraction is now BOUNDED at the LLM seam (callClaude timeout), so it
|
|
159
|
+
// can no longer hang; and
|
|
160
|
+
// (b) the timeline write below is UNCONDITIONAL (no abort guard) — so the
|
|
161
|
+
// file ALWAYS lands, with real entities when extraction succeeds and an
|
|
162
|
+
// empty set when it times out.
|
|
163
|
+
// We write the row ONCE, with the entities we have — NOT write-empty-then-
|
|
164
|
+
// backfill: the file_path upsert overwrites entities and `last_insert_rowid()`
|
|
165
|
+
// is stale on its DO UPDATE branch, so a backfill would corrupt an unrelated
|
|
166
|
+
// row (BH-001). A single write is correct and simple.
|
|
167
|
+
// Step 1 — Extract entities + relationships (bounded LLM; best-effort).
|
|
127
168
|
let entities = [];
|
|
128
169
|
let relationships = [];
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
170
|
+
if (!signal?.aborted) {
|
|
171
|
+
try {
|
|
172
|
+
const extraction = await extractRelationships(t, fullText);
|
|
173
|
+
entities = extraction.entities;
|
|
174
|
+
relationships = extraction.relationships;
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
console.warn('[brain-core/store-conversation] entity extraction failed', { err: String(err) });
|
|
178
|
+
}
|
|
136
179
|
}
|
|
137
180
|
// Step 1b: Filter noise
|
|
138
181
|
entities = filterNoiseEntities(entities, options.entityStoplist);
|
|
@@ -140,16 +183,22 @@ async function storeConversationImpl(t, input, options) {
|
|
|
140
183
|
relationships = relationships.filter(r => entityNameSet.has(r.source.name.toLowerCase()) && entityNameSet.has(r.target.name.toLowerCase()));
|
|
141
184
|
const entityNames = entities.map(e => e.name);
|
|
142
185
|
const topicNames = entities.filter(e => e.type === 'topic').map(e => e.name);
|
|
143
|
-
// Step 2:
|
|
186
|
+
// Step 2 — Timeline (UNCONDITIONAL: the file MUST land — even if the job was
|
|
187
|
+
// evicted or extraction returned nothing). Written once, with whatever
|
|
188
|
+
// entities extraction produced. NOTE: on a re-ingest whose extraction failed,
|
|
189
|
+
// the upsert overwrites entities with the empty set — a quality degradation
|
|
190
|
+
// (missing graph links), never a drop; it self-heals on the next re-ingest
|
|
191
|
+
// once the LLM recovers. Landing the file is the priority.
|
|
144
192
|
const title = input.prompt.length > 100 ? input.prompt.slice(0, 97) + '...' : input.prompt;
|
|
145
193
|
const dateMatch = input.prompt.match(/^DATE:\s*(.+?)$/m);
|
|
146
194
|
const sessionDate = dateMatch ? dateMatch[1].trim() : '';
|
|
147
195
|
const fullTitle = sessionDate ? `[${input.channel}] ${sessionDate} — ${title}` : `[${input.channel}] ${title}`;
|
|
148
196
|
const recentHours = input.channel === 'heartbeat' ? 24 : 0.033;
|
|
197
|
+
const telemetryLabel = provenance?.file_path ? `${input.channel}:${provenance.file_path}` : input.channel;
|
|
149
198
|
try {
|
|
150
|
-
// file_path rows skip the title-window duplicate check: the dual-key
|
|
151
|
-
//
|
|
152
|
-
//
|
|
199
|
+
// file_path rows skip the title-window duplicate check: the dual-key upsert
|
|
200
|
+
// IS their dedup, and the increment-only path would silently drop an edited
|
|
201
|
+
// file's new content_hash/summary (the stale-brain bug class).
|
|
153
202
|
const existing = provenance?.file_path
|
|
154
203
|
? null
|
|
155
204
|
: await findRecentDuplicate(t, fullTitle, recentHours);
|
|
@@ -159,35 +208,45 @@ async function storeConversationImpl(t, input, options) {
|
|
|
159
208
|
else {
|
|
160
209
|
await addConversationToTimeline(t, conversationId, sourcePath, timestamp, undefined, fullTitle, timelineSummary, entityNames, topicNames, arpMetadata, input.eventType, provenance);
|
|
161
210
|
}
|
|
211
|
+
emitTelemetry({ kind: 'store.success', slug: t.slug, label: telemetryLabel, ts: new Date().toISOString() });
|
|
162
212
|
}
|
|
163
213
|
catch (err) {
|
|
214
|
+
emitTelemetry({ kind: 'store.failure', slug: t.slug, label: telemetryLabel, error: String(err), ts: new Date().toISOString() });
|
|
164
215
|
console.warn('[brain-core/store-conversation] timeline failed', { err: String(err) });
|
|
165
216
|
}
|
|
166
|
-
// Step
|
|
167
|
-
|
|
217
|
+
// Step 3: Segment-level vector indexing (best-effort, batched — KYB-182)
|
|
218
|
+
// One embedBatch round-trip for all segments instead of N sequential embeds
|
|
219
|
+
// (an 18KB file was ~72 sequential calls). The eviction guard is checked
|
|
220
|
+
// once before the batch; the batch is a single operation, so there is no
|
|
221
|
+
// mid-loop window to re-check.
|
|
222
|
+
if (!options.skipEmbeddings && !signal?.aborted) {
|
|
168
223
|
try {
|
|
169
224
|
const segs = segmentText(fullText, 250, 50);
|
|
170
225
|
if (segs.length > 1) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
catch { /* best-effort */ }
|
|
180
|
-
}
|
|
226
|
+
await indexChunks(t, segs.map((seg) => ({
|
|
227
|
+
content: seg.text,
|
|
228
|
+
meta: {
|
|
229
|
+
ts: timestamp,
|
|
230
|
+
source: `${sourcePath}/seg_${seg.index}`,
|
|
231
|
+
origin_id: `${conversationId}_seg_${seg.index}`,
|
|
232
|
+
},
|
|
233
|
+
})));
|
|
181
234
|
}
|
|
182
235
|
}
|
|
183
236
|
catch (err) {
|
|
184
237
|
console.warn('[brain-core/store-conversation] segment indexing failed', { err: String(err) });
|
|
185
238
|
}
|
|
186
239
|
}
|
|
187
|
-
// Step
|
|
240
|
+
// Step 4: Entity graph (best-effort)
|
|
241
|
+
if (signal?.aborted)
|
|
242
|
+
return;
|
|
188
243
|
try {
|
|
189
244
|
const entityMap = new Map();
|
|
190
245
|
for (const entity of entities) {
|
|
246
|
+
// Per-iteration guard: a large entity set can span many awaited writes;
|
|
247
|
+
// bail mid-loop if evicted (matches the Step-2b embed loop).
|
|
248
|
+
if (signal?.aborted)
|
|
249
|
+
break;
|
|
191
250
|
try {
|
|
192
251
|
const dbEntity = await findOrCreateEntity(t, entity.name, entity.type, timestamp);
|
|
193
252
|
entityMap.set(entity.name, dbEntity.id);
|
|
@@ -198,6 +257,8 @@ async function storeConversationImpl(t, input, options) {
|
|
|
198
257
|
}
|
|
199
258
|
}
|
|
200
259
|
for (const rel of relationships) {
|
|
260
|
+
if (signal?.aborted)
|
|
261
|
+
break;
|
|
201
262
|
try {
|
|
202
263
|
const srcId = entityMap.get(rel.source.name);
|
|
203
264
|
const tgtId = entityMap.get(rel.target.name);
|
|
@@ -217,7 +278,9 @@ async function storeConversationImpl(t, input, options) {
|
|
|
217
278
|
catch (err) {
|
|
218
279
|
console.warn('[brain-core/store-conversation] entity graph failed', { err: String(err) });
|
|
219
280
|
}
|
|
220
|
-
// Step
|
|
281
|
+
// Step 5: Real-time fact extraction (bounded LLM, best-effort)
|
|
282
|
+
if (signal?.aborted)
|
|
283
|
+
return;
|
|
221
284
|
try {
|
|
222
285
|
await extractFactsRealtime(t, conversationId, fullText, {
|
|
223
286
|
entities: entityNames,
|
|
@@ -228,8 +291,8 @@ async function storeConversationImpl(t, input, options) {
|
|
|
228
291
|
});
|
|
229
292
|
}
|
|
230
293
|
catch { /* fact extraction is best-effort */ }
|
|
231
|
-
// Step
|
|
232
|
-
if (!options.skipEmbeddings && fullText.length <= 250) {
|
|
294
|
+
// Step 6: Parent-level embedding (only if no segments)
|
|
295
|
+
if (!options.skipEmbeddings && fullText.length <= 250 && !signal?.aborted) {
|
|
233
296
|
try {
|
|
234
297
|
await indexChunk(t, fullText, { ts: timestamp, source: sourcePath, origin_id: conversationId });
|
|
235
298
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-conversation.js","sourceRoot":"","sources":["../src/store-conversation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store-conversation.js","sourceRoot":"","sources":["../src/store-conversation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,kFAAkF;AAElF,MAAM,qBAAqB,GAAa;IACtC,8EAA8E;IAC9E,wEAAwE;IACxE,4EAA4E;IAC5E,iEAAiE;IACjE,kDAAkD;IAClD,iEAAiE;IACjE,YAAY;IACZ,OAAO;IACP,UAAU;IACV,mDAAmD;IACnD,kBAAkB;IAClB,kDAAkD;IAClD,kBAAkB;CACnB,CAAC;AAEF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM;IAClD,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IACvD,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;IACzD,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW;IAC/D,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY;IAC9C,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS;CACxC,CAAC,CAAC;AAEH,MAAM,UAAU,mBAAmB,CACjC,QAA+C,EAC/C,gBAA0B,EAAE;IAE5B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACzB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACzC,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF,SAAS,WAAW,CAAC,IAAY,EAAE,WAAW,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE;IAChE,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAA2C,EAAE,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,GAAG,GAAG,KAAK,GAAG,WAAW,CAAC;QAC9B,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACzC,IAAI,EAAE,GAAG,WAAW,GAAG,GAAG;gBAAE,GAAG,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;iBAC5C,IAAI,EAAE,GAAG,WAAW,GAAG,GAAG;gBAAE,GAAG,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,KAAK,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC;QAC3B,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACnC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,GAAG;YAAE,MAAM;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAWD,SAAS,mBAAmB,CAAC,OAAe;IAC1C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,UAAU,CAAC,CAAC,OAAO,aAAa,CAAC;QACtC,KAAK,WAAW,CAAC,CAAC,OAAO,WAAW,CAAC;QACrC,KAAK,gBAAgB,CAAC,CAAC,OAAO,gBAAgB,CAAC;QAC/C,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,CAAgB;IAC5C,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,iBAAiB,CAC/B,CAAgB,EAChB,KAAwB,EACxB,UAAmE,EAAE;IAErE,0EAA0E;IAC1E,oDAAoD;IACpD,MAAM,EAAE,GAAI,KAAK,CAAC,QAAgD,EAAE,CAAC,WAAW,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAChF,OAAO,YAAY,CACjB,CAAC,CAAC,IAAI,EACN,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAC5D,EAAE,KAAK,EAAE,CACV,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,+EAA+E;AAC/E,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,CAAgB,EAChB,KAAwB,EACxB,OAAgE;AAChE,2EAA2E;AAC3E,+EAA+E;AAC/E,yEAAyE;AACzE,4EAA4E;AAC5E,yEAAyE;AACzE,sEAAsE;AACtE,mCAAmC;AACnC,MAAoB;IAEpB,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,aAAa,KAAK,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,SAAS,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,QAAQ,EAAE,CAAC;IACzE,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAA4C,CAAC,IAAI,IAAI,CAAC;IAEjG,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAA4B,CAAC;IAC/D,wEAAwE;IACxE,2EAA2E;IAC3E,oEAAoE;IACpE,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,KAAK,MAAM;QAC3C,CAAC,CAAC;YACE,SAAS,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAW,CAAC,CAAC,CAAC,SAAS;YAC1F,YAAY,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAW,CAAC,CAAC,CAAC,SAAS;SACpG;QACH,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,WAAW,GAAG;QAClB,UAAU,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAW,CAAC,CAAC,CAAC,SAAS;QAC7F,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,MAAM,CAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7H,cAAc,EAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,QAAQ;YACxD,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAmD;YAC1E,CAAC,CAAC,SAAS;QACb,aAAa,EAAE,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAW,CAAC,CAAC,CAAC,SAAS;QACtG,UAAU,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAW,CAAC,CAAC,CAAC,SAAS;KAC9F,CAAC;IAEF,8EAA8E;IAC9E,+EAA+E;IAC/E,4EAA4E;IAC5E,+EAA+E;IAC/E,oBAAoB;IACpB,8EAA8E;IAC9E,gCAAgC;IAChC,4EAA4E;IAC5E,8EAA8E;IAC9E,qCAAqC;IACrC,2EAA2E;IAC3E,+EAA+E;IAC/E,6EAA6E;IAC7E,sDAAsD;IAEtD,wEAAwE;IACxE,IAAI,QAAQ,GAA0C,EAAE,CAAC;IACzD,IAAI,aAAa,GAMZ,EAAE,CAAC;IAER,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC3D,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;YAC/B,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,0DAA0D,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACvE,aAAa,GAAG,aAAa,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CACtG,CAAC;IACF,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE7E,6EAA6E;IAC7E,uEAAuE;IACvE,8EAA8E;IAC9E,4EAA4E;IAC5E,2EAA2E;IAC3E,2DAA2D;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3F,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;IAC/G,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,MAAM,cAAc,GAAG,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAE1G,IAAI,CAAC;QACH,4EAA4E;QAC5E,4EAA4E;QAC5E,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,UAAU,EAAE,SAAS;YACpC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,2BAA2B,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,yBAAyB,CAC7B,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EACnD,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EACnD,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,CACzC,CAAC;QACJ,CAAC;QACD,aAAa,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9G,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAChI,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,yEAAyE;IACzE,4EAA4E;IAC5E,yEAAyE;IACzE,yEAAyE;IACzE,+BAA+B;IAC/B,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,WAAW,CACf,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACjB,OAAO,EAAE,GAAG,CAAC,IAAI;oBACjB,IAAI,EAAE;wBACJ,EAAE,EAAE,SAAS;wBACb,MAAM,EAAE,GAAG,UAAU,QAAQ,GAAG,CAAC,KAAK,EAAE;wBACxC,SAAS,EAAE,GAAG,cAAc,QAAQ,GAAG,CAAC,KAAK,EAAE;qBAChD;iBACF,CAAC,CAAC,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,yDAAyD,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO;IAC5B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,wEAAwE;YACxE,6DAA6D;YAC7D,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM;YAC3B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAa,EAAE,SAAS,CAAC,CAAC;gBAC3F,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACxC,MAAM,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,UAAU,EAC/D,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,0CAA0C,MAAM,CAAC,IAAI,SAAS,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM;YAC3B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;oBACtC,MAAM,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;wBAC1C,YAAY,EAAE,GAAG,CAAC,YAAqB;wBACvC,UAAU,EAAE,GAAG,CAAC,UAAU;wBAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;qBACzB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,+DAA+D;IAC/D,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO;IAC5B,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE;YACtD,QAAQ,EAAE,WAAW;YACrB,UAAU;YACV,SAAS;YACT,UAAU;YACV,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;IAEhD,uDAAuD;IACvD,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;QAClG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain health telemetry (KYB-183 local half, pulled forward by KYB-187).
|
|
3
|
+
*
|
|
4
|
+
* Cortex EMITS structured events; the host ROUTES them. Two surfaces:
|
|
5
|
+
* - PUSH: `setTelemetryProvider(sink)` — the host receives every event and
|
|
6
|
+
* decides where it goes (daemon.log locally, a metrics backend in Arcana).
|
|
7
|
+
* Injectable like the LLM/embedding seams (ADR-0009). Cortex never owns a
|
|
8
|
+
* log sink, so it stays portable across KBDE / KAD / Arcana.
|
|
9
|
+
* - PULL: `getHealth(t)` — a cheap per-tenant snapshot (queue depth, last
|
|
10
|
+
* store/embed/llm success + counts) that a host `/health` endpoint or
|
|
11
|
+
* dashboard reads to answer "is this brain healthy / is its queue stalled?"
|
|
12
|
+
* without tailing logs.
|
|
13
|
+
*
|
|
14
|
+
* The 2026-06-30 freeze took hours to diagnose because the layers that KNEW
|
|
15
|
+
* (embedder 429, hung queue job) swallowed it silently. This makes that state
|
|
16
|
+
* observable. The eviction log (KYB-181) and embedder stats (KYB-180) are the
|
|
17
|
+
* seeds this generalises.
|
|
18
|
+
*/
|
|
19
|
+
import type { TenantContext } from '@kybernesis/brain-contracts';
|
|
20
|
+
export type BrainTelemetryEvent = {
|
|
21
|
+
kind: 'queue.evicted';
|
|
22
|
+
slug: string;
|
|
23
|
+
ts: string;
|
|
24
|
+
label: string;
|
|
25
|
+
timeoutMs: number;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'store.success';
|
|
28
|
+
slug: string;
|
|
29
|
+
ts: string;
|
|
30
|
+
label: string;
|
|
31
|
+
} | {
|
|
32
|
+
kind: 'store.failure';
|
|
33
|
+
slug: string;
|
|
34
|
+
ts: string;
|
|
35
|
+
label: string;
|
|
36
|
+
error: string;
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'embed.success';
|
|
39
|
+
slug: string;
|
|
40
|
+
ts: string;
|
|
41
|
+
count: number;
|
|
42
|
+
} | {
|
|
43
|
+
kind: 'embed.failure';
|
|
44
|
+
slug: string;
|
|
45
|
+
ts: string;
|
|
46
|
+
error?: string;
|
|
47
|
+
} | {
|
|
48
|
+
kind: 'llm.success';
|
|
49
|
+
slug: string;
|
|
50
|
+
ts: string;
|
|
51
|
+
label: string;
|
|
52
|
+
durationMs: number;
|
|
53
|
+
} | {
|
|
54
|
+
kind: 'llm.failure';
|
|
55
|
+
slug: string;
|
|
56
|
+
ts: string;
|
|
57
|
+
label: string;
|
|
58
|
+
stage: 'timeout' | 'error';
|
|
59
|
+
error: string;
|
|
60
|
+
};
|
|
61
|
+
/** The host implements this to route events wherever it logs/meters. */
|
|
62
|
+
export interface TelemetrySink {
|
|
63
|
+
emit(event: BrainTelemetryEvent): void;
|
|
64
|
+
}
|
|
65
|
+
/** Per-tenant rolling health snapshot (the PULL surface). */
|
|
66
|
+
export interface BrainHealth {
|
|
67
|
+
slug: string;
|
|
68
|
+
/** Live queue depth — >0 means a write is in flight / queued. */
|
|
69
|
+
queueDepth: number;
|
|
70
|
+
store: {
|
|
71
|
+
ok: number;
|
|
72
|
+
evicted: number;
|
|
73
|
+
failed: number;
|
|
74
|
+
lastSuccessAt: string | null;
|
|
75
|
+
lastEvictedAt: string | null;
|
|
76
|
+
/** The job label (channel + file_path) of the most recent eviction. */
|
|
77
|
+
lastEvictedLabel: string | null;
|
|
78
|
+
};
|
|
79
|
+
embed: {
|
|
80
|
+
ok: number;
|
|
81
|
+
failed: number;
|
|
82
|
+
lastSuccessAt: string | null;
|
|
83
|
+
};
|
|
84
|
+
llm: {
|
|
85
|
+
ok: number;
|
|
86
|
+
failed: number;
|
|
87
|
+
lastSuccessAt: string | null;
|
|
88
|
+
lastFailureAt: string | null;
|
|
89
|
+
lastFailureStage: string | null;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Wire a host sink to receive every emitted event (PUSH). Null clears it. */
|
|
93
|
+
export declare function setTelemetryProvider(sink: TelemetrySink | null): void;
|
|
94
|
+
export declare function resetTelemetryProvider(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Record an event: update the rolling per-tenant snapshot, then forward to the
|
|
97
|
+
* host sink. Never throws — a broken sink must not break an ingest.
|
|
98
|
+
*/
|
|
99
|
+
export declare function emitTelemetry(event: BrainTelemetryEvent): void;
|
|
100
|
+
/** A defensive copy of the tenant's health snapshot, with the LIVE queue depth. */
|
|
101
|
+
export declare function getHealth(t: TenantContext): BrainHealth;
|
|
102
|
+
/** Clear all recorded health — for tests. */
|
|
103
|
+
export declare function resetHealth(): void;
|
|
104
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain health telemetry (KYB-183 local half, pulled forward by KYB-187).
|
|
3
|
+
*
|
|
4
|
+
* Cortex EMITS structured events; the host ROUTES them. Two surfaces:
|
|
5
|
+
* - PUSH: `setTelemetryProvider(sink)` — the host receives every event and
|
|
6
|
+
* decides where it goes (daemon.log locally, a metrics backend in Arcana).
|
|
7
|
+
* Injectable like the LLM/embedding seams (ADR-0009). Cortex never owns a
|
|
8
|
+
* log sink, so it stays portable across KBDE / KAD / Arcana.
|
|
9
|
+
* - PULL: `getHealth(t)` — a cheap per-tenant snapshot (queue depth, last
|
|
10
|
+
* store/embed/llm success + counts) that a host `/health` endpoint or
|
|
11
|
+
* dashboard reads to answer "is this brain healthy / is its queue stalled?"
|
|
12
|
+
* without tailing logs.
|
|
13
|
+
*
|
|
14
|
+
* The 2026-06-30 freeze took hours to diagnose because the layers that KNEW
|
|
15
|
+
* (embedder 429, hung queue job) swallowed it silently. This makes that state
|
|
16
|
+
* observable. The eviction log (KYB-181) and embedder stats (KYB-180) are the
|
|
17
|
+
* seeds this generalises.
|
|
18
|
+
*/
|
|
19
|
+
import { queueDepth } from './queue.js';
|
|
20
|
+
let _sink = null;
|
|
21
|
+
/** Wire a host sink to receive every emitted event (PUSH). Null clears it. */
|
|
22
|
+
export function setTelemetryProvider(sink) { _sink = sink; }
|
|
23
|
+
export function resetTelemetryProvider() { _sink = null; }
|
|
24
|
+
function blankHealth(slug) {
|
|
25
|
+
return {
|
|
26
|
+
slug,
|
|
27
|
+
queueDepth: 0,
|
|
28
|
+
store: { ok: 0, evicted: 0, failed: 0, lastSuccessAt: null, lastEvictedAt: null, lastEvictedLabel: null },
|
|
29
|
+
embed: { ok: 0, failed: 0, lastSuccessAt: null },
|
|
30
|
+
llm: { ok: 0, failed: 0, lastSuccessAt: null, lastFailureAt: null, lastFailureStage: null },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const _health = new Map();
|
|
34
|
+
function ensure(slug) {
|
|
35
|
+
let h = _health.get(slug);
|
|
36
|
+
if (!h) {
|
|
37
|
+
h = blankHealth(slug);
|
|
38
|
+
_health.set(slug, h);
|
|
39
|
+
}
|
|
40
|
+
return h;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Record an event: update the rolling per-tenant snapshot, then forward to the
|
|
44
|
+
* host sink. Never throws — a broken sink must not break an ingest.
|
|
45
|
+
*/
|
|
46
|
+
export function emitTelemetry(event) {
|
|
47
|
+
const h = ensure(event.slug);
|
|
48
|
+
switch (event.kind) {
|
|
49
|
+
case 'queue.evicted':
|
|
50
|
+
h.store.evicted += 1;
|
|
51
|
+
h.store.lastEvictedAt = event.ts;
|
|
52
|
+
h.store.lastEvictedLabel = event.label;
|
|
53
|
+
break;
|
|
54
|
+
case 'store.success':
|
|
55
|
+
h.store.ok += 1;
|
|
56
|
+
h.store.lastSuccessAt = event.ts;
|
|
57
|
+
break;
|
|
58
|
+
case 'store.failure':
|
|
59
|
+
h.store.failed += 1;
|
|
60
|
+
break;
|
|
61
|
+
case 'embed.success':
|
|
62
|
+
h.embed.ok += event.count;
|
|
63
|
+
h.embed.lastSuccessAt = event.ts;
|
|
64
|
+
break;
|
|
65
|
+
case 'embed.failure':
|
|
66
|
+
h.embed.failed += 1;
|
|
67
|
+
break;
|
|
68
|
+
case 'llm.success':
|
|
69
|
+
h.llm.ok += 1;
|
|
70
|
+
h.llm.lastSuccessAt = event.ts;
|
|
71
|
+
break;
|
|
72
|
+
case 'llm.failure':
|
|
73
|
+
h.llm.failed += 1;
|
|
74
|
+
h.llm.lastFailureAt = event.ts;
|
|
75
|
+
h.llm.lastFailureStage = event.stage;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
if (_sink) {
|
|
79
|
+
try {
|
|
80
|
+
_sink.emit(event);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.warn('[brain-core/telemetry] sink threw', { err: String(err) });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** A defensive copy of the tenant's health snapshot, with the LIVE queue depth. */
|
|
88
|
+
export function getHealth(t) {
|
|
89
|
+
const h = _health.get(t.slug) ?? blankHealth(t.slug);
|
|
90
|
+
return {
|
|
91
|
+
slug: t.slug,
|
|
92
|
+
queueDepth: queueDepth(t.slug),
|
|
93
|
+
store: { ...h.store },
|
|
94
|
+
embed: { ...h.embed },
|
|
95
|
+
llm: { ...h.llm },
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Clear all recorded health — for tests. */
|
|
99
|
+
export function resetHealth() { _health.clear(); }
|
|
100
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
package/dist/vectors.d.ts
CHANGED
|
@@ -19,6 +19,13 @@ export interface EmbeddingProvider {
|
|
|
19
19
|
* resolves its per-agent key/client from `t` (see 0.8.0 kickoff §4.5).
|
|
20
20
|
*/
|
|
21
21
|
embed(t: TenantContext, text: string): Promise<number[] | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Optional (KYB-182): embed many texts in ONE (or few) provider round-trips
|
|
24
|
+
* and return vectors positionally aligned with `texts` (null per failed
|
|
25
|
+
* item). When absent, indexChunks falls back to sequential `embed` — so this
|
|
26
|
+
* is a pure throughput capability, never a correctness dependency.
|
|
27
|
+
*/
|
|
28
|
+
embedBatch?(t: TenantContext, texts: string[]): Promise<Array<number[] | null>>;
|
|
22
29
|
}
|
|
23
30
|
export declare function setEmbeddingProvider(p: EmbeddingProvider): void;
|
|
24
31
|
export declare function resetEmbeddingProvider(): void;
|
|
@@ -33,6 +40,19 @@ export interface IndexChunkResult {
|
|
|
33
40
|
reason?: string;
|
|
34
41
|
}
|
|
35
42
|
export declare function indexChunk(t: TenantContext, content: string, meta: IndexChunkMeta): Promise<IndexChunkResult>;
|
|
43
|
+
export interface IndexChunkInput {
|
|
44
|
+
content: string;
|
|
45
|
+
meta: IndexChunkMeta;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Batch sibling of indexChunk (KYB-182): embed many chunks in ONE provider
|
|
49
|
+
* round-trip (via `embedBatch`, falling back to sequential `embed` if the
|
|
50
|
+
* provider lacks it) and bulk-write the vectors. Semantically identical to
|
|
51
|
+
* calling indexChunk in a loop — same dedup (`origin_id`), same capping, same
|
|
52
|
+
* per-chunk result — just without N sequential embed round-trips. Results are
|
|
53
|
+
* positionally aligned with `chunks`.
|
|
54
|
+
*/
|
|
55
|
+
export declare function indexChunks(t: TenantContext, chunks: IndexChunkInput[]): Promise<IndexChunkResult[]>;
|
|
36
56
|
export interface SearchResult {
|
|
37
57
|
id: string;
|
|
38
58
|
content: string;
|
package/dist/vectors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectors.d.ts","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAA2C,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"vectors.d.ts","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,aAAa,EAA2C,MAAM,6BAA6B,CAAC;AAIrG,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,KAAK,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAChE;;;;;OAKG;IACH,UAAU,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;CACjF;AAID,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAmB;AACnF,wBAAgB,sBAAsB,IAAI,IAAI,CAAsB;AACpE,wBAAgB,kBAAkB,IAAI,OAAO,CAA+B;AAI5E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,UAAU,CAC9B,CAAC,EAAE,aAAa,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC,CA8B3B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,CAAC,EAAE,aAAa,EAChB,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgD7B;AAWD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,wBAAsB,cAAc,CAClC,CAAC,EAAE,aAAa,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3C,OAAO,CAAC,YAAY,EAAE,CAAC,CA+BzB;AAED,wBAAsB,WAAW,CAC/B,CAAC,EAAE,aAAa,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAMhD"}
|
package/dist/vectors.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { EMBEDDING_DIM, EMBEDDING_INPUT_CAP as CONTENT_CHAR_CAP } from '@kybernesis/brain-contracts';
|
|
14
14
|
import { getStorage } from './storage.js';
|
|
15
|
+
import { emitTelemetry } from './telemetry.js';
|
|
15
16
|
export { EMBEDDING_DIM };
|
|
16
17
|
let _embedder = null;
|
|
17
18
|
export function setEmbeddingProvider(p) { _embedder = p; }
|
|
@@ -29,11 +30,15 @@ export async function indexChunk(t, content, meta) {
|
|
|
29
30
|
}
|
|
30
31
|
const capped = content.slice(0, CONTENT_CHAR_CAP);
|
|
31
32
|
const embedding = await _embedder.embed(t, capped);
|
|
32
|
-
if (!embedding)
|
|
33
|
+
if (!embedding) {
|
|
34
|
+
emitTelemetry({ kind: 'embed.failure', slug: t.slug, ts: new Date().toISOString() });
|
|
33
35
|
return { indexed: false, reason: 'embedding failed' };
|
|
36
|
+
}
|
|
34
37
|
if (embedding.length !== EMBEDDING_DIM) {
|
|
38
|
+
emitTelemetry({ kind: 'embed.failure', slug: t.slug, ts: new Date().toISOString() });
|
|
35
39
|
return { indexed: false, reason: `expected ${EMBEDDING_DIM}-dim vector, got ${embedding.length}` };
|
|
36
40
|
}
|
|
41
|
+
emitTelemetry({ kind: 'embed.success', slug: t.slug, count: 1, ts: new Date().toISOString() });
|
|
37
42
|
await vectors.insertChunk(t, {
|
|
38
43
|
embedding,
|
|
39
44
|
ts: meta.ts,
|
|
@@ -43,6 +48,74 @@ export async function indexChunk(t, content, meta) {
|
|
|
43
48
|
});
|
|
44
49
|
return { indexed: true };
|
|
45
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Batch sibling of indexChunk (KYB-182): embed many chunks in ONE provider
|
|
53
|
+
* round-trip (via `embedBatch`, falling back to sequential `embed` if the
|
|
54
|
+
* provider lacks it) and bulk-write the vectors. Semantically identical to
|
|
55
|
+
* calling indexChunk in a loop — same dedup (`origin_id`), same capping, same
|
|
56
|
+
* per-chunk result — just without N sequential embed round-trips. Results are
|
|
57
|
+
* positionally aligned with `chunks`.
|
|
58
|
+
*/
|
|
59
|
+
export async function indexChunks(t, chunks) {
|
|
60
|
+
if (chunks.length === 0)
|
|
61
|
+
return [];
|
|
62
|
+
if (!_embedder)
|
|
63
|
+
return chunks.map(() => ({ indexed: false, reason: 'no embedding provider' }));
|
|
64
|
+
const vectors = getStorage().repositories.vectors;
|
|
65
|
+
if (!(await vectors.available(t))) {
|
|
66
|
+
return chunks.map(() => ({ indexed: false, reason: 'vector db unavailable' }));
|
|
67
|
+
}
|
|
68
|
+
const results = new Array(chunks.length);
|
|
69
|
+
// Resolve dedup up front so only genuinely-new chunks reach the embedder.
|
|
70
|
+
const pending = [];
|
|
71
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
72
|
+
const { content, meta } = chunks[i];
|
|
73
|
+
if (meta.origin_id && (await vectors.hasOrigin(t, meta.origin_id))) {
|
|
74
|
+
results[i] = { indexed: false, reason: 'already indexed' };
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
pending.push({ i, content: content.slice(0, CONTENT_CHAR_CAP), meta });
|
|
78
|
+
}
|
|
79
|
+
if (pending.length === 0)
|
|
80
|
+
return results;
|
|
81
|
+
const embeddings = await embedMany(t, pending.map((p) => p.content));
|
|
82
|
+
let okCount = 0;
|
|
83
|
+
let failCount = 0;
|
|
84
|
+
for (let k = 0; k < pending.length; k++) {
|
|
85
|
+
const p = pending[k];
|
|
86
|
+
const embedding = embeddings[k];
|
|
87
|
+
if (!embedding || embedding.length !== EMBEDDING_DIM) {
|
|
88
|
+
results[p.i] = { indexed: false, reason: 'embedding failed' };
|
|
89
|
+
failCount += 1;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
await vectors.insertChunk(t, {
|
|
93
|
+
embedding,
|
|
94
|
+
ts: p.meta.ts,
|
|
95
|
+
source: p.meta.source,
|
|
96
|
+
content: p.content,
|
|
97
|
+
origin_id: p.meta.origin_id,
|
|
98
|
+
});
|
|
99
|
+
results[p.i] = { indexed: true };
|
|
100
|
+
okCount += 1;
|
|
101
|
+
}
|
|
102
|
+
const ts = new Date().toISOString();
|
|
103
|
+
if (okCount > 0)
|
|
104
|
+
emitTelemetry({ kind: 'embed.success', slug: t.slug, count: okCount, ts });
|
|
105
|
+
if (failCount > 0)
|
|
106
|
+
emitTelemetry({ kind: 'embed.failure', slug: t.slug, ts });
|
|
107
|
+
return results;
|
|
108
|
+
}
|
|
109
|
+
/** One batched embed call when the provider supports it; sequential fallback otherwise. */
|
|
110
|
+
async function embedMany(t, texts) {
|
|
111
|
+
const embedder = _embedder;
|
|
112
|
+
if (embedder.embedBatch)
|
|
113
|
+
return embedder.embedBatch(t, texts);
|
|
114
|
+
const out = [];
|
|
115
|
+
for (const text of texts)
|
|
116
|
+
out.push(await embedder.embed(t, text));
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
46
119
|
export async function semanticSearch(t, query, opts = {}) {
|
|
47
120
|
const limit = opts.limit ?? 10;
|
|
48
121
|
if (!_embedder)
|
package/dist/vectors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectors.js","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACrG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"vectors.js","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kybernesis/brain-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "Kernel brain methods — timeline, entity-graph, facts, vectors, retrieval, sleep",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "David Cruwys (AppyDave)",
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
"README.md"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@kybernesis/brain-
|
|
31
|
-
"@kybernesis/brain-
|
|
30
|
+
"@kybernesis/brain-storage-sqlite": "0.16.0",
|
|
31
|
+
"@kybernesis/brain-contracts": "0.16.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@kybernesis/brain-storage-vec": "0.
|
|
34
|
+
"@kybernesis/brain-storage-vec": "0.16.0"
|
|
35
35
|
},
|
|
36
36
|
"peerDependenciesMeta": {
|
|
37
37
|
"@kybernesis/brain-storage-vec": {
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/better-sqlite3": "^7.6.13",
|
|
43
43
|
"better-sqlite3": "^12.10.0",
|
|
44
|
-
"@kybernesis/brain-testkit": "0.
|
|
45
|
-
"@kybernesis/brain-storage-vec": "0.
|
|
44
|
+
"@kybernesis/brain-testkit": "0.16.0",
|
|
45
|
+
"@kybernesis/brain-storage-vec": "0.16.0"
|
|
46
46
|
},
|
|
47
47
|
"publishConfig": {
|
|
48
48
|
"access": "public"
|