@thread-memory/core 0.1.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/events.d.ts +18 -0
- package/dist/events.js +17 -0
- package/dist/events.js.map +1 -0
- package/dist/events.test.d.ts +1 -0
- package/dist/events.test.js +46 -0
- package/dist/events.test.js.map +1 -0
- package/dist/feedback-guard.d.ts +3 -0
- package/dist/feedback-guard.js +33 -0
- package/dist/feedback-guard.js.map +1 -0
- package/dist/feedback-guard.test.d.ts +1 -0
- package/dist/feedback-guard.test.js +67 -0
- package/dist/feedback-guard.test.js.map +1 -0
- package/dist/governor.d.ts +16 -0
- package/dist/governor.js +25 -0
- package/dist/governor.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +8 -0
- package/dist/index.test.js.map +1 -0
- package/dist/isolation.test.d.ts +1 -0
- package/dist/isolation.test.js +102 -0
- package/dist/isolation.test.js.map +1 -0
- package/dist/light-confirm.d.ts +37 -0
- package/dist/light-confirm.js +149 -0
- package/dist/light-confirm.js.map +1 -0
- package/dist/light-confirm.test.d.ts +1 -0
- package/dist/light-confirm.test.js +154 -0
- package/dist/light-confirm.test.js.map +1 -0
- package/dist/lineage.test.d.ts +1 -0
- package/dist/lineage.test.js +58 -0
- package/dist/lineage.test.js.map +1 -0
- package/dist/migrate.d.ts +45 -0
- package/dist/migrate.js +349 -0
- package/dist/migrate.js.map +1 -0
- package/dist/migrate.test.d.ts +1 -0
- package/dist/migrate.test.js +111 -0
- package/dist/migrate.test.js.map +1 -0
- package/dist/paths.d.ts +7 -0
- package/dist/paths.js +16 -0
- package/dist/paths.js.map +1 -0
- package/dist/project-key.d.ts +3 -0
- package/dist/project-key.js +48 -0
- package/dist/project-key.js.map +1 -0
- package/dist/project-key.test.d.ts +1 -0
- package/dist/project-key.test.js +29 -0
- package/dist/project-key.test.js.map +1 -0
- package/dist/query.d.ts +49 -0
- package/dist/query.js +165 -0
- package/dist/query.js.map +1 -0
- package/dist/query.test.d.ts +1 -0
- package/dist/query.test.js +162 -0
- package/dist/query.test.js.map +1 -0
- package/dist/schema.d.ts +4 -0
- package/dist/schema.js +92 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.test.d.ts +1 -0
- package/dist/schema.test.js +80 -0
- package/dist/schema.test.js.map +1 -0
- package/dist/state.d.ts +4 -0
- package/dist/state.js +15 -0
- package/dist/state.js.map +1 -0
- package/dist/status-card.d.ts +10 -0
- package/dist/status-card.js +65 -0
- package/dist/status-card.js.map +1 -0
- package/dist/status-card.test.d.ts +1 -0
- package/dist/status-card.test.js +53 -0
- package/dist/status-card.test.js.map +1 -0
- package/dist/store.d.ts +170 -0
- package/dist/store.js +664 -0
- package/dist/store.js.map +1 -0
- package/dist/store.test.d.ts +1 -0
- package/dist/store.test.js +284 -0
- package/dist/store.test.js.map +1 -0
- package/package.json +29 -0
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import type { EventKind, SessionEvent } from "./events.js";
|
|
3
|
+
import type { DecisionStatus, GoalStatus } from "./state.js";
|
|
4
|
+
import { SpillPolicy } from "./governor.js";
|
|
5
|
+
export declare const EVENTS_SCHEMA = "\nCREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n kind TEXT NOT NULL,\n ts TEXT NOT NULL,\n seq INTEGER NOT NULL,\n body TEXT NOT NULL,\n meta TEXT,\n truncated INTEGER NOT NULL DEFAULT 0,\n project_key TEXT,\n scope TEXT NOT NULL DEFAULT 'project',\n origin TEXT,\n spilled INTEGER NOT NULL DEFAULT 0,\n isolation INTEGER NOT NULL DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id, seq);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(\n body,\n content='events',\n content_rowid='id',\n tokenize='unicode61'\n);\n\nCREATE TABLE IF NOT EXISTS episodes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n seq_start INTEGER NOT NULL,\n seq_end INTEGER,\n status TEXT NOT NULL DEFAULT 'active',\n summary TEXT,\n created_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_episodes_session ON episodes(session_id, id);\n\nCREATE TABLE IF NOT EXISTS spills (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n event_id INTEGER NOT NULL REFERENCES events(id),\n ref TEXT NOT NULL,\n blob TEXT,\n sha256 TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS lineage_edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n src_type TEXT NOT NULL,\n src_id INTEGER,\n dst_type TEXT NOT NULL,\n dst_id INTEGER,\n ref TEXT,\n edge_type TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 1.0,\n ts TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lineage_src ON lineage_edges(session_id, src_type, src_id);\nCREATE INDEX IF NOT EXISTS idx_lineage_dst ON lineage_edges(session_id, dst_type, dst_id);\n\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER NOT NULL,\n applied_at TEXT NOT NULL\n);\n";
|
|
6
|
+
export declare const STRUCTURED_SCHEMA = "\nCREATE TABLE IF NOT EXISTS goals (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n text TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'active',\n source_event INTEGER,\n created_at TEXT NOT NULL,\n project_key TEXT,\n scope TEXT NOT NULL DEFAULT 'project',\n origin TEXT,\n isolation INTEGER NOT NULL DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS idx_goals_session ON goals(session_id, id);\n\nCREATE TABLE IF NOT EXISTS decisions (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n text TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'proposed',\n superseded_by INTEGER,\n source_event INTEGER,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n project_key TEXT,\n scope TEXT NOT NULL DEFAULT 'project',\n origin TEXT,\n isolation INTEGER NOT NULL DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS idx_decisions_session ON decisions(session_id, status);\n\nCREATE TABLE IF NOT EXISTS feedback (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n text TEXT NOT NULL,\n kind TEXT NOT NULL DEFAULT 'preference',\n source_event INTEGER,\n created_at TEXT NOT NULL,\n project_key TEXT,\n scope TEXT NOT NULL DEFAULT 'project',\n origin TEXT,\n isolation INTEGER NOT NULL DEFAULT 0\n);\nCREATE INDEX IF NOT EXISTS idx_feedback_session ON feedback(session_id, id);\n\nCREATE TABLE IF NOT EXISTS session_isolation (\n session_id TEXT PRIMARY KEY,\n isolated INTEGER NOT NULL DEFAULT 0,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS lineage_edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n src_type TEXT NOT NULL,\n src_id INTEGER,\n dst_type TEXT NOT NULL,\n dst_id INTEGER,\n ref TEXT,\n edge_type TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 1.0,\n ts TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lineage_src ON lineage_edges(session_id, src_type, src_id);\nCREATE INDEX IF NOT EXISTS idx_lineage_dst ON lineage_edges(session_id, dst_type, dst_id);\n\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER NOT NULL,\n applied_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS entities (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n kind TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS decision_entities (\n decision_id INTEGER NOT NULL REFERENCES decisions(id),\n entity_id INTEGER NOT NULL REFERENCES entities(id),\n edge TEXT NOT NULL DEFAULT 'references',\n ts TEXT NOT NULL,\n PRIMARY KEY (decision_id, entity_id)\n);\n\nCREATE TABLE IF NOT EXISTS metrics (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n event_id INTEGER,\n name TEXT NOT NULL,\n value REAL NOT NULL,\n ts TEXT NOT NULL\n);\n";
|
|
7
|
+
export interface ThreadStoreOptions {
|
|
8
|
+
eventsPath: string;
|
|
9
|
+
structuredPath: string;
|
|
10
|
+
projectKey?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AppendOptions {
|
|
13
|
+
projectKey?: string;
|
|
14
|
+
scope?: "global" | "project";
|
|
15
|
+
origin?: string;
|
|
16
|
+
spillRef?: string;
|
|
17
|
+
isolation?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface StructuredWriteOptions {
|
|
20
|
+
sourceEvent?: number;
|
|
21
|
+
ts?: string;
|
|
22
|
+
scope?: "session" | "project" | "global";
|
|
23
|
+
projectKey?: string;
|
|
24
|
+
origin?: string;
|
|
25
|
+
isolation?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface Episode {
|
|
28
|
+
id: number;
|
|
29
|
+
session_id: string;
|
|
30
|
+
seq_start: number;
|
|
31
|
+
seq_end: number | null;
|
|
32
|
+
status: string;
|
|
33
|
+
summary: string | null;
|
|
34
|
+
created_at: string;
|
|
35
|
+
}
|
|
36
|
+
export interface Goal {
|
|
37
|
+
id: number;
|
|
38
|
+
session_id: string;
|
|
39
|
+
text: string;
|
|
40
|
+
status: GoalStatus;
|
|
41
|
+
source_event: number | null;
|
|
42
|
+
created_at: string;
|
|
43
|
+
project_key?: string | null;
|
|
44
|
+
scope?: string;
|
|
45
|
+
origin?: string | null;
|
|
46
|
+
isolation?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface Decision {
|
|
49
|
+
id: number;
|
|
50
|
+
session_id: string;
|
|
51
|
+
text: string;
|
|
52
|
+
status: DecisionStatus;
|
|
53
|
+
superseded_by: number | null;
|
|
54
|
+
source_event: number | null;
|
|
55
|
+
created_at: string;
|
|
56
|
+
updated_at: string;
|
|
57
|
+
project_key?: string | null;
|
|
58
|
+
scope?: string;
|
|
59
|
+
origin?: string | null;
|
|
60
|
+
isolation?: number;
|
|
61
|
+
}
|
|
62
|
+
export interface FeedbackRow {
|
|
63
|
+
id: number;
|
|
64
|
+
session_id: string;
|
|
65
|
+
text: string;
|
|
66
|
+
kind: "preference" | "correction";
|
|
67
|
+
source_event: number | null;
|
|
68
|
+
created_at: string;
|
|
69
|
+
project_key?: string | null;
|
|
70
|
+
scope?: string;
|
|
71
|
+
origin?: string | null;
|
|
72
|
+
isolation?: number;
|
|
73
|
+
}
|
|
74
|
+
export interface LineageNeighbor {
|
|
75
|
+
id: number;
|
|
76
|
+
session_id: string;
|
|
77
|
+
src_type: string;
|
|
78
|
+
src_id: number | null;
|
|
79
|
+
dst_type: string;
|
|
80
|
+
dst_id: number | null;
|
|
81
|
+
ref: string | null;
|
|
82
|
+
edge_type: string;
|
|
83
|
+
confidence: number;
|
|
84
|
+
ts: string;
|
|
85
|
+
}
|
|
86
|
+
export interface SearchHit {
|
|
87
|
+
id: number;
|
|
88
|
+
session_id: string;
|
|
89
|
+
kind: EventKind;
|
|
90
|
+
ts: string;
|
|
91
|
+
seq: number;
|
|
92
|
+
body: string;
|
|
93
|
+
truncated: boolean;
|
|
94
|
+
score: number;
|
|
95
|
+
}
|
|
96
|
+
export declare class ThreadStore {
|
|
97
|
+
readonly eventsDb: Database.Database;
|
|
98
|
+
readonly structuredDb: Database.Database;
|
|
99
|
+
readonly projectKey?: string;
|
|
100
|
+
private spillPolicy;
|
|
101
|
+
constructor(opts: ThreadStoreOptions, spillPolicy?: SpillPolicy);
|
|
102
|
+
getRecentSessionId(): string | undefined;
|
|
103
|
+
expand(eventId: number, opts?: {
|
|
104
|
+
sessionId?: string;
|
|
105
|
+
}): string;
|
|
106
|
+
hasAssistantTurn(sessionId: string, uuid: string): boolean;
|
|
107
|
+
close(): void;
|
|
108
|
+
append(event: Omit<SessionEvent, "id" | "seq" | "truncated">, opts?: AppendOptions): SessionEvent & {
|
|
109
|
+
project_key?: string;
|
|
110
|
+
scope?: string;
|
|
111
|
+
origin?: string;
|
|
112
|
+
spilled?: number;
|
|
113
|
+
isolation?: number;
|
|
114
|
+
};
|
|
115
|
+
transact<T>(fn: () => T): T;
|
|
116
|
+
search(query: string, opts?: {
|
|
117
|
+
limit?: number;
|
|
118
|
+
sessionId?: string;
|
|
119
|
+
}): SearchHit[];
|
|
120
|
+
getActiveEpisode(sessionId: string): Episode | undefined;
|
|
121
|
+
getLatestEpisodeWithSummary(sessionId: string): Episode | undefined;
|
|
122
|
+
addGoal(sessionId: string, text: string, opts?: StructuredWriteOptions): Goal;
|
|
123
|
+
getActiveGoals(sessionId: string): Goal[];
|
|
124
|
+
getFeedback(sessionId: string, limit?: number): FeedbackRow[];
|
|
125
|
+
getRecentEvents(sessionId: string, limit?: number): SessionEvent[];
|
|
126
|
+
updateGoalStatus(sessionId: string, goalId: number, status: GoalStatus): Goal | undefined;
|
|
127
|
+
addFeedback(sessionId: string, text: string, kind: "preference" | "correction", opts?: StructuredWriteOptions): FeedbackRow;
|
|
128
|
+
deleteFeedback(id: number): boolean;
|
|
129
|
+
proposeDecision(sessionId: string, text: string, opts?: StructuredWriteOptions): Decision;
|
|
130
|
+
private findByOrigin;
|
|
131
|
+
confirmLatestProposed(sessionId: string, opts?: {
|
|
132
|
+
ts?: string;
|
|
133
|
+
}): Decision | undefined;
|
|
134
|
+
revokeLatestActive(sessionId: string, opts?: {
|
|
135
|
+
ts?: string;
|
|
136
|
+
}): Decision | undefined;
|
|
137
|
+
supersedeLatestActive(sessionId: string, replacementText: string, opts?: {
|
|
138
|
+
sourceEvent?: number;
|
|
139
|
+
ts?: string;
|
|
140
|
+
}): {
|
|
141
|
+
superseded: Decision;
|
|
142
|
+
replacement: Decision;
|
|
143
|
+
} | undefined;
|
|
144
|
+
getActiveDecisions(sessionId: string): Decision[];
|
|
145
|
+
getActiveDecisionsMerged(sessionId: string, projectKey?: string): Decision[];
|
|
146
|
+
getActiveGoalsMerged(sessionId: string, projectKey?: string): Goal[];
|
|
147
|
+
getFeedbackMerged(sessionId: string, projectKey: string | undefined, limit?: number): FeedbackRow[];
|
|
148
|
+
setSessionIsolation(sessionId: string, isolated: boolean): void;
|
|
149
|
+
getSessionIsolation(sessionId: string): boolean;
|
|
150
|
+
unisolateRow(sessionId: string, table: "goals" | "decisions" | "feedback", id: number): boolean;
|
|
151
|
+
getLatestProposed(sessionId: string): Decision | undefined;
|
|
152
|
+
getDecisions(sessionId: string, status?: DecisionStatus): Decision[];
|
|
153
|
+
private lineageDb;
|
|
154
|
+
addLineageEdge(sessionId: string, srcType: string, srcId: number | null, dstType: string, dstId: number | null, edgeType: string, opts?: {
|
|
155
|
+
ref?: string;
|
|
156
|
+
confidence?: number;
|
|
157
|
+
ts?: string;
|
|
158
|
+
}): void;
|
|
159
|
+
getRelatedEvents(sessionId: string, eventId: number): LineageNeighbor[];
|
|
160
|
+
getRelatedEdges(sessionId: string, type: string, id: number): LineageNeighbor[];
|
|
161
|
+
getEventsForFile(sessionId: string, filePath: string): LineageNeighbor[];
|
|
162
|
+
private transitionDecision;
|
|
163
|
+
private nextSeq;
|
|
164
|
+
private updateEpisode;
|
|
165
|
+
private closeActiveEpisode;
|
|
166
|
+
}
|
|
167
|
+
export declare function applyScopePriority<T extends {
|
|
168
|
+
text: string;
|
|
169
|
+
scope?: string | null;
|
|
170
|
+
}>(rows: T[]): T[];
|