@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 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).
@@ -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;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,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;AAKD,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,CAQlG;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"}
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"}
@@ -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
- return await _provider.call(prompt, opts);
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
- console.warn('[brain-core/claude-call] callClaude threw', { err: String(err) });
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claude-call.js","sourceRoot":"","sources":["../src/claude-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,8CAA8C;AAC9C,IAAI,SAAS,GAAuB,IAAI,CAAC;AAEzC,MAAM,UAAU,cAAc,CAAC,CAAc,IAAU,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AACvE,MAAM,UAAU,gBAAgB,KAAW,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC;AAE9D,gDAAgD;AAChD,MAAM,UAAU,YAAY,KAAc,OAAO,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC;AAEtE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,OAAuB,EAAE;IACxE,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,QAAoC,EACpC,OAAuB,EAAE;IAEzB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,uDAAuD;IACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"claude-call.js","sourceRoot":"","sources":["../src/claude-call.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
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';
@@ -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
@@ -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":"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"}
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
- export declare function enqueueWrite<T>(slug: string, job: Job<T>): Promise<T>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,KAAK,GAAG,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;AAS/B,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAcrE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C"}
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
- export function enqueueWrite(slug, job) {
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
- return job().catch((err) => {
15
- console.warn('[brain-core/queue] write failed', { slug, err: String(err) });
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
- }).finally(() => {
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;;;;;;;GAOG;AASH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE7C,MAAM,UAAU,YAAY,CAAI,IAAY,EAAE,GAAW;IACvD,MAAM,KAAK,GAAe,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACpF,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QAC/B,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5E,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,OAAO,GAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AACtC,CAAC"}
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(_t: TenantContext, text: string, options?: {
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,CAExC,EAAE,EAAE,aAAa,EACjB,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"}
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":"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"}
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
- /** Returns true if a storeConversation call is in progress for this tenant. */
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;AAoCpF,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,+EAA+E;AAC/E,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,CAEf"}
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
- /** Returns true if a storeConversation call is in progress for this tenant. */
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
- return enqueueWrite(t.slug, () => storeConversationImpl(t, input, options));
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
- async function storeConversationImpl(t, input, options) {
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
- // Step 1: Extract entities + relationships
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
- try {
130
- const extraction = await extractRelationships(t, fullText);
131
- entities = extraction.entities;
132
- relationships = extraction.relationships;
133
- }
134
- catch (err) {
135
- console.warn('[brain-core/store-conversation] entity extraction failed', { err: String(err) });
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: Timeline
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
- // upsert IS their dedup, and the increment-only path would silently drop
152
- // an edited file's new content_hash/summary (the stale-brain bug class).
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 2b: Segment-level vector indexing (best-effort)
167
- if (!options.skipEmbeddings) {
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
- for (const seg of segs) {
172
- try {
173
- await indexChunk(t, seg.text, {
174
- ts: timestamp,
175
- source: `${sourcePath}/seg_${seg.index}`,
176
- origin_id: `${conversationId}_seg_${seg.index}`,
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 3: Entity graph
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 3b: Real-time fact extraction (best-effort)
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 4: Parent-level embedding (only if no segments)
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":"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"}
@@ -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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGjE,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpF;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhH,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACxC;AAED,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,uEAAuE;QACvE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;IACF,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACpE,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,CAAC;CACH;AAID,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAAkB;AACxF,wBAAgB,sBAAsB,IAAI,IAAI,CAAkB;AAmBhE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAsB9D;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,WAAW,CASvD;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,IAAI,IAAI,CAAqB"}
@@ -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;
@@ -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;AAGrG,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;CACjE;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,CAyB3B;AAED,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"}
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)
@@ -1 +1 @@
1
- {"version":3,"file":"vectors.js","sourceRoot":"","sources":["../src/vectors.ts"],"names":[],"mappings":"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"}
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.14.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-contracts": "0.14.0",
31
- "@kybernesis/brain-storage-sqlite": "0.14.0"
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.14.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.14.0",
45
- "@kybernesis/brain-storage-vec": "0.14.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"