@abnersajr/claude-timeline 1.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/dist/capture.js +140 -0
  4. package/dist/classifier.d.ts +37 -0
  5. package/dist/classifier.d.ts.map +1 -0
  6. package/dist/classifier.test.d.ts +2 -0
  7. package/dist/classifier.test.d.ts.map +1 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +1328 -0
  10. package/dist/context-tracker.d.ts +44 -0
  11. package/dist/context-tracker.d.ts.map +1 -0
  12. package/dist/context-tracker.test.d.ts +2 -0
  13. package/dist/context-tracker.test.d.ts.map +1 -0
  14. package/dist/conversation-groups.d.ts +11 -0
  15. package/dist/conversation-groups.d.ts.map +1 -0
  16. package/dist/conversation-groups.test.d.ts +2 -0
  17. package/dist/conversation-groups.test.d.ts.map +1 -0
  18. package/dist/cost-stream-capture.d.ts +47 -0
  19. package/dist/cost-stream-capture.d.ts.map +1 -0
  20. package/dist/cost-stream-db.d.ts +87 -0
  21. package/dist/cost-stream-db.d.ts.map +1 -0
  22. package/dist/cost-stream-merger.d.ts +38 -0
  23. package/dist/cost-stream-merger.d.ts.map +1 -0
  24. package/dist/db-reader-BrPRGqww.mjs +1028 -0
  25. package/dist/db-reader-BrPRGqww.mjs.map +1 -0
  26. package/dist/db-reader-CPXmkt55.mjs +2 -0
  27. package/dist/db-reader.d.ts +58 -0
  28. package/dist/db-reader.d.ts.map +1 -0
  29. package/dist/db.js +100 -0
  30. package/dist/dedup.d.ts +16 -0
  31. package/dist/dedup.d.ts.map +1 -0
  32. package/dist/dedup.test.d.ts +2 -0
  33. package/dist/dedup.test.d.ts.map +1 -0
  34. package/dist/index.d.ts +20 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/jsonl-parser.d.ts +14 -0
  37. package/dist/jsonl-parser.d.ts.map +1 -0
  38. package/dist/jsonl-parser.test.d.ts +2 -0
  39. package/dist/jsonl-parser.test.d.ts.map +1 -0
  40. package/dist/merger.d.ts +31 -0
  41. package/dist/merger.d.ts.map +1 -0
  42. package/dist/model-parser.d.ts +25 -0
  43. package/dist/model-parser.d.ts.map +1 -0
  44. package/dist/model-parser.test.d.ts +2 -0
  45. package/dist/model-parser.test.d.ts.map +1 -0
  46. package/dist/noise-filter.d.ts +6 -0
  47. package/dist/noise-filter.d.ts.map +1 -0
  48. package/dist/pricing-B-rwfwDB.mjs +2 -0
  49. package/dist/pricing-DTmya3JY.mjs +273 -0
  50. package/dist/pricing-DTmya3JY.mjs.map +1 -0
  51. package/dist/pricing.d.ts +26 -0
  52. package/dist/pricing.d.ts.map +1 -0
  53. package/dist/server.cjs +31237 -0
  54. package/dist/session-state.d.ts +19 -0
  55. package/dist/session-state.d.ts.map +1 -0
  56. package/dist/session-state.test.d.ts +2 -0
  57. package/dist/session-state.test.d.ts.map +1 -0
  58. package/dist/subagent-locator.d.ts +30 -0
  59. package/dist/subagent-locator.d.ts.map +1 -0
  60. package/dist/subagent-locator.test.d.ts +2 -0
  61. package/dist/subagent-locator.test.d.ts.map +1 -0
  62. package/dist/subagent-resolver.d.ts +35 -0
  63. package/dist/subagent-resolver.d.ts.map +1 -0
  64. package/dist/subagent-resolver.test.d.ts +2 -0
  65. package/dist/subagent-resolver.test.d.ts.map +1 -0
  66. package/dist/tool-extraction.d.ts +34 -0
  67. package/dist/tool-extraction.d.ts.map +1 -0
  68. package/dist/tool-extraction.test.d.ts +2 -0
  69. package/dist/tool-extraction.test.d.ts.map +1 -0
  70. package/dist/tool-matcher.d.ts +35 -0
  71. package/dist/tool-matcher.d.ts.map +1 -0
  72. package/dist/types.d.ts +272 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/utils.d.ts +24 -0
  75. package/dist/utils.d.ts.map +1 -0
  76. package/dist/web/assets/index-Dr0FGYfS.js +158 -0
  77. package/dist/web/assets/index-nXTIEelb.css +1 -0
  78. package/dist/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  79. package/dist/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  80. package/dist/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  81. package/dist/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  82. package/dist/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  83. package/dist/web/favicon-light.svg +14 -0
  84. package/dist/web/favicon.svg +14 -0
  85. package/dist/web/index.html +14 -0
  86. package/dist/web/logo.svg +20 -0
  87. package/package.json +73 -0
