@kybernesis/brain-contracts 0.2.0 → 0.5.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/dist/index.d.ts CHANGED
@@ -4,5 +4,6 @@ export * from './timeline.js';
4
4
  export * from './entity.js';
5
5
  export * from './fact.js';
6
6
  export * from './sleep.js';
7
+ export * from './storage.js';
7
8
  export * from './logger.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -4,5 +4,6 @@ export * from './timeline.js';
4
4
  export * from './entity.js';
5
5
  export * from './fact.js';
6
6
  export * from './sleep.js';
7
+ export * from './storage.js';
7
8
  export * from './logger.js';
8
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Storage provider interfaces — the swappable seam (Stage 1).
3
+ *
4
+ * `brain-core` business logic depends ONLY on these interfaces, obtained via
5
+ * the `setStorageProvider`/`getStorage` seam in brain-core (which mirrors
6
+ * `setLLMProvider`). Each backend package (brain-storage-sqlite today; a
7
+ * libsql impl in Stage 3) implements them with its own dialect.
8
+ *
9
+ * DESIGN RULES (load-bearing — see docs/specs/storage-provider-di-spec.md):
10
+ * - Every method is async. Inserts return `Promise<number>` (the new id), so
11
+ * the impl owns `RETURNING` vs `lastInsertRowid` internally.
12
+ * - No method ever exposes a driver handle (`better-sqlite3.Database`, a libsql
13
+ * client, …). The seam speaks domain operations, never SQL.
14
+ * - Returned object fields are snake_case, matching the v0.2.0 realignment and
15
+ * guarded by schema-naming.test.ts.
16
+ * - The 3 within-kind transactions (mergeEntities, deleteEntity, the vector
17
+ * chunk insert) are IMPL-INTERNAL to their methods — no public transaction
18
+ * primitive is exposed in Stage 1 (decision ①: keep per-kind best-effort
19
+ * semantics; cross-kind unit-of-work is a reserved Stage-3 addition).
20
+ * - Param names stay camelCase at the input edge (unchanged public surface);
21
+ * only RETURNED fields are snake_case.
22
+ *
23
+ * NOTE: this interface establishes the 5-store decomposition + shape. Methods
24
+ * are added as each brain-core module migrates (G1–G6); the surface is complete
25
+ * by the time the conformance suite (G7) runs against it.
26
+ */
27
+ import type { TenantContext } from './tenant.js';
28
+ import type { TimelineEvent, TimelineEventInput } from './timeline.js';
29
+ import type { Entity, EntityMention, Contradiction, EntityInsight } from './entity.js';
30
+ import type { Fact } from './fact.js';
31
+ import type { EntityType, RelationshipType, InsightType, EventType, FactCategory } from './constants.js';
32
+ export interface TimelineQuery {
33
+ start?: string;
34
+ end?: string;
35
+ type?: EventType;
36
+ search?: string;
37
+ entities?: string[];
38
+ topics?: string[];
39
+ limit?: number;
40
+ offset?: number;
41
+ }
42
+ export interface TimelineStats {
43
+ totalEvents: number;
44
+ byType: Record<EventType, number>;
45
+ dateRange: {
46
+ earliest: string | null;
47
+ latest: string | null;
48
+ };
49
+ }
50
+ export interface VectorChunkInput {
51
+ /** Embedding vector; impl marshals to its own binding format. */
52
+ embedding: number[];
53
+ ts: string;
54
+ source?: string;
55
+ content: string;
56
+ origin_id?: string;
57
+ }
58
+ export interface VectorSearchRow {
59
+ ts: string;
60
+ source: string | null;
61
+ content: string;
62
+ origin_id: string | null;
63
+ distance: number;
64
+ }
65
+ export interface TimelineStore {
66
+ ensureSchema(t: TenantContext): Promise<void>;
67
+ addEvent(t: TenantContext, event: TimelineEventInput): Promise<number>;
68
+ removeEventByPath(t: TenantContext, sourcePath: string): Promise<boolean>;
69
+ updateEvent(t: TenantContext, id: number, updates: Partial<Omit<TimelineEventInput, 'source_path'>>): Promise<void>;
70
+ deleteEventById(t: TenantContext, id: number): Promise<boolean>;
71
+ getEventById(t: TenantContext, id: number): Promise<TimelineEvent | null>;
72
+ getEventByPath(t: TenantContext, sourcePath: string): Promise<TimelineEvent | null>;
73
+ query(t: TenantContext, query: TimelineQuery): Promise<TimelineEvent[]>;
74
+ findRecentDuplicate(t: TenantContext, title: string, withinHours: number): Promise<{
75
+ id: number;
76
+ title: string;
77
+ } | null>;
78
+ incrementEventCount(t: TenantContext, eventId: number): Promise<void>;
79
+ stats(t: TenantContext): Promise<TimelineStats>;
80
+ /** DISTINCT source_paths whose title/tags/entities LIKE the (lowercased) term. (ops.ts recall) */
81
+ findSourcePathsMatching(t: TenantContext, termLower: string, limit: number): Promise<string[]>;
82
+ }
83
+ export interface EntityRelatedHit {
84
+ entity: Entity;
85
+ relationship: string;
86
+ strength: number;
87
+ }
88
+ export interface TypedRelationship {
89
+ entity: Entity;
90
+ relationship: RelationshipType;
91
+ direction: 'outgoing' | 'incoming';
92
+ confidence: number;
93
+ rationale?: string;
94
+ }
95
+ export interface EntityGraphStats {
96
+ totalEntities: number;
97
+ totalMentions: number;
98
+ totalRelations: number;
99
+ byType: Record<EntityType, number>;
100
+ }
101
+ export interface EntityGraphStore {
102
+ ensureSchema(t: TenantContext): Promise<void>;
103
+ findOrCreateEntity(t: TenantContext, name: string, type: EntityType, timestamp: string): Promise<Entity>;
104
+ addEntityAlias(t: TenantContext, entityId: number, alias: string): Promise<void>;
105
+ addEntityMention(t: TenantContext, entityId: number, conversationId: string, sourcePath: string, context: string, timestamp: string, sourceType?: string, confidence?: number): Promise<void>;
106
+ linkEntities(t: TenantContext, sourceId: number, targetId: number, relationship?: RelationshipType): Promise<void>;
107
+ linkEntitiesWithType(t: TenantContext, sourceId: number, targetId: number, options: {
108
+ relationship: RelationshipType;
109
+ confidence?: number;
110
+ rationale?: string;
111
+ method?: string;
112
+ }): Promise<void>;
113
+ getTypedRelationships(t: TenantContext, entityId: number): Promise<TypedRelationship[]>;
114
+ getEntityContext(t: TenantContext, nameOrId: string | number): Promise<{
115
+ entity: Entity;
116
+ mentions: EntityMention[];
117
+ relatedEntities: EntityRelatedHit[];
118
+ } | null>;
119
+ searchEntities(t: TenantContext, query: string, options?: {
120
+ type?: EntityType;
121
+ limit?: number;
122
+ }): Promise<Entity[]>;
123
+ getRecentEntities(t: TenantContext, limit?: number): Promise<Entity[]>;
124
+ getMostMentionedEntities(t: TenantContext, options?: {
125
+ type?: EntityType;
126
+ limit?: number;
127
+ }): Promise<Entity[]>;
128
+ stats(t: TenantContext): Promise<EntityGraphStats>;
129
+ detectEntitiesInQuery(t: TenantContext, query: string): Promise<{
130
+ entities: string[];
131
+ remainingQuery: string;
132
+ }>;
133
+ mergeEntities(t: TenantContext, keepId: number, removeId: number, reason: string, confidence?: number, aiRationale?: string, mergedBy?: string): Promise<{
134
+ mentions_moved: number;
135
+ relations_moved: number;
136
+ }>;
137
+ deleteEntity(t: TenantContext, entityId: number, reason: string, mergedBy?: string): Promise<void>;
138
+ getEntityProfile(t: TenantContext, entityId: number): Promise<{
139
+ profile: string;
140
+ generated_at: string;
141
+ fact_count: number;
142
+ } | null>;
143
+ saveEntityProfile(t: TenantContext, entityId: number, profile: string, factCount: number): Promise<void>;
144
+ createContradiction(t: TenantContext, entityId: number, factAId: number, factBId: number, factA: string, factB: string, description: string): Promise<number>;
145
+ getOpenContradictions(t: TenantContext, entityId: number): Promise<Contradiction[]>;
146
+ resolveContradiction(t: TenantContext, contradictionId: number, resolvedBy: string): Promise<void>;
147
+ applyContradictions(t: TenantContext, entityId: number, factIds: number[]): Promise<void>;
148
+ saveEntityInsight(t: TenantContext, entityId: number, insightType: InsightType, insight: string, reasoning: string, confidence: number, sourceEntityIds?: number[], expiresAt?: string): Promise<number>;
149
+ getEntityInsights(t: TenantContext, entityId: number, minConfidence?: number): Promise<EntityInsight[]>;
150
+ markInsightsStale(t: TenantContext, entityId: number): Promise<void>;
151
+ getEntitiesForReasoning(t: TenantContext, limit?: number, staleDays?: number, recencyDays?: number): Promise<Array<{
152
+ id: number;
153
+ name: string;
154
+ type: string;
155
+ }>>;
156
+ markEntityReasoned(t: TenantContext, entityId: number): Promise<void>;
157
+ pinEntity(t: TenantContext, entityId: number, pinned?: boolean): Promise<void>;
158
+ listPinned(t: TenantContext, type?: EntityType): Promise<Entity[]>;
159
+ /** Bump access_count + last_accessed for an entity. (ops.ts recall tracking) */
160
+ trackAccess(t: TenantContext, entityId: number): Promise<void>;
161
+ }
162
+ /** Insert shape for storeFact — server fills id/created_at/is_latest/access_count/is_retracted. */
163
+ export type StoreFactInput = Omit<Fact, 'id' | 'created_at' | 'is_latest' | 'access_count' | 'is_retracted'>;
164
+ export interface FactStore {
165
+ ensureFactsTable(t: TenantContext): Promise<void>;
166
+ storeFact(t: TenantContext, fact: StoreFactInput): Promise<number>;
167
+ retractFact(t: TenantContext, factId: number, retractedBy?: string): Promise<void>;
168
+ reinforceFact(t: TenantContext, factId: number): Promise<void>;
169
+ getFactById(t: TenantContext, factId: number): Promise<Fact | null>;
170
+ getFactsForEntity(t: TenantContext, entity: string, options?: {
171
+ latestOnly?: boolean;
172
+ limit?: number;
173
+ category?: FactCategory;
174
+ }): Promise<Fact[]>;
175
+ markFactSuperseded(t: TenantContext, oldFactId: number, newFactId: number): Promise<void>;
176
+ factsCount(t: TenantContext): Promise<number>;
177
+ listFacts(t: TenantContext, options?: {
178
+ limit?: number;
179
+ offset?: number;
180
+ latestOnly?: boolean;
181
+ category?: FactCategory;
182
+ }): Promise<Fact[]>;
183
+ listTemporalFacts(t: TenantContext, options?: {
184
+ includeExpired?: boolean;
185
+ limit?: number;
186
+ }): Promise<Fact[]>;
187
+ searchFactsFts(t: TenantContext, query: string, limit?: number): Promise<Fact[]>;
188
+ /**
189
+ * Active (latest, non-expired) fact CONTENTS for a category. (user-profile.ts)
190
+ * order 'frecency' = confidence DESC, access_count DESC (fallback confidence-only
191
+ * if access_count column is absent); 'recent' = timestamp DESC.
192
+ */
193
+ getFactContentsByCategory(t: TenantContext, category: string, limit: number, order: 'frecency' | 'recent'): Promise<string[]>;
194
+ }
195
+ export interface MemoryEdgeHit {
196
+ related_path: string;
197
+ confidence: number;
198
+ shared_tags: string;
199
+ }
200
+ export interface SleepStore {
201
+ /** memory_edges neighbours of a source path. Returns [] if the table doesn't exist yet. */
202
+ getRelatedEdges(t: TenantContext, sourcePath: string, limit: number): Promise<MemoryEdgeHit[]>;
203
+ }
204
+ export interface VectorStore {
205
+ /** Can the vector backend be opened for this tenant? (loads sqlite-vec) */
206
+ available(t: TenantContext): Promise<boolean>;
207
+ hasOrigin(t: TenantContext, originId: string): Promise<boolean>;
208
+ insertChunk(t: TenantContext, chunk: VectorChunkInput): Promise<number>;
209
+ search(t: TenantContext, embedding: number[], limit: number): Promise<VectorSearchRow[]>;
210
+ stats(t: TenantContext): Promise<{
211
+ count: number;
212
+ available: boolean;
213
+ }>;
214
+ }
215
+ export interface StorageProvider {
216
+ timeline: TimelineStore;
217
+ entities: EntityGraphStore;
218
+ facts: FactStore;
219
+ sleep: SleepStore;
220
+ vectors: VectorStore;
221
+ }
222
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Storage provider interfaces — the swappable seam (Stage 1).
3
+ *
4
+ * `brain-core` business logic depends ONLY on these interfaces, obtained via
5
+ * the `setStorageProvider`/`getStorage` seam in brain-core (which mirrors
6
+ * `setLLMProvider`). Each backend package (brain-storage-sqlite today; a
7
+ * libsql impl in Stage 3) implements them with its own dialect.
8
+ *
9
+ * DESIGN RULES (load-bearing — see docs/specs/storage-provider-di-spec.md):
10
+ * - Every method is async. Inserts return `Promise<number>` (the new id), so
11
+ * the impl owns `RETURNING` vs `lastInsertRowid` internally.
12
+ * - No method ever exposes a driver handle (`better-sqlite3.Database`, a libsql
13
+ * client, …). The seam speaks domain operations, never SQL.
14
+ * - Returned object fields are snake_case, matching the v0.2.0 realignment and
15
+ * guarded by schema-naming.test.ts.
16
+ * - The 3 within-kind transactions (mergeEntities, deleteEntity, the vector
17
+ * chunk insert) are IMPL-INTERNAL to their methods — no public transaction
18
+ * primitive is exposed in Stage 1 (decision ①: keep per-kind best-effort
19
+ * semantics; cross-kind unit-of-work is a reserved Stage-3 addition).
20
+ * - Param names stay camelCase at the input edge (unchanged public surface);
21
+ * only RETURNED fields are snake_case.
22
+ *
23
+ * NOTE: this interface establishes the 5-store decomposition + shape. Methods
24
+ * are added as each brain-core module migrates (G1–G6); the surface is complete
25
+ * by the time the conformance suite (G7) runs against it.
26
+ */
27
+ export {};
28
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kybernesis/brain-contracts",
3
- "version": "0.2.0",
3
+ "version": "0.5.0",
4
4
  "description": "Zod schemas, provider interfaces, and shared types for the Kybernesis brain library",
5
5
  "license": "MIT",
6
6
  "author": "David Cruwys (AppyDave)",