claude-context-saver 1.2.2 → 1.2.3

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/conv-backup.mjs CHANGED
@@ -21,7 +21,7 @@ async function main() {
21
21
 
22
22
  const sessionId = data.session_id || 'unknown';
23
23
  const transcriptPath = data.transcript_path || '';
24
- const projectDir = data.workspace?.project_dir || data.workspace?.cwd || process.cwd();
24
+ const projectDir = data.workspace?.project_dir || data.workspace?.current_dir || data.cwd || process.cwd();
25
25
 
26
26
  // Determine trigger type
27
27
  const trigger = data.trigger === 'manual'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-context-saver",
3
- "version": "1.2.2",
3
+ "version": "1.2.3",
4
4
  "description": "Automatic context backup for Claude Code — saves conversation state before auto-compaction wipes it",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,10 +30,19 @@ async function main() {
30
30
 
31
31
  const sessionId = data.session_id || 'unknown';
32
32
  const transcriptPath = data.transcript_path || '';
33
- const tokensUsed = data.context_window?.tokens_used ?? 0;
34
- const windowSize = data.context_window?.window_size ?? 200_000;
35
- const modelName = data.model?.name || data.model?.model_id || 'unknown';
36
- const projectDir = data.workspace?.project_dir || data.workspace?.cwd || process.cwd();
33
+
34
+ // Context window Claude Code sends total_input_tokens + total_output_tokens
35
+ const cw = data.context_window || {};
36
+ const inputTokens = cw.total_input_tokens ?? 0;
37
+ const outputTokens = cw.total_output_tokens ?? 0;
38
+ const tokensUsed = inputTokens + outputTokens;
39
+ const windowSize = cw.context_window_size ?? 200_000;
40
+
41
+ // Model — Claude Code sends model.id and model.display_name
42
+ const modelName = data.model?.display_name || data.model?.id || 'unknown';
43
+
44
+ // Workspace
45
+ const projectDir = data.workspace?.project_dir || data.workspace?.current_dir || data.cwd || process.cwd();
37
46
 
38
47
  // Calculate free-until-compaction percentage
39
48
  const freeTokens = windowSize - tokensUsed - AUTO_COMPACT_BUFFER;
@@ -42,7 +51,7 @@ async function main() {
42
51
  // Format token counts for display
43
52
  const usedK = Math.round(tokensUsed / 1000);
44
53
  const windowK = Math.round(windowSize / 1000);
45
- const usedPercent = Math.round((tokensUsed / windowSize) * 100);
54
+ const usedPercent = cw.used_percentage ?? Math.round((tokensUsed / windowSize) * 100);
46
55
  const freeDisplay = Math.round(freePercent);
47
56
 
48
57
  // Load/reset state for this session
@@ -62,9 +71,7 @@ async function main() {
62
71
  // --- Token-based triggers ---
63
72
  if (tokensUsed >= FIRST_TOKEN_THRESHOLD) {
64
73
  // Calculate which threshold we should be at
65
- const expectedThreshold = tokensUsed >= FIRST_TOKEN_THRESHOLD
66
- ? FIRST_TOKEN_THRESHOLD + Math.floor((tokensUsed - FIRST_TOKEN_THRESHOLD) / TOKEN_INCREMENT) * TOKEN_INCREMENT
67
- : 0;
74
+ const expectedThreshold = FIRST_TOKEN_THRESHOLD + Math.floor((tokensUsed - FIRST_TOKEN_THRESHOLD) / TOKEN_INCREMENT) * TOKEN_INCREMENT;
68
75
 
69
76
  if (expectedThreshold > (state.lastTokenThreshold || 0)) {
70
77
  triggered = true;