braindump 0.3.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +180 -0
  3. package/dist/adapters/base-adapter.d.ts +13 -0
  4. package/dist/adapters/base-adapter.d.ts.map +1 -0
  5. package/dist/adapters/base-adapter.js +7 -0
  6. package/dist/adapters/base-adapter.js.map +1 -0
  7. package/dist/adapters/claude-code/adapter.d.ts +47 -0
  8. package/dist/adapters/claude-code/adapter.d.ts.map +1 -0
  9. package/dist/adapters/claude-code/adapter.js +382 -0
  10. package/dist/adapters/claude-code/adapter.js.map +1 -0
  11. package/dist/adapters/codex/adapter.d.ts +26 -0
  12. package/dist/adapters/codex/adapter.d.ts.map +1 -0
  13. package/dist/adapters/codex/adapter.js +446 -0
  14. package/dist/adapters/codex/adapter.js.map +1 -0
  15. package/dist/adapters/cursor/adapter.d.ts +35 -0
  16. package/dist/adapters/cursor/adapter.d.ts.map +1 -0
  17. package/dist/adapters/cursor/adapter.js +675 -0
  18. package/dist/adapters/cursor/adapter.js.map +1 -0
  19. package/dist/adapters/index.d.ts +19 -0
  20. package/dist/adapters/index.d.ts.map +1 -0
  21. package/dist/adapters/index.js +65 -0
  22. package/dist/adapters/index.js.map +1 -0
  23. package/dist/cli/index.d.ts +3 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +424 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/utils.d.ts +10 -0
  28. package/dist/cli/utils.d.ts.map +1 -0
  29. package/dist/cli/utils.js +21 -0
  30. package/dist/cli/utils.js.map +1 -0
  31. package/dist/core/compression.d.ts +11 -0
  32. package/dist/core/compression.d.ts.map +1 -0
  33. package/dist/core/compression.js +182 -0
  34. package/dist/core/compression.js.map +1 -0
  35. package/dist/core/conversation-analyzer.d.ts +9 -0
  36. package/dist/core/conversation-analyzer.d.ts.map +1 -0
  37. package/dist/core/conversation-analyzer.js +220 -0
  38. package/dist/core/conversation-analyzer.js.map +1 -0
  39. package/dist/core/project-context.d.ts +7 -0
  40. package/dist/core/project-context.d.ts.map +1 -0
  41. package/dist/core/project-context.js +136 -0
  42. package/dist/core/project-context.js.map +1 -0
  43. package/dist/core/prompt-builder.d.ts +7 -0
  44. package/dist/core/prompt-builder.d.ts.map +1 -0
  45. package/dist/core/prompt-builder.js +88 -0
  46. package/dist/core/prompt-builder.js.map +1 -0
  47. package/dist/core/registry.d.ts +10 -0
  48. package/dist/core/registry.d.ts.map +1 -0
  49. package/dist/core/registry.js +51 -0
  50. package/dist/core/registry.js.map +1 -0
  51. package/dist/core/token-estimator.d.ts +10 -0
  52. package/dist/core/token-estimator.d.ts.map +1 -0
  53. package/dist/core/token-estimator.js +14 -0
  54. package/dist/core/token-estimator.js.map +1 -0
  55. package/dist/core/validation.d.ts +188 -0
  56. package/dist/core/validation.d.ts.map +1 -0
  57. package/dist/core/validation.js +61 -0
  58. package/dist/core/validation.js.map +1 -0
  59. package/dist/core/watcher.d.ts +20 -0
  60. package/dist/core/watcher.d.ts.map +1 -0
  61. package/dist/core/watcher.js +208 -0
  62. package/dist/core/watcher.js.map +1 -0
  63. package/dist/providers/clipboard-provider.d.ts +8 -0
  64. package/dist/providers/clipboard-provider.d.ts.map +1 -0
  65. package/dist/providers/clipboard-provider.js +15 -0
  66. package/dist/providers/clipboard-provider.js.map +1 -0
  67. package/dist/providers/file-provider.d.ts +8 -0
  68. package/dist/providers/file-provider.d.ts.map +1 -0
  69. package/dist/providers/file-provider.js +14 -0
  70. package/dist/providers/file-provider.js.map +1 -0
  71. package/dist/providers/index.d.ts +9 -0
  72. package/dist/providers/index.d.ts.map +1 -0
  73. package/dist/providers/index.js +18 -0
  74. package/dist/providers/index.js.map +1 -0
  75. package/dist/types/index.d.ts +132 -0
  76. package/dist/types/index.d.ts.map +1 -0
  77. package/dist/types/index.js +3 -0
  78. package/dist/types/index.js.map +1 -0
  79. package/package.json +69 -0
