@visorcraft/idlehands 2.0.0 → 2.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.
package/dist/history.js CHANGED
@@ -171,4 +171,422 @@ function findGroupEnd(msgs, startIdx) {
171
171
  }
172
172
  return i;
173
173
  }
174
+ // ============================================================================
175
+ // ENHANCED COMPACTION - Importance Scoring, Compression, Semantic Chunking
176
+ // ============================================================================
177
+ /**
178
+ * Get text content from a message for analysis.
179
+ */
180
+ function getMessageText(msg) {
181
+ const content = msg.content;
182
+ if (!content)
183
+ return '';
184
+ if (typeof content === 'string')
185
+ return content;
186
+ if (Array.isArray(content)) {
187
+ return content
188
+ .filter((p) => p.type === 'text')
189
+ .map((p) => p.text)
190
+ .join('\n');
191
+ }
192
+ return '';
193
+ }
194
+ // Pre-compiled regex patterns for importance scoring (avoid re-creation)
195
+ const IMPORTANT_PATTERNS = /\b(important|critical|must|decision|agreed|confirmed|remember|note)\b/i;
196
+ const ERROR_PATTERNS = /\b(error|bug|fix|issue|problem|failed|exception|crash)\b/i;
197
+ const PLANNING_PATTERNS = /\b(todo|next|plan|will|should|need to|going to)\b/i;
198
+ const TRIVIAL_PATTERNS = /^(ok|done|success|completed|yes|no|sure|got it)\.?$/i;
199
+ const BULK_TOOL_PATTERNS = /read_file|list_directory|glob|search_files/i;
200
+ /**
201
+ * Score a message by importance (higher = more important to keep).
202
+ * Zero LLM cost - pure heuristics.
203
+ */
204
+ export function scoreMessageImportance(msg, idx, total, toolName) {
205
+ let score = 0;
206
+ // Recency bonus: newer messages score higher (0-50 points)
207
+ score += Math.floor((idx / Math.max(1, total - 1)) * 50);
208
+ const text = getMessageText(msg);
209
+ const len = text.length;
210
+ // Role-based scoring
211
+ switch (msg.role) {
212
+ case 'user':
213
+ score += 30; // User messages are high-value context
214
+ break;
215
+ case 'assistant':
216
+ if (!msg.tool_calls?.length) {
217
+ score += 25; // Substantive assistant responses
218
+ }
219
+ else {
220
+ score += 10; // Tool-calling assistant messages
221
+ }
222
+ break;
223
+ case 'tool':
224
+ score -= 5; // Tool results are often bulk data
225
+ break;
226
+ case 'system':
227
+ score += 40; // System messages are critical
228
+ break;
229
+ }
230
+ // Content-based scoring (regex, no LLM)
231
+ if (IMPORTANT_PATTERNS.test(text))
232
+ score += 25;
233
+ if (ERROR_PATTERNS.test(text))
234
+ score += 20;
235
+ if (PLANNING_PATTERNS.test(text))
236
+ score += 15;
237
+ // Penalize trivial/bulk content
238
+ if (TRIVIAL_PATTERNS.test(text.trim()))
239
+ score -= 30;
240
+ // Penalize very large tool outputs (bulk data)
241
+ if (msg.role === 'tool') {
242
+ if (len > 10000)
243
+ score -= 25;
244
+ else if (len > 5000)
245
+ score -= 15;
246
+ else if (len < 50)
247
+ score -= 10; // Too short = trivial
248
+ // Penalize repetitive read operations
249
+ const name = toolName ?? (msg.name || '');
250
+ if (BULK_TOOL_PATTERNS.test(name))
251
+ score -= 10;
252
+ }
253
+ // Boost messages with code/technical content (likely important)
254
+ if (/```[\s\S]+```/.test(text))
255
+ score += 10;
256
+ if (/function |class |const |let |import |export /.test(text))
257
+ score += 5;
258
+ // Boost messages mentioning files (context about what was worked on)
259
+ if (/\.(ts|js|py|tsx|jsx|json|md|yaml|yml|sh)\b/.test(text))
260
+ score += 5;
261
+ return score;
262
+ }
263
+ /**
264
+ * Compress a large tool result to preserve key information while reducing tokens.
265
+ * Zero LLM cost - pure string manipulation.
266
+ */
267
+ export function compressToolResult(content, maxChars = 1200) {
268
+ if (content.length <= maxChars)
269
+ return content;
270
+ const lines = content.split('\n');
271
+ const totalLines = lines.length;
272
+ // For very long content, extract structure
273
+ if (totalLines > 50) {
274
+ const headLines = 12;
275
+ const tailLines = 8;
276
+ const head = lines.slice(0, headLines).join('\n');
277
+ const tail = lines.slice(-tailLines).join('\n');
278
+ // Extract "interesting" lines from middle
279
+ const middle = lines.slice(headLines, -tailLines);
280
+ const interestingPatterns = /error|warn|fail|success|found|match|import|export|function|class|def |async |interface |type |const |TODO|FIXME|BUG/i;
281
+ const interesting = middle
282
+ .filter(line => interestingPatterns.test(line))
283
+ .slice(0, 8);
284
+ const omitted = totalLines - headLines - tailLines - interesting.length;
285
+ const parts = [head];
286
+ if (interesting.length > 0) {
287
+ parts.push(`\n... [${omitted} lines omitted] ...\n`);
288
+ parts.push('[Key lines from middle:]');
289
+ parts.push(interesting.join('\n'));
290
+ }
291
+ else {
292
+ parts.push(`\n... [${omitted} lines omitted] ...\n`);
293
+ }
294
+ parts.push(tail);
295
+ const result = parts.join('\n');
296
+ // If still too long, truncate more aggressively
297
+ if (result.length > maxChars) {
298
+ return result.slice(0, maxChars - 50) + `\n... [truncated, ${content.length} chars total]`;
299
+ }
300
+ return result;
301
+ }
302
+ // For medium content, just head + tail
303
+ const headChars = Math.floor(maxChars * 0.6);
304
+ const tailChars = Math.floor(maxChars * 0.3);
305
+ return (content.slice(0, headChars) +
306
+ `\n... [${content.length - headChars - tailChars} chars omitted] ...\n` +
307
+ content.slice(-tailChars));
308
+ }
309
+ /**
310
+ * Apply compression to tool result messages in-place.
311
+ */
312
+ export function compressToolMessages(messages, maxChars = 1200) {
313
+ return messages.map(msg => {
314
+ if (msg.role !== 'tool')
315
+ return msg;
316
+ const content = msg.content;
317
+ if (typeof content !== 'string' || content.length <= maxChars)
318
+ return msg;
319
+ return {
320
+ ...msg,
321
+ content: compressToolResult(content, maxChars),
322
+ };
323
+ });
324
+ }
325
+ /**
326
+ * Build a single chunk with aggregate score and token estimate.
327
+ */
328
+ export function buildChunk(messages, startIdx, endIdx, totalMessages) {
329
+ let score = 0;
330
+ for (let i = 0; i < messages.length; i++) {
331
+ score += scoreMessageImportance(messages[i], startIdx + i, totalMessages);
332
+ }
333
+ return {
334
+ messages,
335
+ startIdx,
336
+ endIdx,
337
+ score: Math.round(score / Math.max(1, messages.length)), // Average score
338
+ tokenEstimate: estimateTokensFromMessages(messages),
339
+ };
340
+ }
341
+ /**
342
+ * Group messages into semantic chunks (user request + response + tool calls).
343
+ * This keeps related messages together during compaction.
344
+ */
345
+ export function buildSemanticChunks(messages, sysStart = 0) {
346
+ const chunks = [];
347
+ let currentChunk = [];
348
+ let chunkStart = sysStart;
349
+ // Skip system message
350
+ const startIdx = messages[0]?.role === 'system' ? 1 : 0;
351
+ for (let i = startIdx; i < messages.length; i++) {
352
+ const msg = messages[i];
353
+ // New user message starts a new chunk (unless current is empty)
354
+ if (msg.role === 'user' && currentChunk.length > 0) {
355
+ chunks.push(buildChunk(currentChunk, chunkStart, i, messages.length));
356
+ currentChunk = [];
357
+ chunkStart = i;
358
+ }
359
+ currentChunk.push(msg);
360
+ }
361
+ // Don't forget the last chunk
362
+ if (currentChunk.length > 0) {
363
+ chunks.push(buildChunk(currentChunk, chunkStart, messages.length, messages.length));
364
+ }
365
+ return chunks;
366
+ }
367
+ // ============================================================================
368
+ // Key Fact Extraction
369
+ // ============================================================================
370
+ // Pre-compiled patterns for fact extraction
371
+ const DECISION_PATTERNS = /\b(decided|agreed|confirmed|chose|will use|going with|settled on)\b[^.!?\n]{10,100}/gi;
372
+ const FILE_OP_PATTERNS = /\b(created|edited|modified|deleted|renamed|moved)\s+[\w./\\-]+\.(ts|js|py|json|md|yaml|yml|sh|tsx|jsx)/gi;
373
+ const ERROR_FIX_PATTERNS = /\b(fixed|resolved|solved|patched)\b[^.!?\n]{10,80}/gi;
374
+ const TASK_COMPLETE_PATTERNS = /\b(finished|completed|done with|implemented)\b[^.!?\n]{10,80}/gi;
375
+ /**
376
+ * Extract key facts from dropped messages for vault archiving.
377
+ * Zero LLM cost - regex-based extraction.
378
+ */
379
+ export function extractKeyFacts(messages) {
380
+ const facts = [];
381
+ const seen = new Set();
382
+ for (const msg of messages) {
383
+ if (msg.role !== 'assistant' && msg.role !== 'user')
384
+ continue;
385
+ const text = getMessageText(msg);
386
+ if (!text)
387
+ continue;
388
+ // Extract decisions
389
+ for (const pattern of [DECISION_PATTERNS, FILE_OP_PATTERNS, ERROR_FIX_PATTERNS, TASK_COMPLETE_PATTERNS]) {
390
+ pattern.lastIndex = 0;
391
+ let match;
392
+ while ((match = pattern.exec(text)) !== null) {
393
+ const fact = match[0].trim().replace(/\s+/g, ' ');
394
+ const normalized = fact.toLowerCase();
395
+ if (!seen.has(normalized) && fact.length > 15 && fact.length < 200) {
396
+ seen.add(normalized);
397
+ facts.push(fact);
398
+ }
399
+ }
400
+ }
401
+ }
402
+ return facts.slice(0, 10); // Cap at 10 facts
403
+ }
404
+ /**
405
+ * Enhanced context budget enforcement with full result details.
406
+ * Returns dropped messages and extracted facts for vault archiving.
407
+ */
408
+ export function enforceContextBudgetEnhanced(opts) {
409
+ const { contextWindow, maxTokens } = opts;
410
+ const minTail = opts.force ? 2 : (opts.minTailMessages ?? 20);
411
+ const enhanced = opts.enhanced !== false;
412
+ const compressionMaxChars = opts.compressionMaxChars ?? 1200;
413
+ const toolOverhead = opts.toolSchemaTokens ?? 800;
414
+ const safetyMargin = 2048 + toolOverhead;
415
+ const budget = Math.max(1024, contextWindow - maxTokens - safetyMargin);
416
+ const compactAt = opts.force
417
+ ? 0.5
418
+ : Number.isFinite(opts.compactAt)
419
+ ? Math.min(0.95, Math.max(0.5, Number(opts.compactAt)))
420
+ : 0.8;
421
+ const threshold = Math.floor(budget * compactAt);
422
+ let msgs = [...opts.messages];
423
+ const beforeCount = msgs.length;
424
+ const beforeTokens = estimateTokensFromMessages(msgs);
425
+ const allDropped = [];
426
+ let chunksDropped = 0;
427
+ let messagesCompressed = 0;
428
+ // Early exit if under threshold
429
+ if (!opts.force && beforeTokens <= threshold) {
430
+ return {
431
+ messages: msgs,
432
+ dropped: [],
433
+ keyFacts: [],
434
+ stats: {
435
+ beforeCount,
436
+ afterCount: msgs.length,
437
+ beforeTokens,
438
+ afterTokens: beforeTokens,
439
+ freedTokens: 0,
440
+ chunksDropped: 0,
441
+ messagesCompressed: 0,
442
+ },
443
+ };
444
+ }
445
+ const sysStart = msgs[0]?.role === 'system' ? 1 : 0;
446
+ let currentTokens = beforeTokens;
447
+ // Find protected assistant index
448
+ let protectedIdx = -1;
449
+ for (let i = msgs.length - 1; i >= sysStart; i--) {
450
+ const m = msgs[i];
451
+ if (m.role === 'assistant' &&
452
+ !m.tool_calls?.length &&
453
+ messageContentChars(m.content) > 50) {
454
+ protectedIdx = i;
455
+ break;
456
+ }
457
+ }
458
+ // ENHANCEMENT: Compress tool results first (reduces tokens without losing messages)
459
+ if (enhanced) {
460
+ const beforeCompression = currentTokens;
461
+ msgs = msgs.map((msg, idx) => {
462
+ if (msg.role !== 'tool')
463
+ return msg;
464
+ if (idx >= msgs.length - minTail)
465
+ return msg; // Don't compress recent
466
+ const content = msg.content;
467
+ if (typeof content !== 'string' || content.length <= compressionMaxChars)
468
+ return msg;
469
+ messagesCompressed++;
470
+ return {
471
+ ...msg,
472
+ content: compressToolResult(content, compressionMaxChars),
473
+ };
474
+ });
475
+ currentTokens = estimateTokensFromMessages(msgs);
476
+ if (currentTokens <= threshold && !opts.force) {
477
+ return {
478
+ messages: msgs,
479
+ dropped: [],
480
+ keyFacts: [],
481
+ stats: {
482
+ beforeCount,
483
+ afterCount: msgs.length,
484
+ beforeTokens,
485
+ afterTokens: currentTokens,
486
+ freedTokens: beforeCompression - currentTokens,
487
+ chunksDropped: 0,
488
+ messagesCompressed,
489
+ },
490
+ };
491
+ }
492
+ }
493
+ // ENHANCEMENT: Use semantic chunking with importance scoring
494
+ if (enhanced && msgs.length > minTail + 5) {
495
+ const chunks = buildSemanticChunks(msgs, sysStart);
496
+ // Sort chunks by score (lowest first = drop first)
497
+ // But protect the last chunk (recent context)
498
+ const droppableChunks = chunks.slice(0, -1).sort((a, b) => a.score - b.score);
499
+ const protectedChunk = chunks[chunks.length - 1];
500
+ // Drop lowest-scored chunks until under threshold
501
+ const keptChunks = [];
502
+ let keptTokens = protectedChunk ? protectedChunk.tokenEstimate : 0;
503
+ // Add system message tokens
504
+ if (sysStart === 1) {
505
+ keptTokens += estimateTokensFromMessages([msgs[0]]);
506
+ }
507
+ // Keep chunks from highest score down until we'd exceed budget
508
+ const sortedByScoreDesc = [...droppableChunks].sort((a, b) => b.score - a.score);
509
+ for (const chunk of sortedByScoreDesc) {
510
+ if (keptTokens + chunk.tokenEstimate <= threshold || keptChunks.length < 2) {
511
+ keptChunks.push(chunk);
512
+ keptTokens += chunk.tokenEstimate;
513
+ }
514
+ else {
515
+ // This chunk will be dropped
516
+ allDropped.push(...chunk.messages);
517
+ chunksDropped++;
518
+ }
519
+ }
520
+ // Rebuild messages array in original order
521
+ const keptChunkStarts = new Set(keptChunks.map(c => c.startIdx));
522
+ const newMsgs = [];
523
+ // Keep system message
524
+ if (sysStart === 1) {
525
+ newMsgs.push(msgs[0]);
526
+ }
527
+ // Add kept chunks in order
528
+ for (const chunk of chunks) {
529
+ if (keptChunkStarts.has(chunk.startIdx) || chunk === protectedChunk) {
530
+ newMsgs.push(...chunk.messages);
531
+ }
532
+ }
533
+ if (newMsgs.length < msgs.length) {
534
+ msgs = newMsgs;
535
+ currentTokens = estimateTokensFromMessages(msgs);
536
+ }
537
+ }
538
+ // Fallback: Original algorithm if still over budget
539
+ // Phase 1: drop oldest tool-call exchange groups first
540
+ while (msgs.length > 2 && currentTokens > threshold) {
541
+ if (msgs.length - sysStart <= minTail)
542
+ break;
543
+ const groupIdx = findOldestToolCallGroup(msgs, sysStart, msgs.length - minTail, protectedIdx);
544
+ if (groupIdx === -1)
545
+ break;
546
+ const groupEnd = findGroupEnd(msgs, groupIdx);
547
+ if (protectedIdx > groupIdx)
548
+ protectedIdx -= groupEnd - groupIdx;
549
+ const dropped = msgs.splice(groupIdx, groupEnd - groupIdx);
550
+ allDropped.push(...dropped);
551
+ for (const d of dropped) {
552
+ currentTokens -= Math.ceil((messageContentChars(d.content) + 20) / 4);
553
+ }
554
+ }
555
+ // Phase 2: drop any oldest messages if still over budget
556
+ while (msgs.length > 2 && currentTokens > threshold) {
557
+ if (msgs.length - sysStart <= minTail)
558
+ break;
559
+ if (sysStart === protectedIdx)
560
+ break;
561
+ const [removed] = msgs.splice(sysStart, 1);
562
+ allDropped.push(removed);
563
+ if (protectedIdx > sysStart)
564
+ protectedIdx--;
565
+ currentTokens -= Math.ceil((messageContentChars(removed.content) + 20) / 4);
566
+ }
567
+ // Extract key facts from dropped messages
568
+ const keyFacts = enhanced ? extractKeyFacts(allDropped) : [];
569
+ const afterTokens = estimateTokensFromMessages(msgs);
570
+ const dropped = beforeCount - msgs.length;
571
+ if (dropped > 0) {
572
+ const freed = beforeTokens - afterTokens;
573
+ const usedPct = budget > 0 ? ((beforeTokens / budget) * 100).toFixed(1) : '?';
574
+ console.error(`[auto-compact] Approaching context limit (${usedPct}%) - compacting ${dropped} old turns, ~${freed} tokens freed` +
575
+ (enhanced ? ` (${chunksDropped} chunks, ${messagesCompressed} compressed, ${keyFacts.length} facts extracted)` : ''));
576
+ }
577
+ return {
578
+ messages: msgs,
579
+ dropped: allDropped,
580
+ keyFacts,
581
+ stats: {
582
+ beforeCount,
583
+ afterCount: msgs.length,
584
+ beforeTokens,
585
+ afterTokens,
586
+ freedTokens: beforeTokens - afterTokens,
587
+ chunksDropped,
588
+ messagesCompressed,
589
+ },
590
+ };
591
+ }
174
592
  //# sourceMappingURL=history.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
