linkedin-toolkit-mcp 2.0.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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/dist/bridge.d.ts +95 -0
  4. package/dist/bridge.js +259 -0
  5. package/dist/bridge.js.map +1 -0
  6. package/dist/cli.d.ts +83 -0
  7. package/dist/cli.js +898 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config.d.ts +47 -0
  10. package/dist/config.js +149 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/contract.d.ts +6770 -0
  13. package/dist/contract.js +926 -0
  14. package/dist/contract.js.map +1 -0
  15. package/dist/db.d.ts +64 -0
  16. package/dist/db.js +542 -0
  17. package/dist/db.js.map +1 -0
  18. package/dist/fake-data.d.ts +277 -0
  19. package/dist/fake-data.js +789 -0
  20. package/dist/fake-data.js.map +1 -0
  21. package/dist/fake-extension.d.ts +51 -0
  22. package/dist/fake-extension.js +151 -0
  23. package/dist/fake-extension.js.map +1 -0
  24. package/dist/gen.d.ts +5 -0
  25. package/dist/gen.js +22 -0
  26. package/dist/gen.js.map +1 -0
  27. package/dist/http.d.ts +27 -0
  28. package/dist/http.js +329 -0
  29. package/dist/http.js.map +1 -0
  30. package/dist/openapi.d.ts +30 -0
  31. package/dist/openapi.js +306 -0
  32. package/dist/openapi.js.map +1 -0
  33. package/dist/prompts.d.ts +9 -0
  34. package/dist/prompts.js +65 -0
  35. package/dist/prompts.js.map +1 -0
  36. package/dist/resources.d.ts +7 -0
  37. package/dist/resources.js +73 -0
  38. package/dist/resources.js.map +1 -0
  39. package/dist/server.d.ts +3 -0
  40. package/dist/server.js +38 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/toolkit.d.ts +82 -0
  43. package/dist/toolkit.js +171 -0
  44. package/dist/toolkit.js.map +1 -0
  45. package/dist/tools.d.ts +31 -0
  46. package/dist/tools.js +103 -0
  47. package/dist/tools.js.map +1 -0
  48. package/dist/webhooks.d.ts +52 -0
  49. package/dist/webhooks.js +112 -0
  50. package/dist/webhooks.js.map +1 -0
  51. package/openapi.json +8334 -0
  52. package/package.json +45 -0
  53. package/tools.json +1205 -0
