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.
- package/LICENSE +21 -0
- package/README.md +180 -0
- package/dist/adapters/base-adapter.d.ts +13 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +7 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/claude-code/adapter.d.ts +47 -0
- package/dist/adapters/claude-code/adapter.d.ts.map +1 -0
- package/dist/adapters/claude-code/adapter.js +382 -0
- package/dist/adapters/claude-code/adapter.js.map +1 -0
- package/dist/adapters/codex/adapter.d.ts +26 -0
- package/dist/adapters/codex/adapter.d.ts.map +1 -0
- package/dist/adapters/codex/adapter.js +446 -0
- package/dist/adapters/codex/adapter.js.map +1 -0
- package/dist/adapters/cursor/adapter.d.ts +35 -0
- package/dist/adapters/cursor/adapter.d.ts.map +1 -0
- package/dist/adapters/cursor/adapter.js +675 -0
- package/dist/adapters/cursor/adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +19 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +65 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +424 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils.d.ts +10 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +21 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/core/compression.d.ts +11 -0
- package/dist/core/compression.d.ts.map +1 -0
- package/dist/core/compression.js +182 -0
- package/dist/core/compression.js.map +1 -0
- package/dist/core/conversation-analyzer.d.ts +9 -0
- package/dist/core/conversation-analyzer.d.ts.map +1 -0
- package/dist/core/conversation-analyzer.js +220 -0
- package/dist/core/conversation-analyzer.js.map +1 -0
- package/dist/core/project-context.d.ts +7 -0
- package/dist/core/project-context.d.ts.map +1 -0
- package/dist/core/project-context.js +136 -0
- package/dist/core/project-context.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +7 -0
- package/dist/core/prompt-builder.d.ts.map +1 -0
- package/dist/core/prompt-builder.js +88 -0
- package/dist/core/prompt-builder.js.map +1 -0
- package/dist/core/registry.d.ts +10 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +51 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/token-estimator.d.ts +10 -0
- package/dist/core/token-estimator.d.ts.map +1 -0
- package/dist/core/token-estimator.js +14 -0
- package/dist/core/token-estimator.js.map +1 -0
- package/dist/core/validation.d.ts +188 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +61 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/core/watcher.d.ts +20 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +208 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/providers/clipboard-provider.d.ts +8 -0
- package/dist/providers/clipboard-provider.d.ts.map +1 -0
- package/dist/providers/clipboard-provider.js +15 -0
- package/dist/providers/clipboard-provider.js.map +1 -0
- package/dist/providers/file-provider.d.ts +8 -0
- package/dist/providers/file-provider.d.ts.map +1 -0
- package/dist/providers/file-provider.js +14 -0
- package/dist/providers/file-provider.js.map +1 -0
- package/dist/providers/index.d.ts +9 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +18 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types/index.d.ts +132 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { getAdapter } from "../adapters/index.js";
|
|
2
|
+
const DEFAULT_INTERVAL_MS = 30_000;
|
|
3
|
+
const ALL_AGENTS = ["claude-code", "cursor", "codex"];
|
|
4
|
+
/**
|
|
5
|
+
* Polling watcher for agent sessions.
|
|
6
|
+
* Uses adapter.listSessions() snapshots to detect changes and stale sessions.
|
|
7
|
+
*/
|
|
8
|
+
export class Watcher {
|
|
9
|
+
static activeInstance = null;
|
|
10
|
+
state = {
|
|
11
|
+
timestamp: new Date().toISOString(),
|
|
12
|
+
agents: [],
|
|
13
|
+
activeSessions: {},
|
|
14
|
+
running: false,
|
|
15
|
+
};
|
|
16
|
+
options = {};
|
|
17
|
+
pollTimer = null;
|
|
18
|
+
tracking = new Map();
|
|
19
|
+
async start(options = {}) {
|
|
20
|
+
if (this.state.running) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (Watcher.activeInstance && Watcher.activeInstance !== this) {
|
|
24
|
+
throw new Error("Watcher is already running in this process");
|
|
25
|
+
}
|
|
26
|
+
const agents = options.agents && options.agents.length > 0
|
|
27
|
+
? [...options.agents]
|
|
28
|
+
: await this.detectAgents();
|
|
29
|
+
this.options = {
|
|
30
|
+
...options,
|
|
31
|
+
agents,
|
|
32
|
+
interval: options.interval ?? DEFAULT_INTERVAL_MS,
|
|
33
|
+
};
|
|
34
|
+
this.state = {
|
|
35
|
+
timestamp: new Date().toISOString(),
|
|
36
|
+
agents,
|
|
37
|
+
activeSessions: {},
|
|
38
|
+
running: true,
|
|
39
|
+
};
|
|
40
|
+
Watcher.activeInstance = this;
|
|
41
|
+
await this.takeSnapshot();
|
|
42
|
+
const interval = this.options.interval ?? DEFAULT_INTERVAL_MS;
|
|
43
|
+
this.pollTimer = setInterval(() => {
|
|
44
|
+
void this.takeSnapshot();
|
|
45
|
+
}, interval);
|
|
46
|
+
}
|
|
47
|
+
async stop() {
|
|
48
|
+
if (this.pollTimer) {
|
|
49
|
+
clearInterval(this.pollTimer);
|
|
50
|
+
this.pollTimer = null;
|
|
51
|
+
}
|
|
52
|
+
this.state = {
|
|
53
|
+
...this.state,
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
running: false,
|
|
56
|
+
};
|
|
57
|
+
this.tracking.clear();
|
|
58
|
+
if (Watcher.activeInstance === this) {
|
|
59
|
+
Watcher.activeInstance = null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
getState() {
|
|
63
|
+
return this.state;
|
|
64
|
+
}
|
|
65
|
+
async takeSnapshot() {
|
|
66
|
+
const now = new Date().toISOString();
|
|
67
|
+
const agents = this.state.agents;
|
|
68
|
+
const activeSessions = {};
|
|
69
|
+
const seenKeys = new Set();
|
|
70
|
+
let emittedEventCount = 0;
|
|
71
|
+
for (const agentId of agents) {
|
|
72
|
+
const adapter = getAdapter(agentId);
|
|
73
|
+
let sessions = [];
|
|
74
|
+
try {
|
|
75
|
+
sessions = await adapter.listSessions(this.options.projectPath);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
for (const session of sessions) {
|
|
81
|
+
const sessionId = session.id;
|
|
82
|
+
const sessionKey = this.makeSessionKey(agentId, sessionId);
|
|
83
|
+
seenKeys.add(sessionKey);
|
|
84
|
+
const messageCount = session.messageCount ?? 0;
|
|
85
|
+
const previous = this.state.activeSessions[sessionKey];
|
|
86
|
+
const tracking = this.tracking.get(sessionKey) ?? {
|
|
87
|
+
unchangedIntervals: 0,
|
|
88
|
+
hadGrowth: false,
|
|
89
|
+
rateLimitEmitted: false,
|
|
90
|
+
};
|
|
91
|
+
activeSessions[sessionKey] = {
|
|
92
|
+
messageCount,
|
|
93
|
+
lastCheckedAt: now,
|
|
94
|
+
lastChangedAt: previous?.lastChangedAt,
|
|
95
|
+
};
|
|
96
|
+
if (!previous) {
|
|
97
|
+
activeSessions[sessionKey].lastChangedAt = now;
|
|
98
|
+
tracking.unchangedIntervals = 0;
|
|
99
|
+
tracking.hadGrowth = false;
|
|
100
|
+
tracking.rateLimitEmitted = false;
|
|
101
|
+
emittedEventCount += this.emitEvent({
|
|
102
|
+
type: "new-session",
|
|
103
|
+
agentId,
|
|
104
|
+
sessionId,
|
|
105
|
+
timestamp: now,
|
|
106
|
+
details: `Detected new session ${sessionId}`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else if (messageCount > previous.messageCount) {
|
|
110
|
+
activeSessions[sessionKey].lastChangedAt = now;
|
|
111
|
+
tracking.unchangedIntervals = 0;
|
|
112
|
+
tracking.hadGrowth = true;
|
|
113
|
+
tracking.rateLimitEmitted = false;
|
|
114
|
+
emittedEventCount += this.emitEvent({
|
|
115
|
+
type: "session-update",
|
|
116
|
+
agentId,
|
|
117
|
+
sessionId,
|
|
118
|
+
timestamp: now,
|
|
119
|
+
details: `Message count ${previous.messageCount} -> ${messageCount}`,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
else if (messageCount === previous.messageCount) {
|
|
123
|
+
tracking.unchangedIntervals += 1;
|
|
124
|
+
activeSessions[sessionKey].lastChangedAt = previous.lastChangedAt;
|
|
125
|
+
// Heuristic rate-limit signal: stale after growth across 2+ checks.
|
|
126
|
+
if (tracking.unchangedIntervals >= 2 &&
|
|
127
|
+
messageCount > 0 &&
|
|
128
|
+
tracking.hadGrowth &&
|
|
129
|
+
!tracking.rateLimitEmitted) {
|
|
130
|
+
tracking.rateLimitEmitted = true;
|
|
131
|
+
emittedEventCount += this.emitEvent({
|
|
132
|
+
type: "rate-limit",
|
|
133
|
+
agentId,
|
|
134
|
+
sessionId,
|
|
135
|
+
timestamp: now,
|
|
136
|
+
details: "Session stale for 2+ polls after prior growth",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
activeSessions[sessionKey].lastChangedAt = now;
|
|
142
|
+
tracking.unchangedIntervals = 0;
|
|
143
|
+
tracking.hadGrowth = false;
|
|
144
|
+
tracking.rateLimitEmitted = false;
|
|
145
|
+
emittedEventCount += this.emitEvent({
|
|
146
|
+
type: "session-update",
|
|
147
|
+
agentId,
|
|
148
|
+
sessionId,
|
|
149
|
+
timestamp: now,
|
|
150
|
+
details: `Message count decreased ${previous.messageCount} -> ${messageCount}`,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
this.tracking.set(sessionKey, tracking);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const existingKey of Object.keys(this.state.activeSessions)) {
|
|
157
|
+
if (!seenKeys.has(existingKey)) {
|
|
158
|
+
this.tracking.delete(existingKey);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
this.state = {
|
|
162
|
+
timestamp: now,
|
|
163
|
+
agents,
|
|
164
|
+
activeSessions,
|
|
165
|
+
running: this.state.running,
|
|
166
|
+
};
|
|
167
|
+
if (emittedEventCount === 0 && agents.length > 0) {
|
|
168
|
+
this.emitEvent({
|
|
169
|
+
type: "idle",
|
|
170
|
+
agentId: agents[0],
|
|
171
|
+
timestamp: now,
|
|
172
|
+
details: "No session changes detected",
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return this.state;
|
|
176
|
+
}
|
|
177
|
+
async detectAgents() {
|
|
178
|
+
const detected = [];
|
|
179
|
+
for (const agentId of ALL_AGENTS) {
|
|
180
|
+
try {
|
|
181
|
+
const adapter = getAdapter(agentId);
|
|
182
|
+
if (await adapter.detect()) {
|
|
183
|
+
detected.push(agentId);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Skip failing adapters.
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return detected;
|
|
191
|
+
}
|
|
192
|
+
emitEvent(event) {
|
|
193
|
+
if (!this.options.onEvent) {
|
|
194
|
+
return 0;
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
this.options.onEvent(event);
|
|
198
|
+
return 1;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
makeSessionKey(agentId, sessionId) {
|
|
205
|
+
return `${agentId}:${sessionId}`;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResumeProvider, ProviderOptions } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Copies the resume prompt to the system clipboard.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ClipboardProvider implements ResumeProvider {
|
|
6
|
+
deliver(content: string, options?: ProviderOptions): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=clipboard-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard-provider.d.ts","sourceRoot":"","sources":["../../src/providers/clipboard-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;GAEG;AACH,qBAAa,iBAAkB,YAAW,cAAc;IAChD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAUzE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import clipboard from "clipboardy";
|
|
2
|
+
/**
|
|
3
|
+
* Copies the resume prompt to the system clipboard.
|
|
4
|
+
*/
|
|
5
|
+
export class ClipboardProvider {
|
|
6
|
+
async deliver(content, options) {
|
|
7
|
+
try {
|
|
8
|
+
await clipboard.write(content);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
console.warn("Clipboard not available — skipping clipboard copy.", error instanceof Error ? error.message : error);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=clipboard-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard-provider.js","sourceRoot":"","sources":["../../src/providers/clipboard-provider.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,YAAY,CAAC;AAGnC;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAyB;QACtD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,oDAAoD,EACpD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResumeProvider, ProviderOptions } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Writes the resume prompt to .handoff/RESUME.md in the project directory.
|
|
4
|
+
*/
|
|
5
|
+
export declare class FileProvider implements ResumeProvider {
|
|
6
|
+
deliver(content: string, options?: ProviderOptions): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=file-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-provider.d.ts","sourceRoot":"","sources":["../../src/providers/file-provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;GAEG;AACH,qBAAa,YAAa,YAAW,cAAc;IAC3C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Writes the resume prompt to .handoff/RESUME.md in the project directory.
|
|
5
|
+
*/
|
|
6
|
+
export class FileProvider {
|
|
7
|
+
async deliver(content, options) {
|
|
8
|
+
const projectPath = options?.projectPath ?? process.cwd();
|
|
9
|
+
const handoffDir = path.join(projectPath, ".handoff");
|
|
10
|
+
fs.mkdirSync(handoffDir, { recursive: true });
|
|
11
|
+
fs.writeFileSync(path.join(handoffDir, "RESUME.md"), content, "utf-8");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=file-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-provider.js","sourceRoot":"","sources":["../../src/providers/file-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;GAEG;AACH,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAyB;QACtD,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACtD,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ResumeProvider, AgentId } from "../types/index.js";
|
|
2
|
+
import { FileProvider } from "./file-provider.js";
|
|
3
|
+
import { ClipboardProvider } from "./clipboard-provider.js";
|
|
4
|
+
/**
|
|
5
|
+
* Get the appropriate provider(s) for a given target.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getProviders(target: AgentId | "clipboard" | "file"): ResumeProvider[];
|
|
8
|
+
export { FileProvider, ClipboardProvider };
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GACrC,cAAc,EAAE,CAUlB;AAED,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { FileProvider } from "./file-provider.js";
|
|
2
|
+
import { ClipboardProvider } from "./clipboard-provider.js";
|
|
3
|
+
/**
|
|
4
|
+
* Get the appropriate provider(s) for a given target.
|
|
5
|
+
*/
|
|
6
|
+
export function getProviders(target) {
|
|
7
|
+
switch (target) {
|
|
8
|
+
case "file":
|
|
9
|
+
return [new FileProvider()];
|
|
10
|
+
case "clipboard":
|
|
11
|
+
return [new ClipboardProvider()];
|
|
12
|
+
default:
|
|
13
|
+
// Agent ID target — use both file and clipboard (belt and suspenders)
|
|
14
|
+
return [new FileProvider(), new ClipboardProvider()];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export { FileProvider, ClipboardProvider };
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAsC;IAEtC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QAC9B,KAAK,WAAW;YACd,OAAO,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;QACnC;YACE,sEAAsE;YACtE,OAAO,CAAC,IAAI,YAAY,EAAE,EAAE,IAAI,iBAAiB,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
export interface CapturedSession {
|
|
2
|
+
version: "1.0";
|
|
3
|
+
source: AgentId;
|
|
4
|
+
capturedAt: string;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
sessionStartedAt?: string;
|
|
7
|
+
project: ProjectContext;
|
|
8
|
+
conversation: Conversation;
|
|
9
|
+
filesChanged: FileChange[];
|
|
10
|
+
decisions: string[];
|
|
11
|
+
blockers: string[];
|
|
12
|
+
task: TaskState;
|
|
13
|
+
}
|
|
14
|
+
export interface ProjectContext {
|
|
15
|
+
path: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
gitBranch?: string;
|
|
18
|
+
gitStatus?: string;
|
|
19
|
+
gitLog?: string[];
|
|
20
|
+
structure?: string;
|
|
21
|
+
memoryFileContents?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface Conversation {
|
|
24
|
+
messageCount: number;
|
|
25
|
+
estimatedTokens: number;
|
|
26
|
+
summary?: string;
|
|
27
|
+
messages: ConversationMessage[];
|
|
28
|
+
}
|
|
29
|
+
export interface ConversationMessage {
|
|
30
|
+
role: "user" | "assistant" | "system" | "tool";
|
|
31
|
+
content: string;
|
|
32
|
+
toolName?: string;
|
|
33
|
+
timestamp?: string;
|
|
34
|
+
tokenCount?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface FileChange {
|
|
37
|
+
path: string;
|
|
38
|
+
changeType: "created" | "modified" | "deleted";
|
|
39
|
+
diff?: string;
|
|
40
|
+
language?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface TaskState {
|
|
43
|
+
description: string;
|
|
44
|
+
completed: string[];
|
|
45
|
+
remaining: string[];
|
|
46
|
+
inProgress?: string;
|
|
47
|
+
blockers: string[];
|
|
48
|
+
}
|
|
49
|
+
export type AgentId = "claude-code" | "cursor" | "codex";
|
|
50
|
+
export interface SessionInfo {
|
|
51
|
+
id: string;
|
|
52
|
+
startedAt?: string;
|
|
53
|
+
lastActiveAt?: string;
|
|
54
|
+
messageCount?: number;
|
|
55
|
+
projectPath?: string;
|
|
56
|
+
preview?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface AgentAdapter {
|
|
59
|
+
agentId: AgentId;
|
|
60
|
+
detect(): Promise<boolean>;
|
|
61
|
+
listSessions(projectPath?: string): Promise<SessionInfo[]>;
|
|
62
|
+
capture(sessionId: string): Promise<CapturedSession>;
|
|
63
|
+
captureLatest(projectPath?: string): Promise<CapturedSession>;
|
|
64
|
+
}
|
|
65
|
+
export interface CompressionOptions {
|
|
66
|
+
targetTokens?: number;
|
|
67
|
+
targetAgent?: AgentId | "clipboard" | "file";
|
|
68
|
+
}
|
|
69
|
+
export interface CompressionResult {
|
|
70
|
+
content: string;
|
|
71
|
+
totalTokens: number;
|
|
72
|
+
includedLayers: string[];
|
|
73
|
+
droppedLayers: string[];
|
|
74
|
+
}
|
|
75
|
+
export interface PriorityLayer {
|
|
76
|
+
name: string;
|
|
77
|
+
priority: number;
|
|
78
|
+
content: string;
|
|
79
|
+
tokens: number;
|
|
80
|
+
}
|
|
81
|
+
export interface ResumeProvider {
|
|
82
|
+
deliver(content: string, options?: ProviderOptions): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
export interface ProviderOptions {
|
|
85
|
+
projectPath?: string;
|
|
86
|
+
targetAgent?: AgentId;
|
|
87
|
+
}
|
|
88
|
+
export interface WatcherEvent {
|
|
89
|
+
type: "session-update" | "new-session" | "rate-limit" | "idle";
|
|
90
|
+
agentId: AgentId;
|
|
91
|
+
sessionId?: string;
|
|
92
|
+
timestamp: string;
|
|
93
|
+
details?: string;
|
|
94
|
+
}
|
|
95
|
+
export interface WatcherOptions {
|
|
96
|
+
agents?: AgentId[];
|
|
97
|
+
interval?: number;
|
|
98
|
+
projectPath?: string;
|
|
99
|
+
onEvent?: (event: WatcherEvent) => void;
|
|
100
|
+
}
|
|
101
|
+
export interface WatcherState {
|
|
102
|
+
timestamp: string;
|
|
103
|
+
agents: AgentId[];
|
|
104
|
+
activeSessions: Record<string, {
|
|
105
|
+
messageCount: number;
|
|
106
|
+
lastCheckedAt: string;
|
|
107
|
+
lastChangedAt?: string;
|
|
108
|
+
}>;
|
|
109
|
+
running: boolean;
|
|
110
|
+
}
|
|
111
|
+
export interface HandoffOptions {
|
|
112
|
+
source?: AgentId;
|
|
113
|
+
target?: AgentId | "clipboard" | "file";
|
|
114
|
+
session?: string;
|
|
115
|
+
project?: string;
|
|
116
|
+
tokens?: number;
|
|
117
|
+
}
|
|
118
|
+
export interface DetectResult {
|
|
119
|
+
agentId: AgentId;
|
|
120
|
+
detected: boolean;
|
|
121
|
+
path: string;
|
|
122
|
+
sessionCount?: number;
|
|
123
|
+
}
|
|
124
|
+
export interface AgentMeta {
|
|
125
|
+
id: AgentId;
|
|
126
|
+
name: string;
|
|
127
|
+
storagePaths: Record<string, string>;
|
|
128
|
+
contextWindow: number;
|
|
129
|
+
usableTokens: number;
|
|
130
|
+
memoryFiles: string[];
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,kCAAkC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "braindump",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "A CLI tool that captures your AI coding agent session and generates a portable resume prompt so you can seamlessly continue in a different agent.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/cli/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"braindump": "dist/cli/index.js",
|
|
9
|
+
"agentrelay": "dist/cli/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsx src/cli/index.ts",
|
|
14
|
+
"test": "vitest",
|
|
15
|
+
"test:run": "vitest run",
|
|
16
|
+
"lint": "tsc --noEmit",
|
|
17
|
+
"prepublishOnly": "npm run build"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"ai",
|
|
21
|
+
"agent",
|
|
22
|
+
"handoff",
|
|
23
|
+
"claude",
|
|
24
|
+
"cursor",
|
|
25
|
+
"codex",
|
|
26
|
+
"cli",
|
|
27
|
+
"context",
|
|
28
|
+
"session",
|
|
29
|
+
"relay",
|
|
30
|
+
"braindump"
|
|
31
|
+
],
|
|
32
|
+
"author": "Prateek Choudhary <prtkworks@gmail.com>",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/Kushalwho/agentrelay.git"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/Kushalwho/agentrelay#readme",
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/Kushalwho/agentrelay/issues"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"dist",
|
|
47
|
+
"README.md",
|
|
48
|
+
"LICENSE"
|
|
49
|
+
],
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"better-sqlite3": "^11.0.0",
|
|
55
|
+
"chalk": "^5.3.0",
|
|
56
|
+
"clipboardy": "^4.0.0",
|
|
57
|
+
"commander": "^12.0.0",
|
|
58
|
+
"glob": "^11.0.0",
|
|
59
|
+
"ora": "^8.0.0",
|
|
60
|
+
"zod": "^4.3.6"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/better-sqlite3": "^7.6.0",
|
|
64
|
+
"@types/node": "^20.0.0",
|
|
65
|
+
"tsx": "^4.7.0",
|
|
66
|
+
"typescript": "^5.4.0",
|
|
67
|
+
"vitest": "^1.3.0"
|
|
68
|
+
}
|
|
69
|
+
}
|