@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.
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Context Formatter
3
+ *
4
+ * Formats ledgers, handoffs, and learnings into markdown
5
+ * for injection into agent context.
6
+ */
7
+ import type { Ledger, Handoff, StartupContext, FileRef, Decision } from './types.js';
8
+ /**
9
+ * Format options for context injection
10
+ */
11
+ export interface FormatOptions {
12
+ /** Maximum length of the formatted context */
13
+ maxLength?: number;
14
+ /** Include file references */
15
+ includeFiles?: boolean;
16
+ /** Include decisions */
17
+ includeDecisions?: boolean;
18
+ /** Include learnings */
19
+ includeLearnings?: boolean;
20
+ /** Compact mode (less verbose) */
21
+ compact?: boolean;
22
+ }
23
+ /**
24
+ * Format a startup context for injection
25
+ */
26
+ export declare function formatStartupContext(context: Omit<StartupContext, 'formatted'>, options?: FormatOptions): string;
27
+ /**
28
+ * Format a ledger for context injection
29
+ */
30
+ export declare function formatLedger(ledger: Ledger, options?: FormatOptions): string;
31
+ /**
32
+ * Format a handoff for context injection
33
+ */
34
+ export declare function formatHandoff(handoff: Handoff, options?: FormatOptions): string;
35
+ /**
36
+ * Format a search result summary
37
+ */
38
+ export declare function formatSearchResults(handoffs: Handoff[], query: string): string;
39
+ /**
40
+ * Format a brief status summary (for status line / dashboard)
41
+ */
42
+ export declare function formatBriefStatus(ledger: Ledger | null, handoff: Handoff | null): string;
43
+ /**
44
+ * Format file references for injection
45
+ */
46
+ export declare function formatFileRefs(files: FileRef[]): string;
47
+ /**
48
+ * Format decisions for injection
49
+ */
50
+ export declare function formatDecisions(decisions: Decision[]): string;
51
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAUD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,EAC1C,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAwCR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAqGhF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CA2FnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA0B9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAwBxF;AASD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAUvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Context Formatter
3
+ *
4
+ * Formats ledgers, handoffs, and learnings into markdown
5
+ * for injection into agent context.
6
+ */
7
+ const DEFAULT_OPTIONS = {
8
+ maxLength: 4000,
9
+ includeFiles: true,
10
+ includeDecisions: true,
11
+ includeLearnings: true,
12
+ compact: false,
13
+ };
14
+ /**
15
+ * Format a startup context for injection
16
+ */
17
+ export function formatStartupContext(context, options = {}) {
18
+ const opts = { ...DEFAULT_OPTIONS, ...options };
19
+ const sections = [];
20
+ sections.push('# Session Continuity');
21
+ sections.push('');
22
+ sections.push('*This context was automatically loaded from your previous session.*');
23
+ sections.push('');
24
+ // Format ledger if present
25
+ if (context.ledger) {
26
+ sections.push(formatLedger(context.ledger, opts));
27
+ }
28
+ // Format handoff if present (and no ledger or ledger is stale)
29
+ if (context.handoff) {
30
+ if (!context.ledger || isHandoffNewer(context.handoff, context.ledger)) {
31
+ sections.push('');
32
+ sections.push(formatHandoff(context.handoff, opts));
33
+ }
34
+ }
35
+ // Format learnings if present
36
+ if (context.learnings && context.learnings.length > 0 && opts.includeLearnings) {
37
+ sections.push('');
38
+ sections.push('## Relevant Learnings');
39
+ sections.push('');
40
+ for (const learning of context.learnings.slice(0, 5)) {
41
+ sections.push(`- ${learning}`);
42
+ }
43
+ }
44
+ let result = sections.join('\n');
45
+ // Truncate if too long
46
+ if (opts.maxLength && result.length > opts.maxLength) {
47
+ result = result.slice(0, opts.maxLength - 100) + '\n\n*[Context truncated for length]*';
48
+ }
49
+ return result;
50
+ }
51
+ /**
52
+ * Format a ledger for context injection
53
+ */
54
+ export function formatLedger(ledger, options = {}) {
55
+ const opts = { ...DEFAULT_OPTIONS, ...options };
56
+ const lines = [];
57
+ lines.push('## Current Session State');
58
+ lines.push('');
59
+ // Current task
60
+ if (ledger.currentTask) {
61
+ lines.push(`**Current Task:** ${ledger.currentTask}`);
62
+ lines.push('');
63
+ }
64
+ // PDERO phase if available
65
+ if (ledger.pderoPhase) {
66
+ lines.push(`**Phase:** ${ledger.pderoPhase.toUpperCase()}`);
67
+ lines.push('');
68
+ }
69
+ // Completed work
70
+ if (ledger.completed.length > 0) {
71
+ if (opts.compact) {
72
+ lines.push(`**Completed:** ${ledger.completed.join(', ')}`);
73
+ }
74
+ else {
75
+ lines.push('### Completed');
76
+ for (const item of ledger.completed) {
77
+ lines.push(`- ✓ ${item}`);
78
+ }
79
+ }
80
+ lines.push('');
81
+ }
82
+ // In progress
83
+ if (ledger.inProgress.length > 0) {
84
+ if (opts.compact) {
85
+ lines.push(`**In Progress:** ${ledger.inProgress.join(', ')}`);
86
+ }
87
+ else {
88
+ lines.push('### In Progress');
89
+ for (const item of ledger.inProgress) {
90
+ lines.push(`- ${item}`);
91
+ }
92
+ }
93
+ lines.push('');
94
+ }
95
+ // Blocked items
96
+ if (ledger.blocked.length > 0) {
97
+ if (opts.compact) {
98
+ lines.push(`**Blocked:** ${ledger.blocked.join(', ')}`);
99
+ }
100
+ else {
101
+ lines.push('### Blocked');
102
+ for (const item of ledger.blocked) {
103
+ lines.push(`- ⚠ ${item}`);
104
+ }
105
+ }
106
+ lines.push('');
107
+ }
108
+ // Uncertain items
109
+ if (ledger.uncertainItems.length > 0) {
110
+ lines.push('### Needs Verification');
111
+ for (const item of ledger.uncertainItems) {
112
+ lines.push(`- ❓ ${item}`);
113
+ }
114
+ lines.push('');
115
+ }
116
+ // Key decisions
117
+ if (ledger.keyDecisions.length > 0 && opts.includeDecisions) {
118
+ if (opts.compact) {
119
+ const decisions = ledger.keyDecisions.map((d) => d.decision).join('; ');
120
+ lines.push(`**Decisions:** ${decisions}`);
121
+ }
122
+ else {
123
+ lines.push('### Key Decisions');
124
+ for (const decision of ledger.keyDecisions.slice(-5)) {
125
+ lines.push(`- **${decision.decision}**`);
126
+ if (decision.reasoning) {
127
+ lines.push(` - Reasoning: ${decision.reasoning}`);
128
+ }
129
+ }
130
+ }
131
+ lines.push('');
132
+ }
133
+ // File context
134
+ if (ledger.fileContext.length > 0 && opts.includeFiles) {
135
+ lines.push('### Relevant Files');
136
+ for (const file of ledger.fileContext.slice(-10)) {
137
+ let line = `- \`${file.path}\``;
138
+ if (file.lines) {
139
+ line += `:${file.lines[0]}-${file.lines[1]}`;
140
+ }
141
+ if (file.description) {
142
+ line += ` - ${file.description}`;
143
+ }
144
+ lines.push(line);
145
+ }
146
+ lines.push('');
147
+ }
148
+ return lines.join('\n');
149
+ }
150
+ /**
151
+ * Format a handoff for context injection
152
+ */
153
+ export function formatHandoff(handoff, options = {}) {
154
+ const opts = { ...DEFAULT_OPTIONS, ...options };
155
+ const lines = [];
156
+ lines.push('## Previous Session Handoff');
157
+ lines.push('');
158
+ // Task and summary
159
+ if (handoff.taskDescription) {
160
+ lines.push(`**Task:** ${handoff.taskDescription}`);
161
+ }
162
+ if (handoff.summary) {
163
+ lines.push('');
164
+ lines.push(handoff.summary);
165
+ }
166
+ lines.push('');
167
+ // PDERO phase if available
168
+ if (handoff.pderoPhase) {
169
+ lines.push(`**Last Phase:** ${handoff.pderoPhase.toUpperCase()}`);
170
+ if (handoff.confidence !== undefined) {
171
+ lines.push(`**Confidence:** ${Math.round(handoff.confidence * 100)}%`);
172
+ }
173
+ lines.push('');
174
+ }
175
+ // Completed work
176
+ if (handoff.completedWork.length > 0) {
177
+ if (opts.compact) {
178
+ lines.push(`**Completed:** ${handoff.completedWork.join(', ')}`);
179
+ }
180
+ else {
181
+ lines.push('### Previously Completed');
182
+ for (const item of handoff.completedWork) {
183
+ lines.push(`- ✓ ${item}`);
184
+ }
185
+ }
186
+ lines.push('');
187
+ }
188
+ // Next steps (these are the priority)
189
+ if (handoff.nextSteps.length > 0) {
190
+ lines.push('### Next Steps');
191
+ for (const item of handoff.nextSteps) {
192
+ lines.push(`- ${item}`);
193
+ }
194
+ lines.push('');
195
+ }
196
+ // Key decisions
197
+ if (handoff.decisions.length > 0 && opts.includeDecisions) {
198
+ if (opts.compact) {
199
+ const decisions = handoff.decisions.map((d) => d.decision).join('; ');
200
+ lines.push(`**Prior Decisions:** ${decisions}`);
201
+ }
202
+ else {
203
+ lines.push('### Prior Decisions');
204
+ for (const decision of handoff.decisions.slice(-5)) {
205
+ lines.push(`- ${decision.decision}`);
206
+ if (decision.reasoning) {
207
+ lines.push(` - *${decision.reasoning}*`);
208
+ }
209
+ }
210
+ }
211
+ lines.push('');
212
+ }
213
+ // File references
214
+ if (handoff.fileReferences.length > 0 && opts.includeFiles) {
215
+ lines.push('### Key Files');
216
+ for (const file of handoff.fileReferences.slice(-10)) {
217
+ let line = `- \`${file.path}\``;
218
+ if (file.lines) {
219
+ line += `:${file.lines[0]}-${file.lines[1]}`;
220
+ }
221
+ if (file.description) {
222
+ line += ` - ${file.description}`;
223
+ }
224
+ lines.push(line);
225
+ }
226
+ lines.push('');
227
+ }
228
+ // Learnings
229
+ if (handoff.learnings && handoff.learnings.length > 0 && opts.includeLearnings) {
230
+ lines.push('### Learnings');
231
+ for (const learning of handoff.learnings) {
232
+ lines.push(`- ${learning}`);
233
+ }
234
+ lines.push('');
235
+ }
236
+ return lines.join('\n');
237
+ }
238
+ /**
239
+ * Format a search result summary
240
+ */
241
+ export function formatSearchResults(handoffs, query) {
242
+ const lines = [];
243
+ lines.push(`## Search Results for "${query}"`);
244
+ lines.push('');
245
+ if (handoffs.length === 0) {
246
+ lines.push('*No matching handoffs found.*');
247
+ return lines.join('\n');
248
+ }
249
+ lines.push(`Found ${handoffs.length} matching handoff(s):`);
250
+ lines.push('');
251
+ for (const handoff of handoffs) {
252
+ const date = handoff.createdAt.toISOString().split('T')[0];
253
+ lines.push(`### ${handoff.taskDescription || 'Untitled'} (${date})`);
254
+ lines.push(`- **Agent:** ${handoff.agentName}`);
255
+ lines.push(`- **ID:** ${handoff.id}`);
256
+ if (handoff.summary) {
257
+ lines.push(`- **Summary:** ${handoff.summary.slice(0, 100)}...`);
258
+ }
259
+ lines.push('');
260
+ }
261
+ return lines.join('\n');
262
+ }
263
+ /**
264
+ * Format a brief status summary (for status line / dashboard)
265
+ */
266
+ export function formatBriefStatus(ledger, handoff) {
267
+ if (!ledger && !handoff) {
268
+ return 'No continuity data';
269
+ }
270
+ const parts = [];
271
+ if (ledger) {
272
+ if (ledger.currentTask) {
273
+ parts.push(`Task: ${ledger.currentTask.slice(0, 40)}`);
274
+ }
275
+ if (ledger.pderoPhase) {
276
+ parts.push(`Phase: ${ledger.pderoPhase}`);
277
+ }
278
+ const progress = `${ledger.completed.length}✓ ${ledger.inProgress.length}→ ${ledger.blocked.length}⚠`;
279
+ parts.push(progress);
280
+ }
281
+ if (handoff && !ledger) {
282
+ parts.push(`Last handoff: ${handoff.taskDescription?.slice(0, 30) || handoff.id}`);
283
+ parts.push(handoff.createdAt.toISOString().split('T')[0]);
284
+ }
285
+ return parts.join(' | ');
286
+ }
287
+ /**
288
+ * Check if handoff is newer than ledger
289
+ */
290
+ function isHandoffNewer(handoff, ledger) {
291
+ return handoff.createdAt > ledger.updatedAt;
292
+ }
293
+ /**
294
+ * Format file references for injection
295
+ */
296
+ export function formatFileRefs(files) {
297
+ return files
298
+ .map((f) => {
299
+ let line = f.path;
300
+ if (f.lines) {
301
+ line += `:${f.lines[0]}-${f.lines[1]}`;
302
+ }
303
+ return line;
304
+ })
305
+ .join(', ');
306
+ }
307
+ /**
308
+ * Format decisions for injection
309
+ */
310
+ export function formatDecisions(decisions) {
311
+ return decisions.map((d) => d.decision).join('; ');
312
+ }
313
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Handoff Store
3
+ *
4
+ * Persists cross-session handoffs as markdown files.
5
+ * Organized by agent, with timestamps in filenames.
6
+ */
7
+ import type { Handoff } from './types.js';
8
+ export declare class HandoffStore {
9
+ private basePath;
10
+ constructor(basePath: string);
11
+ /**
12
+ * Ensure the handoffs directory exists
13
+ */
14
+ initialize(): Promise<void>;
15
+ /**
16
+ * Generate a unique handoff ID
17
+ */
18
+ private generateId;
19
+ /**
20
+ * Get the directory path for an agent's handoffs
21
+ */
22
+ private getAgentDir;
23
+ /**
24
+ * Generate a filename for a handoff
25
+ */
26
+ private generateFilename;
27
+ /**
28
+ * Convert a handoff to markdown format
29
+ */
30
+ private toMarkdown;
31
+ /**
32
+ * Parse a markdown file back to a Handoff object
33
+ */
34
+ private fromMarkdown;
35
+ private parseListItems;
36
+ private parseFileRefs;
37
+ private parseDecisions;
38
+ /**
39
+ * Save a handoff
40
+ */
41
+ save(handoff: Handoff): Promise<string>;
42
+ /**
43
+ * Load a handoff by ID
44
+ */
45
+ loadById(handoffId: string): Promise<Handoff | null>;
46
+ /**
47
+ * Get the latest handoff for an agent
48
+ */
49
+ getLatest(agentName: string): Promise<Handoff | null>;
50
+ /**
51
+ * List handoffs for an agent (sorted by date, newest first)
52
+ */
53
+ listForAgent(agentName: string, limit?: number): Promise<Handoff[]>;
54
+ /**
55
+ * List all agents with handoffs
56
+ */
57
+ listAgents(): Promise<string[]>;
58
+ /**
59
+ * Count handoffs for an agent
60
+ */
61
+ countForAgent(agentName: string): Promise<number>;
62
+ /**
63
+ * Delete a handoff by ID
64
+ */
65
+ delete(handoffId: string): Promise<boolean>;
66
+ }
67
+ //# sourceMappingURL=handoff-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-store.d.ts","sourceRoot":"","sources":["../src/handoff-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAqC,MAAM,YAAY,CAAC;AAE7E,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAmHlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAwHpB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,cAAc;IAgCtB;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB7C;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAgC1D;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAK3D;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAwBzE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYrC;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvD;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAgClD"}