@omnitype-code/adapter-sdk 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 (46) hide show
  1. package/README.md +163 -0
  2. package/dist/adapters/filesystem-only.d.ts +30 -0
  3. package/dist/adapters/filesystem-only.d.ts.map +1 -0
  4. package/dist/adapters/filesystem-only.js +115 -0
  5. package/dist/adapters/filesystem-only.js.map +1 -0
  6. package/dist/adapters/hook-poller.d.ts +40 -0
  7. package/dist/adapters/hook-poller.d.ts.map +1 -0
  8. package/dist/adapters/hook-poller.js +125 -0
  9. package/dist/adapters/hook-poller.js.map +1 -0
  10. package/dist/adapters/index.d.ts +34 -0
  11. package/dist/adapters/index.d.ts.map +1 -0
  12. package/dist/adapters/index.js +61 -0
  13. package/dist/adapters/index.js.map +1 -0
  14. package/dist/adapters/stdin-json-hook-tool.d.ts +87 -0
  15. package/dist/adapters/stdin-json-hook-tool.d.ts.map +1 -0
  16. package/dist/adapters/stdin-json-hook-tool.js +491 -0
  17. package/dist/adapters/stdin-json-hook-tool.js.map +1 -0
  18. package/dist/adapters/transcript-scavenger.d.ts +40 -0
  19. package/dist/adapters/transcript-scavenger.d.ts.map +1 -0
  20. package/dist/adapters/transcript-scavenger.js +569 -0
  21. package/dist/adapters/transcript-scavenger.js.map +1 -0
  22. package/dist/classifier.d.ts +132 -0
  23. package/dist/classifier.d.ts.map +1 -0
  24. package/dist/classifier.js +95 -0
  25. package/dist/classifier.js.map +1 -0
  26. package/dist/index.d.ts +8 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +8 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/loader.d.ts +51 -0
  31. package/dist/loader.d.ts.map +1 -0
  32. package/dist/loader.js +352 -0
  33. package/dist/loader.js.map +1 -0
  34. package/dist/manifest.d.ts +131 -0
  35. package/dist/manifest.d.ts.map +1 -0
  36. package/dist/manifest.js +12 -0
  37. package/dist/manifest.js.map +1 -0
  38. package/dist/normalize.d.ts +51 -0
  39. package/dist/normalize.d.ts.map +1 -0
  40. package/dist/normalize.js +122 -0
  41. package/dist/normalize.js.map +1 -0
  42. package/dist/tier.d.ts +12 -0
  43. package/dist/tier.d.ts.map +1 -0
  44. package/dist/tier.js +62 -0
  45. package/dist/tier.js.map +1 -0
  46. package/package.json +36 -0