package/dist/vault.js CHANGED
@@ -617,5 +617,138 @@ export class VaultStore {
617
617
  // SQLite sync mode may already flush automatically in local file mode.
618
618
  }
619
619
  }
620
+ // ============================================================================
621
+ // ENHANCED COMPACTION CONTEXT METHODS
622
+ // ============================================================================
623
+ /**
624
+ * Get structured context for recovery after compaction.
625
+ * Gathers current task, key facts, recent files, and relevant vault entries.
626
+ */
627
+ async getCompactionContext(opts) {
628
+ const limit = opts?.limit ?? 5;
629
+ const result = {
630
+ facts: [],
631
+ files: [],
632
+ entries: [],
633
+ };
634
+ // Get current task if requested
635
+ if (opts?.includeCurrentTask !== false) {
636
+ const taskEntry = await this.getLatestByKey('current_task');
637
+ if (taskEntry?.value) {
638
+ result.currentTask = taskEntry.value;
639
+ }
640
+ }
641
+ // Get key facts if requested
642
+ if (opts?.includeFacts !== false) {
643
+ const factsEntry = await this.getLatestByKey('key_facts');
644
+ if (factsEntry?.value) {
645
+ try {
646
+ const parsed = JSON.parse(factsEntry.value);
647
+ if (Array.isArray(parsed)) {
648
+ result.facts = parsed.slice(0, 10);
649
+ }
650
+ }
651
+ catch {
652
+ // Not JSON, treat as single fact
653
+ result.facts = [factsEntry.value];
654
+ }
655
+ }
656
+ }
657
+ // Get recent files if requested
658
+ if (opts?.includeFiles !== false) {
659
+ try {
660
+ const rows = this.rows(`SELECT DISTINCT content as path, updated_at as updatedAt
661
+ FROM vault_entries
662
+ WHERE tool IN ('read_file', 'write_file', 'edit_file')
663
+ AND content IS NOT NULL
664
+ AND (project_dir IS NULL OR project_dir = ?)
665
+ ORDER BY updated_at DESC
666
+ LIMIT ?`, [this._projectDir ?? null, limit]);
667
+ result.files = rows;
668
+ }
669
+ catch {
670
+ // Ignore errors
671
+ }
672
+ }
673
+ // Search for relevant entries if query provided
674
+ if (opts?.query) {
675
+ try {
676
+ const searchResults = await this.search(opts.query, limit);
677
+ result.entries = searchResults;
678
+ }
679
+ catch {
680
+ // Ignore search errors
681
+ }
682
+ }
683
+ return result;
684
+ }
685
+ /**
686
+ * Archive context from a compaction operation.
687
+ * Stores dropped messages, key facts, and current task.
688
+ */
689
+ async archiveCompactionContext(opts) {
690
+ // Store current task
691
+ if (opts.currentTask) {
692
+ await this.upsertNote('current_task', opts.currentTask, 'system');
693
+ }
694
+ // Store key facts
695
+ if (opts.keyFacts.length > 0) {
696
+ // Merge with existing facts
697
+ const existingEntry = await this.getLatestByKey('key_facts');
698
+ let allFacts = opts.keyFacts;
699
+ if (existingEntry?.value) {
700
+ try {
701
+ const parsed = JSON.parse(existingEntry.value);
702
+ if (Array.isArray(parsed)) {
703
+ allFacts = [...opts.keyFacts, ...parsed];
704
+ }
705
+ }
706
+ catch {
707
+ // Ignore parse errors
708
+ }
709
+ }
710
+ // Dedupe and cap
711
+ const uniqueFacts = [...new Set(allFacts)].slice(0, 20);
712
+ await this.upsertNote('key_facts', JSON.stringify(uniqueFacts), 'system');
713
+ }
714
+ // Archive dropped tool messages
715
+ await this.archiveToolMessages(opts.dropped, opts.toolNameByCallId ?? new Map());
716
+ }
717
+ /**
718
+ * Format compaction context for injection into conversation.
719
+ */
720
+ formatContextForInjection(context, header = '[Vault context after compaction]') {
721
+ const parts = [header, ''];
722
+ if (context.currentTask) {
723
+ parts.push('## Current Task');
724
+ parts.push(context.currentTask);
725
+ parts.push('');
726
+ }
727
+ if (context.facts.length > 0) {
728
+ parts.push('## Key Facts');
729
+ for (const fact of context.facts) {
730
+ parts.push(`- ${fact}`);
731
+ }
732
+ parts.push('');
733
+ }
734
+ if (context.files.length > 0) {
735
+ parts.push('## Recent Files');
736
+ for (const file of context.files) {
737
+ parts.push(`- ${file.path}`);
738
+ }
739
+ parts.push('');
740
+ }
741
+ if (context.entries.length > 0) {
742
+ parts.push('## Related Context');
743
+ for (const entry of context.entries) {
744
+ const snippet = entry.snippet || entry.value || entry.content || '';
745
+ if (snippet) {
746
+ parts.push(`- ${snippet.slice(0, 200)}${snippet.length > 200 ? '...' : ''}`);
747
+ }
748
+ }
749
+ parts.push('');
750
+ }
751
+ return parts.join('\n');
752
+ }
620
753
  }
621
754
  //# sourceMappingURL=vault.js.map