@agent-relay/continuity 0.1.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/dist/formatter.d.ts +51 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +313 -0
- package/dist/formatter.js.map +1 -0
- package/dist/handoff-store.d.ts +67 -0
- package/dist/handoff-store.d.ts.map +1 -0
- package/dist/handoff-store.js +472 -0
- package/dist/handoff-store.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger-store.d.ts +110 -0
- package/dist/ledger-store.d.ts.map +1 -0
- package/dist/ledger-store.js +500 -0
- package/dist/ledger-store.js.map +1 -0
- package/dist/manager.d.ts +183 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +616 -0
- package/dist/manager.js.map +1 -0
- package/dist/parser.d.ts +76 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +579 -0
- package/dist/parser.js.map +1 -0
- package/dist/types.d.ts +180 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuity Command Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses `->continuity:` patterns from agent output.
|
|
5
|
+
* Similar to how `->relay:` works for messaging.
|
|
6
|
+
*
|
|
7
|
+
* Supported patterns:
|
|
8
|
+
* ->continuity:save <<<...>>>
|
|
9
|
+
* ->continuity:load
|
|
10
|
+
* ->continuity:search "query"
|
|
11
|
+
* ->continuity:uncertain "item"
|
|
12
|
+
* ->continuity:handoff <<<...>>>
|
|
13
|
+
*/
|
|
14
|
+
import type { ContinuityCommand, Ledger, Decision, FileRef } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Check if a value is a placeholder/template string that should be filtered out.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isPlaceholderValue(value: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Filter an array to remove placeholder values.
|
|
21
|
+
*/
|
|
22
|
+
export declare function filterPlaceholders<T extends string>(items: T[]): T[];
|
|
23
|
+
/**
|
|
24
|
+
* Parse a continuity command from agent output
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseContinuityCommand(output: string): ContinuityCommand | null;
|
|
27
|
+
/**
|
|
28
|
+
* Check if output contains any continuity command
|
|
29
|
+
*/
|
|
30
|
+
export declare function hasContinuityCommand(output: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Parse the content of a save command into ledger fields
|
|
33
|
+
*
|
|
34
|
+
* Expected format:
|
|
35
|
+
* Current task: <task>
|
|
36
|
+
* Completed: <item>, <item>, ...
|
|
37
|
+
* In progress: <item>, ...
|
|
38
|
+
* Blocked: <item>, ...
|
|
39
|
+
* Key decisions: <decision>
|
|
40
|
+
* Uncertain: <item>, ...
|
|
41
|
+
* Files: <path>:<lines>, ...
|
|
42
|
+
*
|
|
43
|
+
* Also handles markdown-formatted content:
|
|
44
|
+
* **Current Task:** <task>
|
|
45
|
+
* ### Completed
|
|
46
|
+
* - ✓ <item>
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseSaveContent(content: string): Partial<Ledger>;
|
|
49
|
+
/**
|
|
50
|
+
* Parse handoff content (similar to save but for permanent handoffs)
|
|
51
|
+
*
|
|
52
|
+
* Expected format:
|
|
53
|
+
* Summary: <summary>
|
|
54
|
+
* Task: <task description>
|
|
55
|
+
* Completed: <item>, ...
|
|
56
|
+
* Next steps: <item>, ...
|
|
57
|
+
* Key decisions: <decision>, ...
|
|
58
|
+
* Files: <path>, ...
|
|
59
|
+
* Learnings: <learning>, ...
|
|
60
|
+
*/
|
|
61
|
+
export interface ParsedHandoffContent {
|
|
62
|
+
summary?: string;
|
|
63
|
+
taskDescription?: string;
|
|
64
|
+
completedWork: string[];
|
|
65
|
+
nextSteps: string[];
|
|
66
|
+
decisions: Decision[];
|
|
67
|
+
fileReferences: FileRef[];
|
|
68
|
+
learnings: string[];
|
|
69
|
+
}
|
|
70
|
+
export declare function parseHandoffContent(content: string): ParsedHandoffContent;
|
|
71
|
+
/**
|
|
72
|
+
* Extract all continuity commands from a block of output
|
|
73
|
+
* (in case multiple commands are present)
|
|
74
|
+
*/
|
|
75
|
+
export declare function extractAllCommands(output: string): ContinuityCommand[];
|
|
76
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA2C/E;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAkBzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CA+C/E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AA0ID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgFjE;AAmDD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAyEzE;AAsGD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAgDtE"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuity Command Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses `->continuity:` patterns from agent output.
|
|
5
|
+
* Similar to how `->relay:` works for messaging.
|
|
6
|
+
*
|
|
7
|
+
* Supported patterns:
|
|
8
|
+
* ->continuity:save <<<...>>>
|
|
9
|
+
* ->continuity:load
|
|
10
|
+
* ->continuity:search "query"
|
|
11
|
+
* ->continuity:uncertain "item"
|
|
12
|
+
* ->continuity:handoff <<<...>>>
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Regex patterns for continuity commands
|
|
16
|
+
*/
|
|
17
|
+
const PATTERNS = {
|
|
18
|
+
// ->continuity:save <<<...>>> or ->continuity:save --handoff <<<...>>>
|
|
19
|
+
save: /->continuity:save(?:\s+(--handoff))?\s*<<<([\s\S]*?)>>>/,
|
|
20
|
+
// ->continuity:load
|
|
21
|
+
load: /->continuity:load\b/,
|
|
22
|
+
// ->continuity:search "query" or ->continuity:search <<<query>>>
|
|
23
|
+
search: /->continuity:search\s+(?:"([^"]+)"|<<<([\s\S]*?)>>>)/,
|
|
24
|
+
// ->continuity:uncertain "item"
|
|
25
|
+
uncertain: /->continuity:uncertain\s+"([^"]+)"/,
|
|
26
|
+
// ->continuity:handoff <<<...>>> (explicit handoff creation)
|
|
27
|
+
handoff: /->continuity:handoff\s*<<<([\s\S]*?)>>>/,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Known placeholder/template values that should be filtered out.
|
|
31
|
+
* These appear in documentation examples and startup messages.
|
|
32
|
+
*/
|
|
33
|
+
const PLACEHOLDER_VALUES = new Set([
|
|
34
|
+
'...',
|
|
35
|
+
'....',
|
|
36
|
+
'What you\'ve done',
|
|
37
|
+
'What you\'re working on',
|
|
38
|
+
'What you\'re working on now',
|
|
39
|
+
'What\'s remaining',
|
|
40
|
+
'task1',
|
|
41
|
+
'task2',
|
|
42
|
+
'task3',
|
|
43
|
+
'Important context for session recovery',
|
|
44
|
+
'src/file1.ts',
|
|
45
|
+
'src/file2.ts',
|
|
46
|
+
'item1',
|
|
47
|
+
'item2',
|
|
48
|
+
]);
|
|
49
|
+
/**
|
|
50
|
+
* Check if a value is a placeholder/template string that should be filtered out.
|
|
51
|
+
*/
|
|
52
|
+
export function isPlaceholderValue(value) {
|
|
53
|
+
if (!value)
|
|
54
|
+
return true;
|
|
55
|
+
const trimmed = value.trim();
|
|
56
|
+
if (!trimmed)
|
|
57
|
+
return true;
|
|
58
|
+
// Exact match against known placeholders
|
|
59
|
+
if (PLACEHOLDER_VALUES.has(trimmed))
|
|
60
|
+
return true;
|
|
61
|
+
// Check for ellipsis-only values
|
|
62
|
+
if (/^\.{2,}$/.test(trimmed))
|
|
63
|
+
return true;
|
|
64
|
+
// Check for template-like patterns: [...]
|
|
65
|
+
if (/^\[\.{3}\]$/.test(trimmed))
|
|
66
|
+
return true;
|
|
67
|
+
// Check for placeholder array syntax: [...]
|
|
68
|
+
if (trimmed === '[...]')
|
|
69
|
+
return true;
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Filter an array to remove placeholder values.
|
|
74
|
+
*/
|
|
75
|
+
export function filterPlaceholders(items) {
|
|
76
|
+
return items.filter(item => !isPlaceholderValue(item));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse a continuity command from agent output
|
|
80
|
+
*/
|
|
81
|
+
export function parseContinuityCommand(output) {
|
|
82
|
+
// Check for save command
|
|
83
|
+
const saveMatch = output.match(PATTERNS.save);
|
|
84
|
+
if (saveMatch) {
|
|
85
|
+
return {
|
|
86
|
+
type: 'save',
|
|
87
|
+
content: saveMatch[2].trim(),
|
|
88
|
+
createHandoff: saveMatch[1] === '--handoff',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Check for load command
|
|
92
|
+
if (PATTERNS.load.test(output)) {
|
|
93
|
+
return {
|
|
94
|
+
type: 'load',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Check for search command
|
|
98
|
+
const searchMatch = output.match(PATTERNS.search);
|
|
99
|
+
if (searchMatch) {
|
|
100
|
+
return {
|
|
101
|
+
type: 'search',
|
|
102
|
+
query: (searchMatch[1] || searchMatch[2]).trim(),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Check for uncertain command
|
|
106
|
+
const uncertainMatch = output.match(PATTERNS.uncertain);
|
|
107
|
+
if (uncertainMatch) {
|
|
108
|
+
return {
|
|
109
|
+
type: 'uncertain',
|
|
110
|
+
item: uncertainMatch[1].trim(),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// Check for handoff command
|
|
114
|
+
const handoffMatch = output.match(PATTERNS.handoff);
|
|
115
|
+
if (handoffMatch) {
|
|
116
|
+
return {
|
|
117
|
+
type: 'handoff',
|
|
118
|
+
content: handoffMatch[1].trim(),
|
|
119
|
+
createHandoff: true,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if output contains any continuity command
|
|
126
|
+
*/
|
|
127
|
+
export function hasContinuityCommand(output) {
|
|
128
|
+
return Object.values(PATTERNS).some((pattern) => pattern.test(output));
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Map section headers to ledger field names
|
|
132
|
+
*/
|
|
133
|
+
function mapSectionToField(section) {
|
|
134
|
+
const sectionMap = {
|
|
135
|
+
'completed': 'completed',
|
|
136
|
+
'previously completed': 'completed',
|
|
137
|
+
'done': 'completed',
|
|
138
|
+
'finished': 'completed',
|
|
139
|
+
'in progress': 'inProgress',
|
|
140
|
+
'working': 'inProgress',
|
|
141
|
+
'ongoing': 'inProgress',
|
|
142
|
+
'blocked': 'blocked',
|
|
143
|
+
'blockers': 'blocked',
|
|
144
|
+
'stuck': 'blocked',
|
|
145
|
+
'key decisions': 'keyDecisions',
|
|
146
|
+
'prior decisions': 'keyDecisions',
|
|
147
|
+
'decisions': 'keyDecisions',
|
|
148
|
+
'needs verification': 'uncertainItems',
|
|
149
|
+
'uncertain': 'uncertainItems',
|
|
150
|
+
'relevant files': 'fileContext',
|
|
151
|
+
'key files': 'fileContext',
|
|
152
|
+
'files': 'fileContext',
|
|
153
|
+
'next steps': 'nextSteps',
|
|
154
|
+
'todo': 'nextSteps',
|
|
155
|
+
'next': 'nextSteps',
|
|
156
|
+
'learnings': 'learnings',
|
|
157
|
+
};
|
|
158
|
+
return sectionMap[section] || null;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Add an item to the appropriate ledger section.
|
|
162
|
+
* Filters out placeholder/template values.
|
|
163
|
+
*/
|
|
164
|
+
function addItemToSection(result, section, item) {
|
|
165
|
+
const field = mapSectionToField(section);
|
|
166
|
+
if (!field)
|
|
167
|
+
return;
|
|
168
|
+
// Filter out placeholder values
|
|
169
|
+
if (isPlaceholderValue(item))
|
|
170
|
+
return;
|
|
171
|
+
switch (field) {
|
|
172
|
+
case 'completed':
|
|
173
|
+
result.completed = [...(result.completed || []), item];
|
|
174
|
+
break;
|
|
175
|
+
case 'inProgress':
|
|
176
|
+
result.inProgress = [...(result.inProgress || []), item];
|
|
177
|
+
break;
|
|
178
|
+
case 'blocked':
|
|
179
|
+
result.blocked = [...(result.blocked || []), item];
|
|
180
|
+
break;
|
|
181
|
+
case 'keyDecisions':
|
|
182
|
+
result.keyDecisions = [
|
|
183
|
+
...(result.keyDecisions || []),
|
|
184
|
+
{ decision: item, timestamp: new Date() },
|
|
185
|
+
];
|
|
186
|
+
break;
|
|
187
|
+
case 'uncertainItems':
|
|
188
|
+
result.uncertainItems = [...(result.uncertainItems || []), item];
|
|
189
|
+
break;
|
|
190
|
+
case 'fileContext':
|
|
191
|
+
result.fileContext = [...(result.fileContext || []), { path: item }];
|
|
192
|
+
break;
|
|
193
|
+
case 'nextSteps':
|
|
194
|
+
result.inProgress = [...(result.inProgress || []), item];
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Process a field-value pair from bold markdown or plain text.
|
|
200
|
+
* Filters out placeholder/template values.
|
|
201
|
+
*/
|
|
202
|
+
function processFieldValue(result, field, value) {
|
|
203
|
+
switch (field) {
|
|
204
|
+
case 'current task':
|
|
205
|
+
case 'task':
|
|
206
|
+
case 'working on':
|
|
207
|
+
// Only set if not a placeholder
|
|
208
|
+
if (!isPlaceholderValue(value)) {
|
|
209
|
+
result.currentTask = value;
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
case 'completed':
|
|
213
|
+
case 'done':
|
|
214
|
+
case 'finished':
|
|
215
|
+
result.completed = filterPlaceholders(parseListValue(value));
|
|
216
|
+
break;
|
|
217
|
+
case 'in progress':
|
|
218
|
+
case 'working':
|
|
219
|
+
case 'ongoing':
|
|
220
|
+
result.inProgress = filterPlaceholders(parseListValue(value));
|
|
221
|
+
break;
|
|
222
|
+
case 'blocked':
|
|
223
|
+
case 'blockers':
|
|
224
|
+
case 'stuck':
|
|
225
|
+
result.blocked = filterPlaceholders(parseListValue(value));
|
|
226
|
+
break;
|
|
227
|
+
case 'key decision':
|
|
228
|
+
case 'key decisions':
|
|
229
|
+
case 'decisions':
|
|
230
|
+
case 'decided':
|
|
231
|
+
result.keyDecisions = parseDecisions(value);
|
|
232
|
+
break;
|
|
233
|
+
case 'uncertain':
|
|
234
|
+
case 'unconfirmed':
|
|
235
|
+
case 'needs verification':
|
|
236
|
+
case 'to verify':
|
|
237
|
+
result.uncertainItems = filterPlaceholders(parseListValue(value));
|
|
238
|
+
break;
|
|
239
|
+
case 'files':
|
|
240
|
+
case 'file context':
|
|
241
|
+
case 'relevant files':
|
|
242
|
+
result.fileContext = parseFileRefs(value).filter(f => !isPlaceholderValue(f.path));
|
|
243
|
+
break;
|
|
244
|
+
case 'next':
|
|
245
|
+
case 'next steps':
|
|
246
|
+
case 'todo':
|
|
247
|
+
result.inProgress = [...(result.inProgress || []), ...filterPlaceholders(parseListValue(value))];
|
|
248
|
+
break;
|
|
249
|
+
case 'phase':
|
|
250
|
+
case 'last phase':
|
|
251
|
+
result.pderoPhase = value.toLowerCase();
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Parse the content of a save command into ledger fields
|
|
257
|
+
*
|
|
258
|
+
* Expected format:
|
|
259
|
+
* Current task: <task>
|
|
260
|
+
* Completed: <item>, <item>, ...
|
|
261
|
+
* In progress: <item>, ...
|
|
262
|
+
* Blocked: <item>, ...
|
|
263
|
+
* Key decisions: <decision>
|
|
264
|
+
* Uncertain: <item>, ...
|
|
265
|
+
* Files: <path>:<lines>, ...
|
|
266
|
+
*
|
|
267
|
+
* Also handles markdown-formatted content:
|
|
268
|
+
* **Current Task:** <task>
|
|
269
|
+
* ### Completed
|
|
270
|
+
* - ✓ <item>
|
|
271
|
+
*/
|
|
272
|
+
export function parseSaveContent(content) {
|
|
273
|
+
const result = {
|
|
274
|
+
completed: [],
|
|
275
|
+
inProgress: [],
|
|
276
|
+
blocked: [],
|
|
277
|
+
keyDecisions: [],
|
|
278
|
+
uncertainItems: [],
|
|
279
|
+
fileContext: [],
|
|
280
|
+
};
|
|
281
|
+
const lines = content.split('\n');
|
|
282
|
+
let currentSection = null;
|
|
283
|
+
for (const line of lines) {
|
|
284
|
+
const trimmed = line.trim();
|
|
285
|
+
if (!trimmed)
|
|
286
|
+
continue;
|
|
287
|
+
// Check for markdown section headers (## or ###)
|
|
288
|
+
const sectionMatch = trimmed.match(/^#{2,3}\s+(.+)$/);
|
|
289
|
+
if (sectionMatch) {
|
|
290
|
+
currentSection = sectionMatch[1].toLowerCase().trim();
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
// Skip top-level markdown headers
|
|
294
|
+
if (trimmed.startsWith('#'))
|
|
295
|
+
continue;
|
|
296
|
+
// Handle markdown list items under a section
|
|
297
|
+
if (trimmed.startsWith('-') && currentSection) {
|
|
298
|
+
const itemContent = trimmed.slice(1).trim().replace(/^[✓⚠❓]\s*/, '');
|
|
299
|
+
if (itemContent) {
|
|
300
|
+
addItemToSection(result, currentSection, itemContent);
|
|
301
|
+
}
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
// Skip standalone list items without a section context
|
|
305
|
+
if (trimmed.startsWith('-') && !currentSection) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
// Match "**Field:** value" (markdown bold syntax - colon can be inside or outside asterisks)
|
|
309
|
+
// Format 1: **Field:** value (colon inside asterisks)
|
|
310
|
+
// Format 2: **Field**: value (colon outside asterisks)
|
|
311
|
+
const boldMatch = trimmed.match(/^\*\*([^*:]+):?\*\*:?\s*(.*)$/);
|
|
312
|
+
if (boldMatch) {
|
|
313
|
+
const field = boldMatch[1].toLowerCase().trim();
|
|
314
|
+
const value = boldMatch[2].trim();
|
|
315
|
+
processFieldValue(result, field, value);
|
|
316
|
+
// Reset section when we see a bold field
|
|
317
|
+
currentSection = null;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
// Match "Field: value" or "Field:" followed by list items
|
|
321
|
+
const colonIndex = trimmed.indexOf(':');
|
|
322
|
+
if (colonIndex === -1)
|
|
323
|
+
continue;
|
|
324
|
+
// Skip if colon is too early (likely a file path like "src/file.ts:10")
|
|
325
|
+
// or if field contains special characters that suggest it's not a field
|
|
326
|
+
const potentialField = trimmed.slice(0, colonIndex);
|
|
327
|
+
if (colonIndex < 2 ||
|
|
328
|
+
potentialField.includes('/') ||
|
|
329
|
+
potentialField.includes('\\') ||
|
|
330
|
+
potentialField.includes('`')) {
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
const field = potentialField.toLowerCase().trim();
|
|
334
|
+
const value = trimmed.slice(colonIndex + 1).trim();
|
|
335
|
+
// Reset section when we see a new field
|
|
336
|
+
currentSection = null;
|
|
337
|
+
processFieldValue(result, field, value);
|
|
338
|
+
}
|
|
339
|
+
return result;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Parse a comma or newline separated list
|
|
343
|
+
*/
|
|
344
|
+
function parseListValue(value) {
|
|
345
|
+
if (!value)
|
|
346
|
+
return [];
|
|
347
|
+
// Handle both comma-separated and newline-separated
|
|
348
|
+
return value
|
|
349
|
+
.split(/[,\n]/)
|
|
350
|
+
.map((item) => item.trim())
|
|
351
|
+
.filter((item) => item && !item.startsWith('-') && item !== '-')
|
|
352
|
+
.map((item) => item.replace(/^[-*]\s*/, '').trim())
|
|
353
|
+
.filter(Boolean);
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Parse decisions from value
|
|
357
|
+
*/
|
|
358
|
+
function parseDecisions(value) {
|
|
359
|
+
const items = parseListValue(value);
|
|
360
|
+
return items.map((item) => ({
|
|
361
|
+
decision: item,
|
|
362
|
+
timestamp: new Date(),
|
|
363
|
+
}));
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Parse file references from value
|
|
367
|
+
* Format: path:startLine-endLine, path, path:line
|
|
368
|
+
*/
|
|
369
|
+
function parseFileRefs(value) {
|
|
370
|
+
const items = parseListValue(value);
|
|
371
|
+
return items.map((item) => {
|
|
372
|
+
// Match path:startLine-endLine or path:line or just path
|
|
373
|
+
const match = item.match(/^([^:]+)(?::(\d+)(?:-(\d+))?)?$/);
|
|
374
|
+
if (!match) {
|
|
375
|
+
return { path: item.trim() };
|
|
376
|
+
}
|
|
377
|
+
const ref = { path: match[1].trim() };
|
|
378
|
+
if (match[2]) {
|
|
379
|
+
const startLine = parseInt(match[2]);
|
|
380
|
+
const endLine = match[3] ? parseInt(match[3]) : startLine;
|
|
381
|
+
ref.lines = [startLine, endLine];
|
|
382
|
+
}
|
|
383
|
+
return ref;
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
export function parseHandoffContent(content) {
|
|
387
|
+
const result = {
|
|
388
|
+
completedWork: [],
|
|
389
|
+
nextSteps: [],
|
|
390
|
+
decisions: [],
|
|
391
|
+
fileReferences: [],
|
|
392
|
+
learnings: [],
|
|
393
|
+
};
|
|
394
|
+
const lines = content.split('\n');
|
|
395
|
+
let currentSection = null;
|
|
396
|
+
for (const line of lines) {
|
|
397
|
+
const trimmed = line.trim();
|
|
398
|
+
if (!trimmed)
|
|
399
|
+
continue;
|
|
400
|
+
// Check for markdown section headers (## or ###)
|
|
401
|
+
const sectionMatch = trimmed.match(/^#{2,3}\s+(.+)$/);
|
|
402
|
+
if (sectionMatch) {
|
|
403
|
+
currentSection = sectionMatch[1].toLowerCase().trim();
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
// Skip top-level markdown headers
|
|
407
|
+
if (trimmed.startsWith('#'))
|
|
408
|
+
continue;
|
|
409
|
+
// Handle markdown list items under a section
|
|
410
|
+
if (trimmed.startsWith('-') && currentSection) {
|
|
411
|
+
const itemContent = trimmed.slice(1).trim().replace(/^[✓⚠❓]\s*/, '');
|
|
412
|
+
if (itemContent) {
|
|
413
|
+
addItemToHandoffSection(result, currentSection, itemContent);
|
|
414
|
+
}
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
// Skip standalone list items without a section context
|
|
418
|
+
if (trimmed.startsWith('-') && !currentSection) {
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
// Match "**Field:** value" (markdown bold syntax - colon can be inside or outside asterisks)
|
|
422
|
+
const boldMatch = trimmed.match(/^\*\*([^*:]+):?\*\*:?\s*(.*)$/);
|
|
423
|
+
if (boldMatch) {
|
|
424
|
+
const field = boldMatch[1].toLowerCase().trim();
|
|
425
|
+
const value = boldMatch[2].trim();
|
|
426
|
+
processHandoffFieldValue(result, field, value);
|
|
427
|
+
currentSection = null;
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
// Match "Field: value"
|
|
431
|
+
const colonIndex = trimmed.indexOf(':');
|
|
432
|
+
if (colonIndex === -1)
|
|
433
|
+
continue;
|
|
434
|
+
// Skip if colon is too early or field contains path-like characters
|
|
435
|
+
const potentialField = trimmed.slice(0, colonIndex);
|
|
436
|
+
if (colonIndex < 2 ||
|
|
437
|
+
potentialField.includes('/') ||
|
|
438
|
+
potentialField.includes('\\') ||
|
|
439
|
+
potentialField.includes('`')) {
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
const field = potentialField.toLowerCase().trim();
|
|
443
|
+
const value = trimmed.slice(colonIndex + 1).trim();
|
|
444
|
+
currentSection = null;
|
|
445
|
+
processHandoffFieldValue(result, field, value);
|
|
446
|
+
}
|
|
447
|
+
return result;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Add an item to the appropriate handoff section.
|
|
451
|
+
* Filters out placeholder/template values.
|
|
452
|
+
*/
|
|
453
|
+
function addItemToHandoffSection(result, section, item) {
|
|
454
|
+
const sectionMap = {
|
|
455
|
+
'summary': 'summary',
|
|
456
|
+
'completed': 'completedWork',
|
|
457
|
+
'previously completed': 'completedWork',
|
|
458
|
+
'done': 'completedWork',
|
|
459
|
+
'next steps': 'nextSteps',
|
|
460
|
+
'next': 'nextSteps',
|
|
461
|
+
'todo': 'nextSteps',
|
|
462
|
+
'key decisions': 'decisions',
|
|
463
|
+
'prior decisions': 'decisions',
|
|
464
|
+
'decisions': 'decisions',
|
|
465
|
+
'files': 'fileReferences',
|
|
466
|
+
'key files': 'fileReferences',
|
|
467
|
+
'learnings': 'learnings',
|
|
468
|
+
};
|
|
469
|
+
const field = sectionMap[section];
|
|
470
|
+
if (!field)
|
|
471
|
+
return;
|
|
472
|
+
// Filter out placeholder values
|
|
473
|
+
if (isPlaceholderValue(item))
|
|
474
|
+
return;
|
|
475
|
+
switch (field) {
|
|
476
|
+
case 'completedWork':
|
|
477
|
+
result.completedWork.push(item);
|
|
478
|
+
break;
|
|
479
|
+
case 'nextSteps':
|
|
480
|
+
result.nextSteps.push(item);
|
|
481
|
+
break;
|
|
482
|
+
case 'decisions':
|
|
483
|
+
result.decisions.push({ decision: item, timestamp: new Date() });
|
|
484
|
+
break;
|
|
485
|
+
case 'fileReferences':
|
|
486
|
+
result.fileReferences.push({ path: item });
|
|
487
|
+
break;
|
|
488
|
+
case 'learnings':
|
|
489
|
+
result.learnings.push(item);
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Process a field-value pair for handoff content.
|
|
495
|
+
* Filters out placeholder/template values.
|
|
496
|
+
*/
|
|
497
|
+
function processHandoffFieldValue(result, field, value) {
|
|
498
|
+
switch (field) {
|
|
499
|
+
case 'summary':
|
|
500
|
+
if (!isPlaceholderValue(value)) {
|
|
501
|
+
result.summary = value;
|
|
502
|
+
}
|
|
503
|
+
break;
|
|
504
|
+
case 'task':
|
|
505
|
+
case 'task description':
|
|
506
|
+
if (!isPlaceholderValue(value)) {
|
|
507
|
+
result.taskDescription = value;
|
|
508
|
+
}
|
|
509
|
+
break;
|
|
510
|
+
case 'completed':
|
|
511
|
+
case 'done':
|
|
512
|
+
result.completedWork = filterPlaceholders(parseListValue(value));
|
|
513
|
+
break;
|
|
514
|
+
case 'next':
|
|
515
|
+
case 'next steps':
|
|
516
|
+
case 'todo':
|
|
517
|
+
result.nextSteps = filterPlaceholders(parseListValue(value));
|
|
518
|
+
break;
|
|
519
|
+
case 'decisions':
|
|
520
|
+
case 'key decisions':
|
|
521
|
+
result.decisions = parseDecisions(value).filter(d => !isPlaceholderValue(d.decision));
|
|
522
|
+
break;
|
|
523
|
+
case 'files':
|
|
524
|
+
result.fileReferences = parseFileRefs(value).filter(f => !isPlaceholderValue(f.path));
|
|
525
|
+
break;
|
|
526
|
+
case 'learnings':
|
|
527
|
+
case 'learned':
|
|
528
|
+
result.learnings = filterPlaceholders(parseListValue(value));
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Extract all continuity commands from a block of output
|
|
534
|
+
* (in case multiple commands are present)
|
|
535
|
+
*/
|
|
536
|
+
export function extractAllCommands(output) {
|
|
537
|
+
const commands = [];
|
|
538
|
+
// Find all save commands
|
|
539
|
+
const saveRegex = new RegExp(PATTERNS.save.source, 'g');
|
|
540
|
+
let match;
|
|
541
|
+
while ((match = saveRegex.exec(output)) !== null) {
|
|
542
|
+
commands.push({
|
|
543
|
+
type: 'save',
|
|
544
|
+
content: match[2].trim(),
|
|
545
|
+
createHandoff: match[1] === '--handoff',
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
// Find load commands
|
|
549
|
+
if (PATTERNS.load.test(output)) {
|
|
550
|
+
commands.push({ type: 'load' });
|
|
551
|
+
}
|
|
552
|
+
// Find search commands
|
|
553
|
+
const searchRegex = new RegExp(PATTERNS.search.source, 'g');
|
|
554
|
+
while ((match = searchRegex.exec(output)) !== null) {
|
|
555
|
+
commands.push({
|
|
556
|
+
type: 'search',
|
|
557
|
+
query: (match[1] || match[2]).trim(),
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
// Find uncertain commands
|
|
561
|
+
const uncertainRegex = new RegExp(PATTERNS.uncertain.source, 'g');
|
|
562
|
+
while ((match = uncertainRegex.exec(output)) !== null) {
|
|
563
|
+
commands.push({
|
|
564
|
+
type: 'uncertain',
|
|
565
|
+
item: match[1].trim(),
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
// Find handoff commands
|
|
569
|
+
const handoffRegex = new RegExp(PATTERNS.handoff.source, 'g');
|
|
570
|
+
while ((match = handoffRegex.exec(output)) !== null) {
|
|
571
|
+
commands.push({
|
|
572
|
+
type: 'handoff',
|
|
573
|
+
content: match[1].trim(),
|
|
574
|
+
createHandoff: true,
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
return commands;
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|