@@ -0,0 +1,569 @@
1
+ /**
2
+ * transcript-scavenger-adapter
3
+ *
4
+ * Tails on-disk transcripts from AI tools to recover SessionStarted,
5
+ * ModelClaim, and PromptCapture events for tools that:
6
+ * - don't support preToolUse hooks, or
7
+ * - had hooks fire but lost events due to timing/TTL issues.
8
+ *
9
+ * Events from this adapter are tagged `retrospective: true` and always T2
10
+ * (we can identify the session and model but not the exact splice).
11
+ *
12
+ * Supported transcript formats:
13
+ * - Claude Code: ~/.claude/projects/<slug>/<session>.jsonl
14
+ * - Cline: ~/.cline/tasks/TASK_ID/api_conversation_history.json
15
+ * + VSCode ext: ~/.vscode/extensions/saoudrizwan.claude-dev-X/tasks/X/api_conversation_history.json
16
+ * - Aider: .aider.chat.history.md (workspace-relative conversation history)
17
+ * - Windsurf: ~/.windsurf/memories/conversations/*.jsonl
18
+ * + workspace: .windsurf/history/*.json
19
+ * - OpenCode: ~/.opencode/sessions/*.jsonl
20
+ */
21
+ import { watch, readFileSync, readdirSync, existsSync, statSync } from 'node:fs';
22
+ import { join } from 'node:path';
23
+ import { homedir } from 'node:os';
24
+ import { createHash } from 'node:crypto';
25
+ export const ADAPTER_ID = 'org.omnitype.adapters.transcript-scavenger';
26
+ export const TRANSCRIPT_TIER = 'T2';
27
+ function parseClaudeCodeTranscript(jsonl) {
28
+ const lines = jsonl.split('\n').filter((l) => l.trim());
29
+ let session_id = null;
30
+ let model = null;
31
+ const prompts = [];
32
+ for (const line of lines) {
33
+ try {
34
+ const entry = JSON.parse(line);
35
+ if (entry.sessionId)
36
+ session_id = entry.sessionId;
37
+ if (entry.session_id)
38
+ session_id = entry.session_id;
39
+ if (entry.model)
40
+ model = entry.model;
41
+ if ((entry.type === 'human' || entry.role === 'user') && entry.content) {
42
+ const text = typeof entry.content === 'string'
43
+ ? entry.content
44
+ : JSON.stringify(entry.content);
45
+ prompts.push(text);
46
+ }
47
+ }
48
+ catch { /* skip malformed lines */ }
49
+ }
50
+ return { session_id, model, prompts };
51
+ }
52
+ function findClaudeCodeTranscripts(workspace) {
53
+ const base = join(homedir(), '.claude', 'projects');
54
+ if (!existsSync(base))
55
+ return [];
56
+ // Find project directory matching workspace
57
+ const locations = [];
58
+ try {
59
+ for (const projectDir of readdirSync(base)) {
60
+ const fullDir = join(base, projectDir);
61
+ if (!statSync(fullDir).isDirectory())
62
+ continue;
63
+ // Claude Code encodes workspace path in directory name (URL-encoded)
64
+ const decoded = decodeURIComponent(projectDir.replace(/-/g, '/'));
65
+ if (!workspace.includes(decoded) && !decoded.includes(workspace))
66
+ continue;
67
+ for (const file of readdirSync(fullDir)) {
68
+ if (file.endsWith('.jsonl')) {
69
+ locations.push({ tool: 'claude-code', path: join(fullDir, file) });
70
+ }
71
+ }
72
+ }
73
+ }
74
+ catch { /* ignore */ }
75
+ return locations;
76
+ }
77
+ function parseClineTranscript(json) {
78
+ let data;
79
+ try {
80
+ data = JSON.parse(json);
81
+ }
82
+ catch {
83
+ return { session_id: null, model: null, prompts: [] };
84
+ }
85
+ const messages = data.conversation ?? data.messages ?? [];
86
+ const model = data.model ?? null;
87
+ const prompts = [];
88
+ for (const msg of messages) {
89
+ if (msg.role !== 'user')
90
+ continue;
91
+ let text = '';
92
+ if (typeof msg.content === 'string') {
93
+ text = msg.content;
94
+ }
95
+ else if (Array.isArray(msg.content)) {
96
+ text = msg.content.filter((c) => c.type === 'text').map((c) => c.text ?? '').join('\n');
97
+ }
98
+ if (text.trim())
99
+ prompts.push(text);
100
+ }
101
+ // Cline doesn't embed a session_id. Derive a STABLE seed that doesn't change
102
+ // when new turns are appended: tool + model + first user prompt only.
103
+ // (Including prompts.length here would mint a new session_id every turn and
104
+ // break cross-machine merge.)
105
+ const sessionSeed = 'cline\x00' + (model ?? '') + '\x00' + (prompts[0] ?? '');
106
+ const session_id = createHash('sha256').update(sessionSeed).digest('hex').slice(0, 32);
107
+ return { session_id, model, prompts };
108
+ }
109
+ function findClineTranscripts(workspace) {
110
+ const locations = [];
111
+ // ~/.cline/tasks/
112
+ const homeBase = join(homedir(), '.cline', 'tasks');
113
+ if (existsSync(homeBase)) {
114
+ try {
115
+ for (const taskDir of readdirSync(homeBase)) {
116
+ const histFile = join(homeBase, taskDir, 'api_conversation_history.json');
117
+ if (existsSync(histFile))
118
+ locations.push({ tool: 'cline', path: histFile });
119
+ }
120
+ }
121
+ catch { /* ignore */ }
122
+ }
123
+ // VSCode extension location: ~/.vscode/extensions/saoudrizwan.claude-dev-*/tasks/
124
+ const vscodeExt = join(homedir(), '.vscode', 'extensions');
125
+ if (existsSync(vscodeExt)) {
126
+ try {
127
+ for (const extDir of readdirSync(vscodeExt)) {
128
+ if (!extDir.startsWith('saoudrizwan.claude-dev'))
129
+ continue;
130
+ const tasksDir = join(vscodeExt, extDir, 'tasks');
131
+ if (!existsSync(tasksDir))
132
+ continue;
133
+ for (const taskDir of readdirSync(tasksDir)) {
134
+ const histFile = join(tasksDir, taskDir, 'api_conversation_history.json');
135
+ if (existsSync(histFile))
136
+ locations.push({ tool: 'cline', path: histFile });
137
+ }
138
+ }
139
+ }
140
+ catch { /* ignore */ }
141
+ }
142
+ // Workspace-local .cline/tasks/
143
+ const localTasks = join(workspace, '.cline', 'tasks');
144
+ if (existsSync(localTasks)) {
145
+ try {
146
+ for (const taskDir of readdirSync(localTasks)) {
147
+ const histFile = join(localTasks, taskDir, 'api_conversation_history.json');
148
+ if (existsSync(histFile))
149
+ locations.push({ tool: 'cline', path: histFile });
150
+ }
151
+ }
152
+ catch { /* ignore */ }
153
+ }
154
+ return locations;
155
+ }
156
+ // ─── Aider transcript format ──────────────────────────────────────────────────
157
+ function parseAiderTranscript(md) {
158
+ const prompts = [];
159
+ let model = null;
160
+ // Aider history format uses #### markers for user turns and #### for aider turns
161
+ // Lines starting with "> " are user input, "#" sections separate sessions
162
+ const lines = md.split('\n');
163
+ let inUserBlock = false;
164
+ let currentPrompt = '';
165
+ for (const line of lines) {
166
+ // Model declaration: "# aider chat started with claude-3-5-sonnet..."
167
+ const modelMatch = line.match(/^#\s*aider chat started with\s+(.+)/i);
168
+ if (modelMatch) {
169
+ model = modelMatch[1].trim();
170
+ inUserBlock = false;
171
+ if (currentPrompt.trim()) {
172
+ prompts.push(currentPrompt.trim());
173
+ currentPrompt = '';
174
+ }
175
+ continue;
176
+ }
177
+ // User prompt block starts with "> "
178
+ if (line.startsWith('> ')) {
179
+ inUserBlock = true;
180
+ currentPrompt += (currentPrompt ? '\n' : '') + line.slice(2);
181
+ continue;
182
+ }
183
+ // Empty line or aider response ends user block
184
+ if (inUserBlock && (line.trim() === '' || !line.startsWith('> '))) {
185
+ if (currentPrompt.trim()) {
186
+ prompts.push(currentPrompt.trim());
187
+ currentPrompt = '';
188
+ }
189
+ inUserBlock = false;
190
+ }
191
+ }
192
+ if (currentPrompt.trim())
193
+ prompts.push(currentPrompt.trim());
194
+ if (prompts.length === 0)
195
+ return { session_id: null, model, prompts };
196
+ // Stable across additional turns — first prompt + model only.
197
+ const session_id = createHash('sha256')
198
+ .update('aider\x00' + (model ?? '') + '\x00' + (prompts[0] ?? ''))
199
+ .digest('hex').slice(0, 32);
200
+ return { session_id, model, prompts };
201
+ }
202
+ function findAiderTranscripts(workspace) {
203
+ const histFile = join(workspace, '.aider.chat.history.md');
204
+ if (existsSync(histFile))
205
+ return [{ tool: 'aider', path: histFile }];
206
+ return [];
207
+ }
208
+ function parseWindsurfTranscript(raw) {
209
+ let model = null;
210
+ const prompts = [];
211
+ // Try JSON array first (conversation history files)
212
+ try {
213
+ const data = JSON.parse(raw);
214
+ const messages = Array.isArray(data) ? data : (data.messages ?? []);
215
+ if (!Array.isArray(data) && data.model)
216
+ model = data.model;
217
+ for (const msg of messages) {
218
+ const role = msg.role ?? msg.author ?? '';
219
+ if (role !== 'user' && role !== 'human')
220
+ continue;
221
+ const text = msg.content ?? msg.text ?? '';
222
+ if (text.trim())
223
+ prompts.push(text);
224
+ if (!model && msg.model)
225
+ model = msg.model;
226
+ }
227
+ if (prompts.length === 0)
228
+ return { session_id: null, model, prompts };
229
+ const session_id = createHash('sha256')
230
+ .update('windsurf\x00' + (model ?? '') + '\x00' + (prompts[0] ?? ''))
231
+ .digest('hex').slice(0, 32);
232
+ return { session_id, model, prompts };
233
+ }
234
+ catch { /* not JSON array — try JSONL */ }
235
+ // JSONL format
236
+ for (const line of raw.split('\n').filter((l) => l.trim())) {
237
+ try {
238
+ const msg = JSON.parse(line);
239
+ const role = msg.role ?? msg.author ?? '';
240
+ if (role !== 'user' && role !== 'human')
241
+ continue;
242
+ const text = msg.content ?? msg.text ?? '';
243
+ if (text.trim())
244
+ prompts.push(text);
245
+ if (!model && msg.model)
246
+ model = msg.model;
247
+ }
248
+ catch { /* skip */ }
249
+ }
250
+ if (prompts.length === 0)
251
+ return { session_id: null, model, prompts };
252
+ const session_id = createHash('sha256')
253
+ .update('windsurf\x00' + (model ?? '') + '\x00' + (prompts[0] ?? ''))
254
+ .digest('hex').slice(0, 32);
255
+ return { session_id, model, prompts };
256
+ }
257
+ function findWindsurfTranscripts(workspace) {
258
+ const locations = [];
259
+ // ~/.windsurf/memories/conversations/
260
+ const homeConvs = join(homedir(), '.windsurf', 'memories', 'conversations');
261
+ if (existsSync(homeConvs)) {
262
+ try {
263
+ for (const f of readdirSync(homeConvs)) {
264
+ if (f.endsWith('.jsonl') || f.endsWith('.json')) {
265
+ locations.push({ tool: 'windsurf', path: join(homeConvs, f) });
266
+ }
267
+ }
268
+ }
269
+ catch { /* ignore */ }
270
+ }
271
+ // Workspace-local .windsurf/history/
272
+ const localHist = join(workspace, '.windsurf', 'history');
273
+ if (existsSync(localHist)) {
274
+ try {
275
+ for (const f of readdirSync(localHist)) {
276
+ if (f.endsWith('.json') || f.endsWith('.jsonl')) {
277
+ locations.push({ tool: 'windsurf', path: join(localHist, f) });
278
+ }
279
+ }
280
+ }
281
+ catch { /* ignore */ }
282
+ }
283
+ return locations;
284
+ }
285
+ function findOpenCodeTranscripts() {
286
+ const base = join(homedir(), '.opencode', 'sessions');
287
+ if (!existsSync(base))
288
+ return [];
289
+ try {
290
+ return readdirSync(base)
291
+ .filter((f) => f.endsWith('.jsonl'))
292
+ .map((f) => ({ tool: 'opencode', path: join(base, f) }));
293
+ }
294
+ catch {
295
+ return [];
296
+ }
297
+ }
298
+ function parseCodexTranscript(jsonl) {
299
+ let session_id = null;
300
+ let model = null;
301
+ const prompts = [];
302
+ for (const line of jsonl.split('\n')) {
303
+ if (!line.trim())
304
+ continue;
305
+ try {
306
+ const entry = JSON.parse(line);
307
+ if (entry.session_id)
308
+ session_id = entry.session_id;
309
+ if (entry.model)
310
+ model = entry.model;
311
+ // User prompt: either {role:'user', content:...} or {message:{role:'user',content:...}}
312
+ const role = entry.role ?? entry.message?.role;
313
+ const content = entry.content ?? entry.message?.content;
314
+ if (role === 'user' && content) {
315
+ const text = typeof content === 'string'
316
+ ? content
317
+ : Array.isArray(content)
318
+ ? content.map((c) => c.text ?? '').join('\n')
319
+ : JSON.stringify(content);
320
+ if (text.trim())
321
+ prompts.push(text);
322
+ }
323
+ }
324
+ catch { /* skip malformed line */ }
325
+ }
326
+ if (!session_id && prompts.length > 0) {
327
+ // Codex doesn't always include session_id in every line — derive stable id
328
+ session_id = createHash('sha256')
329
+ .update('codex\x00' + (model ?? '') + '\x00' + prompts[0])
330
+ .digest('hex').slice(0, 32);
331
+ }
332
+ return { session_id, model, prompts };
333
+ }
334
+ function parseAntigravityTranscript(jsonl) {
335
+ const lines = jsonl.split('\n').filter((l) => l.trim());
336
+ let session_id = null;
337
+ let model = null;
338
+ const prompts = [];
339
+ for (const line of lines) {
340
+ try {
341
+ const entry = JSON.parse(line);
342
+ if (!session_id) {
343
+ const cid = entry.conversationId ?? entry.conversation_id;
344
+ if (typeof cid === 'string')
345
+ session_id = cid;
346
+ }
347
+ if (!model && typeof entry.model === 'string')
348
+ model = entry.model;
349
+ const role = entry.role ?? entry.type;
350
+ if (role === 'user' || role === 'human') {
351
+ let text = '';
352
+ if (typeof entry.content === 'string') {
353
+ text = entry.content;
354
+ }
355
+ else if (typeof entry.text === 'string') {
356
+ text = entry.text;
357
+ }
358
+ else if (Array.isArray(entry.content)) {
359
+ text = entry.content
360
+ .map((c) => c.text ?? c.content ?? '').join('\n');
361
+ }
362
+ else if (Array.isArray(entry.parts)) {
363
+ text = entry.parts.map((p) => p.text ?? '').join('\n');
364
+ }
365
+ if (text.trim())
366
+ prompts.push(text.trim());
367
+ }
368
+ }
369
+ catch { /* skip malformed */ }
370
+ }
371
+ return { session_id, model, prompts };
372
+ }
373
+ function findAntigravityTranscripts(workspace) {
374
+ const jetskiPath = join(workspace, '.gemini', 'jetski', 'transcript.jsonl');
375
+ if (existsSync(jetskiPath))
376
+ return [{ tool: 'antigravity', path: jetskiPath }];
377
+ return [];
378
+ }
379
+ function findCodexTranscripts() {
380
+ const base = join(homedir(), '.codex', 'sessions');
381
+ if (!existsSync(base))
382
+ return [];
383
+ const locations = [];
384
+ // ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl (recurse 3 levels)
385
+ function walk(dir, depth) {
386
+ if (depth > 4)
387
+ return;
388
+ let entries;
389
+ try {
390
+ entries = readdirSync(dir);
391
+ }
392
+ catch {
393
+ return;
394
+ }
395
+ for (const name of entries) {
396
+ const full = join(dir, name);
397
+ let stat;
398
+ try {
399
+ stat = statSync(full);
400
+ }
401
+ catch {
402
+ continue;
403
+ }
404
+ if (stat.isDirectory()) {
405
+ walk(full, depth + 1);
406
+ }
407
+ else if (name.endsWith('.jsonl') && name.includes('rollout')) {
408
+ locations.push({ tool: 'codex', path: full });
409
+ }
410
+ }
411
+ }
412
+ walk(base, 0);
413
+ return locations;
414
+ }
415
+ // ─── Adapter ─────────────────────────────────────────────────────────────────
416
+ export class TranscriptScavengerAdapter {
417
+ emit;
418
+ workspace;
419
+ user;
420
+ host;
421
+ seenSessions = new Set();
422
+ seenPromptHashes = new Set();
423
+ filePositions = new Map(); // path → last read position
424
+ watchers = [];
425
+ constructor(emit, workspace, user, host) {
426
+ this.emit = emit;
427
+ this.workspace = workspace;
428
+ this.user = user;
429
+ this.host = host;
430
+ }
431
+ start() {
432
+ this.scanAll();
433
+ // Watch for new transcript files and additions
434
+ const watchDirs = [
435
+ join(homedir(), '.claude', 'projects'),
436
+ join(homedir(), '.opencode', 'sessions'),
437
+ join(homedir(), '.cline', 'tasks'),
438
+ join(homedir(), '.windsurf', 'memories', 'conversations'),
439
+ join(homedir(), '.codex', 'sessions'),
440
+ join(this.workspace, '.aider.chat.history.md'),
441
+ join(this.workspace, '.windsurf', 'history'),
442
+ join(this.workspace, '.gemini', 'jetski'),
443
+ ];
444
+ for (const dir of watchDirs) {
445
+ const watchTarget = existsSync(dir) ? dir : null;
446
+ if (!watchTarget)
447
+ continue;
448
+ try {
449
+ const w = watch(watchTarget, { recursive: true, persistent: false }, () => {
450
+ setTimeout(() => this.scanAll(), 300);
451
+ });
452
+ this.watchers.push(w);
453
+ }
454
+ catch { /* platform may not support recursive watch */ }
455
+ }
456
+ }
457
+ scanAll() {
458
+ const locations = [
459
+ ...findClaudeCodeTranscripts(this.workspace),
460
+ ...findOpenCodeTranscripts(),
461
+ ...findClineTranscripts(this.workspace),
462
+ ...findAiderTranscripts(this.workspace),
463
+ ...findWindsurfTranscripts(this.workspace),
464
+ ...findCodexTranscripts(),
465
+ ...findAntigravityTranscripts(this.workspace),
466
+ ];
467
+ for (const loc of locations) {
468
+ this.processTranscript(loc);
469
+ }
470
+ }
471
+ parseTranscript(loc, content) {
472
+ switch (loc.tool) {
473
+ case 'cline': return parseClineTranscript(content);
474
+ case 'aider': return parseAiderTranscript(content);
475
+ case 'windsurf': return parseWindsurfTranscript(content);
476
+ case 'codex': return parseCodexTranscript(content);
477
+ case 'antigravity': return parseAntigravityTranscript(content);
478
+ default: return parseClaudeCodeTranscript(content);
479
+ }
480
+ }
481
+ processTranscript(loc) {
482
+ let content;
483
+ try {
484
+ content = readFileSync(loc.path, 'utf-8');
485
+ }
486
+ catch {
487
+ return;
488
+ }
489
+ // Only read new content since last scan
490
+ const lastPos = this.filePositions.get(loc.path) ?? 0;
491
+ const newContent = content.slice(lastPos);
492
+ this.filePositions.set(loc.path, content.length);
493
+ if (!newContent.trim())
494
+ return;
495
+ const { session_id, model, prompts } = this.parseTranscript(loc, newContent);
496
+ if (!session_id)
497
+ return;
498
+ const isNewSession = !this.seenSessions.has(session_id);
499
+ this.seenSessions.add(session_id);
500
+ const actor = {
501
+ kind: 'ai',
502
+ tool: loc.tool,
503
+ model: model ?? 'unknown',
504
+ session_id,
505
+ user: this.user,
506
+ host: this.host,
507
+ workspace: this.workspace,
508
+ };
509
+ // Emit SessionStarted only the first time we see this session_id.
510
+ if (isNewSession) {
511
+ const firstPrompt = prompts[0] ?? '';
512
+ const promptHash = createHash('sha256').update(firstPrompt).digest('hex');
513
+ const sessionEvent = {
514
+ type: 'SessionStarted',
515
+ session_id,
516
+ tool: loc.tool,
517
+ model: model ?? 'unknown',
518
+ prompt_hash: promptHash,
519
+ prompt_bytes: firstPrompt.length,
520
+ };
521
+ this.emit(actor, sessionEvent, TRANSCRIPT_TIER, ADAPTER_ID);
522
+ if (model) {
523
+ const modelEvent = {
524
+ type: 'ModelClaim',
525
+ session_id,
526
+ model,
527
+ source: 'transcript',
528
+ };
529
+ this.emit(actor, modelEvent, TRANSCRIPT_TIER, ADAPTER_ID);
530
+ }
531
+ }
532
+ // Emit PromptCapture only for prompts we haven't seen yet (hash-keyed).
533
+ // Hash only — text is NEVER sent without explicit user consent (§privacy).
534
+ for (const prompt of prompts) {
535
+ const hash = createHash('sha256').update(prompt).digest('hex');
536
+ const dedupKey = session_id + ':' + hash;
537
+ if (this.seenPromptHashes.has(dedupKey))
538
+ continue;
539
+ this.seenPromptHashes.add(dedupKey);
540
+ const promptEvent = {
541
+ type: 'PromptCapture',
542
+ session_id,
543
+ prompt_id: hash.slice(0, 32),
544
+ prompt_hash: hash,
545
+ prompt_bytes: prompt.length,
546
+ privacy_marks: detectPrivacyMarks(prompt),
547
+ client_scrubbed: false,
548
+ };
549
+ this.emit(actor, promptEvent, TRANSCRIPT_TIER, ADAPTER_ID);
550
+ }
551
+ }
552
+ stop() {
553
+ for (const w of this.watchers)
554
+ w.close();
555
+ this.watchers = [];
556
+ }
557
+ }
558
+ function detectPrivacyMarks(text) {
559
+ const marks = [];
560
+ // Rudimentary — proper scrubbing is a future feature
561
+ if (/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/.test(text)) {
562
+ marks.push('pii-suspected');
563
+ }
564
+ if (/\b(sk-[A-Za-z0-9]{20,}|ghp_[A-Za-z0-9]{36}|AKIA[A-Z0-9]{16})\b/.test(text)) {
565
+ marks.push('secret-detected');
566
+ }
567
+ return marks;
568
+ }
569
+ //# sourceMappingURL=transcript-scavenger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-scavenger.js","sourceRoot":"","sources":["../../src/adapters/transcript-scavenger.ts"],"names":[],"mappings":"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"}