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,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":"AAEA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrD,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC/D;AAID,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;IAC/D,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,CACpB,MAAM,EACN;QACE,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CACF,CAAC;IACF,OAAO,EAAE,OAAO,CAAC;CAClB;AAID,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
@@ -0,0 +1,3 @@
1
+ // === Portable Session Format ===
2
+ export {};
3
+ //# sourceMappingURL=index.js.map
@@ -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
+ }