@cereworker/core 26.322.5 → 26.323.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.
- package/dist/conversation.d.ts +2 -3
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +60 -231
- package/dist/conversation.js.map +1 -1
- package/dist/pairing.d.ts.map +1 -1
- package/dist/pairing.js +7 -36
- package/dist/pairing.js.map +1 -1
- package/package.json +2 -6
package/dist/conversation.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Conversation, Message, MessageRole } from './types.js';
|
|
2
2
|
export declare class ConversationStore {
|
|
3
|
-
private
|
|
3
|
+
private db;
|
|
4
4
|
constructor(dbPath?: string);
|
|
5
|
+
private ensureSchema;
|
|
5
6
|
create(): Conversation;
|
|
6
7
|
get(id: string): Conversation | undefined;
|
|
7
8
|
list(): Conversation[];
|
|
@@ -11,7 +12,5 @@ export declare class ConversationStore {
|
|
|
11
12
|
/** Get the most recent message content from a conversation (for list previews) */
|
|
12
13
|
getPreview(conversationId: string): string | null;
|
|
13
14
|
close(): void;
|
|
14
|
-
/** Migrate conversations from a JSON fallback file into SQLite, then rename the JSON file */
|
|
15
|
-
private migrateJsonToSqlite;
|
|
16
15
|
}
|
|
17
16
|
//# sourceMappingURL=conversation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOrE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAe;gBAEb,MAAM,CAAC,EAAE,MAAM;IAgB3B,OAAO,CAAC,YAAY;IAyBpB,MAAM,IAAI,YAAY;IAgBtB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAczC,IAAI,IAAI,YAAY,EAAE;IAatB,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO;IAqC5G,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,EAAE;IA2B9C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS3B,kFAAkF;IAClF,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWjD,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/conversation.js
CHANGED
|
@@ -1,29 +1,25 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
1
2
|
import { nanoid } from 'nanoid';
|
|
2
|
-
import { existsSync, mkdirSync
|
|
3
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
3
4
|
import { dirname, join } from 'node:path';
|
|
4
5
|
import { homedir } from 'node:os';
|
|
5
|
-
import { createRequire } from 'node:module';
|
|
6
6
|
import { createLogger } from './logger.js';
|
|
7
7
|
const log = createLogger('conversation');
|
|
8
|
-
const require = createRequire(import.meta.url);
|
|
9
|
-
function tryOpenDb(dbPath) {
|
|
10
|
-
try {
|
|
11
|
-
const Database = require('better-sqlite3');
|
|
12
|
-
return new Database(dbPath);
|
|
13
|
-
}
|
|
14
|
-
catch {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
8
|
const DEFAULT_DB_PATH = join(homedir(), '.cereworker', 'conversations.db');
|
|
19
|
-
|
|
20
|
-
class SqliteBackend {
|
|
9
|
+
export class ConversationStore {
|
|
21
10
|
db;
|
|
22
|
-
constructor(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
11
|
+
constructor(dbPath) {
|
|
12
|
+
const path = dbPath ?? DEFAULT_DB_PATH;
|
|
13
|
+
if (path !== ':memory:') {
|
|
14
|
+
const dir = dirname(path);
|
|
15
|
+
if (!existsSync(dir)) {
|
|
16
|
+
mkdirSync(dir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
this.db = new DatabaseSync(path);
|
|
20
|
+
this.db.exec('PRAGMA journal_mode = WAL');
|
|
26
21
|
this.ensureSchema();
|
|
22
|
+
log.info('Opened conversation database', { path });
|
|
27
23
|
}
|
|
28
24
|
ensureSchema() {
|
|
29
25
|
this.db.exec(`
|
|
@@ -49,182 +45,6 @@ class SqliteBackend {
|
|
|
49
45
|
ON messages(conversationId, timestamp);
|
|
50
46
|
`);
|
|
51
47
|
}
|
|
52
|
-
createConversation(id, now) {
|
|
53
|
-
this.db
|
|
54
|
-
.prepare('INSERT INTO conversations (id, createdAt, updatedAt) VALUES (?, ?, ?)')
|
|
55
|
-
.run(id, now, now);
|
|
56
|
-
}
|
|
57
|
-
getConversation(id) {
|
|
58
|
-
return this.db
|
|
59
|
-
.prepare('SELECT id, createdAt, updatedAt FROM conversations WHERE id = ?')
|
|
60
|
-
.get(id);
|
|
61
|
-
}
|
|
62
|
-
listConversations() {
|
|
63
|
-
return this.db
|
|
64
|
-
.prepare('SELECT id, createdAt, updatedAt FROM conversations ORDER BY updatedAt DESC')
|
|
65
|
-
.all();
|
|
66
|
-
}
|
|
67
|
-
insertMessage(conversationId, message) {
|
|
68
|
-
this.db
|
|
69
|
-
.prepare(`INSERT INTO messages (id, conversationId, role, content, timestamp, toolCalls, toolResult, metadata)
|
|
70
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
71
|
-
.run(message.id, conversationId, message.role, message.content, message.timestamp, message.toolCalls ? JSON.stringify(message.toolCalls) : null, message.toolResult ? JSON.stringify(message.toolResult) : null, message.metadata ? JSON.stringify(message.metadata) : null);
|
|
72
|
-
this.db
|
|
73
|
-
.prepare('UPDATE conversations SET updatedAt = ? WHERE id = ?')
|
|
74
|
-
.run(Date.now(), conversationId);
|
|
75
|
-
}
|
|
76
|
-
getMessages(conversationId) {
|
|
77
|
-
const rows = this.db
|
|
78
|
-
.prepare(`SELECT id, role, content, timestamp, toolCalls, toolResult, metadata
|
|
79
|
-
FROM messages WHERE conversationId = ? ORDER BY timestamp`)
|
|
80
|
-
.all(conversationId);
|
|
81
|
-
return rows.map((row) => ({
|
|
82
|
-
id: row.id,
|
|
83
|
-
role: row.role,
|
|
84
|
-
content: row.content,
|
|
85
|
-
timestamp: row.timestamp,
|
|
86
|
-
...(row.toolCalls ? { toolCalls: JSON.parse(row.toolCalls) } : {}),
|
|
87
|
-
...(row.toolResult ? { toolResult: JSON.parse(row.toolResult) } : {}),
|
|
88
|
-
...(row.metadata ? { metadata: JSON.parse(row.metadata) } : {}),
|
|
89
|
-
}));
|
|
90
|
-
}
|
|
91
|
-
deleteConversation(id) {
|
|
92
|
-
const result = this.db
|
|
93
|
-
.prepare('DELETE FROM conversations WHERE id = ?')
|
|
94
|
-
.run(id);
|
|
95
|
-
return result.changes > 0;
|
|
96
|
-
}
|
|
97
|
-
getPreview(conversationId) {
|
|
98
|
-
const row = this.db
|
|
99
|
-
.prepare(`SELECT content FROM messages
|
|
100
|
-
WHERE conversationId = ? AND role = 'user'
|
|
101
|
-
ORDER BY timestamp ASC LIMIT 1`)
|
|
102
|
-
.get(conversationId);
|
|
103
|
-
return row?.content ?? null;
|
|
104
|
-
}
|
|
105
|
-
close() {
|
|
106
|
-
this.db.close();
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
class JsonFileBackend {
|
|
110
|
-
data;
|
|
111
|
-
filePath;
|
|
112
|
-
dirty = false;
|
|
113
|
-
flushTimer = null;
|
|
114
|
-
constructor(filePath) {
|
|
115
|
-
this.filePath = filePath;
|
|
116
|
-
this.data = { conversations: {}, messages: {} };
|
|
117
|
-
if (filePath && existsSync(filePath)) {
|
|
118
|
-
try {
|
|
119
|
-
this.data = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
log.warn('Failed to parse conversation JSON, starting fresh');
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
createConversation(id, now) {
|
|
127
|
-
this.data.conversations[id] = { id, createdAt: now, updatedAt: now };
|
|
128
|
-
this.data.messages[id] = [];
|
|
129
|
-
this.scheduleFlush();
|
|
130
|
-
}
|
|
131
|
-
getConversation(id) {
|
|
132
|
-
return this.data.conversations[id];
|
|
133
|
-
}
|
|
134
|
-
listConversations() {
|
|
135
|
-
return Object.values(this.data.conversations).sort((a, b) => b.updatedAt - a.updatedAt);
|
|
136
|
-
}
|
|
137
|
-
insertMessage(conversationId, message) {
|
|
138
|
-
const msgs = this.data.messages[conversationId];
|
|
139
|
-
if (msgs) {
|
|
140
|
-
msgs.push(message);
|
|
141
|
-
const conv = this.data.conversations[conversationId];
|
|
142
|
-
if (conv)
|
|
143
|
-
conv.updatedAt = Date.now();
|
|
144
|
-
this.scheduleFlush();
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
getMessages(conversationId) {
|
|
148
|
-
return [...(this.data.messages[conversationId] ?? [])];
|
|
149
|
-
}
|
|
150
|
-
deleteConversation(id) {
|
|
151
|
-
const existed = id in this.data.conversations;
|
|
152
|
-
delete this.data.conversations[id];
|
|
153
|
-
delete this.data.messages[id];
|
|
154
|
-
if (existed)
|
|
155
|
-
this.scheduleFlush();
|
|
156
|
-
return existed;
|
|
157
|
-
}
|
|
158
|
-
getPreview(conversationId) {
|
|
159
|
-
const msgs = this.data.messages[conversationId] ?? [];
|
|
160
|
-
const first = msgs.find((m) => m.role === 'user');
|
|
161
|
-
return first?.content ?? null;
|
|
162
|
-
}
|
|
163
|
-
close() {
|
|
164
|
-
if (this.flushTimer) {
|
|
165
|
-
clearTimeout(this.flushTimer);
|
|
166
|
-
this.flushTimer = null;
|
|
167
|
-
}
|
|
168
|
-
this.flush();
|
|
169
|
-
}
|
|
170
|
-
/** Debounced write — flush at most once per 500ms to avoid excessive I/O */
|
|
171
|
-
scheduleFlush() {
|
|
172
|
-
this.dirty = true;
|
|
173
|
-
if (this.flushTimer)
|
|
174
|
-
return;
|
|
175
|
-
this.flushTimer = setTimeout(() => {
|
|
176
|
-
this.flushTimer = null;
|
|
177
|
-
this.flush();
|
|
178
|
-
}, 500);
|
|
179
|
-
}
|
|
180
|
-
flush() {
|
|
181
|
-
if (!this.dirty || !this.filePath)
|
|
182
|
-
return;
|
|
183
|
-
try {
|
|
184
|
-
writeFileSync(this.filePath, JSON.stringify(this.data), 'utf-8');
|
|
185
|
-
this.dirty = false;
|
|
186
|
-
}
|
|
187
|
-
catch (err) {
|
|
188
|
-
log.warn('Failed to write conversation JSON', {
|
|
189
|
-
error: err instanceof Error ? err.message : String(err),
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
export class ConversationStore {
|
|
195
|
-
backend;
|
|
196
|
-
constructor(dbPath) {
|
|
197
|
-
const path = dbPath ?? DEFAULT_DB_PATH;
|
|
198
|
-
// Try SQLite first
|
|
199
|
-
if (path !== ':memory:') {
|
|
200
|
-
const dir = dirname(path);
|
|
201
|
-
if (!existsSync(dir)) {
|
|
202
|
-
mkdirSync(dir, { recursive: true });
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
const jsonPath = path === ':memory:' ? null : path.replace(/\.db$/, '.json');
|
|
206
|
-
const db = tryOpenDb(path);
|
|
207
|
-
if (db) {
|
|
208
|
-
const sqlite = new SqliteBackend(db);
|
|
209
|
-
this.backend = sqlite;
|
|
210
|
-
log.info('Opened conversation database', { path });
|
|
211
|
-
// Migrate JSON → SQLite if a JSON file exists from a previous fallback
|
|
212
|
-
if (jsonPath && existsSync(jsonPath)) {
|
|
213
|
-
this.migrateJsonToSqlite(jsonPath, sqlite);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
this.backend = new JsonFileBackend(jsonPath);
|
|
218
|
-
if (jsonPath) {
|
|
219
|
-
const hint = process.platform === 'darwin'
|
|
220
|
-
? 'xcode-select --install'
|
|
221
|
-
: process.platform === 'win32'
|
|
222
|
-
? 'npm install --global windows-build-tools'
|
|
223
|
-
: 'sudo apt install build-essential';
|
|
224
|
-
log.info(`better-sqlite3 not available, using JSON file store. For better performance, install build tools and reinstall:\n ${hint} && npm install -g @cereworker/cli`, { path: jsonPath });
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
48
|
create() {
|
|
229
49
|
const now = Date.now();
|
|
230
50
|
const conversation = {
|
|
@@ -233,12 +53,16 @@ export class ConversationStore {
|
|
|
233
53
|
createdAt: now,
|
|
234
54
|
updatedAt: now,
|
|
235
55
|
};
|
|
236
|
-
this.
|
|
56
|
+
this.db
|
|
57
|
+
.prepare('INSERT INTO conversations (id, createdAt, updatedAt) VALUES (?, ?, ?)')
|
|
58
|
+
.run(conversation.id, now, now);
|
|
237
59
|
log.debug('Created conversation', { id: conversation.id });
|
|
238
60
|
return conversation;
|
|
239
61
|
}
|
|
240
62
|
get(id) {
|
|
241
|
-
const row = this.
|
|
63
|
+
const row = this.db
|
|
64
|
+
.prepare('SELECT id, createdAt, updatedAt FROM conversations WHERE id = ?')
|
|
65
|
+
.get(id);
|
|
242
66
|
if (!row)
|
|
243
67
|
return undefined;
|
|
244
68
|
return {
|
|
@@ -249,7 +73,10 @@ export class ConversationStore {
|
|
|
249
73
|
};
|
|
250
74
|
}
|
|
251
75
|
list() {
|
|
252
|
-
|
|
76
|
+
const rows = this.db
|
|
77
|
+
.prepare('SELECT id, createdAt, updatedAt FROM conversations ORDER BY updatedAt DESC')
|
|
78
|
+
.all();
|
|
79
|
+
return rows.map((row) => ({
|
|
253
80
|
id: row.id,
|
|
254
81
|
messages: [], // Don't load messages for list view
|
|
255
82
|
createdAt: row.createdAt,
|
|
@@ -257,7 +84,9 @@ export class ConversationStore {
|
|
|
257
84
|
}));
|
|
258
85
|
}
|
|
259
86
|
appendMessage(conversationId, role, content, extra) {
|
|
260
|
-
const row = this.
|
|
87
|
+
const row = this.db
|
|
88
|
+
.prepare('SELECT id FROM conversations WHERE id = ?')
|
|
89
|
+
.get(conversationId);
|
|
261
90
|
if (!row)
|
|
262
91
|
throw new Error(`Conversation ${conversationId} not found`);
|
|
263
92
|
const message = {
|
|
@@ -267,49 +96,49 @@ export class ConversationStore {
|
|
|
267
96
|
timestamp: Date.now(),
|
|
268
97
|
...extra,
|
|
269
98
|
};
|
|
270
|
-
this.
|
|
99
|
+
this.db
|
|
100
|
+
.prepare(`INSERT INTO messages (id, conversationId, role, content, timestamp, toolCalls, toolResult, metadata)
|
|
101
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
102
|
+
.run(message.id, conversationId, message.role, message.content, message.timestamp, message.toolCalls ? JSON.stringify(message.toolCalls) : null, message.toolResult ? JSON.stringify(message.toolResult) : null, message.metadata ? JSON.stringify(message.metadata) : null);
|
|
103
|
+
this.db
|
|
104
|
+
.prepare('UPDATE conversations SET updatedAt = ? WHERE id = ?')
|
|
105
|
+
.run(Date.now(), conversationId);
|
|
271
106
|
return message;
|
|
272
107
|
}
|
|
273
108
|
getMessages(conversationId) {
|
|
274
|
-
|
|
109
|
+
const rows = this.db
|
|
110
|
+
.prepare(`SELECT id, role, content, timestamp, toolCalls, toolResult, metadata
|
|
111
|
+
FROM messages WHERE conversationId = ? ORDER BY timestamp`)
|
|
112
|
+
.all(conversationId);
|
|
113
|
+
return rows.map((row) => ({
|
|
114
|
+
id: row.id,
|
|
115
|
+
role: row.role,
|
|
116
|
+
content: row.content,
|
|
117
|
+
timestamp: row.timestamp,
|
|
118
|
+
...(row.toolCalls ? { toolCalls: JSON.parse(row.toolCalls) } : {}),
|
|
119
|
+
...(row.toolResult ? { toolResult: JSON.parse(row.toolResult) } : {}),
|
|
120
|
+
...(row.metadata ? { metadata: JSON.parse(row.metadata) } : {}),
|
|
121
|
+
}));
|
|
275
122
|
}
|
|
276
123
|
delete(id) {
|
|
277
|
-
const result = this.
|
|
278
|
-
|
|
279
|
-
|
|
124
|
+
const result = this.db
|
|
125
|
+
.prepare('DELETE FROM conversations WHERE id = ?')
|
|
126
|
+
.run(id);
|
|
127
|
+
const deleted = Number(result.changes) > 0;
|
|
128
|
+
log.debug('Deleted conversation', { id, deleted });
|
|
129
|
+
return deleted;
|
|
280
130
|
}
|
|
281
131
|
/** Get the most recent message content from a conversation (for list previews) */
|
|
282
132
|
getPreview(conversationId) {
|
|
283
|
-
|
|
133
|
+
const row = this.db
|
|
134
|
+
.prepare(`SELECT content FROM messages
|
|
135
|
+
WHERE conversationId = ? AND role = 'user'
|
|
136
|
+
ORDER BY timestamp ASC LIMIT 1`)
|
|
137
|
+
.get(conversationId);
|
|
138
|
+
return row?.content ?? null;
|
|
284
139
|
}
|
|
285
140
|
close() {
|
|
286
|
-
this.
|
|
287
|
-
}
|
|
288
|
-
/** Migrate conversations from a JSON fallback file into SQLite, then rename the JSON file */
|
|
289
|
-
migrateJsonToSqlite(jsonPath, sqlite) {
|
|
290
|
-
try {
|
|
291
|
-
const raw = JSON.parse(readFileSync(jsonPath, 'utf-8'));
|
|
292
|
-
let migrated = 0;
|
|
293
|
-
for (const conv of Object.values(raw.conversations)) {
|
|
294
|
-
// Skip if already exists in SQLite (e.g. partial previous migration)
|
|
295
|
-
if (sqlite.getConversation(conv.id))
|
|
296
|
-
continue;
|
|
297
|
-
sqlite.createConversation(conv.id, conv.createdAt);
|
|
298
|
-
const msgs = raw.messages[conv.id] ?? [];
|
|
299
|
-
for (const msg of msgs) {
|
|
300
|
-
sqlite.insertMessage(conv.id, msg);
|
|
301
|
-
}
|
|
302
|
-
migrated++;
|
|
303
|
-
}
|
|
304
|
-
// Rename instead of delete so nothing is lost if something goes wrong
|
|
305
|
-
renameSync(jsonPath, jsonPath + '.migrated');
|
|
306
|
-
log.info('Migrated JSON conversations to SQLite', { migrated, source: jsonPath });
|
|
307
|
-
}
|
|
308
|
-
catch (err) {
|
|
309
|
-
log.warn('Failed to migrate JSON conversations to SQLite', {
|
|
310
|
-
error: err instanceof Error ? err.message : String(err),
|
|
311
|
-
});
|
|
312
|
-
}
|
|
141
|
+
this.db.close();
|
|
313
142
|
}
|
|
314
143
|
}
|
|
315
144
|
//# sourceMappingURL=conversation.js.map
|
package/dist/conversation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"conversation.js","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
|
package/dist/pairing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAe;gBAEb,MAAM,CAAC,EAAE,MAAM;IAQ3B,OAAO,CAAC,YAAY;IA0BpB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA8C1F,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAQrD,WAAW,IAAI,cAAc,EAAE;IAM/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAqCzC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOxD,WAAW,IAAI,MAAM;IAOrB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOxD,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/pairing.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
1
2
|
import { randomInt } from 'node:crypto';
|
|
2
3
|
import { join } from 'node:path';
|
|
3
4
|
import { homedir } from 'node:os';
|
|
4
|
-
import { createRequire } from 'node:module';
|
|
5
5
|
import { createLogger } from './logger.js';
|
|
6
6
|
const log = createLogger('pairing');
|
|
7
|
-
const require = createRequire(import.meta.url);
|
|
8
7
|
const DEFAULT_DB_PATH = join(homedir(), '.cereworker', 'conversations.db');
|
|
9
8
|
const CODE_ALPHABET = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
|
|
10
9
|
const CODE_LENGTH = 8;
|
|
@@ -23,28 +22,14 @@ export function formatCode(code) {
|
|
|
23
22
|
export function normalizeCode(input) {
|
|
24
23
|
return input.replace(/[-\s]/g, '').toUpperCase();
|
|
25
24
|
}
|
|
26
|
-
function tryOpenDb(dbPath) {
|
|
27
|
-
try {
|
|
28
|
-
const Database = require('better-sqlite3');
|
|
29
|
-
return new Database(dbPath);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
25
|
export class PairingStore {
|
|
36
26
|
db;
|
|
37
27
|
constructor(dbPath) {
|
|
38
28
|
const path = dbPath ?? DEFAULT_DB_PATH;
|
|
39
|
-
this.db =
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
log.info('Opened pairing database', { path });
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
log.warn('better-sqlite3 not available — pairing will be disabled. Run "cereworker onboard" to install build tools.');
|
|
47
|
-
}
|
|
29
|
+
this.db = new DatabaseSync(path);
|
|
30
|
+
this.db.exec('PRAGMA journal_mode = WAL');
|
|
31
|
+
this.ensureSchema();
|
|
32
|
+
log.info('Opened pairing database', { path });
|
|
48
33
|
}
|
|
49
34
|
ensureSchema() {
|
|
50
35
|
this.db.exec(`
|
|
@@ -72,8 +57,6 @@ export class PairingStore {
|
|
|
72
57
|
`);
|
|
73
58
|
}
|
|
74
59
|
createPairingCode(channelId, senderId, senderName) {
|
|
75
|
-
if (!this.db)
|
|
76
|
-
return null;
|
|
77
60
|
this.expireStale();
|
|
78
61
|
// Check for existing pending code for this sender+channel
|
|
79
62
|
const existing = this.db.prepare(`SELECT code FROM pairing_requests WHERE channelId = ? AND senderId = ? AND status = 'pending' AND expiresAt > ?`).get(channelId, senderId, Date.now());
|
|
@@ -104,20 +87,14 @@ export class PairingStore {
|
|
|
104
87
|
return formatCode(code);
|
|
105
88
|
}
|
|
106
89
|
getPendingByCode(code) {
|
|
107
|
-
if (!this.db)
|
|
108
|
-
return null;
|
|
109
90
|
const normalized = normalizeCode(code);
|
|
110
91
|
const row = this.db.prepare(`SELECT * FROM pairing_requests WHERE code = ? AND status = 'pending' AND expiresAt > ?`).get(normalized, Date.now());
|
|
111
92
|
return row ?? null;
|
|
112
93
|
}
|
|
113
94
|
listPending() {
|
|
114
|
-
if (!this.db)
|
|
115
|
-
return [];
|
|
116
95
|
return this.db.prepare(`SELECT * FROM pairing_requests WHERE status = 'pending' AND expiresAt > ? ORDER BY createdAt DESC`).all(Date.now());
|
|
117
96
|
}
|
|
118
97
|
approveCode(code) {
|
|
119
|
-
if (!this.db)
|
|
120
|
-
return { ok: false, error: 'Pairing unavailable (database not available)' };
|
|
121
98
|
const normalized = normalizeCode(code);
|
|
122
99
|
this.expireStale();
|
|
123
100
|
const request = this.db.prepare(`SELECT * FROM pairing_requests WHERE code = ? AND status = 'pending' AND expiresAt > ?`).get(normalized, Date.now());
|
|
@@ -142,25 +119,19 @@ export class PairingStore {
|
|
|
142
119
|
};
|
|
143
120
|
}
|
|
144
121
|
isApproved(channelId, senderId) {
|
|
145
|
-
if (!this.db)
|
|
146
|
-
return true;
|
|
147
122
|
const row = this.db.prepare(`SELECT 1 FROM approved_users WHERE channelId = ? AND senderId = ?`).get(channelId, senderId);
|
|
148
123
|
return !!row;
|
|
149
124
|
}
|
|
150
125
|
expireStale() {
|
|
151
|
-
if (!this.db)
|
|
152
|
-
return 0;
|
|
153
126
|
const result = this.db.prepare(`UPDATE pairing_requests SET status = 'expired' WHERE status = 'pending' AND expiresAt <= ?`).run(Date.now());
|
|
154
|
-
return result.changes;
|
|
127
|
+
return Number(result.changes);
|
|
155
128
|
}
|
|
156
129
|
addConfigUser(channelId, senderId) {
|
|
157
|
-
if (!this.db)
|
|
158
|
-
return;
|
|
159
130
|
this.db.prepare(`INSERT OR IGNORE INTO approved_users (channelId, senderId, approvedAt, approvedVia)
|
|
160
131
|
VALUES (?, ?, ?, 'config')`).run(channelId, senderId, Date.now());
|
|
161
132
|
}
|
|
162
133
|
close() {
|
|
163
|
-
this.db
|
|
134
|
+
this.db.close();
|
|
164
135
|
}
|
|
165
136
|
}
|
|
166
137
|
//# sourceMappingURL=pairing.js.map
|
package/dist/pairing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cereworker/core",
|
|
3
|
-
"version": "26.
|
|
3
|
+
"version": "26.323.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -16,14 +16,10 @@
|
|
|
16
16
|
"directory": "packages/core"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@cereworker/config": "26.
|
|
19
|
+
"@cereworker/config": "26.323.1",
|
|
20
20
|
"nanoid": "^5.0.9"
|
|
21
21
|
},
|
|
22
|
-
"optionalDependencies": {
|
|
23
|
-
"better-sqlite3": "^11.7.0"
|
|
24
|
-
},
|
|
25
22
|
"devDependencies": {
|
|
26
|
-
"@types/better-sqlite3": "^7.6.12",
|
|
27
23
|
"typescript": "^5.7.3"
|
|
28
24
|
},
|
|
29
25
|
"scripts": {
|