@@ -0,0 +1,21 @@
1
+ import { existsSync, lstatSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ /**
4
+ * Resolve the output path for RESUME.md.
5
+ * - If path is a directory or ends with `/`, write RESUME.md inside it.
6
+ * - Otherwise treat as a file path.
7
+ */
8
+ export function resolveOutputPath(outputFlag, projectPath) {
9
+ if (!outputFlag) {
10
+ const handoffDir = join(projectPath, ".handoff");
11
+ return { resumePath: join(handoffDir, "RESUME.md"), sessionDir: handoffDir };
12
+ }
13
+ const isDir = outputFlag.endsWith("/") ||
14
+ outputFlag.endsWith("\\") ||
15
+ (existsSync(outputFlag) && lstatSync(outputFlag).isDirectory());
16
+ if (isDir) {
17
+ return { resumePath: join(outputFlag, "RESUME.md"), sessionDir: outputFlag };
18
+ }
19
+ return { resumePath: outputFlag, sessionDir: dirname(outputFlag) };
20
+ }
21
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAA8B,EAC9B,WAAmB;IAEnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACjD,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,KAAK,GACT,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;QACxB,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAElE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IAC/E,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CapturedSession, CompressionOptions, CompressionResult, PriorityLayer } from "../types/index.js";
2
+ /**
3
+ * Build all priority layers from a captured session.
4
+ */
5
+ export declare function buildLayers(session: CapturedSession): PriorityLayer[];
6
+ /**
7
+ * Compression engine using priority-layered packing.
8
+ * Takes a CapturedSession and a token budget, produces compressed content.
9
+ */
10
+ export declare function compress(session: CapturedSession, options: CompressionOptions): CompressionResult;
11
+ //# sourceMappingURL=compression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/core/compression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACd,MAAM,mBAAmB,CAAC;AAI3B;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE,CAqJrE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,kBAAkB,GAC1B,iBAAiB,CAiCnB"}
@@ -0,0 +1,182 @@
1
+ import { estimateTokens } from "./token-estimator.js";
2
+ import { getUsableTokenBudget } from "./registry.js";
3
+ /**
4
+ * Build all priority layers from a captured session.
5
+ */
6
+ export function buildLayers(session) {
7
+ const layers = [];
8
+ // Priority 1: TASK STATE
9
+ {
10
+ const lines = ["## TASK STATE"];
11
+ lines.push(`**Description:** ${session.task.description}`);
12
+ if (session.task.completed.length > 0) {
13
+ lines.push(`**Completed:** ${session.task.completed.join(", ")}`);
14
+ }
15
+ if (session.task.inProgress) {
16
+ lines.push(`**In Progress:** ${session.task.inProgress}`);
17
+ }
18
+ if (session.task.remaining.length > 0) {
19
+ lines.push(`**Remaining:** ${session.task.remaining.join(", ")}`);
20
+ }
21
+ if (session.task.blockers.length > 0) {
22
+ lines.push(`**Blockers:** ${session.task.blockers.join(", ")}`);
23
+ }
24
+ const content = lines.join("\n");
25
+ layers.push({ name: "TASK STATE", priority: 1, content, tokens: estimateTokens(content) });
26
+ }
27
+ // Priority 2: ACTIVE FILES
28
+ {
29
+ const lines = ["## ACTIVE FILES"];
30
+ const files = session.filesChanged.slice(0, 15);
31
+ for (const file of files) {
32
+ lines.push(`- \`${file.path}\` (${file.changeType})`);
33
+ if (file.diff) {
34
+ const truncatedDiff = file.diff.length > 2000 ? file.diff.slice(0, 2000) + "..." : file.diff;
35
+ lines.push("```" + (file.language || ""));
36
+ lines.push(truncatedDiff);
37
+ lines.push("```");
38
+ }
39
+ }
40
+ const content = lines.join("\n");
41
+ layers.push({ name: "ACTIVE FILES", priority: 2, content, tokens: estimateTokens(content) });
42
+ }
43
+ // Priority 3: DECISIONS & BLOCKERS
44
+ {
45
+ const lines = ["## DECISIONS & BLOCKERS"];
46
+ if (session.decisions.length > 0) {
47
+ lines.push("**Decisions:**");
48
+ for (const d of session.decisions) {
49
+ lines.push(`- ${d}`);
50
+ }
51
+ }
52
+ if (session.blockers.length > 0) {
53
+ lines.push("**Blockers:**");
54
+ for (const b of session.blockers) {
55
+ lines.push(`- ${b}`);
56
+ }
57
+ }
58
+ const content = lines.join("\n");
59
+ layers.push({ name: "DECISIONS & BLOCKERS", priority: 3, content, tokens: estimateTokens(content) });
60
+ }
61
+ // Priority 4: PROJECT CONTEXT
62
+ {
63
+ const lines = ["## PROJECT CONTEXT"];
64
+ lines.push(`**Path:** ${session.project.path}`);
65
+ if (session.project.name) {
66
+ lines.push(`**Name:** ${session.project.name}`);
67
+ }
68
+ if (session.project.gitBranch) {
69
+ lines.push(`**Branch:** ${session.project.gitBranch}`);
70
+ }
71
+ if (session.project.gitStatus) {
72
+ lines.push(`**Git Status:** ${session.project.gitStatus}`);
73
+ }
74
+ if (session.project.structure) {
75
+ const structureLines = session.project.structure.split("\n");
76
+ const truncated = structureLines.slice(0, 40).join("\n");
77
+ lines.push("**Structure:**");
78
+ lines.push("```");
79
+ lines.push(truncated);
80
+ lines.push("```");
81
+ }
82
+ if (session.project.memoryFileContents) {
83
+ const mem = session.project.memoryFileContents.length > 2000
84
+ ? session.project.memoryFileContents.slice(0, 2000) + "..."
85
+ : session.project.memoryFileContents;
86
+ lines.push("**Memory File:**");
87
+ lines.push(mem);
88
+ }
89
+ const content = lines.join("\n");
90
+ layers.push({ name: "PROJECT CONTEXT", priority: 4, content, tokens: estimateTokens(content) });
91
+ }
92
+ // Priority 5: SESSION OVERVIEW
93
+ {
94
+ const lines = ["## SESSION OVERVIEW"];
95
+ lines.push(`**Messages:** ${session.conversation.messageCount}`);
96
+ lines.push(`**Estimated Tokens:** ${session.conversation.estimatedTokens}`);
97
+ const messages = session.conversation.messages;
98
+ const firstUser = messages.find(m => m.role === "user");
99
+ const lastUser = [...messages].reverse().find(m => m.role === "user");
100
+ if (firstUser) {
101
+ lines.push(`**First User Message:** ${firstUser.content}`);
102
+ }
103
+ if (lastUser && lastUser !== firstUser) {
104
+ lines.push(`**Last User Message:** ${lastUser.content}`);
105
+ }
106
+ const toolNames = new Set(messages.filter(m => m.toolName).map(m => m.toolName));
107
+ if (toolNames.size > 0) {
108
+ lines.push(`**Tools Used:** ${[...toolNames].join(", ")}`);
109
+ }
110
+ const content = lines.join("\n");
111
+ layers.push({ name: "SESSION OVERVIEW", priority: 5, content, tokens: estimateTokens(content) });
112
+ }
113
+ // Priority 6: RECENT MESSAGES (last 20)
114
+ {
115
+ const messages = session.conversation.messages;
116
+ const recent = messages.slice(-20);
117
+ const lines = ["## RECENT MESSAGES"];
118
+ for (const msg of recent) {
119
+ const truncated = msg.content.length > 1000 ? msg.content.slice(0, 1000) + "..." : msg.content;
120
+ const tool = msg.toolName ? ` [${msg.toolName}]` : "";
121
+ lines.push(`**${msg.role}${tool}:** ${truncated}`);
122
+ }
123
+ const content = lines.join("\n");
124
+ layers.push({ name: "RECENT MESSAGES", priority: 6, content, tokens: estimateTokens(content) });
125
+ }
126
+ // Priority 7: FULL HISTORY (older messages beyond last 20)
127
+ {
128
+ const messages = session.conversation.messages;
129
+ const olderCount = Math.max(0, messages.length - 20);
130
+ if (olderCount > 0) {
131
+ const older = messages.slice(0, olderCount);
132
+ const lines = ["## FULL HISTORY"];
133
+ for (const msg of older) {
134
+ const truncated = msg.content.length > 500 ? msg.content.slice(0, 500) + "..." : msg.content;
135
+ const tool = msg.toolName ? ` [${msg.toolName}]` : "";
136
+ lines.push(`**${msg.role}${tool}:** ${truncated}`);
137
+ }
138
+ const content = lines.join("\n");
139
+ layers.push({ name: "FULL HISTORY", priority: 7, content, tokens: estimateTokens(content) });
140
+ }
141
+ else {
142
+ layers.push({ name: "FULL HISTORY", priority: 7, content: "## FULL HISTORY\nNo older messages.", tokens: estimateTokens("## FULL HISTORY\nNo older messages.") });
143
+ }
144
+ }
145
+ return layers;
146
+ }
147
+ /**
148
+ * Compression engine using priority-layered packing.
149
+ * Takes a CapturedSession and a token budget, produces compressed content.
150
+ */
151
+ export function compress(session, options) {
152
+ const budget = options.targetTokens || getUsableTokenBudget(options.targetAgent || "file");
153
+ const reservedTokens = 400;
154
+ let remaining = budget - reservedTokens;
155
+ const layers = buildLayers(session);
156
+ layers.sort((a, b) => a.priority - b.priority);
157
+ const includedLayers = [];
158
+ const droppedLayers = [];
159
+ const includedContent = [];
160
+ for (const layer of layers) {
161
+ if (layer.tokens <= remaining) {
162
+ includedContent.push(layer.content);
163
+ includedLayers.push(layer.name);
164
+ remaining -= layer.tokens;
165
+ }
166
+ else if (layer.priority <= 3 && remaining > 200) {
167
+ // Truncate high-priority layers to fit
168
+ const availableChars = remaining * 4;
169
+ const truncated = layer.content.slice(0, availableChars);
170
+ includedContent.push(truncated);
171
+ includedLayers.push(layer.name);
172
+ remaining = 0;
173
+ }
174
+ else {
175
+ droppedLayers.push(layer.name);
176
+ }
177
+ }
178
+ const content = includedContent.join("\n\n");
179
+ const totalTokens = estimateTokens(content);
180
+ return { content, totalTokens, includedLayers, droppedLayers };
181
+ }
182
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/core/compression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ConversationMessage } from "../types/index.js";
2
+ export interface ConversationAnalysis {
3
+ taskDescription: string;
4
+ decisions: string[];
5
+ blockers: string[];
6
+ completedSteps: string[];
7
+ }
8
+ export declare function analyzeConversation(messages: ConversationMessage[]): ConversationAnalysis;
9
+ //# sourceMappingURL=conversation-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-analyzer.d.ts","sourceRoot":"","sources":["../../src/core/conversation-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAuBD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,mBAAmB,EAAE,GAC9B,oBAAoB,CAOtB"}
@@ -0,0 +1,220 @@
1
+ const MAX_TASK_CHARS = 300;
2
+ const MAX_DECISIONS = 10;
3
+ const MAX_BLOCKERS = 10;
4
+ const MAX_COMPLETED_STEPS = 15;
5
+ const MAX_STEP_CHARS = 100;
6
+ const MAX_BLOCKER_CHARS = 160;
7
+ const ACK_ONLY = new Set([
8
+ "yes",
9
+ "ok",
10
+ "okay",
11
+ "sure",
12
+ "continue",
13
+ "go ahead",
14
+ "proceed",
15
+ "sounds good",
16
+ "do it",
17
+ "yep",
18
+ "yeah",
19
+ ]);
20
+ export function analyzeConversation(messages) {
21
+ return {
22
+ taskDescription: extractTaskDescription(messages),
23
+ decisions: extractDecisions(messages),
24
+ blockers: extractBlockers(messages),
25
+ completedSteps: extractCompletedSteps(messages),
26
+ };
27
+ }
28
+ function extractTaskDescription(messages) {
29
+ const userMessages = messages.filter((m) => m.role === "user");
30
+ for (const message of userMessages) {
31
+ if (!isMeaningfulTaskMessage(message.content)) {
32
+ continue;
33
+ }
34
+ return truncate(cleanText(message.content), MAX_TASK_CHARS);
35
+ }
36
+ // Fallback to a meaningful assistant message when user prompts are too noisy.
37
+ const assistantMessages = messages.filter((m) => m.role === "assistant");
38
+ for (const message of assistantMessages) {
39
+ if (!isMeaningfulTaskMessage(message.content)) {
40
+ continue;
41
+ }
42
+ return truncate(cleanText(message.content), MAX_TASK_CHARS);
43
+ }
44
+ return "Unknown task";
45
+ }
46
+ function extractDecisions(messages) {
47
+ const results = [];
48
+ const seen = new Set();
49
+ const decisionPatterns = [
50
+ /\b(?:i(?:'| a)?ll|i will)\s+(?:use|go with|choose|pick)\b/i,
51
+ /\blet'?s\s+(?:use|go with)\b/i,
52
+ /\bdecid(?:e|ed)\s+to\b/i,
53
+ /\bchoos(?:e|ing)\b.*\bover\b/i,
54
+ /\bbetter to use\b/i,
55
+ /\bis better than\b/i,
56
+ /\busing\b.*\bfor\b/i,
57
+ /\bpicked\b.*\bbecause\b/i,
58
+ /\binstead of\b/i,
59
+ ];
60
+ for (const message of messages) {
61
+ if (message.role !== "assistant") {
62
+ continue;
63
+ }
64
+ const sentences = toSentences(message.content);
65
+ for (const sentence of sentences) {
66
+ if (!decisionPatterns.some((pattern) => pattern.test(sentence))) {
67
+ continue;
68
+ }
69
+ const normalized = normalizeSummaryLine(sentence);
70
+ if (!normalized) {
71
+ continue;
72
+ }
73
+ const key = normalized.toLowerCase();
74
+ if (seen.has(key)) {
75
+ continue;
76
+ }
77
+ seen.add(key);
78
+ results.push(normalized);
79
+ if (results.length >= MAX_DECISIONS) {
80
+ return results;
81
+ }
82
+ }
83
+ }
84
+ return results;
85
+ }
86
+ function extractBlockers(messages) {
87
+ const results = [];
88
+ const seen = new Set();
89
+ const blockerPatterns = [
90
+ /\berror\b/i,
91
+ /\bfailed\b/i,
92
+ /\bunable to\b/i,
93
+ /\bcan't\b/i,
94
+ /\bcannot\b/i,
95
+ /permission denied/i,
96
+ /\bnot found\b/i,
97
+ /\b404\b/i,
98
+ /\b500\b/i,
99
+ /\btimeout\b/i,
100
+ /\beconnrefused\b/i,
101
+ /^at\s+\S+/i,
102
+ ];
103
+ for (const message of messages) {
104
+ const lines = message.content
105
+ .split("\n")
106
+ .map((line) => line.trim())
107
+ .filter(Boolean);
108
+ for (const line of lines) {
109
+ if (!blockerPatterns.some((pattern) => pattern.test(line))) {
110
+ continue;
111
+ }
112
+ const normalized = normalizeBlockerLine(line);
113
+ if (!normalized) {
114
+ continue;
115
+ }
116
+ const key = normalized.toLowerCase();
117
+ if (seen.has(key)) {
118
+ continue;
119
+ }
120
+ seen.add(key);
121
+ results.push(normalized);
122
+ if (results.length >= MAX_BLOCKERS) {
123
+ return results;
124
+ }
125
+ }
126
+ }
127
+ return results;
128
+ }
129
+ function extractCompletedSteps(messages) {
130
+ const results = [];
131
+ const seen = new Set();
132
+ const completionPatterns = [
133
+ /\b(?:done|completed|finished|created|added|updated|fixed|implemented|resolved|configured|refactored|verified)\b/i,
134
+ /\b(?:i have|i've|we have|we've)\s+(?:done|completed|finished|created|added|updated|fixed|implemented|resolved|configured|refactored|verified)\b/i,
135
+ ];
136
+ const futurePattern = /\b(?:i(?:'| a)?ll|i will|we(?:'| wi)?ll|going to)\b/i;
137
+ for (const message of messages) {
138
+ if (message.role !== "assistant") {
139
+ continue;
140
+ }
141
+ const sentences = toSentences(message.content);
142
+ for (const sentence of sentences) {
143
+ if (!completionPatterns.some((pattern) => pattern.test(sentence))) {
144
+ continue;
145
+ }
146
+ if (futurePattern.test(sentence)) {
147
+ continue;
148
+ }
149
+ const normalized = normalizeSummaryLine(sentence);
150
+ if (!normalized) {
151
+ continue;
152
+ }
153
+ const summary = truncate(normalized, MAX_STEP_CHARS);
154
+ const key = summary.toLowerCase();
155
+ if (seen.has(key)) {
156
+ continue;
157
+ }
158
+ seen.add(key);
159
+ results.push(summary);
160
+ if (results.length >= MAX_COMPLETED_STEPS) {
161
+ return results;
162
+ }
163
+ }
164
+ }
165
+ return results;
166
+ }
167
+ function isMeaningfulTaskMessage(content) {
168
+ const cleaned = cleanText(content);
169
+ if (!cleaned) {
170
+ return false;
171
+ }
172
+ if (cleaned.length < 15) {
173
+ return false;
174
+ }
175
+ if (cleaned.startsWith("[")) {
176
+ return false;
177
+ }
178
+ if (/request interrupted|interrupted/i.test(cleaned)) {
179
+ return false;
180
+ }
181
+ const normalized = cleaned.toLowerCase().replace(/[.!?,;:]/g, "").trim();
182
+ if (ACK_ONLY.has(normalized)) {
183
+ return false;
184
+ }
185
+ return true;
186
+ }
187
+ function toSentences(content) {
188
+ const normalized = cleanText(content).replace(/\r/g, " ");
189
+ const matches = normalized.match(/[^.!?\n]+[.!?]?/g) ?? [];
190
+ return matches.map((sentence) => cleanText(sentence)).filter(Boolean);
191
+ }
192
+ function normalizeSummaryLine(input) {
193
+ return cleanText(input).replace(/^[-*]\s*/, "").trim();
194
+ }
195
+ function normalizeBlockerLine(line) {
196
+ const cleaned = cleanText(line);
197
+ if (!cleaned) {
198
+ return "";
199
+ }
200
+ const stackMatch = cleaned.match(/^at\s+(.+)$/i);
201
+ if (stackMatch) {
202
+ return truncate(`Stack trace: ${stackMatch[1]}`, MAX_BLOCKER_CHARS);
203
+ }
204
+ const errorMatch = cleaned.match(/^error:\s*(.+)$/i);
205
+ if (errorMatch) {
206
+ return truncate(`Error: ${errorMatch[1]}`, MAX_BLOCKER_CHARS);
207
+ }
208
+ const failedMatch = cleaned.match(/^failed:\s*(.+)$/i);
209
+ if (failedMatch) {
210
+ return truncate(`Failed: ${failedMatch[1]}`, MAX_BLOCKER_CHARS);
211
+ }
212
+ return truncate(cleaned, MAX_BLOCKER_CHARS);
213
+ }
214
+ function truncate(input, maxChars) {
215
+ return input.length <= maxChars ? input : `${input.slice(0, maxChars)}...`;
216
+ }
217
+ function cleanText(input) {
218
+ return input.replace(/\s+/g, " ").trim();
219
+ }
220
+ //# sourceMappingURL=conversation-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-analyzer.js","sourceRoot":"","sources":["../../src/core/conversation-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ProjectContext } from "../types/index.js";
2
+ /**
3
+ * Extract project context from the filesystem.
4
+ * Gathers git info, directory tree, and memory file contents.
5
+ */
6
+ export declare function extractProjectContext(projectPath: string): Promise<ProjectContext>;
7
+ //# sourceMappingURL=project-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../src/core/project-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA+DxD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAyFzB"}
@@ -0,0 +1,136 @@
1
+ import { execSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ /**
5
+ * Build a directory tree string recursively, excluding common non-essential directories.
6
+ * Limited to maxDepth levels and maxLines output lines.
7
+ */
8
+ function buildDirectoryTree(dirPath, prefix = "", depth = 0, maxDepth = 2, lines = []) {
9
+ if (depth > maxDepth || lines.length >= 40) {
10
+ return lines;
11
+ }
12
+ const excludeDirs = new Set(["node_modules", ".git", ".next", "dist", "__pycache__", ".venv"]);
13
+ let entries;
14
+ try {
15
+ entries = fs.readdirSync(dirPath, { withFileTypes: true });
16
+ }
17
+ catch {
18
+ return lines;
19
+ }
20
+ // Sort: directories first, then files, both alphabetically
21
+ entries.sort((a, b) => {
22
+ if (a.isDirectory() && !b.isDirectory())
23
+ return -1;
24
+ if (!a.isDirectory() && b.isDirectory())
25
+ return 1;
26
+ return a.name.localeCompare(b.name);
27
+ });
28
+ for (let i = 0; i < entries.length && lines.length < 40; i++) {
29
+ const entry = entries[i];
30
+ const isLast = i === entries.length - 1;
31
+ const connector = isLast ? "\u2514\u2500 " : "\u251C\u2500 ";
32
+ const childPrefix = isLast ? " " : "\u2502 ";
33
+ if (entry.isDirectory() && excludeDirs.has(entry.name)) {
34
+ continue;
35
+ }
36
+ const suffix = entry.isDirectory() ? "/" : "";
37
+ lines.push(`${prefix}${connector}${entry.name}${suffix}`);
38
+ if (entry.isDirectory() && depth < maxDepth) {
39
+ buildDirectoryTree(path.join(dirPath, entry.name), prefix + childPrefix, depth + 1, maxDepth, lines);
40
+ }
41
+ }
42
+ return lines;
43
+ }
44
+ /**
45
+ * Extract project context from the filesystem.
46
+ * Gathers git info, directory tree, and memory file contents.
47
+ */
48
+ export async function extractProjectContext(projectPath) {
49
+ const context = {
50
+ path: projectPath,
51
+ };
52
+ // Name: try package.json first, fall back to directory basename
53
+ try {
54
+ const packageJsonPath = path.join(projectPath, "package.json");
55
+ const packageJson = fs.readFileSync(packageJsonPath, "utf-8");
56
+ const parsed = JSON.parse(packageJson);
57
+ context.name = parsed.name ?? path.basename(projectPath);
58
+ }
59
+ catch {
60
+ context.name = path.basename(projectPath);
61
+ }
62
+ // Git branch
63
+ try {
64
+ context.gitBranch = execSync("git branch --show-current", {
65
+ cwd: projectPath,
66
+ encoding: "utf-8",
67
+ stdio: "pipe",
68
+ }).trim();
69
+ }
70
+ catch {
71
+ // Git not available or not a git repo
72
+ }
73
+ // Git status
74
+ try {
75
+ context.gitStatus = execSync("git status --short", {
76
+ cwd: projectPath,
77
+ encoding: "utf-8",
78
+ stdio: "pipe",
79
+ }).trim();
80
+ }
81
+ catch {
82
+ // Git not available or not a git repo
83
+ }
84
+ // Git log (last 10 commits)
85
+ try {
86
+ const logOutput = execSync("git log --oneline -10", {
87
+ cwd: projectPath,
88
+ encoding: "utf-8",
89
+ stdio: "pipe",
90
+ }).trim();
91
+ if (logOutput) {
92
+ context.gitLog = logOutput.split("\n");
93
+ }
94
+ }
95
+ catch {
96
+ // Git not available or not a git repo
97
+ }
98
+ // Directory structure (recursive, max depth 2, capped at 40 lines)
99
+ try {
100
+ const lines = buildDirectoryTree(projectPath);
101
+ if (lines.length > 0) {
102
+ context.structure = lines.join("\n");
103
+ }
104
+ }
105
+ catch {
106
+ // Unable to read directory
107
+ }
108
+ // Memory file contents (CLAUDE.md and .claude/CLAUDE.md)
109
+ try {
110
+ const memoryFiles = ["CLAUDE.md", ".claude/CLAUDE.md"];
111
+ const contents = [];
112
+ for (const file of memoryFiles) {
113
+ try {
114
+ const filePath = path.join(projectPath, file);
115
+ const content = fs.readFileSync(filePath, "utf-8");
116
+ if (content) {
117
+ contents.push(content);
118
+ }
119
+ }
120
+ catch {
121
+ // File doesn't exist, skip
122
+ }
123
+ }
124
+ if (contents.length > 0) {
125
+ const combined = contents.join("\n\n");
126
+ context.memoryFileContents = combined.length > 2000
127
+ ? combined.substring(0, 2000)
128
+ : combined;
129
+ }
130
+ }
131
+ catch {
132
+ // Unable to read memory files
133
+ }
134
+ return context;
135
+ }
136
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/core/project-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AgentId, CapturedSession, CompressionResult } from "../types/index.js";
2
+ /**
3
+ * Builds the self-summarizing resume prompt (RESUME.md).
4
+ * Uses the compressed session data to generate a structured handoff document.
5
+ */
6
+ export declare function buildResumePrompt(session: CapturedSession, compressed: CompressionResult, targetAgent?: AgentId | "clipboard" | "file"): string;
7
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAiBrF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,iBAAiB,EAC7B,WAAW,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAC3C,MAAM,CA+ER"}