@@ -0,0 +1,19 @@
1
+ import type { RawJsonlRecord } from "./types";
2
+ /**
3
+ * Detect whether a session is ongoing (AI still working) vs completed.
4
+ *
5
+ * Algorithm:
6
+ * 1. Classify each record into an activity type
7
+ * 2. Find the last ending event (text_output or interruption)
8
+ * 3. Check if any AI activities exist after that ending event
9
+ * 4. If AI activities exist after the last ending event → ongoing
10
+ * 5. If no AI activities after last ending event → completed
11
+ * 6. If no ending events exist → not ongoing (empty or all AI activities)
12
+ *
13
+ * Special case: interruption is always treated as an ending event,
14
+ * and no AI activities are expected to follow it in practice.
15
+ */
16
+ export declare function detectSessionState(records: RawJsonlRecord[]): {
17
+ isOngoing: boolean;
18
+ };
19
+ //# sourceMappingURL=session-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAkE7C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CA8BpF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-state.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.test.d.ts","sourceRoot":"","sources":["../src/session-state.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import type { SubagentFile } from "./types";
2
+ /**
3
+ * List subagent files for a session.
4
+ * Scans two directory structures:
5
+ * - New nested: {projectsDir}/{project}/{session}/subagents/agent-{id}.jsonl
6
+ * - Legacy flat: {projectsDir}/{project}/agent-{id}.jsonl (filtered by sessionId)
7
+ *
8
+ * Returns NEW structure files first, then legacy flat files.
9
+ */
10
+ export declare function listSubagentFiles(projectsDir: string, projectName: string, sessionId: string): SubagentFile[];
11
+ /**
12
+ * Check if a session has any subagent files.
13
+ * Fast check — returns true if at least one subagent file exists.
14
+ */
15
+ export declare function hasSubagents(projectsDir: string, projectName: string, sessionId: string): boolean;
16
+ /**
17
+ * Extract agent ID from filename.
18
+ * e.g., "agent-abc123.jsonl" → "abc123"
19
+ */
20
+ export declare function extractAgentId(filename: string): string | null;
21
+ /**
22
+ * Check if agent ID belongs to a compact agent (starts with "acompact").
23
+ */
24
+ export declare function isCompactAgent(agentId: string): boolean;
25
+ /**
26
+ * Check if a legacy subagent file belongs to a specific session.
27
+ * Reads the first line to check the sessionId field.
28
+ */
29
+ export declare function subagentBelongsToSession(filePath: string, sessionId: string): boolean;
30
+ //# sourceMappingURL=subagent-locator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-locator.d.ts","sourceRoot":"","sources":["../src/subagent-locator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,YAAY,EAAE,CAgEhB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAkDT;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAarF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=subagent-locator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-locator.test.d.ts","sourceRoot":"","sources":["../src/subagent-locator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import type { Message, RawJsonlRecord, Subagent, SubagentFile, TokenUsage, ToolCall } from "./types";
2
+ /**
3
+ * Result of parsing a subagent JSONL file.
4
+ */
5
+ interface SubagentParseResult {
6
+ records: RawJsonlRecord[];
7
+ messages: Message[];
8
+ toolCalls: ToolCall[];
9
+ description: string;
10
+ agentType?: string;
11
+ model?: string;
12
+ totalTokens: TokenUsage;
13
+ }
14
+ /**
15
+ * Resolve subagents from discovered files.
16
+ * Links subagents to parent Task calls with 3-phase linking:
17
+ * Phase 1: agentId matching (from Task tool result JSON)
18
+ * Phase 2: description matching (fuzzy match on taskDescription)
19
+ * Phase 3: positional fallback (unmatched Task calls in order)
20
+ *
21
+ * Also detects parallel execution and aggregates tokens.
22
+ */
23
+ export declare function resolveSubagents(subagentFiles: SubagentFile[], parentToolCalls: ToolCall[]): Subagent[];
24
+ /**
25
+ * Parse a subagent JSONL file into structured data.
26
+ * Returns null if file doesn't exist or is empty.
27
+ */
28
+ export declare function parseSubagentFile(filePath: string): SubagentParseResult | null;
29
+ /**
30
+ * Check if a subagent is a warmup agent.
31
+ * Warmup agents have first user message === "Warmup".
32
+ */
33
+ export declare function isWarmupAgent(records: RawJsonlRecord[]): boolean;
34
+ export { extractAgentId, isCompactAgent } from "./subagent-locator";
35
+ //# sourceMappingURL=subagent-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-resolver.d.ts","sourceRoot":"","sources":["../src/subagent-resolver.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,OAAO,EAEP,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,QAAQ,EAGT,MAAM,SAAS,CAAA;AAQhB;;GAEG;AACH,UAAU,mBAAmB;IAC3B,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,UAAU,CAAA;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,YAAY,EAAE,EAC7B,eAAe,EAAE,QAAQ,EAAE,GAC1B,QAAQ,EAAE,CA+FZ;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CA2I9E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAKhE;AA0KD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=subagent-resolver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent-resolver.test.d.ts","sourceRoot":"","sources":["../src/subagent-resolver.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import type { ToolCall } from "./types";
2
+ /**
3
+ * Extract tool calls from assistant message content.
4
+ * Filters tool_use blocks and identifies Task tools specially.
5
+ */
6
+ export declare function extractToolCalls(content: Array<Record<string, unknown>> | string, timestamp?: string): ToolCall[];
7
+ /**
8
+ * Extract tool results from user message content.
9
+ * Filters tool_result blocks from content array.
10
+ */
11
+ export declare function extractToolResults(content: Array<Record<string, unknown>> | string): ToolResult[];
12
+ /**
13
+ * Raw tool result extracted from message content.
14
+ */
15
+ export interface ToolResult {
16
+ toolUseId: string;
17
+ content: unknown;
18
+ isError?: boolean;
19
+ }
20
+ /**
21
+ * Link tool results to tool calls by toolUseId.
22
+ * Sets result string and isError flag on matched calls.
23
+ * Returns a new array (does not mutate input).
24
+ */
25
+ export declare function linkToolResults(calls: ToolCall[], results: ToolResult[]): ToolCall[];
26
+ /**
27
+ * Format tool result content into a readable string.
28
+ * Handles:
29
+ * - stdout/stderr (command execution results)
30
+ * - questions/answers (interactive prompts)
31
+ * - generic JSON (everything else)
32
+ */
33
+ export declare function formatToolResult(content: unknown): string;
34
+ //# sourceMappingURL=tool-extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-extraction.d.ts","sourceRoot":"","sources":["../src/tool-extraction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEvC;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAChD,SAAS,CAAC,EAAE,MAAM,GACjB,QAAQ,EAAE,CAiCZ;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,UAAU,EAAE,CAejG;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAkBpF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CA4BzD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-extraction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-extraction.test.d.ts","sourceRoot":"","sources":["../src/tool-extraction.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import type { RawJsonlRecord, ToolCall, ToolExecution } from "./types";
2
+ /**
3
+ * Collect tool calls from raw JSONL messages.
4
+ * Extracts tool_use blocks from assistant messages.
5
+ */
6
+ export declare function collectToolCalls(rawMessages: RawJsonlRecord[]): ToolCall[];
7
+ /**
8
+ * Match tool calls to their results and compute timing.
9
+ *
10
+ * Matching strategy:
11
+ * 1. Primary: Match by sourceToolUseID (in tool result metadata)
12
+ * 2. Fallback: Match by parentUuid (user message → assistant message)
13
+ * 3. Fallback: Match by toolResults array (positional)
14
+ */
15
+ export declare function matchToolCalls(toolCalls: ToolCall[], toolResults: Map<string, {
16
+ result: string;
17
+ isError: boolean;
18
+ timestamp: string;
19
+ }>): ToolExecution[];
20
+ /**
21
+ * Build a map of tool results from raw JSONL records.
22
+ * Keys by toolUseId from toolUseResult metadata.
23
+ */
24
+ export declare function buildToolResultMap(rawMessages: Array<{
25
+ type: string;
26
+ uuid?: string;
27
+ parentUuid?: string;
28
+ toolUseResult?: Record<string, unknown>;
29
+ timestamp?: string;
30
+ }>): Map<string, {
31
+ result: string;
32
+ isError: boolean;
33
+ timestamp: string;
34
+ }>;
35
+ //# sourceMappingURL=tool-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-matcher.d.ts","sourceRoot":"","sources":["../src/tool-matcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAEtE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,CAW1E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,QAAQ,EAAE,EACrB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAChF,aAAa,EAAE,CAkCjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,KAAK,CAAC;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,GACD,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBtE"}
@@ -0,0 +1,272 @@
1
+ /** Message category from the 5-category cascade */
2
+ export type MessageCategory = "user" | "assistant" | "system" | "compact" | "hardNoise";
3
+ /** A message paired with its classified category */
4
+ export interface ClassifiedMessage {
5
+ record: RawJsonlRecord;
6
+ category: MessageCategory;
7
+ }
8
+ /** Per-turn token counts */
9
+ export interface TokenUsage {
10
+ inputTokens: number;
11
+ outputTokens: number;
12
+ cacheReadTokens: number;
13
+ cacheCreation5mTokens: number;
14
+ cacheCreation1hTokens: number;
15
+ /** Fallback total cache creation (optional) */
16
+ cacheCreationTokens?: number;
17
+ }
18
+ /** Raw JSONL record from session file (internal use) */
19
+ export interface RawJsonlRecord {
20
+ type: string;
21
+ timestamp?: string;
22
+ uuid?: string;
23
+ parentUuid?: string;
24
+ requestId?: string;
25
+ isMeta?: boolean;
26
+ isSidechain?: boolean;
27
+ isCompactSummary?: boolean;
28
+ agentId?: string;
29
+ sourceToolUseID?: string;
30
+ message?: {
31
+ role: string;
32
+ content: Array<Record<string, unknown>> | string;
33
+ model?: string;
34
+ usage?: {
35
+ input_tokens?: number;
36
+ output_tokens?: number;
37
+ cache_read_input_tokens?: number;
38
+ cache_creation_input_tokens?: number;
39
+ cache_creation?: {
40
+ ephemeral_5m_input_tokens?: number;
41
+ ephemeral_1h_input_tokens?: number;
42
+ };
43
+ cacheCreation5mTokens?: number;
44
+ cacheCreation1hTokens?: number;
45
+ };
46
+ };
47
+ toolUseResult?: {
48
+ toolUseId: string;
49
+ content: unknown;
50
+ isError?: boolean;
51
+ };
52
+ attachment?: {
53
+ type: string;
54
+ hookName?: string;
55
+ toolUseID?: string;
56
+ stdout?: string;
57
+ [key: string]: unknown;
58
+ };
59
+ }
60
+ /** Text content block */
61
+ export interface TextContent {
62
+ type: "text";
63
+ text: string;
64
+ }
65
+ /** Tool use content block */
66
+ export interface ToolUseContent {
67
+ type: "tool_use";
68
+ name: string;
69
+ input: Record<string, unknown>;
70
+ toolUseId: string;
71
+ }
72
+ /** Tool result content block */
73
+ export interface ToolResultContent {
74
+ type: "tool_result";
75
+ toolUseId: string;
76
+ content: unknown;
77
+ isError?: boolean;
78
+ }
79
+ /** Union of all message content types */
80
+ export type MessageContent = TextContent | ToolUseContent | ToolResultContent;
81
+ /** Normalized message */
82
+ export interface Message {
83
+ type: "assistant" | "user" | "system";
84
+ timestamp?: string;
85
+ content: MessageContent[];
86
+ }
87
+ /** Extracted tool invocation */
88
+ export interface ToolCall {
89
+ toolUseId: string;
90
+ name: string;
91
+ input: Record<string, unknown>;
92
+ result?: string;
93
+ isError?: boolean;
94
+ timestamp?: string;
95
+ /** Whether this tool call is a Task (subagent spawn) */
96
+ isTask: boolean;
97
+ /** Description of the task, extracted from Task tool input */
98
+ taskDescription?: string;
99
+ /** Subagent type, extracted from Task tool input */
100
+ taskSubagentType?: string;
101
+ /** Rewritten command from a PreToolUse hook (e.g. RTK proxy) */
102
+ hookRewrite?: {
103
+ command: string;
104
+ };
105
+ }
106
+ /** Single API call record */
107
+ export interface Turn {
108
+ timestamp: string;
109
+ tokenUsage: TokenUsage;
110
+ toolName?: string;
111
+ cwd?: string;
112
+ /** Model used for this specific turn (detected from assistant message). Falls back to session-level model when undefined. */
113
+ model?: string;
114
+ messages: Message[];
115
+ toolCalls: ToolCall[];
116
+ cacheWriteType: "5m" | "1h" | "none";
117
+ cacheReadType: "5m" | "1h" | "5m-fallback" | "unknown";
118
+ cacheCreationTokensThisTurn: number;
119
+ }
120
+ /** Session-level info from SQLite */
121
+ export interface SessionMetadata {
122
+ sessionId: string;
123
+ projectName: string;
124
+ model: string;
125
+ commandExecuted?: string;
126
+ workingDirectory: string;
127
+ turnCount: number;
128
+ totalTokens: TokenUsage;
129
+ startTime: string;
130
+ endTime: string;
131
+ isOngoing: boolean;
132
+ activeDurationMs?: number;
133
+ costCaptureAvailable?: boolean;
134
+ }
135
+ /** Model pricing config */
136
+ export interface PricingRate {
137
+ model: string;
138
+ inputPerMTok: number;
139
+ outputPerMTok: number;
140
+ cacheReadPerMTok: number;
141
+ cacheWritePerMTok: number;
142
+ }
143
+ /** Cached pricing file structure */
144
+ export interface PricingFile {
145
+ fetchedAt: string;
146
+ models: Record<string, PricingRate>;
147
+ }
148
+ /** Per-turn cost breakdown */
149
+ export interface TurnPricing {
150
+ inputCost: number;
151
+ outputCost: number;
152
+ cacheReadCost: number;
153
+ cacheWriteCost: number;
154
+ totalCost: number;
155
+ }
156
+ /** Session-level pricing */
157
+ export interface SessionPricing {
158
+ estimatedTotalCost: number;
159
+ turnsPricing: TurnPricing[];
160
+ apiTotalCost: number | null;
161
+ apiSnapshotCount: number;
162
+ apiLastSnapshotAt: string | null;
163
+ totalCost: number;
164
+ costSource: "api" | "estimated";
165
+ modelBreakdown: Record<string, {
166
+ inputTokens: number;
167
+ outputTokens: number;
168
+ cacheReadTokens: number;
169
+ cacheCreationTokens: number;
170
+ cost: number;
171
+ turnCount: number;
172
+ }>;
173
+ pricingRate: PricingRate;
174
+ }
175
+ /** Matched tool call with result and timing */
176
+ export interface ToolExecution {
177
+ toolCall: ToolCall;
178
+ result?: string;
179
+ isError?: boolean;
180
+ durationMs: number;
181
+ startTime: string;
182
+ endTime: string;
183
+ }
184
+ /** Discovered subagent file */
185
+ export interface SubagentFile {
186
+ /** Absolute path to the JSONL file */
187
+ filePath: string;
188
+ /** Agent ID extracted from filename (e.g., "abc123" from "agent-abc123.jsonl") */
189
+ agentId: string;
190
+ /** Whether this file is from the NEW nested structure */
191
+ isNewStructure: boolean;
192
+ }
193
+ /** Subagent session */
194
+ export interface Subagent {
195
+ id: string;
196
+ parentTaskId: string;
197
+ description: string;
198
+ startTime: string;
199
+ endTime: string;
200
+ turnCount: number;
201
+ status: "completed" | "failed" | "pending";
202
+ isParallel: boolean;
203
+ /** Model used by the subagent */
204
+ model?: string;
205
+ /** Agent type from meta.json (e.g. "Explore", "general-purpose") */
206
+ agentType?: string;
207
+ /** Aggregated token usage (request-id deduplicated) */
208
+ totalTokens?: TokenUsage;
209
+ /** Total calculated cost in USD */
210
+ totalCost?: number;
211
+ /** Index in the parent session's turns array (for inline placement) */
212
+ parentTurnIndex?: number;
213
+ /** Messages from the subagent session */
214
+ messages?: Message[];
215
+ /** Tool calls from the subagent session */
216
+ toolCalls?: ToolCall[];
217
+ }
218
+ /** Conversation group: user message + all AI responses until next user message */
219
+ export interface ConversationGroup {
220
+ id: string;
221
+ userMessage?: Message;
222
+ aiResponses: Message[];
223
+ toolExecutions: ToolCall[];
224
+ processIds: string[];
225
+ startTime: string;
226
+ endTime: string;
227
+ durationMs: number;
228
+ tokenUsage: TokenUsage;
229
+ totalCost: number;
230
+ }
231
+ /** Final output shape */
232
+ export interface FullTimelineSession {
233
+ session: SessionMetadata;
234
+ turns: Turn[];
235
+ pricing: SessionPricing;
236
+ contextStats?: ContextStats;
237
+ subagents?: Subagent[];
238
+ conversationGroups?: ConversationGroup[];
239
+ }
240
+ /** Context categories for token tracking */
241
+ export type ContextCategory = "user-message" | "tool-output" | "thinking-text" | "system" | "compact" | "other";
242
+ /** A compaction phase in the session (bounded by compact events) */
243
+ export interface Phase {
244
+ phaseNumber: number;
245
+ startRecordIndex: number;
246
+ endRecordIndex: number;
247
+ }
248
+ /** A single context injection record tracking what consumed tokens */
249
+ export interface ContextInjection {
250
+ recordIndex: number;
251
+ category: ContextCategory;
252
+ inputTokens: number;
253
+ timestamp?: string;
254
+ phaseNumber: number;
255
+ }
256
+ /** Per-turn context snapshot */
257
+ export interface TurnContextSnapshot {
258
+ recordIndex: number;
259
+ category: ContextCategory;
260
+ inputTokens: number;
261
+ phaseNumber: number;
262
+ timestamp?: string;
263
+ }
264
+ /** Session-level context statistics */
265
+ export interface ContextStats {
266
+ injections: ContextInjection[];
267
+ tokensByCategory: Record<ContextCategory, number>;
268
+ totalInputTokens: number;
269
+ phaseCount: number;
270
+ phases: Phase[];
271
+ }
272
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Get the path to usage.db
3
+ * Priority: customPath > CLAUDE_CONFIG_DIR env > ~/.claude
4
+ */
5
+ export declare function getDbPath(customPath?: string): string;
6
+ /**
7
+ * Get the path to the projects directory
8
+ * Priority: customPath > CLAUDE_CONFIG_DIR env > ~/.claude
9
+ */
10
+ export declare function getProjectsDir(customPath?: string): string;
11
+ /**
12
+ * Encode project name for directory lookup
13
+ * Replaces all '/' with '-' (e.g., '/Users/test' → '-Users-test')
14
+ */
15
+ export declare function encodeProjectName(projectName: string): string;
16
+ /**
17
+ * Resolve the path to a session's JSONL file
18
+ * Tries multiple encodings to handle DB storing project_name with or without leading '/'
19
+ */
20
+ export declare function resolveSessionJsonlPath(session: {
21
+ projectName: string;
22
+ sessionId: string;
23
+ }, projectsDir: string): string | null;
24
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACnD,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAyBf"}