@ank1015/llm-sdk-adapters 0.0.1

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.
@@ -0,0 +1,57 @@
1
+ /**
2
+ * In-memory Keys Adapter
3
+ *
4
+ * Simple Map-based implementation for testing. No persistence, no encryption.
5
+ */
6
+ function normalizeCredentials(api, credentials) {
7
+ const normalized = { ...credentials };
8
+ if (api === 'codex') {
9
+ const accountId = normalized['chatgpt-account-id'] ??
10
+ normalized.chatgptAccountId ??
11
+ normalized.accountId ??
12
+ normalized.account_id;
13
+ if (accountId) {
14
+ normalized['chatgpt-account-id'] = accountId;
15
+ }
16
+ const apiKey = normalized.apiKey ?? normalized.access_token ?? normalized.accessToken;
17
+ if (apiKey) {
18
+ normalized.apiKey = apiKey;
19
+ }
20
+ delete normalized.chatgptAccountId;
21
+ delete normalized.accountId;
22
+ delete normalized.account_id;
23
+ delete normalized.access_token;
24
+ delete normalized.accessToken;
25
+ }
26
+ return normalized;
27
+ }
28
+ /**
29
+ * In-memory implementation of KeysAdapter for testing.
30
+ */
31
+ export class InMemoryKeysAdapter {
32
+ credentials = new Map();
33
+ async get(api) {
34
+ return this.credentials.get(api)?.apiKey;
35
+ }
36
+ async getCredentials(api) {
37
+ const credentials = this.credentials.get(api);
38
+ return credentials ? normalizeCredentials(api, credentials) : undefined;
39
+ }
40
+ async set(api, key) {
41
+ const existing = this.credentials.get(api) ?? {};
42
+ this.credentials.set(api, { ...existing, apiKey: key });
43
+ }
44
+ async setCredentials(api, credentials) {
45
+ this.credentials.set(api, normalizeCredentials(api, credentials));
46
+ }
47
+ async delete(api) {
48
+ return this.credentials.delete(api);
49
+ }
50
+ async deleteCredentials(api) {
51
+ return this.credentials.delete(api);
52
+ }
53
+ async list() {
54
+ return [...this.credentials.keys()];
55
+ }
56
+ }
57
+ //# sourceMappingURL=memory-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-keys.js","sourceRoot":"","sources":["../src/memory-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,SAAS,oBAAoB,CAC3B,GAAQ,EACR,WAAmC;IAEnC,MAAM,UAAU,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IAEtC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,SAAS,GACb,UAAU,CAAC,oBAAoB,CAAC;YAChC,UAAU,CAAC,gBAAgB;YAC3B,UAAU,CAAC,SAAS;YACpB,UAAU,CAAC,UAAU,CAAC;QACxB,IAAI,SAAS,EAAE,CAAC;YACd,UAAU,CAAC,oBAAoB,CAAC,GAAG,SAAS,CAAC;QAC/C,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,WAAW,CAAC;QACtF,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;QAC7B,CAAC;QAED,OAAO,UAAU,CAAC,gBAAgB,CAAC;QACnC,OAAO,UAAU,CAAC,SAAS,CAAC;QAC5B,OAAO,UAAU,CAAC,UAAU,CAAC;QAC7B,OAAO,UAAU,CAAC,YAAY,CAAC;QAC/B,OAAO,UAAU,CAAC,WAAW,CAAC;IAChC,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACtB,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;IAE7D,KAAK,CAAC,GAAG,CAAC,GAAQ;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAQ;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAQ,EAAE,GAAW;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAQ,EAAE,WAAmC;QAChE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAQ;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAQ;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * In-memory Sessions Adapter
3
+ *
4
+ * Simple Map-based implementation for testing. No persistence.
5
+ */
6
+ import type { AppendCustomInput, AppendMessageInput, CreateSessionInput, SessionLocation, SessionsAdapter, BranchInfo, CustomNode, MessageNode, Session, SessionHeader, SessionNode, SessionSummary } from '@ank1015/llm-types';
7
+ /**
8
+ * In-memory implementation of SessionsAdapter for testing.
9
+ */
10
+ export declare class InMemorySessionsAdapter implements SessionsAdapter {
11
+ private sessions;
12
+ private getKey;
13
+ createSession(input: CreateSessionInput): Promise<{
14
+ sessionId: string;
15
+ header: SessionHeader;
16
+ }>;
17
+ getSession(location: SessionLocation): Promise<Session | undefined>;
18
+ deleteSession(location: SessionLocation): Promise<boolean>;
19
+ updateSessionName(location: SessionLocation, sessionName: string): Promise<SessionHeader | undefined>;
20
+ listSessions(projectName: string, path?: string): Promise<SessionSummary[]>;
21
+ listProjects(): Promise<string[]>;
22
+ appendMessage(input: AppendMessageInput): Promise<{
23
+ sessionId: string;
24
+ node: MessageNode;
25
+ }>;
26
+ appendCustom(input: AppendCustomInput): Promise<CustomNode | undefined>;
27
+ getBranches(location: SessionLocation): Promise<BranchInfo[] | undefined>;
28
+ getBranchHistory(location: SessionLocation, branch: string): Promise<SessionNode[] | undefined>;
29
+ getNode(location: SessionLocation, nodeId: string): Promise<SessionNode | undefined>;
30
+ getLatestNode(location: SessionLocation, branch?: string): Promise<SessionNode | undefined>;
31
+ getMessages(location: SessionLocation, branch?: string): Promise<MessageNode[] | undefined>;
32
+ searchSessions(projectName: string, query: string, path?: string): Promise<SessionSummary[]>;
33
+ }
34
+ //# sourceMappingURL=memory-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-sessions.d.ts","sourceRoot":"","sources":["../src/memory-sessions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,UAAU,EACV,UAAU,EACV,WAAW,EACX,OAAO,EACP,aAAa,EACb,WAAW,EACX,cAAc,EACf,MAAM,oBAAoB,CAAC;AAU5B;;GAEG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAoC;IAEpD,OAAO,CAAC,MAAM;IAIR,aAAa,CACjB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC;IA0BlD,UAAU,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAcnE,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAM1D,iBAAiB,CACrB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAe/B,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAuB/E,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQjC,aAAa,CACjB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC;IAiD9C,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IA0BvE,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC;IAsCzE,gBAAgB,CACpB,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC;IA4B/B,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAMpF,aAAa,CACjB,QAAQ,EAAE,eAAe,EACzB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAY7B,WAAW,CACf,QAAQ,EAAE,eAAe,EACzB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC;IAW/B,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,cAAc,EAAE,CAAC;CAK7B"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * In-memory Sessions Adapter
3
+ *
4
+ * Simple Map-based implementation for testing. No persistence.
5
+ */
6
+ import { generateUUID } from '@ank1015/llm-core';
7
+ import { InvalidParentError, SessionNotFoundError } from '@ank1015/llm-types';
8
+ /**
9
+ * In-memory implementation of SessionsAdapter for testing.
10
+ */
11
+ export class InMemorySessionsAdapter {
12
+ sessions = new Map();
13
+ getKey(projectName, path, sessionId) {
14
+ return `${projectName}/${path}/${sessionId}`;
15
+ }
16
+ async createSession(input) {
17
+ const { projectName, path = '', sessionName } = input;
18
+ const sessionId = generateUUID();
19
+ const now = new Date().toISOString();
20
+ const header = {
21
+ type: 'session',
22
+ id: sessionId,
23
+ parentId: null,
24
+ branch: 'main',
25
+ timestamp: now,
26
+ sessionName: sessionName ?? `Session ${new Date().toLocaleDateString()}`,
27
+ };
28
+ const key = this.getKey(projectName, path, sessionId);
29
+ this.sessions.set(key, {
30
+ location: { projectName, path, sessionId },
31
+ header,
32
+ nodes: [header],
33
+ createdAt: now,
34
+ updatedAt: now,
35
+ });
36
+ return { sessionId, header };
37
+ }
38
+ async getSession(location) {
39
+ const { projectName, path = '', sessionId } = location;
40
+ const key = this.getKey(projectName, path, sessionId);
41
+ const stored = this.sessions.get(key);
42
+ if (!stored)
43
+ return undefined;
44
+ return {
45
+ location: stored.location,
46
+ header: stored.header,
47
+ nodes: [...stored.nodes],
48
+ };
49
+ }
50
+ async deleteSession(location) {
51
+ const { projectName, path = '', sessionId } = location;
52
+ const key = this.getKey(projectName, path, sessionId);
53
+ return this.sessions.delete(key);
54
+ }
55
+ async updateSessionName(location, sessionName) {
56
+ const { projectName, path = '', sessionId } = location;
57
+ const key = this.getKey(projectName, path, sessionId);
58
+ const stored = this.sessions.get(key);
59
+ if (!stored)
60
+ return undefined;
61
+ const updatedHeader = { ...stored.header, sessionName };
62
+ stored.header = updatedHeader;
63
+ stored.nodes[0] = updatedHeader;
64
+ stored.updatedAt = new Date().toISOString();
65
+ return updatedHeader;
66
+ }
67
+ async listSessions(projectName, path = '') {
68
+ const summaries = [];
69
+ const prefix = `${projectName}/${path}/`;
70
+ for (const [key, stored] of this.sessions) {
71
+ if (key.startsWith(prefix)) {
72
+ const branches = [...new Set(stored.nodes.map((n) => n.branch))];
73
+ summaries.push({
74
+ sessionId: stored.location.sessionId,
75
+ sessionName: stored.header.sessionName,
76
+ filePath: key,
77
+ createdAt: stored.createdAt,
78
+ updatedAt: stored.updatedAt,
79
+ nodeCount: stored.nodes.length,
80
+ branches,
81
+ });
82
+ }
83
+ }
84
+ summaries.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
85
+ return summaries;
86
+ }
87
+ async listProjects() {
88
+ const projects = new Set();
89
+ for (const stored of this.sessions.values()) {
90
+ projects.add(stored.location.projectName);
91
+ }
92
+ return [...projects];
93
+ }
94
+ async appendMessage(input) {
95
+ const { projectName, path = '', sessionId, parentId, branch, message, api, modelId, providerOptions = {}, } = input;
96
+ let actualSessionId = sessionId;
97
+ if (!actualSessionId) {
98
+ const { sessionId: newId } = await this.createSession({ projectName, path });
99
+ actualSessionId = newId;
100
+ }
101
+ const key = this.getKey(projectName, path, actualSessionId);
102
+ const stored = this.sessions.get(key);
103
+ if (!stored) {
104
+ throw new SessionNotFoundError(actualSessionId);
105
+ }
106
+ if (!stored.nodes.some((n) => n.id === parentId)) {
107
+ throw new InvalidParentError(parentId, actualSessionId);
108
+ }
109
+ const node = {
110
+ type: 'message',
111
+ id: generateUUID(),
112
+ parentId,
113
+ branch,
114
+ timestamp: new Date().toISOString(),
115
+ message,
116
+ api,
117
+ modelId,
118
+ providerOptions,
119
+ };
120
+ stored.nodes.push(node);
121
+ stored.updatedAt = new Date().toISOString();
122
+ return { sessionId: actualSessionId, node };
123
+ }
124
+ async appendCustom(input) {
125
+ const { projectName, path = '', sessionId, parentId, branch, payload } = input;
126
+ const key = this.getKey(projectName, path, sessionId);
127
+ const stored = this.sessions.get(key);
128
+ if (!stored)
129
+ return undefined;
130
+ if (!stored.nodes.some((n) => n.id === parentId)) {
131
+ throw new InvalidParentError(parentId, sessionId);
132
+ }
133
+ const node = {
134
+ type: 'custom',
135
+ id: generateUUID(),
136
+ parentId,
137
+ branch,
138
+ timestamp: new Date().toISOString(),
139
+ payload,
140
+ };
141
+ stored.nodes.push(node);
142
+ stored.updatedAt = new Date().toISOString();
143
+ return node;
144
+ }
145
+ async getBranches(location) {
146
+ const session = await this.getSession(location);
147
+ if (!session)
148
+ return undefined;
149
+ const branchMap = new Map();
150
+ for (const node of session.nodes) {
151
+ if (!branchMap.has(node.branch)) {
152
+ branchMap.set(node.branch, { nodes: [], branchPointId: null });
153
+ }
154
+ branchMap.get(node.branch).nodes.push(node);
155
+ }
156
+ for (const [branchName, data] of branchMap) {
157
+ if (branchName === 'main')
158
+ continue;
159
+ const firstNode = data.nodes[0];
160
+ if (firstNode && firstNode.parentId) {
161
+ const parent = session.nodes.find((n) => n.id === firstNode.parentId);
162
+ if (parent && parent.branch !== branchName) {
163
+ data.branchPointId = firstNode.parentId;
164
+ }
165
+ }
166
+ }
167
+ const branches = [];
168
+ for (const [name, data] of branchMap) {
169
+ const latestNode = data.nodes[data.nodes.length - 1];
170
+ branches.push({
171
+ name,
172
+ branchPointId: data.branchPointId,
173
+ nodeCount: data.nodes.length,
174
+ latestNodeId: latestNode?.id ?? '',
175
+ });
176
+ }
177
+ return branches;
178
+ }
179
+ async getBranchHistory(location, branch) {
180
+ const session = await this.getSession(location);
181
+ if (!session)
182
+ return undefined;
183
+ const childMap = new Map();
184
+ for (const node of session.nodes) {
185
+ const children = childMap.get(node.parentId) ?? [];
186
+ children.push(node);
187
+ childMap.set(node.parentId, children);
188
+ }
189
+ const history = [];
190
+ let currentId = null;
191
+ while (true) {
192
+ const children = childMap.get(currentId) ?? [];
193
+ let next = children.find((c) => c.branch === branch);
194
+ if (!next && currentId === null) {
195
+ next = children[0];
196
+ }
197
+ if (!next)
198
+ break;
199
+ history.push(next);
200
+ currentId = next.id;
201
+ }
202
+ return history;
203
+ }
204
+ async getNode(location, nodeId) {
205
+ const session = await this.getSession(location);
206
+ if (!session)
207
+ return undefined;
208
+ return session.nodes.find((n) => n.id === nodeId);
209
+ }
210
+ async getLatestNode(location, branch) {
211
+ const session = await this.getSession(location);
212
+ if (!session || session.nodes.length === 0)
213
+ return undefined;
214
+ if (branch) {
215
+ const branchNodes = session.nodes.filter((n) => n.branch === branch);
216
+ return branchNodes[branchNodes.length - 1];
217
+ }
218
+ return session.nodes[session.nodes.length - 1];
219
+ }
220
+ async getMessages(location, branch) {
221
+ const session = await this.getSession(location);
222
+ if (!session)
223
+ return undefined;
224
+ let nodes = session.nodes.filter((n) => n.type === 'message');
225
+ if (branch) {
226
+ nodes = nodes.filter((n) => n.branch === branch);
227
+ }
228
+ return nodes;
229
+ }
230
+ async searchSessions(projectName, query, path = '') {
231
+ const sessions = await this.listSessions(projectName, path);
232
+ const lowerQuery = query.toLowerCase();
233
+ return sessions.filter((s) => s.sessionName.toLowerCase().includes(lowerQuery));
234
+ }
235
+ }
236
+ //# sourceMappingURL=memory-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-sessions.js","sourceRoot":"","sources":["../src/memory-sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * In-memory Usage Adapter
3
+ *
4
+ * Simple array-based implementation for testing. No persistence.
5
+ */
6
+ import type { UsageAdapter, UsageFilters, UsageStats, Api, BaseAssistantMessage } from '@ank1015/llm-types';
7
+ /**
8
+ * In-memory implementation of UsageAdapter for testing.
9
+ */
10
+ export declare class InMemoryUsageAdapter implements UsageAdapter {
11
+ private messages;
12
+ track<TApi extends Api>(message: BaseAssistantMessage<TApi>): Promise<void>;
13
+ getMessage<TApi extends Api>(id: string): Promise<BaseAssistantMessage<TApi> | undefined>;
14
+ getMessages<TApi extends Api>(filters?: UsageFilters): Promise<BaseAssistantMessage<TApi>[]>;
15
+ deleteMessage(id: string): Promise<boolean>;
16
+ getStats(filters?: UsageFilters): Promise<UsageStats>;
17
+ }
18
+ //# sourceMappingURL=memory-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-usage.d.ts","sourceRoot":"","sources":["../src/memory-usage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,GAAG,EACH,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,QAAQ,CAAmC;IAE7C,KAAK,CAAC,IAAI,SAAS,GAAG,EAAE,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3E,UAAU,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAIzF,WAAW,CAAC,IAAI,SAAS,GAAG,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IA4BlC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;CA0E5D"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * In-memory Usage Adapter
3
+ *
4
+ * Simple array-based implementation for testing. No persistence.
5
+ */
6
+ /**
7
+ * In-memory implementation of UsageAdapter for testing.
8
+ */
9
+ export class InMemoryUsageAdapter {
10
+ messages = [];
11
+ async track(message) {
12
+ // Replace if same ID exists, otherwise push
13
+ const index = this.messages.findIndex((m) => m.id === message.id);
14
+ if (index >= 0) {
15
+ this.messages[index] = message;
16
+ }
17
+ else {
18
+ this.messages.push(message);
19
+ }
20
+ }
21
+ async getMessage(id) {
22
+ return this.messages.find((m) => m.id === id);
23
+ }
24
+ async getMessages(filters) {
25
+ let result = [...this.messages];
26
+ if (filters?.api) {
27
+ result = result.filter((m) => m.api === filters.api);
28
+ }
29
+ if (filters?.modelId) {
30
+ result = result.filter((m) => m.model.id === filters.modelId);
31
+ }
32
+ if (filters?.startTime) {
33
+ result = result.filter((m) => m.timestamp >= filters.startTime);
34
+ }
35
+ if (filters?.endTime) {
36
+ result = result.filter((m) => m.timestamp <= filters.endTime);
37
+ }
38
+ result.sort((a, b) => b.timestamp - a.timestamp);
39
+ if (filters?.offset) {
40
+ result = result.slice(filters.offset);
41
+ }
42
+ if (filters?.limit) {
43
+ result = result.slice(0, filters.limit);
44
+ }
45
+ return result;
46
+ }
47
+ async deleteMessage(id) {
48
+ const index = this.messages.findIndex((m) => m.id === id);
49
+ if (index < 0)
50
+ return false;
51
+ this.messages.splice(index, 1);
52
+ return true;
53
+ }
54
+ async getStats(filters) {
55
+ const filtered = await this.getMessages(filters);
56
+ const tokens = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 };
57
+ const cost = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 };
58
+ const byApi = {};
59
+ const byModel = {};
60
+ for (const msg of filtered) {
61
+ tokens.input += msg.usage.input;
62
+ tokens.output += msg.usage.output;
63
+ tokens.cacheRead += msg.usage.cacheRead;
64
+ tokens.cacheWrite += msg.usage.cacheWrite;
65
+ tokens.total += msg.usage.totalTokens;
66
+ cost.input += msg.usage.cost.input;
67
+ cost.output += msg.usage.cost.output;
68
+ cost.cacheRead += msg.usage.cost.cacheRead;
69
+ cost.cacheWrite += msg.usage.cost.cacheWrite;
70
+ cost.total += msg.usage.cost.total;
71
+ // By API
72
+ if (!byApi[msg.api]) {
73
+ byApi[msg.api] = {
74
+ messages: 0,
75
+ tokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
76
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
77
+ };
78
+ }
79
+ const apiEntry = byApi[msg.api];
80
+ apiEntry.messages++;
81
+ apiEntry.tokens.input += msg.usage.input;
82
+ apiEntry.tokens.output += msg.usage.output;
83
+ apiEntry.tokens.cacheRead += msg.usage.cacheRead;
84
+ apiEntry.tokens.cacheWrite += msg.usage.cacheWrite;
85
+ apiEntry.tokens.total += msg.usage.totalTokens;
86
+ apiEntry.cost.input += msg.usage.cost.input;
87
+ apiEntry.cost.output += msg.usage.cost.output;
88
+ apiEntry.cost.cacheRead += msg.usage.cost.cacheRead;
89
+ apiEntry.cost.cacheWrite += msg.usage.cost.cacheWrite;
90
+ apiEntry.cost.total += msg.usage.cost.total;
91
+ // By Model
92
+ if (!byModel[msg.model.id]) {
93
+ byModel[msg.model.id] = {
94
+ api: msg.api,
95
+ modelName: msg.model.name,
96
+ messages: 0,
97
+ tokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
98
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
99
+ };
100
+ }
101
+ const modelEntry = byModel[msg.model.id];
102
+ modelEntry.messages++;
103
+ modelEntry.tokens.input += msg.usage.input;
104
+ modelEntry.tokens.output += msg.usage.output;
105
+ modelEntry.tokens.cacheRead += msg.usage.cacheRead;
106
+ modelEntry.tokens.cacheWrite += msg.usage.cacheWrite;
107
+ modelEntry.tokens.total += msg.usage.totalTokens;
108
+ modelEntry.cost.input += msg.usage.cost.input;
109
+ modelEntry.cost.output += msg.usage.cost.output;
110
+ modelEntry.cost.cacheRead += msg.usage.cost.cacheRead;
111
+ modelEntry.cost.cacheWrite += msg.usage.cost.cacheWrite;
112
+ modelEntry.cost.total += msg.usage.cost.total;
113
+ }
114
+ return {
115
+ totalMessages: filtered.length,
116
+ tokens,
117
+ cost,
118
+ byApi,
119
+ byModel,
120
+ };
121
+ }
122
+ }
123
+ //# sourceMappingURL=memory-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-usage.js","sourceRoot":"","sources":["../src/memory-usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * SQLite-based Usage Adapter
3
+ *
4
+ * Stores LLM usage data in ~/.llm/global/usages/messages.db
5
+ */
6
+ import type { UsageAdapter, UsageFilters, UsageStats, Api, BaseAssistantMessage } from '@ank1015/llm-types';
7
+ /**
8
+ * SQLite-based implementation of UsageAdapter.
9
+ */
10
+ export declare class SqliteUsageAdapter implements UsageAdapter {
11
+ private db;
12
+ private dbPath;
13
+ constructor(dbPath?: string);
14
+ /**
15
+ * Initialize the database connection.
16
+ */
17
+ private getDb;
18
+ track<TApi extends Api>(message: BaseAssistantMessage<TApi>): Promise<void>;
19
+ getMessage<TApi extends Api>(id: string): Promise<BaseAssistantMessage<TApi> | undefined>;
20
+ getMessages<TApi extends Api>(filters?: UsageFilters): Promise<BaseAssistantMessage<TApi>[]>;
21
+ deleteMessage(id: string): Promise<boolean>;
22
+ getStats(filters?: UsageFilters): Promise<UsageStats>;
23
+ /**
24
+ * Close the database connection.
25
+ */
26
+ close(): void;
27
+ /**
28
+ * Get the database file path.
29
+ */
30
+ getDbPath(): string;
31
+ }
32
+ /**
33
+ * Create a SqliteUsageAdapter with the default database path.
34
+ */
35
+ export declare function createSqliteUsageAdapter(dbPath?: string): SqliteUsageAdapter;
36
+ //# sourceMappingURL=sqlite-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-usage.d.ts","sourceRoot":"","sources":["../src/sqlite-usage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,GAAG,EACH,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAqF5B;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IAW3B;;OAEG;IACH,OAAO,CAAC,KAAK;IA6CP,KAAK,CAAC,IAAI,SAAS,GAAG,EAAE,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC3E,UAAU,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IASzF,WAAW,CAAC,IAAI,SAAS,GAAG,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IA4ClC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA+L3D;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,SAAS,IAAI,MAAM;CAGpB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAE5E"}