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,88 @@
1
+ import path from "node:path";
2
+ const TARGET_HINTS = {
3
+ cursor: {
4
+ label: "Cursor (paste into Composer)",
5
+ footer: "Paste this into Cursor's Composer to continue.",
6
+ },
7
+ codex: {
8
+ label: "Codex CLI",
9
+ footer: "Feed this to Codex CLI with `codex resume` or paste it.",
10
+ },
11
+ "claude-code": {
12
+ label: "Claude Code",
13
+ footer: "Paste this into a new Claude Code session to continue.",
14
+ },
15
+ };
16
+ /**
17
+ * Builds the self-summarizing resume prompt (RESUME.md).
18
+ * Uses the compressed session data to generate a structured handoff document.
19
+ */
20
+ export function buildResumePrompt(session, compressed, targetAgent) {
21
+ const projectName = session.project.name || path.basename(session.project.path);
22
+ const gitBranch = session.project.gitBranch || "unknown";
23
+ const completedList = session.task.completed.length > 0
24
+ ? session.task.completed.map((item) => `- ${item}`).join("\n")
25
+ : "- None yet";
26
+ const inProgressText = session.task.inProgress || "See remaining items";
27
+ const remainingList = session.task.remaining.length > 0
28
+ ? session.task.remaining.map((item) => `- ${item}`).join("\n")
29
+ : "- None";
30
+ const resumeAction = session.task.inProgress ||
31
+ session.task.remaining[0] ||
32
+ "the next logical step";
33
+ const targetHint = targetAgent && TARGET_HINTS[targetAgent]
34
+ ? TARGET_HINTS[targetAgent]
35
+ : null;
36
+ const lines = [
37
+ `# AgentRelay — Session Handoff`,
38
+ ``,
39
+ `> **Source:** ${session.source} | **Captured:** ${session.capturedAt}`,
40
+ `> **Project:** ${projectName} (${session.project.path}) | Branch: \`${gitBranch}\``,
41
+ ...(targetHint ? [`> **Target:** ${targetHint.label}`] : []),
42
+ ``,
43
+ `---`,
44
+ ``,
45
+ `## Instructions for Resuming Agent`,
46
+ ``,
47
+ `You are continuing a task that was started in a previous ${session.source} session.`,
48
+ `The previous session ended (likely due to token/rate limits).`,
49
+ ``,
50
+ `**Your job:**`,
51
+ `1. Read ALL the context below carefully and silently internalize it`,
52
+ `2. Do NOT summarize what you read back to the user`,
53
+ `3. Do NOT re-debate any decisions listed in "Key Decisions"`,
54
+ `4. Do NOT re-introduce yourself or ask if the user wants to continue`,
55
+ `5. Pick up EXACTLY where the previous agent left off`,
56
+ `6. Your first action should be to continue the in-progress work described below`,
57
+ ``,
58
+ `---`,
59
+ ``,
60
+ `## Current Task`,
61
+ ``,
62
+ `**Goal:** ${session.task.description}`,
63
+ ``,
64
+ `**Completed:**`,
65
+ completedList,
66
+ ``,
67
+ `**In Progress (continue this immediately):**`,
68
+ inProgressText,
69
+ ``,
70
+ `**Remaining:**`,
71
+ remainingList,
72
+ ``,
73
+ `---`,
74
+ ``,
75
+ compressed.content,
76
+ ``,
77
+ `---`,
78
+ ``,
79
+ `## Resume Now`,
80
+ ``,
81
+ `Continue the work described above. Start with ${resumeAction}.`,
82
+ `Do not ask for confirmation. Do not summarize. Just continue building.`,
83
+ ``,
84
+ targetHint ? targetHint.footer : "Paste into your target agent.",
85
+ ];
86
+ return lines.join("\n");
87
+ }
88
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { AgentId, AgentMeta } from "../types/index.js";
2
+ /**
3
+ * Agent metadata registry — storage paths, context windows, memory files per agent.
4
+ */
5
+ export declare const AGENT_REGISTRY: Record<AgentId, AgentMeta>;
6
+ /**
7
+ * Get the usable token budget for a given target.
8
+ */
9
+ export declare function getUsableTokenBudget(target: AgentId | "clipboard" | "file"): number;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,CAqCrD,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GACrC,MAAM,CAKR"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Agent metadata registry — storage paths, context windows, memory files per agent.
3
+ */
4
+ export const AGENT_REGISTRY = {
5
+ "claude-code": {
6
+ id: "claude-code",
7
+ name: "Claude Code",
8
+ storagePaths: {
9
+ linux: "~/.claude/projects/",
10
+ darwin: "~/.claude/projects/",
11
+ win32: "~/.claude/projects/",
12
+ },
13
+ contextWindow: 200_000,
14
+ usableTokens: 120_000,
15
+ memoryFiles: ["CLAUDE.md", ".claude/CLAUDE.md"],
16
+ },
17
+ cursor: {
18
+ id: "cursor",
19
+ name: "Cursor",
20
+ storagePaths: {
21
+ linux: "~/.config/Cursor/User/workspaceStorage/",
22
+ darwin: "~/Library/Application Support/Cursor/User/workspaceStorage/",
23
+ win32: "%APPDATA%/Cursor/User/workspaceStorage/",
24
+ },
25
+ contextWindow: 64_000,
26
+ usableTokens: 38_000,
27
+ memoryFiles: [".cursorrules", ".cursor/rules/"],
28
+ },
29
+ codex: {
30
+ id: "codex",
31
+ name: "Codex CLI",
32
+ storagePaths: {
33
+ linux: "~/.codex/sessions/",
34
+ darwin: "~/.codex/sessions/",
35
+ win32: "~/.codex/sessions/",
36
+ },
37
+ contextWindow: 200_000,
38
+ usableTokens: 120_000,
39
+ memoryFiles: ["AGENTS.md", "~/.codex/AGENTS.md"],
40
+ },
41
+ };
42
+ /**
43
+ * Get the usable token budget for a given target.
44
+ */
45
+ export function getUsableTokenBudget(target) {
46
+ if (target === "clipboard" || target === "file") {
47
+ return 19_000; // Universal safe default
48
+ }
49
+ return AGENT_REGISTRY[target].usableTokens;
50
+ }
51
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA+B;IACxD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE;YACZ,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,qBAAqB;YAC7B,KAAK,EAAE,qBAAqB;SAC7B;QACD,aAAa,EAAE,OAAO;QACtB,YAAY,EAAE,OAAO;QACrB,WAAW,EAAE,CAAC,WAAW,EAAE,mBAAmB,CAAC;KAChD;IACD,MAAM,EAAE;QACN,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE;YACZ,KAAK,EAAE,yCAAyC;YAChD,MAAM,EAAE,6DAA6D;YACrE,KAAK,EAAE,yCAAyC;SACjD;QACD,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC;KAChD;IACD,KAAK,EAAE;QACL,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,WAAW;QACjB,YAAY,EAAE;YACZ,KAAK,EAAE,oBAAoB;YAC3B,MAAM,EAAE,oBAAoB;YAC5B,KAAK,EAAE,oBAAoB;SAC5B;QACD,aAAa,EAAE,OAAO;QACtB,YAAY,EAAE,OAAO;QACrB,WAAW,EAAE,CAAC,WAAW,EAAE,oBAAoB,CAAC;KACjD;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAsC;IAEtC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,CAAC,yBAAyB;IAC1C,CAAC;IACD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Simple character-based token estimator.
3
+ * Heuristic: 1 token ≈ 4 characters for English text.
4
+ */
5
+ export declare function estimateTokens(text: string): number;
6
+ /**
7
+ * Check if content fits within a token budget.
8
+ */
9
+ export declare function fitsInBudget(text: string, budget: number): boolean;
10
+ //# sourceMappingURL=token-estimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.d.ts","sourceRoot":"","sources":["../../src/core/token-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAElE"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Simple character-based token estimator.
3
+ * Heuristic: 1 token ≈ 4 characters for English text.
4
+ */
5
+ export function estimateTokens(text) {
6
+ return Math.ceil(text.length / 4);
7
+ }
8
+ /**
9
+ * Check if content fits within a token budget.
10
+ */
11
+ export function fitsInBudget(text, budget) {
12
+ return estimateTokens(text) <= budget;
13
+ }
14
+ //# sourceMappingURL=token-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../src/core/token-estimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc;IACvD,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;AACxC,CAAC"}
@@ -0,0 +1,188 @@
1
+ import { z } from "zod";
2
+ export declare const ConversationMessageSchema: z.ZodObject<{
3
+ role: z.ZodEnum<{
4
+ user: "user";
5
+ assistant: "assistant";
6
+ system: "system";
7
+ tool: "tool";
8
+ }>;
9
+ content: z.ZodString;
10
+ toolName: z.ZodOptional<z.ZodString>;
11
+ timestamp: z.ZodOptional<z.ZodString>;
12
+ tokenCount: z.ZodOptional<z.ZodNumber>;
13
+ }, z.core.$strip>;
14
+ export declare const FileChangeSchema: z.ZodObject<{
15
+ path: z.ZodString;
16
+ changeType: z.ZodEnum<{
17
+ created: "created";
18
+ modified: "modified";
19
+ deleted: "deleted";
20
+ }>;
21
+ diff: z.ZodOptional<z.ZodString>;
22
+ language: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$strip>;
24
+ export declare const TaskStateSchema: z.ZodObject<{
25
+ description: z.ZodString;
26
+ completed: z.ZodArray<z.ZodString>;
27
+ remaining: z.ZodArray<z.ZodString>;
28
+ inProgress: z.ZodOptional<z.ZodString>;
29
+ blockers: z.ZodArray<z.ZodString>;
30
+ }, z.core.$strip>;
31
+ export declare const ProjectContextSchema: z.ZodObject<{
32
+ path: z.ZodString;
33
+ name: z.ZodOptional<z.ZodString>;
34
+ gitBranch: z.ZodOptional<z.ZodString>;
35
+ gitStatus: z.ZodOptional<z.ZodString>;
36
+ gitLog: z.ZodOptional<z.ZodArray<z.ZodString>>;
37
+ structure: z.ZodOptional<z.ZodString>;
38
+ memoryFileContents: z.ZodOptional<z.ZodString>;
39
+ }, z.core.$strip>;
40
+ export declare const CapturedSessionSchema: z.ZodObject<{
41
+ version: z.ZodLiteral<"1.0">;
42
+ source: z.ZodEnum<{
43
+ "claude-code": "claude-code";
44
+ cursor: "cursor";
45
+ codex: "codex";
46
+ }>;
47
+ capturedAt: z.ZodString;
48
+ sessionId: z.ZodString;
49
+ sessionStartedAt: z.ZodOptional<z.ZodString>;
50
+ project: z.ZodObject<{
51
+ path: z.ZodString;
52
+ name: z.ZodOptional<z.ZodString>;
53
+ gitBranch: z.ZodOptional<z.ZodString>;
54
+ gitStatus: z.ZodOptional<z.ZodString>;
55
+ gitLog: z.ZodOptional<z.ZodArray<z.ZodString>>;
56
+ structure: z.ZodOptional<z.ZodString>;
57
+ memoryFileContents: z.ZodOptional<z.ZodString>;
58
+ }, z.core.$strip>;
59
+ conversation: z.ZodObject<{
60
+ messageCount: z.ZodNumber;
61
+ estimatedTokens: z.ZodNumber;
62
+ summary: z.ZodOptional<z.ZodString>;
63
+ messages: z.ZodArray<z.ZodObject<{
64
+ role: z.ZodEnum<{
65
+ user: "user";
66
+ assistant: "assistant";
67
+ system: "system";
68
+ tool: "tool";
69
+ }>;
70
+ content: z.ZodString;
71
+ toolName: z.ZodOptional<z.ZodString>;
72
+ timestamp: z.ZodOptional<z.ZodString>;
73
+ tokenCount: z.ZodOptional<z.ZodNumber>;
74
+ }, z.core.$strip>>;
75
+ }, z.core.$strip>;
76
+ filesChanged: z.ZodArray<z.ZodObject<{
77
+ path: z.ZodString;
78
+ changeType: z.ZodEnum<{
79
+ created: "created";
80
+ modified: "modified";
81
+ deleted: "deleted";
82
+ }>;
83
+ diff: z.ZodOptional<z.ZodString>;
84
+ language: z.ZodOptional<z.ZodString>;
85
+ }, z.core.$strip>>;
86
+ decisions: z.ZodArray<z.ZodString>;
87
+ blockers: z.ZodArray<z.ZodString>;
88
+ task: z.ZodObject<{
89
+ description: z.ZodString;
90
+ completed: z.ZodArray<z.ZodString>;
91
+ remaining: z.ZodArray<z.ZodString>;
92
+ inProgress: z.ZodOptional<z.ZodString>;
93
+ blockers: z.ZodArray<z.ZodString>;
94
+ }, z.core.$strip>;
95
+ }, z.core.$strip>;
96
+ /**
97
+ * Validate a CapturedSession object. Throws ZodError if invalid.
98
+ */
99
+ export declare function validateSession(data: unknown): {
100
+ version: "1.0";
101
+ source: "claude-code" | "cursor" | "codex";
102
+ capturedAt: string;
103
+ sessionId: string;
104
+ project: {
105
+ path: string;
106
+ name?: string | undefined;
107
+ gitBranch?: string | undefined;
108
+ gitStatus?: string | undefined;
109
+ gitLog?: string[] | undefined;
110
+ structure?: string | undefined;
111
+ memoryFileContents?: string | undefined;
112
+ };
113
+ conversation: {
114
+ messageCount: number;
115
+ estimatedTokens: number;
116
+ messages: {
117
+ role: "user" | "assistant" | "system" | "tool";
118
+ content: string;
119
+ toolName?: string | undefined;
120
+ timestamp?: string | undefined;
121
+ tokenCount?: number | undefined;
122
+ }[];
123
+ summary?: string | undefined;
124
+ };
125
+ filesChanged: {
126
+ path: string;
127
+ changeType: "created" | "modified" | "deleted";
128
+ diff?: string | undefined;
129
+ language?: string | undefined;
130
+ }[];
131
+ decisions: string[];
132
+ blockers: string[];
133
+ task: {
134
+ description: string;
135
+ completed: string[];
136
+ remaining: string[];
137
+ blockers: string[];
138
+ inProgress?: string | undefined;
139
+ };
140
+ sessionStartedAt?: string | undefined;
141
+ };
142
+ /**
143
+ * Safe validation - returns { success, data, error } without throwing.
144
+ */
145
+ export declare function safeValidateSession(data: unknown): z.ZodSafeParseResult<{
146
+ version: "1.0";
147
+ source: "claude-code" | "cursor" | "codex";
148
+ capturedAt: string;
149
+ sessionId: string;
150
+ project: {
151
+ path: string;
152
+ name?: string | undefined;
153
+ gitBranch?: string | undefined;
154
+ gitStatus?: string | undefined;
155
+ gitLog?: string[] | undefined;
156
+ structure?: string | undefined;
157
+ memoryFileContents?: string | undefined;
158
+ };
159
+ conversation: {
160
+ messageCount: number;
161
+ estimatedTokens: number;
162
+ messages: {
163
+ role: "user" | "assistant" | "system" | "tool";
164
+ content: string;
165
+ toolName?: string | undefined;
166
+ timestamp?: string | undefined;
167
+ tokenCount?: number | undefined;
168
+ }[];
169
+ summary?: string | undefined;
170
+ };
171
+ filesChanged: {
172
+ path: string;
173
+ changeType: "created" | "modified" | "deleted";
174
+ diff?: string | undefined;
175
+ language?: string | undefined;
176
+ }[];
177
+ decisions: string[];
178
+ blockers: string[];
179
+ task: {
180
+ description: string;
181
+ completed: string[];
182
+ remaining: string[];
183
+ blockers: string[];
184
+ inProgress?: string | undefined;
185
+ };
186
+ sessionStartedAt?: string | undefined;
187
+ }>;
188
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,yBAAyB;;;;;;;;;;;iBAMpC,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;iBAK3B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;iBAM1B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;iBAQ/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBhC,CAAC;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAEhD"}
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ export const ConversationMessageSchema = z.object({
3
+ role: z.enum(["user", "assistant", "system", "tool"]),
4
+ content: z.string(),
5
+ toolName: z.string().optional(),
6
+ timestamp: z.string().optional(),
7
+ tokenCount: z.number().optional(),
8
+ });
9
+ export const FileChangeSchema = z.object({
10
+ path: z.string(),
11
+ changeType: z.enum(["created", "modified", "deleted"]),
12
+ diff: z.string().optional(),
13
+ language: z.string().optional(),
14
+ });
15
+ export const TaskStateSchema = z.object({
16
+ description: z.string(),
17
+ completed: z.array(z.string()),
18
+ remaining: z.array(z.string()),
19
+ inProgress: z.string().optional(),
20
+ blockers: z.array(z.string()),
21
+ });
22
+ export const ProjectContextSchema = z.object({
23
+ path: z.string(),
24
+ name: z.string().optional(),
25
+ gitBranch: z.string().optional(),
26
+ gitStatus: z.string().optional(),
27
+ gitLog: z.array(z.string()).optional(),
28
+ structure: z.string().optional(),
29
+ memoryFileContents: z.string().optional(),
30
+ });
31
+ export const CapturedSessionSchema = z.object({
32
+ version: z.literal("1.0"),
33
+ source: z.enum(["claude-code", "cursor", "codex"]),
34
+ capturedAt: z.string(),
35
+ sessionId: z.string(),
36
+ sessionStartedAt: z.string().optional(),
37
+ project: ProjectContextSchema,
38
+ conversation: z.object({
39
+ messageCount: z.number(),
40
+ estimatedTokens: z.number(),
41
+ summary: z.string().optional(),
42
+ messages: z.array(ConversationMessageSchema),
43
+ }),
44
+ filesChanged: z.array(FileChangeSchema),
45
+ decisions: z.array(z.string()),
46
+ blockers: z.array(z.string()),
47
+ task: TaskStateSchema,
48
+ });
49
+ /**
50
+ * Validate a CapturedSession object. Throws ZodError if invalid.
51
+ */
52
+ export function validateSession(data) {
53
+ return CapturedSessionSchema.parse(data);
54
+ }
55
+ /**
56
+ * Safe validation - returns { success, data, error } without throwing.
57
+ */
58
+ export function safeValidateSession(data) {
59
+ return CapturedSessionSchema.safeParse(data);
60
+ }
61
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { WatcherOptions, WatcherState } from "../types/index.js";
2
+ /**
3
+ * Polling watcher for agent sessions.
4
+ * Uses adapter.listSessions() snapshots to detect changes and stale sessions.
5
+ */
6
+ export declare class Watcher {
7
+ private static activeInstance;
8
+ private state;
9
+ private options;
10
+ private pollTimer;
11
+ private tracking;
12
+ start(options?: WatcherOptions): Promise<void>;
13
+ stop(): Promise<void>;
14
+ getState(): WatcherState | null;
15
+ takeSnapshot(): Promise<WatcherState>;
16
+ private detectAgents;
17
+ private emitEvent;
18
+ private makeSessionKey;
19
+ }
20
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,cAAc,EACd,YAAY,EACb,MAAM,mBAAmB,CAAC;AAW3B;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAwB;IAErD,OAAO,CAAC,KAAK,CAKX;IAEF,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,QAAQ,CAA2C;IAErD,KAAK,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoClD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B,QAAQ,IAAI,YAAY,GAAG,IAAI;IAIzB,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;YA4H7B,YAAY;IAe1B,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,cAAc;CAGvB"}