package/dist/db.js ADDED
@@ -0,0 +1,542 @@
1
+ /**
2
+ * The local SQLite mirror.
3
+ *
4
+ * Everything the toolkit sees — sync pulls and the results of individual tool
5
+ * calls — is upserted here so agents can count, filter and join with
6
+ * `linkedin_query_sql` instead of re-scraping LinkedIn. The file lives at
7
+ * `~/.linkedin-toolkit/toolkit.db` unless the config overrides it.
8
+ */
9
+ import Database from 'better-sqlite3';
10
+ import { mkdirSync } from 'node:fs';
11
+ import { dirname } from 'node:path';
12
+ export const ROW_CAP = 1000;
13
+ export const QUERY_TIMEOUT_MS = 5000;
14
+ const SCHEMA = `
15
+ CREATE TABLE IF NOT EXISTS profiles (
16
+ public_id TEXT PRIMARY KEY,
17
+ urn TEXT, url TEXT, first_name TEXT, last_name TEXT, full_name TEXT,
18
+ headline TEXT, title TEXT, company TEXT, company_urn TEXT,
19
+ location TEXT, industry TEXT, photo_url TEXT,
20
+ connection_degree INTEGER, skills TEXT, experience TEXT, education TEXT,
21
+ page_text TEXT, source TEXT, captured_at INTEGER, data TEXT,
22
+ updated_at INTEGER NOT NULL
23
+ );
24
+ CREATE TABLE IF NOT EXISTS companies (
25
+ universal_name TEXT PRIMARY KEY,
26
+ urn TEXT, name TEXT, url TEXT, industry TEXT, size TEXT, hq TEXT,
27
+ website TEXT, description TEXT, follower_count INTEGER,
28
+ captured_at INTEGER, data TEXT,
29
+ updated_at INTEGER NOT NULL
30
+ );
31
+ CREATE TABLE IF NOT EXISTS searches (
32
+ search_id TEXT PRIMARY KEY,
33
+ keywords TEXT, filters TEXT, source TEXT, total INTEGER,
34
+ ran_at INTEGER, updated_at INTEGER NOT NULL
35
+ );
36
+ CREATE TABLE IF NOT EXISTS search_results (
37
+ search_id TEXT NOT NULL,
38
+ public_id TEXT NOT NULL,
39
+ position INTEGER,
40
+ updated_at INTEGER NOT NULL,
41
+ PRIMARY KEY (search_id, public_id)
42
+ );
43
+ CREATE TABLE IF NOT EXISTS lists (
44
+ list_id TEXT PRIMARY KEY,
45
+ name TEXT, tags TEXT, created_at INTEGER, count INTEGER,
46
+ updated_at INTEGER NOT NULL
47
+ );
48
+ CREATE TABLE IF NOT EXISTS list_members (
49
+ list_id TEXT NOT NULL,
50
+ public_id TEXT NOT NULL,
51
+ added_at INTEGER, tags TEXT, contacted_before INTEGER, signals TEXT,
52
+ updated_at INTEGER NOT NULL,
53
+ PRIMARY KEY (list_id, public_id)
54
+ );
55
+ CREATE TABLE IF NOT EXISTS campaigns (
56
+ campaign_id TEXT PRIMARY KEY,
57
+ name TEXT, status TEXT, steps TEXT, settings TEXT, stats TEXT,
58
+ created_at INTEGER, updated_at INTEGER NOT NULL
59
+ );
60
+ CREATE TABLE IF NOT EXISTS enrollments (
61
+ campaign_id TEXT NOT NULL,
62
+ public_id TEXT NOT NULL,
63
+ step_index INTEGER, status TEXT, enrolled_at INTEGER, next_at INTEGER,
64
+ data TEXT, updated_at INTEGER NOT NULL,
65
+ PRIMARY KEY (campaign_id, public_id)
66
+ );
67
+ CREATE TABLE IF NOT EXISTS actions (
68
+ id TEXT PRIMARY KEY,
69
+ action TEXT, public_id TEXT, campaign_id TEXT, status TEXT,
70
+ params TEXT, result TEXT, at INTEGER, updated_at INTEGER NOT NULL
71
+ );
72
+ CREATE TABLE IF NOT EXISTS conversations (
73
+ thread_id TEXT PRIMARY KEY,
74
+ participants TEXT, last_message_at INTEGER, unread INTEGER,
75
+ snippet TEXT, sentiment TEXT, updated_at INTEGER NOT NULL
76
+ );
77
+ CREATE TABLE IF NOT EXISTS messages (
78
+ message_id TEXT PRIMARY KEY,
79
+ thread_id TEXT, from_public_id TEXT, body TEXT, sent_at INTEGER,
80
+ updated_at INTEGER NOT NULL
81
+ );
82
+ CREATE TABLE IF NOT EXISTS events (
83
+ id TEXT PRIMARY KEY,
84
+ event TEXT, payload TEXT, at INTEGER, updated_at INTEGER NOT NULL
85
+ );
86
+ CREATE TABLE IF NOT EXISTS packs (
87
+ pack_id TEXT PRIMARY KEY,
88
+ job_id TEXT, public_id TEXT, universal_name TEXT, kind TEXT,
89
+ confidence REAL, signals TEXT, markdown TEXT, csv_row TEXT, data TEXT,
90
+ updated_at INTEGER NOT NULL
91
+ );
92
+ CREATE TABLE IF NOT EXISTS meta (
93
+ key TEXT PRIMARY KEY,
94
+ value TEXT,
95
+ updated_at INTEGER NOT NULL
96
+ );
97
+
98
+ CREATE INDEX IF NOT EXISTS idx_profiles_company ON profiles(company);
99
+ CREATE INDEX IF NOT EXISTS idx_list_members_public ON list_members(public_id);
100
+ CREATE INDEX IF NOT EXISTS idx_messages_thread ON messages(thread_id);
101
+ CREATE INDEX IF NOT EXISTS idx_packs_public ON packs(public_id);
102
+ `;
103
+ export const TABLES = [
104
+ 'profiles',
105
+ 'companies',
106
+ 'searches',
107
+ 'search_results',
108
+ 'lists',
109
+ 'list_members',
110
+ 'campaigns',
111
+ 'enrollments',
112
+ 'actions',
113
+ 'conversations',
114
+ 'messages',
115
+ 'events',
116
+ 'packs',
117
+ ];
118
+ const json = (v) => (v === undefined || v === null ? null : JSON.stringify(v));
119
+ const bool = (v) => (v ? 1 : 0);
120
+ const num = (v) => (typeof v === 'number' ? v : null);
121
+ const str = (v) => (typeof v === 'string' ? v : null);
122
+ export class Db {
123
+ db;
124
+ path;
125
+ constructor(path) {
126
+ this.path = path;
127
+ if (path !== ':memory:')
128
+ mkdirSync(dirname(path), { recursive: true });
129
+ this.db = new Database(path);
130
+ this.db.pragma('journal_mode = WAL');
131
+ this.db.pragma('foreign_keys = ON');
132
+ this.db.exec(SCHEMA);
133
+ }
134
+ close() {
135
+ this.db.close();
136
+ }
137
+ /* --------------------------- meta ---------------------------- */
138
+ getMeta(key) {
139
+ const row = this.db.prepare('SELECT value FROM meta WHERE key = ?').get(key);
140
+ return row?.value ?? null;
141
+ }
142
+ setMeta(key, value) {
143
+ this.db
144
+ .prepare(`INSERT INTO meta (key, value, updated_at) VALUES (?, ?, ?)
145
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = excluded.updated_at`)
146
+ .run(key, value, Date.now());
147
+ }
148
+ get lastSyncAt() {
149
+ const raw = this.getMeta('lastSyncAt');
150
+ return raw ? Number(raw) : 0;
151
+ }
152
+ set lastSyncAt(at) {
153
+ this.setMeta('lastSyncAt', String(at));
154
+ }
155
+ /* ------------------------- upserts ---------------------------- */
156
+ upsertProfile(profile, now = Date.now()) {
157
+ if (!profile || typeof profile.publicId !== 'string' || !profile.publicId)
158
+ return;
159
+ this.db
160
+ .prepare(`INSERT INTO profiles (public_id, urn, url, first_name, last_name, full_name, headline,
161
+ title, company, company_urn, location, industry, photo_url, connection_degree,
162
+ skills, experience, education, page_text, source, captured_at, data, updated_at)
163
+ VALUES (@public_id, @urn, @url, @first_name, @last_name, @full_name, @headline,
164
+ @title, @company, @company_urn, @location, @industry, @photo_url, @connection_degree,
165
+ @skills, @experience, @education, @page_text, @source, @captured_at, @data, @updated_at)
166
+ ON CONFLICT(public_id) DO UPDATE SET
167
+ urn=COALESCE(excluded.urn, profiles.urn),
168
+ url=COALESCE(excluded.url, profiles.url),
169
+ first_name=COALESCE(excluded.first_name, profiles.first_name),
170
+ last_name=COALESCE(excluded.last_name, profiles.last_name),
171
+ full_name=COALESCE(excluded.full_name, profiles.full_name),
172
+ headline=COALESCE(excluded.headline, profiles.headline),
173
+ title=COALESCE(excluded.title, profiles.title),
174
+ company=COALESCE(excluded.company, profiles.company),
175
+ company_urn=COALESCE(excluded.company_urn, profiles.company_urn),
176
+ location=COALESCE(excluded.location, profiles.location),
177
+ industry=COALESCE(excluded.industry, profiles.industry),
178
+ photo_url=COALESCE(excluded.photo_url, profiles.photo_url),
179
+ connection_degree=COALESCE(excluded.connection_degree, profiles.connection_degree),
180
+ skills=COALESCE(excluded.skills, profiles.skills),
181
+ experience=COALESCE(excluded.experience, profiles.experience),
182
+ education=COALESCE(excluded.education, profiles.education),
183
+ page_text=COALESCE(excluded.page_text, profiles.page_text),
184
+ source=COALESCE(excluded.source, profiles.source),
185
+ captured_at=COALESCE(excluded.captured_at, profiles.captured_at),
186
+ data=excluded.data,
187
+ updated_at=excluded.updated_at`)
188
+ .run({
189
+ public_id: profile.publicId,
190
+ urn: str(profile.urn),
191
+ url: str(profile.url),
192
+ first_name: str(profile.firstName),
193
+ last_name: str(profile.lastName),
194
+ full_name: str(profile.fullName),
195
+ headline: str(profile.headline),
196
+ title: str(profile.title),
197
+ company: str(profile.company),
198
+ company_urn: str(profile.companyUrn),
199
+ location: str(profile.location),
200
+ industry: str(profile.industry),
201
+ photo_url: str(profile.photoUrl),
202
+ connection_degree: num(profile.connectionDegree),
203
+ skills: json(profile.skills),
204
+ experience: json(profile.experience),
205
+ education: json(profile.education),
206
+ page_text: str(profile.pageText),
207
+ source: str(profile.source),
208
+ captured_at: num(profile.capturedAt),
209
+ data: JSON.stringify(profile),
210
+ updated_at: now,
211
+ });
212
+ }
213
+ upsertCompany(company, now = Date.now()) {
214
+ if (!company || typeof company.universalName !== 'string' || !company.universalName)
215
+ return;
216
+ this.db
217
+ .prepare(`INSERT INTO companies (universal_name, urn, name, url, industry, size, hq, website,
218
+ description, follower_count, captured_at, data, updated_at)
219
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
220
+ ON CONFLICT(universal_name) DO UPDATE SET
221
+ urn=COALESCE(excluded.urn, companies.urn),
222
+ name=COALESCE(excluded.name, companies.name),
223
+ url=COALESCE(excluded.url, companies.url),
224
+ industry=COALESCE(excluded.industry, companies.industry),
225
+ size=COALESCE(excluded.size, companies.size),
226
+ hq=COALESCE(excluded.hq, companies.hq),
227
+ website=COALESCE(excluded.website, companies.website),
228
+ description=COALESCE(excluded.description, companies.description),
229
+ follower_count=COALESCE(excluded.follower_count, companies.follower_count),
230
+ captured_at=COALESCE(excluded.captured_at, companies.captured_at),
231
+ data=excluded.data,
232
+ updated_at=excluded.updated_at`)
233
+ .run(company.universalName, str(company.urn), str(company.name), str(company.url), str(company.industry), str(company.size), str(company.hq), str(company.website), str(company.description), num(company.followerCount), num(company.capturedAt), JSON.stringify(company), now);
234
+ }
235
+ upsertList(list, now = Date.now()) {
236
+ if (!list || typeof list.listId !== 'string')
237
+ return;
238
+ this.db
239
+ .prepare(`INSERT INTO lists (list_id, name, tags, created_at, count, updated_at)
240
+ VALUES (?, ?, ?, ?, ?, ?)
241
+ ON CONFLICT(list_id) DO UPDATE SET
242
+ name=excluded.name, tags=excluded.tags, created_at=excluded.created_at,
243
+ count=excluded.count, updated_at=excluded.updated_at`)
244
+ .run(list.listId, str(list.name), json(list.tags ?? []), num(list.createdAt), num(list.count), now);
245
+ }
246
+ upsertListMember(member, now = Date.now()) {
247
+ const listId = member?.listId;
248
+ const publicId = member?.publicId ?? member?.profile?.publicId;
249
+ if (typeof listId !== 'string' || typeof publicId !== 'string')
250
+ return;
251
+ if (member.profile)
252
+ this.upsertProfile(member.profile, now);
253
+ this.db
254
+ .prepare(`INSERT INTO list_members (list_id, public_id, added_at, tags, contacted_before, signals, updated_at)
255
+ VALUES (?, ?, ?, ?, ?, ?, ?)
256
+ ON CONFLICT(list_id, public_id) DO UPDATE SET
257
+ added_at=excluded.added_at, tags=excluded.tags,
258
+ contacted_before=excluded.contacted_before, signals=excluded.signals,
259
+ updated_at=excluded.updated_at`)
260
+ .run(listId, publicId, num(member.addedAt), json(member.tags ?? []), bool(member.contactedBefore), json(member.signals ?? null), now);
261
+ }
262
+ upsertCampaign(campaign, now = Date.now()) {
263
+ if (!campaign || typeof campaign.campaignId !== 'string')
264
+ return;
265
+ this.db
266
+ .prepare(`INSERT INTO campaigns (campaign_id, name, status, steps, settings, stats, created_at, updated_at)
267
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
268
+ ON CONFLICT(campaign_id) DO UPDATE SET
269
+ name=excluded.name, status=excluded.status, steps=excluded.steps,
270
+ settings=excluded.settings, stats=excluded.stats,
271
+ created_at=excluded.created_at, updated_at=excluded.updated_at`)
272
+ .run(campaign.campaignId, str(campaign.name), str(campaign.status), json(campaign.steps ?? []), json(campaign.settings ?? {}), json(campaign.stats ?? null), num(campaign.createdAt), now);
273
+ }
274
+ upsertEnrollment(enrollment, now = Date.now()) {
275
+ if (typeof enrollment?.campaignId !== 'string' ||
276
+ typeof enrollment?.publicId !== 'string')
277
+ return;
278
+ this.db
279
+ .prepare(`INSERT INTO enrollments (campaign_id, public_id, step_index, status, enrolled_at, next_at, data, updated_at)
280
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
281
+ ON CONFLICT(campaign_id, public_id) DO UPDATE SET
282
+ step_index=excluded.step_index, status=excluded.status,
283
+ enrolled_at=excluded.enrolled_at, next_at=excluded.next_at,
284
+ data=excluded.data, updated_at=excluded.updated_at`)
285
+ .run(enrollment.campaignId, enrollment.publicId, num(enrollment.stepIndex), str(enrollment.status), num(enrollment.enrolledAt), num(enrollment.nextAt), JSON.stringify(enrollment), now);
286
+ }
287
+ upsertAction(action, now = Date.now()) {
288
+ const id = action?.id ?? action?.actionId;
289
+ if (typeof id !== 'string')
290
+ return;
291
+ this.db
292
+ .prepare(`INSERT INTO actions (id, action, public_id, campaign_id, status, params, result, at, updated_at)
293
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
294
+ ON CONFLICT(id) DO UPDATE SET
295
+ action=excluded.action, public_id=excluded.public_id, campaign_id=excluded.campaign_id,
296
+ status=excluded.status, params=excluded.params, result=excluded.result,
297
+ at=excluded.at, updated_at=excluded.updated_at`)
298
+ .run(id, str(action.action), str(action.publicId), str(action.campaignId), str(action.status), json(action.params ?? null), json(action.result ?? null), num(action.at), now);
299
+ }
300
+ upsertThread(thread, now = Date.now()) {
301
+ if (!thread || typeof thread.threadId !== 'string')
302
+ return;
303
+ this.db
304
+ .prepare(`INSERT INTO conversations (thread_id, participants, last_message_at, unread, snippet, sentiment, updated_at)
305
+ VALUES (?, ?, ?, ?, ?, ?, ?)
306
+ ON CONFLICT(thread_id) DO UPDATE SET
307
+ participants=excluded.participants, last_message_at=excluded.last_message_at,
308
+ unread=excluded.unread, snippet=excluded.snippet, sentiment=excluded.sentiment,
309
+ updated_at=excluded.updated_at`)
310
+ .run(thread.threadId, json(thread.participants ?? []), num(thread.lastMessageAt), bool(thread.unread), str(thread.snippet), str(thread.sentiment), now);
311
+ }
312
+ upsertMessage(message, now = Date.now()) {
313
+ if (!message || typeof message.messageId !== 'string')
314
+ return;
315
+ this.db
316
+ .prepare(`INSERT INTO messages (message_id, thread_id, from_public_id, body, sent_at, updated_at)
317
+ VALUES (?, ?, ?, ?, ?, ?)
318
+ ON CONFLICT(message_id) DO UPDATE SET
319
+ thread_id=excluded.thread_id, from_public_id=excluded.from_public_id,
320
+ body=excluded.body, sent_at=excluded.sent_at, updated_at=excluded.updated_at`)
321
+ .run(message.messageId, str(message.threadId), str(message.fromPublicId), str(message.body), num(message.sentAt), now);
322
+ }
323
+ upsertEvent(event, now = Date.now()) {
324
+ const id = typeof event?.id === 'string'
325
+ ? event.id
326
+ : `${event?.event ?? 'event'}:${event?.at ?? now}:${JSON.stringify(event?.payload ?? {})}`;
327
+ this.db
328
+ .prepare(`INSERT INTO events (id, event, payload, at, updated_at)
329
+ VALUES (?, ?, ?, ?, ?)
330
+ ON CONFLICT(id) DO UPDATE SET
331
+ event=excluded.event, payload=excluded.payload, at=excluded.at,
332
+ updated_at=excluded.updated_at`)
333
+ .run(id, str(event?.event), json(event?.payload ?? null), num(event?.at) ?? now, now);
334
+ }
335
+ upsertSearch(search, now = Date.now()) {
336
+ if (!search || typeof search.searchId !== 'string')
337
+ return;
338
+ this.db
339
+ .prepare(`INSERT INTO searches (search_id, keywords, filters, source, total, ran_at, updated_at)
340
+ VALUES (?, ?, ?, ?, ?, ?, ?)
341
+ ON CONFLICT(search_id) DO UPDATE SET
342
+ keywords=excluded.keywords, filters=excluded.filters, source=excluded.source,
343
+ total=excluded.total, ran_at=excluded.ran_at, updated_at=excluded.updated_at`)
344
+ .run(search.searchId, str(search.keywords), json(search.filters ?? null), str(search.source), num(search.total), num(search.ranAt) ?? now, now);
345
+ let position = 0;
346
+ for (const profile of search.profiles ?? []) {
347
+ this.upsertProfile(profile, now);
348
+ this.db
349
+ .prepare(`INSERT INTO search_results (search_id, public_id, position, updated_at)
350
+ VALUES (?, ?, ?, ?)
351
+ ON CONFLICT(search_id, public_id) DO UPDATE SET
352
+ position=excluded.position, updated_at=excluded.updated_at`)
353
+ .run(search.searchId, profile.publicId, position++, now);
354
+ }
355
+ }
356
+ upsertPack(pack, jobId = null, now = Date.now()) {
357
+ if (!pack)
358
+ return;
359
+ const publicId = pack.resolved?.publicId ?? pack.profile?.publicId ?? null;
360
+ const universalName = pack.resolved?.universalName ?? pack.company?.universalName ?? null;
361
+ const packId = `${jobId ?? 'pack'}:${publicId ?? universalName ?? JSON.stringify(pack.row ?? {})}`;
362
+ if (pack.profile)
363
+ this.upsertProfile(pack.profile, now);
364
+ if (pack.company)
365
+ this.upsertCompany(pack.company, now);
366
+ this.db
367
+ .prepare(`INSERT INTO packs (pack_id, job_id, public_id, universal_name, kind, confidence,
368
+ signals, markdown, csv_row, data, updated_at)
369
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
370
+ ON CONFLICT(pack_id) DO UPDATE SET
371
+ job_id=excluded.job_id, public_id=excluded.public_id,
372
+ universal_name=excluded.universal_name, kind=excluded.kind,
373
+ confidence=excluded.confidence, signals=excluded.signals,
374
+ markdown=excluded.markdown, csv_row=excluded.csv_row, data=excluded.data,
375
+ updated_at=excluded.updated_at`)
376
+ .run(packId, jobId, publicId, universalName, str(pack.resolved?.kind), num(pack.resolved?.confidence), json(pack.signals ?? []), str(pack.markdown), json(pack.csvRow ?? {}), JSON.stringify(pack), now);
377
+ }
378
+ /**
379
+ * Apply a `sync.pull` payload. Idempotent: applying the same payload twice
380
+ * leaves exactly the same rows.
381
+ */
382
+ upsertSync(payload, now = Date.now()) {
383
+ const counts = {};
384
+ if (!payload)
385
+ return counts;
386
+ const apply = (table, rows, fn) => {
387
+ if (!Array.isArray(rows) || rows.length === 0)
388
+ return;
389
+ for (const row of rows)
390
+ fn(row);
391
+ counts[table] = (counts[table] ?? 0) + rows.length;
392
+ };
393
+ const run = this.db.transaction(() => {
394
+ apply('profiles', payload.profiles, (p) => this.upsertProfile(p, now));
395
+ apply('companies', payload.companies, (c) => this.upsertCompany(c, now));
396
+ apply('searches', payload.searches, (s) => this.upsertSearch(s, now));
397
+ apply('lists', payload.lists, (l) => this.upsertList(l, now));
398
+ apply('list_members', payload.listMembers, (m) => this.upsertListMember(m, now));
399
+ apply('campaigns', payload.campaigns, (c) => this.upsertCampaign(c, now));
400
+ apply('enrollments', payload.enrollments, (e) => this.upsertEnrollment(e, now));
401
+ apply('actions', payload.actions, (a) => this.upsertAction(a, now));
402
+ apply('conversations', payload.threads, (t) => this.upsertThread(t, now));
403
+ apply('messages', payload.messages, (m) => this.upsertMessage(m, now));
404
+ apply('events', payload.events, (e) => this.upsertEvent(e, now));
405
+ apply('packs', payload.packs, (p) => this.upsertPack(p, null, now));
406
+ });
407
+ run();
408
+ return counts;
409
+ }
410
+ /**
411
+ * Mirror whatever a tool result happens to contain. Best effort and never
412
+ * throws: a tool call must not fail because the mirror could not store it.
413
+ */
414
+ recordToolResult(action, data) {
415
+ if (!data || typeof data !== 'object')
416
+ return;
417
+ const now = Date.now();
418
+ const d = data;
419
+ try {
420
+ const run = this.db.transaction(() => {
421
+ if (typeof d.publicId === 'string')
422
+ this.upsertProfile(d, now);
423
+ if (typeof d.universalName === 'string' && typeof d.name === 'string')
424
+ this.upsertCompany(d, now);
425
+ for (const p of d.profiles ?? [])
426
+ this.upsertProfile(p, now);
427
+ for (const e of d.engagers ?? [])
428
+ this.upsertProfile(e, now);
429
+ for (const c of d.companies ?? [])
430
+ this.upsertCompany(c, now);
431
+ for (const t of d.threads ?? [])
432
+ this.upsertThread(t, now);
433
+ for (const m of d.messages ?? [])
434
+ this.upsertMessage(m, now);
435
+ for (const l of d.lists ?? [])
436
+ this.upsertList(l, now);
437
+ for (const m of d.members ?? [])
438
+ this.upsertListMember({ ...m, listId: m.listId ?? d.listId }, now);
439
+ for (const c of d.campaigns ?? [])
440
+ this.upsertCampaign(c, now);
441
+ for (const p of d.packs ?? [])
442
+ this.upsertPack(p, typeof d.jobId === 'string' ? d.jobId : null, now);
443
+ for (const r of d.resolved ?? []) {
444
+ for (const candidate of r?.candidates ?? [])
445
+ this.upsertProfile(candidate, now);
446
+ }
447
+ if (typeof d.campaignId === 'string' && typeof d.name === 'string')
448
+ this.upsertCampaign(d, now);
449
+ if (typeof d.listId === 'string' && typeof d.name === 'string')
450
+ this.upsertList(d, now);
451
+ if (action === 'search.people' && Array.isArray(d.profiles)) {
452
+ // keep a lightweight record of the search itself when the engine gave us one
453
+ if (typeof d.searchId === 'string')
454
+ this.upsertSearch(d, now);
455
+ }
456
+ });
457
+ run();
458
+ }
459
+ catch {
460
+ /* the mirror is a convenience, never a failure path */
461
+ }
462
+ }
463
+ /* --------------------------- query ---------------------------- */
464
+ /** Read-only SQL: one SELECT or WITH statement, 5 s budget, 1,000 rows. */
465
+ query(sql, params = []) {
466
+ const trimmed = String(sql ?? '').trim().replace(/;\s*$/, '');
467
+ if (!trimmed)
468
+ throw new Error('Empty query.');
469
+ if (trimmed.includes(';')) {
470
+ throw new Error('Only a single statement is allowed.');
471
+ }
472
+ // Comments before the statement would let `--\nPRAGMA ...` or a block
473
+ // comment hide the real verb from the check below, so they are refused
474
+ // outright rather than stripped.
475
+ if (/^(--|\/\*)/.test(trimmed)) {
476
+ throw new Error('Comments are not allowed before the statement.');
477
+ }
478
+ if (!/^(select|with)\b/i.test(trimmed)) {
479
+ throw new Error('Only read-only SELECT or WITH queries are allowed.');
480
+ }
481
+ // Defence in depth, in this order:
482
+ // 1. the verb check above,
483
+ // 2. a connection SQLite itself refuses writes on — a separate read-only
484
+ // handle for a file database, `query_only` for an in-memory one,
485
+ // whose single connection cannot be reopened read-only,
486
+ // 3. `statement.readonly`, which is false for a writing statement that
487
+ // still returns rows, e.g. `WITH x AS (...) INSERT ... RETURNING *`.
488
+ const inMemory = this.path === ':memory:';
489
+ const readonlyDb = inMemory ? this.db : new Database(this.path, { readonly: true });
490
+ if (inMemory)
491
+ readonlyDb.pragma('query_only = ON');
492
+ try {
493
+ const statement = readonlyDb.prepare(trimmed);
494
+ if (!statement.reader || !statement.readonly) {
495
+ throw new Error('Only read-only SELECT or WITH queries are allowed.');
496
+ }
497
+ const deadline = Date.now() + QUERY_TIMEOUT_MS;
498
+ const rows = [];
499
+ let truncated = false;
500
+ for (const row of statement.iterate(...params)) {
501
+ if (rows.length >= ROW_CAP) {
502
+ truncated = true;
503
+ break;
504
+ }
505
+ if (Date.now() > deadline) {
506
+ throw new Error(`Query exceeded the ${QUERY_TIMEOUT_MS}ms budget.`);
507
+ }
508
+ rows.push(row);
509
+ }
510
+ const columns = statement.columns().map((c) => c.name);
511
+ return { columns, rows, rowCount: rows.length, truncated };
512
+ }
513
+ finally {
514
+ if (inMemory)
515
+ readonlyDb.pragma('query_only = OFF');
516
+ else
517
+ readonlyDb.close();
518
+ }
519
+ }
520
+ /** Row counts for every table, for `lit status` and `linkedin_sync`. */
521
+ counts() {
522
+ const out = {};
523
+ for (const table of TABLES) {
524
+ const row = this.db.prepare(`SELECT COUNT(*) AS n FROM ${table}`).get();
525
+ out[table] = row.n;
526
+ }
527
+ return out;
528
+ }
529
+ }
530
+ let shared = null;
531
+ export function openDb(path) {
532
+ if (shared && shared.path === path)
533
+ return shared;
534
+ shared?.close();
535
+ shared = new Db(path);
536
+ return shared;
537
+ }
538
+ export function closeSharedDb() {
539
+ shared?.close();
540
+ shared = null;
541
+ }
542
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}