agent-trajectories 0.2.2 → 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/README.md +24 -0
- package/dist/{chunk-2RSTDBLD.js → chunk-DX4OPGH7.js} +64 -6
- package/dist/chunk-DX4OPGH7.js.map +1 -0
- package/dist/cli/index.js +300 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +214 -45
- package/dist/index.js +1 -1
- package/package.json +8 -2
- package/dist/chunk-2RSTDBLD.js.map +0 -1
package/README.md
CHANGED
|
@@ -33,6 +33,30 @@ Works with any task system: Beads, Linear, Jira, GitHub Issues, or standalone. T
|
|
|
33
33
|
### Integration Ready
|
|
34
34
|
- Complements [claude-mem](https://github.com/thedotmack/claude-mem) for observation-level memory
|
|
35
35
|
- Integrates with [agent-relay](https://github.com/khaliqgant/agent-relay) for multi-agent messaging
|
|
36
|
+
- **Agent Trace integration** - Automatic code attribution following [agent-trace.dev](https://agent-trace.dev) spec
|
|
37
|
+
|
|
38
|
+
### Code Attribution (Agent Trace)
|
|
39
|
+
|
|
40
|
+
Trajectories automatically generate [Agent Trace](https://agent-trace.dev) records that attribute code changes to AI agents:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
trail start "Implement auth module"
|
|
44
|
+
# ... agent writes code, makes commits ...
|
|
45
|
+
trail complete --summary "Added JWT auth" --confidence 0.85
|
|
46
|
+
|
|
47
|
+
# View trace attribution
|
|
48
|
+
trail show traj_abc123 --trace
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**What you get:**
|
|
52
|
+
- `.trace.json` files saved alongside each trajectory
|
|
53
|
+
- Line-level attribution of which code was AI-generated
|
|
54
|
+
- Model identification (Claude, GPT, etc.)
|
|
55
|
+
- Git revision tracking for change history
|
|
56
|
+
|
|
57
|
+
**Zero configuration required** - traces are generated automatically when completing trajectories in a git repository.
|
|
58
|
+
|
|
59
|
+
See the full [Agent Trace Integration Spec](./docs/specs/agent-trace-integration.md) for details.
|
|
36
60
|
|
|
37
61
|
## Use Cases
|
|
38
62
|
|
|
@@ -60,6 +60,7 @@ var TrajectoryEventTypeSchema = z.enum([
|
|
|
60
60
|
"message_sent",
|
|
61
61
|
"message_received",
|
|
62
62
|
"decision",
|
|
63
|
+
"finding",
|
|
63
64
|
"note",
|
|
64
65
|
"error"
|
|
65
66
|
]);
|
|
@@ -75,13 +76,19 @@ var TrajectoryEventSchema = z.object({
|
|
|
75
76
|
content: z.string().min(1, "Event content is required"),
|
|
76
77
|
raw: z.unknown().optional(),
|
|
77
78
|
significance: EventSignificanceSchema.optional(),
|
|
78
|
-
tags: z.array(z.string()).optional()
|
|
79
|
+
tags: z.array(z.string()).optional(),
|
|
80
|
+
confidence: z.number().min(0, "Confidence must be between 0 and 1").max(1, "Confidence must be between 0 and 1").optional()
|
|
81
|
+
});
|
|
82
|
+
var AlternativeSchema = z.object({
|
|
83
|
+
option: z.string().min(1, "Alternative option is required"),
|
|
84
|
+
reason: z.string().optional()
|
|
79
85
|
});
|
|
80
86
|
var DecisionSchema = z.object({
|
|
81
87
|
question: z.string().min(1, "Decision question is required"),
|
|
82
88
|
chosen: z.string().min(1, "Chosen option is required"),
|
|
83
|
-
alternatives: z.array(z.string()),
|
|
84
|
-
reasoning: z.string().min(1, "Decision reasoning is required")
|
|
89
|
+
alternatives: z.array(z.union([z.string(), AlternativeSchema])),
|
|
90
|
+
reasoning: z.string().min(1, "Decision reasoning is required"),
|
|
91
|
+
confidence: z.number().min(0, "Confidence must be between 0 and 1").max(1, "Confidence must be between 0 and 1").optional()
|
|
85
92
|
});
|
|
86
93
|
var AgentParticipationSchema = z.object({
|
|
87
94
|
name: z.string().min(1, "Agent name is required"),
|
|
@@ -107,6 +114,38 @@ var RetrospectiveSchema = z.object({
|
|
|
107
114
|
confidence: z.number().min(0, "Confidence must be between 0 and 1").max(1, "Confidence must be between 0 and 1"),
|
|
108
115
|
timeSpent: z.string().optional()
|
|
109
116
|
});
|
|
117
|
+
var TraceRangeSchema = z.object({
|
|
118
|
+
start_line: z.number().int().positive("Start line must be positive"),
|
|
119
|
+
end_line: z.number().int().positive("End line must be positive"),
|
|
120
|
+
revision: z.string().optional(),
|
|
121
|
+
content_hash: z.string().optional()
|
|
122
|
+
});
|
|
123
|
+
var ContributorTypeSchema = z.enum(["human", "agent"]);
|
|
124
|
+
var TraceContributorSchema = z.object({
|
|
125
|
+
type: ContributorTypeSchema,
|
|
126
|
+
model: z.string().optional()
|
|
127
|
+
});
|
|
128
|
+
var TraceConversationSchema = z.object({
|
|
129
|
+
contributor: TraceContributorSchema,
|
|
130
|
+
url: z.string().url().optional(),
|
|
131
|
+
ranges: z.array(TraceRangeSchema)
|
|
132
|
+
});
|
|
133
|
+
var TraceFileSchema = z.object({
|
|
134
|
+
path: z.string().min(1, "File path is required"),
|
|
135
|
+
conversations: z.array(TraceConversationSchema)
|
|
136
|
+
});
|
|
137
|
+
var TraceRecordSchema = z.object({
|
|
138
|
+
version: z.literal(1),
|
|
139
|
+
id: z.string().regex(/^trace_[a-z0-9]+$/, "Invalid trace ID format"),
|
|
140
|
+
timestamp: z.string().datetime(),
|
|
141
|
+
trajectory: z.string().optional(),
|
|
142
|
+
files: z.array(TraceFileSchema)
|
|
143
|
+
});
|
|
144
|
+
var TrajectoryTraceRefSchema = z.object({
|
|
145
|
+
startRef: z.string().min(1, "Start ref is required"),
|
|
146
|
+
endRef: z.string().optional(),
|
|
147
|
+
traceId: z.string().optional()
|
|
148
|
+
});
|
|
110
149
|
var TrajectorySchema = z.object({
|
|
111
150
|
id: z.string().regex(/^traj_[a-z0-9]+$/, "Invalid trajectory ID format"),
|
|
112
151
|
version: z.literal(1),
|
|
@@ -120,7 +159,8 @@ var TrajectorySchema = z.object({
|
|
|
120
159
|
commits: z.array(z.string()),
|
|
121
160
|
filesChanged: z.array(z.string()),
|
|
122
161
|
projectId: z.string(),
|
|
123
|
-
tags: z.array(z.string())
|
|
162
|
+
tags: z.array(z.string()),
|
|
163
|
+
_trace: TrajectoryTraceRefSchema.optional()
|
|
124
164
|
});
|
|
125
165
|
var CreateTrajectoryInputSchema = z.object({
|
|
126
166
|
title: z.string().min(1, "Trajectory title is required").max(500, "Trajectory title must be 500 characters or less"),
|
|
@@ -240,8 +280,22 @@ function addChapter(trajectory, input) {
|
|
|
240
280
|
startedAt: now,
|
|
241
281
|
events: []
|
|
242
282
|
};
|
|
283
|
+
let updatedAgents = trajectory.agents;
|
|
284
|
+
const agentExists = trajectory.agents.some((a) => a.name === input.agentName);
|
|
285
|
+
if (!agentExists) {
|
|
286
|
+
const isFirstAgent = trajectory.agents.length === 0;
|
|
287
|
+
updatedAgents = [
|
|
288
|
+
...trajectory.agents,
|
|
289
|
+
{
|
|
290
|
+
name: input.agentName,
|
|
291
|
+
role: isFirstAgent ? "lead" : "contributor",
|
|
292
|
+
joinedAt: now
|
|
293
|
+
}
|
|
294
|
+
];
|
|
295
|
+
}
|
|
243
296
|
return {
|
|
244
297
|
...trajectory,
|
|
298
|
+
agents: updatedAgents,
|
|
245
299
|
chapters: [...updatedChapters, newChapter]
|
|
246
300
|
};
|
|
247
301
|
}
|
|
@@ -397,7 +451,10 @@ function exportToMarkdown(trajectory) {
|
|
|
397
451
|
lines.push(`### ${decision.question}`);
|
|
398
452
|
lines.push(`- **Chose:** ${decision.chosen}`);
|
|
399
453
|
if (decision.alternatives.length > 0) {
|
|
400
|
-
|
|
454
|
+
const altStrings = decision.alternatives.map(
|
|
455
|
+
(a) => typeof a === "string" ? a : a.option
|
|
456
|
+
);
|
|
457
|
+
lines.push(`- **Rejected:** ${altStrings.join(", ")}`);
|
|
401
458
|
}
|
|
402
459
|
lines.push(`- **Reasoning:** ${decision.reasoning}`);
|
|
403
460
|
lines.push("");
|
|
@@ -868,6 +925,7 @@ function formatTime(isoString) {
|
|
|
868
925
|
}
|
|
869
926
|
|
|
870
927
|
export {
|
|
928
|
+
generateRandomId,
|
|
871
929
|
generateTrajectoryId,
|
|
872
930
|
generateChapterId,
|
|
873
931
|
isValidTrajectoryId,
|
|
@@ -893,4 +951,4 @@ export {
|
|
|
893
951
|
exportToJSON,
|
|
894
952
|
exportToTimeline
|
|
895
953
|
};
|
|
896
|
-
//# sourceMappingURL=chunk-
|
|
954
|
+
//# sourceMappingURL=chunk-DX4OPGH7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/id.ts","../src/core/schema.ts","../src/core/trajectory.ts","../src/export/markdown.ts","../src/storage/file.ts","../src/export/json.ts","../src/export/timeline.ts"],"sourcesContent":["/**\n * ID generation utilities for trajectories and chapters\n *\n * Uses a simple random ID generator to avoid external dependencies.\n * IDs are URL-safe and collision-resistant.\n */\n\nimport { webcrypto } from \"node:crypto\";\n\nconst ALPHABET = \"abcdefghijklmnopqrstuvwxyz0123456789\";\nconst ID_LENGTH = 12;\n\n/**\n * Generate a random ID string\n * @param length - Length of the ID (default: 12)\n * @returns Random alphanumeric string\n */\nexport function generateRandomId(length: number = ID_LENGTH): string {\n let id = \"\";\n const randomValues = new Uint8Array(length);\n webcrypto.getRandomValues(randomValues);\n\n for (let i = 0; i < length; i++) {\n id += ALPHABET[randomValues[i] % ALPHABET.length];\n }\n\n return id;\n}\n\n/**\n * Generate a trajectory ID\n * Format: traj_xxxxxxxxxxxx (traj_ prefix + 12 random chars)\n * @returns Unique trajectory ID\n */\nexport function generateTrajectoryId(): string {\n return `traj_${generateRandomId()}`;\n}\n\n/**\n * Generate a chapter ID\n * Format: chap_xxxxxxxxxxxx (chap_ prefix + 12 random chars)\n * @returns Unique chapter ID\n */\nexport function generateChapterId(): string {\n return `chap_${generateRandomId()}`;\n}\n\n/**\n * Validate a trajectory ID format\n * @param id - The ID to validate\n * @returns True if valid format\n */\nexport function isValidTrajectoryId(id: string): boolean {\n return /^traj_[a-z0-9]{12}$/.test(id);\n}\n\n/**\n * Validate a chapter ID format\n * @param id - The ID to validate\n * @returns True if valid format\n */\nexport function isValidChapterId(id: string): boolean {\n return /^chap_[a-z0-9]{12}$/.test(id);\n}\n","/**\n * Zod schemas for runtime validation of trajectory data\n *\n * These schemas validate input at system boundaries and ensure\n * data integrity when reading from storage.\n */\n\nimport { z } from \"zod\";\n\n/**\n * Task source system schema\n */\nexport const TaskSourceSystemSchema = z.union([\n z.literal(\"beads\"),\n z.literal(\"github\"),\n z.literal(\"linear\"),\n z.literal(\"jira\"),\n z.literal(\"plain\"),\n z.string(), // Allow custom systems\n]);\n\n/**\n * Task source schema\n */\nexport const TaskSourceSchema = z.object({\n system: TaskSourceSystemSchema,\n id: z.string().min(1, \"Task ID is required\"),\n url: z.string().url().optional(),\n});\n\n/**\n * Task reference schema\n */\nexport const TaskReferenceSchema = z.object({\n title: z\n .string()\n .min(1, \"Trajectory title is required\")\n .max(500, \"Trajectory title must be 500 characters or less\"),\n description: z.string().optional(),\n source: TaskSourceSchema.optional(),\n});\n\n/**\n * Trajectory status schema\n */\nexport const TrajectoryStatusSchema = z.enum([\n \"active\",\n \"completed\",\n \"abandoned\",\n]);\n\n/**\n * Event type schema\n */\nexport const TrajectoryEventTypeSchema = z.enum([\n \"prompt\",\n \"thinking\",\n \"tool_call\",\n \"tool_result\",\n \"message_sent\",\n \"message_received\",\n \"decision\",\n \"finding\",\n \"note\",\n \"error\",\n]);\n\n/**\n * Event significance schema\n */\nexport const EventSignificanceSchema = z.enum([\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n]);\n\n/**\n * Trajectory event schema\n */\nexport const TrajectoryEventSchema = z.object({\n ts: z.number().int().positive(),\n type: TrajectoryEventTypeSchema,\n content: z.string().min(1, \"Event content is required\"),\n raw: z.unknown().optional(),\n significance: EventSignificanceSchema.optional(),\n tags: z.array(z.string()).optional(),\n confidence: z\n .number()\n .min(0, \"Confidence must be between 0 and 1\")\n .max(1, \"Confidence must be between 0 and 1\")\n .optional(),\n});\n\n/**\n * Alternative schema for decision alternatives\n */\nexport const AlternativeSchema = z.object({\n option: z.string().min(1, \"Alternative option is required\"),\n reason: z.string().optional(),\n});\n\n/**\n * Decision schema\n * Note: alternatives supports both string[] (legacy) and Alternative[] (new)\n */\nexport const DecisionSchema = z.object({\n question: z.string().min(1, \"Decision question is required\"),\n chosen: z.string().min(1, \"Chosen option is required\"),\n alternatives: z.array(z.union([z.string(), AlternativeSchema])),\n reasoning: z.string().min(1, \"Decision reasoning is required\"),\n confidence: z\n .number()\n .min(0, \"Confidence must be between 0 and 1\")\n .max(1, \"Confidence must be between 0 and 1\")\n .optional(),\n});\n\n/**\n * Agent participation schema\n */\nexport const AgentParticipationSchema = z.object({\n name: z.string().min(1, \"Agent name is required\"),\n role: z.enum([\"lead\", \"contributor\", \"reviewer\"]),\n joinedAt: z.string().datetime(),\n leftAt: z.string().datetime().optional(),\n});\n\n/**\n * Chapter schema\n */\nexport const ChapterSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1, \"Chapter title is required\"),\n agentName: z.string().min(1, \"Agent name is required\"),\n startedAt: z.string().datetime(),\n endedAt: z.string().datetime().optional(),\n events: z.array(TrajectoryEventSchema),\n});\n\n/**\n * Retrospective schema\n */\nexport const RetrospectiveSchema = z.object({\n summary: z.string().min(1, \"Retrospective summary is required\"),\n approach: z.string().min(1, \"Approach description is required\"),\n decisions: z.array(DecisionSchema).optional(),\n challenges: z.array(z.string()).optional(),\n learnings: z.array(z.string()).optional(),\n suggestions: z.array(z.string()).optional(),\n confidence: z\n .number()\n .min(0, \"Confidence must be between 0 and 1\")\n .max(1, \"Confidence must be between 0 and 1\"),\n timeSpent: z.string().optional(),\n});\n\n// ============================================================================\n// Agent Trace Schemas\n// ============================================================================\n\n/**\n * Trace range schema - represents a range of lines in a file\n */\nexport const TraceRangeSchema = z.object({\n start_line: z.number().int().positive(\"Start line must be positive\"),\n end_line: z.number().int().positive(\"End line must be positive\"),\n revision: z.string().optional(),\n content_hash: z.string().optional(),\n});\n\n/**\n * Contributor type schema\n */\nexport const ContributorTypeSchema = z.enum([\"human\", \"agent\"]);\n\n/**\n * Trace contributor schema\n */\nexport const TraceContributorSchema = z.object({\n type: ContributorTypeSchema,\n model: z.string().optional(),\n});\n\n/**\n * Trace conversation schema\n */\nexport const TraceConversationSchema = z.object({\n contributor: TraceContributorSchema,\n url: z.string().url().optional(),\n ranges: z.array(TraceRangeSchema),\n});\n\n/**\n * Trace file schema\n */\nexport const TraceFileSchema = z.object({\n path: z.string().min(1, \"File path is required\"),\n conversations: z.array(TraceConversationSchema),\n});\n\n/**\n * Trace record schema - the main trace type\n */\nexport const TraceRecordSchema = z.object({\n version: z.literal(1),\n id: z.string().regex(/^trace_[a-z0-9]+$/, \"Invalid trace ID format\"),\n timestamp: z.string().datetime(),\n trajectory: z.string().optional(),\n files: z.array(TraceFileSchema),\n});\n\n/**\n * Trajectory trace reference schema\n */\nexport const TrajectoryTraceRefSchema = z.object({\n startRef: z.string().min(1, \"Start ref is required\"),\n endRef: z.string().optional(),\n traceId: z.string().optional(),\n});\n\n/**\n * Full trajectory schema\n */\nexport const TrajectorySchema = z.object({\n id: z.string().regex(/^traj_[a-z0-9]+$/, \"Invalid trajectory ID format\"),\n version: z.literal(1),\n task: TaskReferenceSchema,\n status: TrajectoryStatusSchema,\n startedAt: z.string().datetime(),\n completedAt: z.string().datetime().optional(),\n agents: z.array(AgentParticipationSchema),\n chapters: z.array(ChapterSchema),\n retrospective: RetrospectiveSchema.optional(),\n commits: z.array(z.string()),\n filesChanged: z.array(z.string()),\n projectId: z.string(),\n tags: z.array(z.string()),\n _trace: TrajectoryTraceRefSchema.optional(),\n});\n\n/**\n * Create trajectory input schema\n */\nexport const CreateTrajectoryInputSchema = z.object({\n title: z\n .string()\n .min(1, \"Trajectory title is required\")\n .max(500, \"Trajectory title must be 500 characters or less\"),\n description: z.string().optional(),\n source: TaskSourceSchema.optional(),\n projectId: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n\n/**\n * Add chapter input schema\n */\nexport const AddChapterInputSchema = z.object({\n title: z.string().min(1, \"Chapter title is required\"),\n agentName: z.string().min(1, \"Agent name is required\"),\n});\n\n/**\n * Add event input schema\n */\nexport const AddEventInputSchema = z.object({\n type: TrajectoryEventTypeSchema,\n content: z.string().min(1, \"Event content is required\"),\n raw: z.unknown().optional(),\n significance: EventSignificanceSchema.optional(),\n tags: z.array(z.string()).optional(),\n});\n\n/**\n * Complete trajectory input schema\n */\nexport const CompleteTrajectoryInputSchema = z.object({\n summary: z.string().min(1, \"Retrospective summary is required\"),\n approach: z.string().min(1, \"Approach description is required\"),\n decisions: z.array(DecisionSchema).optional(),\n challenges: z.array(z.string()).optional(),\n learnings: z.array(z.string()).optional(),\n suggestions: z.array(z.string()).optional(),\n confidence: z\n .number()\n .min(0, \"Confidence must be between 0 and 1\")\n .max(1, \"Confidence must be between 0 and 1\"),\n});\n\n/**\n * Trajectory query schema\n */\nexport const TrajectoryQuerySchema = z.object({\n status: TrajectoryStatusSchema.optional(),\n since: z.string().datetime().optional(),\n until: z.string().datetime().optional(),\n limit: z.number().int().positive().max(100).optional(),\n offset: z.number().int().nonnegative().optional(),\n sortBy: z.enum([\"startedAt\", \"completedAt\", \"title\"]).optional(),\n sortOrder: z.enum([\"asc\", \"desc\"]).optional(),\n});\n\n/**\n * Validate a trajectory object\n * @param data - The data to validate\n * @returns Validation result with success flag and errors\n */\nexport function validateTrajectory(data: unknown): {\n success: boolean;\n data?: z.infer<typeof TrajectorySchema>;\n errors?: z.ZodError;\n} {\n const result = TrajectorySchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n\n/**\n * Validate create trajectory input\n */\nexport function validateCreateInput(data: unknown): {\n success: boolean;\n data?: z.infer<typeof CreateTrajectoryInputSchema>;\n errors?: z.ZodError;\n} {\n const result = CreateTrajectoryInputSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n\n/**\n * Validate complete trajectory input\n */\nexport function validateCompleteInput(data: unknown): {\n success: boolean;\n data?: z.infer<typeof CompleteTrajectoryInputSchema>;\n errors?: z.ZodError;\n} {\n const result = CompleteTrajectoryInputSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, errors: result.error };\n}\n\n// Type exports inferred from schemas\nexport type TaskSourceSchema = z.infer<typeof TaskSourceSchema>;\nexport type TaskReferenceSchema = z.infer<typeof TaskReferenceSchema>;\nexport type TrajectoryEventSchema = z.infer<typeof TrajectoryEventSchema>;\nexport type ChapterSchema = z.infer<typeof ChapterSchema>;\nexport type RetrospectiveSchema = z.infer<typeof RetrospectiveSchema>;\nexport type TrajectorySchemaType = z.infer<typeof TrajectorySchema>;\nexport type TraceRangeSchemaType = z.infer<typeof TraceRangeSchema>;\nexport type TraceContributorSchemaType = z.infer<typeof TraceContributorSchema>;\nexport type TraceConversationSchemaType = z.infer<\n typeof TraceConversationSchema\n>;\nexport type TraceFileSchemaType = z.infer<typeof TraceFileSchema>;\nexport type TraceRecordSchemaType = z.infer<typeof TraceRecordSchema>;\nexport type TrajectoryTraceRefSchemaType = z.infer<\n typeof TrajectoryTraceRefSchema\n>;\n","/**\n * Trajectory operations\n *\n * Pure functions for creating and manipulating trajectories.\n * These functions return new trajectory objects (immutable updates).\n */\n\nimport { generateChapterId, generateTrajectoryId } from \"./id.js\";\nimport {\n CompleteTrajectoryInputSchema,\n CreateTrajectoryInputSchema,\n} from \"./schema.js\";\nimport type {\n AddChapterInput,\n AddEventInput,\n AgentParticipation,\n Chapter,\n CompleteTrajectoryInput,\n CreateTrajectoryInput,\n Decision,\n Trajectory,\n} from \"./types.js\";\n\n/**\n * Custom error class for trajectory operations\n */\nexport class TrajectoryError extends Error {\n constructor(\n message: string,\n public code: string,\n public suggestion?: string,\n ) {\n super(message);\n this.name = \"TrajectoryError\";\n }\n}\n\n/**\n * Create a new trajectory\n * @param input - Trajectory creation input\n * @returns New trajectory object\n * @throws TrajectoryError if validation fails\n */\nexport function createTrajectory(input: CreateTrajectoryInput): Trajectory {\n // Validate input\n const validation = CreateTrajectoryInputSchema.safeParse(input);\n if (!validation.success) {\n const firstError = validation.error.errors[0];\n throw new TrajectoryError(\n firstError.message,\n \"VALIDATION_ERROR\",\n \"Check your input and try again\",\n );\n }\n\n const now = new Date().toISOString();\n\n return {\n id: generateTrajectoryId(),\n version: 1,\n task: {\n title: input.title,\n description: input.description,\n source: input.source,\n },\n status: \"active\",\n startedAt: now,\n agents: [],\n chapters: [],\n commits: [],\n filesChanged: [],\n projectId: input.projectId ?? process.cwd(),\n tags: input.tags ?? [],\n };\n}\n\n/**\n * Add a chapter to a trajectory\n * @param trajectory - The trajectory to update\n * @param input - Chapter creation input\n * @returns Updated trajectory with new chapter\n * @throws TrajectoryError if trajectory is completed\n */\nexport function addChapter(\n trajectory: Trajectory,\n input: AddChapterInput,\n): Trajectory {\n if (trajectory.status === \"completed\") {\n throw new TrajectoryError(\n \"Cannot add chapter to completed trajectory\",\n \"TRAJECTORY_ALREADY_COMPLETED\",\n \"Start a new trajectory instead\",\n );\n }\n\n const now = new Date().toISOString();\n\n // End the previous chapter if one exists\n const updatedChapters = trajectory.chapters.map((chapter, index) => {\n if (index === trajectory.chapters.length - 1 && !chapter.endedAt) {\n return { ...chapter, endedAt: now };\n }\n return chapter;\n });\n\n const newChapter: Chapter = {\n id: generateChapterId(),\n title: input.title,\n agentName: input.agentName,\n startedAt: now,\n events: [],\n };\n\n // Add agent to trajectory.agents if not already present\n let updatedAgents: AgentParticipation[] = trajectory.agents;\n const agentExists = trajectory.agents.some((a) => a.name === input.agentName);\n if (!agentExists) {\n const isFirstAgent = trajectory.agents.length === 0;\n updatedAgents = [\n ...trajectory.agents,\n {\n name: input.agentName,\n role: isFirstAgent ? \"lead\" : \"contributor\",\n joinedAt: now,\n },\n ];\n }\n\n return {\n ...trajectory,\n agents: updatedAgents,\n chapters: [...updatedChapters, newChapter],\n };\n}\n\n/**\n * Add an event to the current chapter\n * Auto-creates a chapter if none exists\n * @param trajectory - The trajectory to update\n * @param input - Event creation input\n * @returns Updated trajectory with new event\n */\nexport function addEvent(\n trajectory: Trajectory,\n input: AddEventInput,\n): Trajectory {\n // Auto-create a chapter if none exists\n let updatedTrajectory = trajectory;\n if (trajectory.chapters.length === 0) {\n updatedTrajectory = addChapter(trajectory, {\n title: \"Work\",\n agentName: \"default\",\n });\n }\n\n const event = {\n ts: Date.now(),\n type: input.type,\n content: input.content,\n raw: input.raw,\n significance: input.significance,\n tags: input.tags,\n };\n\n const chapters = [...updatedTrajectory.chapters];\n const lastChapter = chapters[chapters.length - 1];\n chapters[chapters.length - 1] = {\n ...lastChapter,\n events: [...lastChapter.events, event],\n };\n\n return {\n ...updatedTrajectory,\n chapters,\n };\n}\n\n/**\n * Add a structured decision to the trajectory\n * @param trajectory - The trajectory to update\n * @param decision - Decision details\n * @returns Updated trajectory with decision event\n */\nexport function addDecision(\n trajectory: Trajectory,\n decision: Decision,\n): Trajectory {\n return addEvent(trajectory, {\n type: \"decision\",\n content: `${decision.question}: ${decision.chosen}`,\n raw: decision,\n significance: \"high\",\n });\n}\n\n/**\n * Complete a trajectory with retrospective\n * @param trajectory - The trajectory to complete\n * @param input - Retrospective input\n * @returns Completed trajectory\n * @throws TrajectoryError if already completed or validation fails\n */\nexport function completeTrajectory(\n trajectory: Trajectory,\n input: CompleteTrajectoryInput,\n): Trajectory {\n if (trajectory.status === \"completed\") {\n throw new TrajectoryError(\n \"Trajectory is already completed\",\n \"TRAJECTORY_ALREADY_COMPLETED\",\n \"Start a new trajectory instead\",\n );\n }\n\n // Validate input\n const validation = CompleteTrajectoryInputSchema.safeParse(input);\n if (!validation.success) {\n const firstError = validation.error.errors[0];\n throw new TrajectoryError(\n firstError.message,\n \"VALIDATION_ERROR\",\n \"Check your input and try again\",\n );\n }\n\n const now = new Date().toISOString();\n\n // End the last chapter if one exists\n const chapters = trajectory.chapters.map((chapter, index) => {\n if (index === trajectory.chapters.length - 1 && !chapter.endedAt) {\n return { ...chapter, endedAt: now };\n }\n return chapter;\n });\n\n return {\n ...trajectory,\n status: \"completed\",\n completedAt: now,\n chapters,\n retrospective: {\n summary: input.summary,\n approach: input.approach,\n decisions: input.decisions,\n challenges: input.challenges,\n learnings: input.learnings,\n suggestions: input.suggestions,\n confidence: input.confidence,\n },\n };\n}\n\n/**\n * Abandon a trajectory without completing\n * @param trajectory - The trajectory to abandon\n * @param reason - Reason for abandonment\n * @returns Abandoned trajectory\n */\nexport function abandonTrajectory(\n trajectory: Trajectory,\n reason?: string,\n): Trajectory {\n const now = new Date().toISOString();\n\n // End the last chapter if one exists\n const chapters = trajectory.chapters.map((chapter, index) => {\n if (index === trajectory.chapters.length - 1 && !chapter.endedAt) {\n return { ...chapter, endedAt: now };\n }\n return chapter;\n });\n\n // Add abandonment note if reason provided\n let updatedChapters = chapters;\n if (reason && chapters.length > 0) {\n const lastChapter = chapters[chapters.length - 1];\n updatedChapters = [\n ...chapters.slice(0, -1),\n {\n ...lastChapter,\n events: [\n ...lastChapter.events,\n {\n ts: Date.now(),\n type: \"note\" as const,\n content: `Abandoned: ${reason}`,\n significance: \"high\" as const,\n },\n ],\n },\n ];\n }\n\n return {\n ...trajectory,\n status: \"abandoned\",\n completedAt: now,\n chapters: updatedChapters,\n };\n}\n","/**\n * Markdown export for trajectories\n *\n * Generates human-readable Notion-style documentation.\n */\n\nimport type { Decision, Trajectory } from \"../core/types.js\";\n\n/**\n * Export a trajectory to markdown format\n * @param trajectory - The trajectory to export\n * @returns Markdown string\n */\nexport function exportToMarkdown(trajectory: Trajectory): string {\n const lines: string[] = [];\n\n // Title\n lines.push(`# Trajectory: ${trajectory.task.title}`);\n lines.push(\"\");\n\n // Metadata block\n lines.push(`> **Status:** ${formatStatus(trajectory.status)}`);\n if (trajectory.task.source) {\n const linkText = trajectory.task.source.url\n ? `[${trajectory.task.source.id}](${trajectory.task.source.url})`\n : trajectory.task.source.id;\n lines.push(`> **Task:** ${linkText}`);\n }\n if (trajectory.retrospective?.confidence !== undefined) {\n lines.push(\n `> **Confidence:** ${Math.round(trajectory.retrospective.confidence * 100)}%`,\n );\n }\n lines.push(`> **Started:** ${formatDate(trajectory.startedAt)}`);\n if (trajectory.completedAt) {\n lines.push(`> **Completed:** ${formatDate(trajectory.completedAt)}`);\n }\n lines.push(\"\");\n\n // Summary (from retrospective)\n if (trajectory.retrospective) {\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"## Summary\");\n lines.push(\"\");\n lines.push(trajectory.retrospective.summary);\n lines.push(\"\");\n\n if (trajectory.retrospective.approach) {\n lines.push(`**Approach:** ${trajectory.retrospective.approach}`);\n lines.push(\"\");\n }\n }\n\n // Key Decisions\n const decisions = extractDecisions(trajectory);\n if (decisions.length > 0) {\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"## Key Decisions\");\n lines.push(\"\");\n\n for (const decision of decisions) {\n lines.push(`### ${decision.question}`);\n lines.push(`- **Chose:** ${decision.chosen}`);\n if (decision.alternatives.length > 0) {\n const altStrings = decision.alternatives.map((a) =>\n typeof a === \"string\" ? a : a.option,\n );\n lines.push(`- **Rejected:** ${altStrings.join(\", \")}`);\n }\n lines.push(`- **Reasoning:** ${decision.reasoning}`);\n lines.push(\"\");\n }\n }\n\n // Chapters\n if (trajectory.chapters.length > 0) {\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"## Chapters\");\n lines.push(\"\");\n\n trajectory.chapters.forEach((chapter, index) => {\n lines.push(`### ${index + 1}. ${chapter.title}`);\n lines.push(`*Agent: ${chapter.agentName}*`);\n lines.push(\"\");\n\n if (chapter.events.length > 0) {\n const significantEvents = chapter.events.filter(\n (e) =>\n e.significance === \"high\" ||\n e.significance === \"critical\" ||\n e.type === \"decision\",\n );\n if (significantEvents.length > 0) {\n for (const event of significantEvents) {\n lines.push(`- ${event.content}`);\n }\n lines.push(\"\");\n }\n }\n });\n }\n\n // Challenges\n if (\n trajectory.retrospective?.challenges &&\n trajectory.retrospective.challenges.length > 0\n ) {\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"## Challenges\");\n lines.push(\"\");\n for (const challenge of trajectory.retrospective.challenges) {\n lines.push(`- ${challenge}`);\n }\n lines.push(\"\");\n }\n\n // Learnings\n if (\n trajectory.retrospective?.learnings &&\n trajectory.retrospective.learnings.length > 0\n ) {\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"## Learnings\");\n lines.push(\"\");\n for (const learning of trajectory.retrospective.learnings) {\n lines.push(`- ${learning}`);\n }\n lines.push(\"\");\n }\n\n // Suggestions\n if (\n trajectory.retrospective?.suggestions &&\n trajectory.retrospective.suggestions.length > 0\n ) {\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"## Suggestions\");\n lines.push(\"\");\n for (const suggestion of trajectory.retrospective.suggestions) {\n lines.push(`- ${suggestion}`);\n }\n lines.push(\"\");\n }\n\n // Artifacts\n if (trajectory.commits.length > 0 || trajectory.filesChanged.length > 0) {\n lines.push(\"---\");\n lines.push(\"\");\n lines.push(\"## Artifacts\");\n lines.push(\"\");\n if (trajectory.commits.length > 0) {\n lines.push(`**Commits:** ${trajectory.commits.join(\", \")}`);\n }\n if (trajectory.filesChanged.length > 0) {\n lines.push(`**Files changed:** ${trajectory.filesChanged.length}`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n// Helper functions\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"active\":\n return \"🔄 Active\";\n case \"completed\":\n return \"✅ Completed\";\n case \"abandoned\":\n return \"❌ Abandoned\";\n default:\n return status;\n }\n}\n\nfunction formatDate(isoString: string): string {\n const date = new Date(isoString);\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction extractDecisions(trajectory: Trajectory): Decision[] {\n const decisions: Decision[] = [];\n\n // From retrospective\n if (trajectory.retrospective?.decisions) {\n decisions.push(...trajectory.retrospective.decisions);\n }\n\n // From events\n for (const chapter of trajectory.chapters) {\n for (const event of chapter.events) {\n if (event.type === \"decision\" && event.raw) {\n const raw = event.raw as Decision;\n if (raw.question && raw.chosen && raw.reasoning) {\n // Avoid duplicates\n if (!decisions.some((d) => d.question === raw.question)) {\n decisions.push(raw);\n }\n }\n }\n }\n }\n\n return decisions;\n}\n","/**\n * File system storage adapter for trajectories\n *\n * Stores trajectories as JSON files in a .trajectories directory.\n * Active trajectories go in active/, completed in completed/YYYY-MM/.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, readdir, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { validateTrajectory } from \"../core/schema.js\";\nimport type {\n Trajectory,\n TrajectoryQuery,\n TrajectorySummary,\n} from \"../core/types.js\";\nimport { exportToMarkdown } from \"../export/markdown.js\";\nimport type { StorageAdapter } from \"./interface.js\";\n\n/**\n * Expand ~ to home directory in a path\n */\nfunction expandPath(path: string): string {\n if (path.startsWith(\"~\")) {\n return join(process.env.HOME ?? \"\", path.slice(1));\n }\n return path;\n}\n\n/**\n * Get trajectory search paths from environment variable\n * TRAJECTORIES_SEARCH_PATHS is colon-separated (like PATH)\n * Falls back to current directory's .trajectories if not set\n */\nexport function getSearchPaths(): string[] {\n const searchPathsEnv = process.env.TRAJECTORIES_SEARCH_PATHS;\n if (searchPathsEnv) {\n return searchPathsEnv\n .split(\":\")\n .map((p) => p.trim())\n .filter(Boolean)\n .map(expandPath);\n }\n\n // Default: check for TRAJECTORIES_DATA_DIR, then fall back to ./.trajectories\n const dataDir = process.env.TRAJECTORIES_DATA_DIR;\n if (dataDir) {\n return [expandPath(dataDir)];\n }\n\n return [join(process.cwd(), \".trajectories\")];\n}\n\n/**\n * Index file structure for quick lookups\n */\ninterface TrajectoryIndex {\n version: number;\n lastUpdated: string;\n trajectories: Record<\n string,\n {\n title: string;\n status: string;\n startedAt: string;\n completedAt?: string;\n path: string;\n }\n >;\n}\n\n/**\n * File system storage adapter\n */\nexport class FileStorage implements StorageAdapter {\n private baseDir: string;\n private trajectoriesDir: string;\n private activeDir: string;\n private completedDir: string;\n private indexPath: string;\n\n constructor(baseDir?: string) {\n this.baseDir = baseDir ?? process.cwd();\n\n // Check for TRAJECTORIES_DATA_DIR env var first\n // When set, use the path directly (no .trajectories suffix)\n const dataDir = process.env.TRAJECTORIES_DATA_DIR;\n if (dataDir) {\n this.trajectoriesDir = expandPath(dataDir);\n } else {\n this.trajectoriesDir = join(this.baseDir, \".trajectories\");\n }\n\n this.activeDir = join(this.trajectoriesDir, \"active\");\n this.completedDir = join(this.trajectoriesDir, \"completed\");\n this.indexPath = join(this.trajectoriesDir, \"index.json\");\n }\n\n /**\n * Initialize storage directories\n */\n async initialize(): Promise<void> {\n await mkdir(this.trajectoriesDir, { recursive: true });\n await mkdir(this.activeDir, { recursive: true });\n await mkdir(this.completedDir, { recursive: true });\n\n // Create index if it doesn't exist\n if (!existsSync(this.indexPath)) {\n await this.saveIndex({\n version: 1,\n lastUpdated: new Date().toISOString(),\n trajectories: {},\n });\n }\n }\n\n /**\n * Save a trajectory\n */\n async save(trajectory: Trajectory): Promise<void> {\n const isCompleted =\n trajectory.status === \"completed\" || trajectory.status === \"abandoned\";\n\n // Determine file path\n let filePath: string;\n if (isCompleted) {\n const date = new Date(trajectory.completedAt ?? trajectory.startedAt);\n const monthDir = join(\n this.completedDir,\n `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`,\n );\n await mkdir(monthDir, { recursive: true });\n filePath = join(monthDir, `${trajectory.id}.json`);\n\n // Remove from active if it was there\n const activePath = join(this.activeDir, `${trajectory.id}.json`);\n if (existsSync(activePath)) {\n await unlink(activePath);\n }\n\n // Generate markdown summary for completed trajectories\n const mdPath = join(monthDir, `${trajectory.id}.md`);\n const markdown = exportToMarkdown(trajectory);\n await writeFile(mdPath, markdown, \"utf-8\");\n } else {\n filePath = join(this.activeDir, `${trajectory.id}.json`);\n }\n\n // Write trajectory file\n await writeFile(filePath, JSON.stringify(trajectory, null, 2), \"utf-8\");\n\n // Update index\n await this.updateIndex(trajectory, filePath);\n }\n\n /**\n * Get a trajectory by ID\n */\n async get(id: string): Promise<Trajectory | null> {\n // Check active first\n const activePath = join(this.activeDir, `${id}.json`);\n if (existsSync(activePath)) {\n return this.readTrajectoryFile(activePath);\n }\n\n // Check completed (need to search subdirectories)\n const index = await this.loadIndex();\n const entry = index.trajectories[id];\n if (entry?.path && existsSync(entry.path)) {\n return this.readTrajectoryFile(entry.path);\n }\n\n // Search completed directories manually if not in index\n try {\n const months = await readdir(this.completedDir);\n for (const month of months) {\n const filePath = join(this.completedDir, month, `${id}.json`);\n if (existsSync(filePath)) {\n return this.readTrajectoryFile(filePath);\n }\n }\n } catch (error) {\n // ENOENT means directory doesn't exist yet - this is expected\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n console.error(\"Error searching completed trajectories:\", error);\n }\n }\n\n return null;\n }\n\n /**\n * Get the currently active trajectory\n */\n async getActive(): Promise<Trajectory | null> {\n try {\n const files = await readdir(this.activeDir);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\"));\n\n if (jsonFiles.length === 0) {\n return null;\n }\n\n // Get most recently started\n let mostRecent: Trajectory | null = null;\n let mostRecentTime = 0;\n\n for (const file of jsonFiles) {\n const trajectory = await this.readTrajectoryFile(\n join(this.activeDir, file),\n );\n if (trajectory) {\n const startTime = new Date(trajectory.startedAt).getTime();\n if (startTime > mostRecentTime) {\n mostRecentTime = startTime;\n mostRecent = trajectory;\n }\n }\n }\n\n return mostRecent;\n } catch (error) {\n // ENOENT means directory doesn't exist yet - this is expected\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n // Log unexpected errors for debugging\n console.error(\"Error reading active trajectories:\", error);\n return null;\n }\n }\n\n /**\n * List trajectories with optional filtering\n */\n async list(query: TrajectoryQuery): Promise<TrajectorySummary[]> {\n const index = await this.loadIndex();\n let entries = Object.entries(index.trajectories);\n\n // Filter by status\n if (query.status) {\n entries = entries.filter(([, entry]) => entry.status === query.status);\n }\n\n // Filter by date range\n if (query.since) {\n const sinceTime = new Date(query.since).getTime();\n entries = entries.filter(\n ([, entry]) => new Date(entry.startedAt).getTime() >= sinceTime,\n );\n }\n if (query.until) {\n const untilTime = new Date(query.until).getTime();\n entries = entries.filter(\n ([, entry]) => new Date(entry.startedAt).getTime() <= untilTime,\n );\n }\n\n // Sort (default: startedAt desc)\n const sortBy = query.sortBy ?? \"startedAt\";\n const sortOrder = query.sortOrder ?? \"desc\";\n entries.sort((a, b) => {\n const aVal = a[1][sortBy as keyof (typeof a)[1]] ?? \"\";\n const bVal = b[1][sortBy as keyof (typeof b)[1]] ?? \"\";\n const cmp = String(aVal).localeCompare(String(bVal));\n return sortOrder === \"asc\" ? cmp : -cmp;\n });\n\n // Pagination\n const offset = query.offset ?? 0;\n const limit = query.limit ?? 50;\n entries = entries.slice(offset, offset + limit);\n\n // Convert to summaries\n return Promise.all(\n entries.map(async ([id, entry]) => {\n // Load full trajectory to get counts\n const trajectory = await this.get(id);\n return {\n id,\n title: entry.title,\n status: entry.status as \"active\" | \"completed\" | \"abandoned\",\n startedAt: entry.startedAt,\n completedAt: entry.completedAt,\n confidence: trajectory?.retrospective?.confidence,\n chapterCount: trajectory?.chapters.length ?? 0,\n decisionCount:\n trajectory?.chapters.reduce(\n (count, chapter) =>\n count +\n chapter.events.filter((e) => e.type === \"decision\").length,\n 0,\n ) ?? 0,\n };\n }),\n );\n }\n\n /**\n * Delete a trajectory\n */\n async delete(id: string): Promise<void> {\n // Remove from active\n const activePath = join(this.activeDir, `${id}.json`);\n if (existsSync(activePath)) {\n await unlink(activePath);\n }\n\n // Remove from completed (search subdirectories)\n const index = await this.loadIndex();\n const entry = index.trajectories[id];\n if (entry?.path && existsSync(entry.path)) {\n await unlink(entry.path);\n // Also remove markdown if exists\n const mdPath = entry.path.replace(\".json\", \".md\");\n if (existsSync(mdPath)) {\n await unlink(mdPath);\n }\n }\n\n // Update index\n delete index.trajectories[id];\n await this.saveIndex(index);\n }\n\n /**\n * Search trajectories by text\n */\n async search(\n text: string,\n options?: { limit?: number },\n ): Promise<TrajectorySummary[]> {\n const allTrajectories = await this.list({});\n const searchLower = text.toLowerCase();\n const limit = options?.limit ?? 20;\n\n const matches: TrajectorySummary[] = [];\n\n for (const summary of allTrajectories) {\n if (matches.length >= limit) break;\n\n // Check title\n if (summary.title.toLowerCase().includes(searchLower)) {\n matches.push(summary);\n continue;\n }\n\n // Load full trajectory for deeper search\n const trajectory = await this.get(summary.id);\n if (!trajectory) continue;\n\n // Check retrospective\n if (\n trajectory.retrospective?.summary.toLowerCase().includes(searchLower)\n ) {\n matches.push(summary);\n continue;\n }\n\n // Check decisions\n const hasMatchingDecision = trajectory.chapters.some((chapter) =>\n chapter.events.some(\n (event) =>\n event.type === \"decision\" &&\n event.content.toLowerCase().includes(searchLower),\n ),\n );\n if (hasMatchingDecision) {\n matches.push(summary);\n }\n }\n\n return matches;\n }\n\n /**\n * Close storage (no-op for file storage)\n */\n async close(): Promise<void> {\n // No cleanup needed for file storage\n }\n\n // Private helpers\n\n private async readTrajectoryFile(path: string): Promise<Trajectory | null> {\n try {\n const content = await readFile(path, \"utf-8\");\n const data = JSON.parse(content);\n const validation = validateTrajectory(data);\n if (validation.success) {\n return validation.data as Trajectory;\n }\n console.error(`Invalid trajectory at ${path}:`, validation.errors);\n return null;\n } catch (error) {\n console.error(`Failed to read trajectory at ${path}:`, error);\n return null;\n }\n }\n\n private async loadIndex(): Promise<TrajectoryIndex> {\n try {\n const content = await readFile(this.indexPath, \"utf-8\");\n return JSON.parse(content);\n } catch (error) {\n // ENOENT means index doesn't exist yet - this is expected on first run\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n console.error(\n \"Error loading trajectory index, using empty index:\",\n error,\n );\n }\n return {\n version: 1,\n lastUpdated: new Date().toISOString(),\n trajectories: {},\n };\n }\n }\n\n private async saveIndex(index: TrajectoryIndex): Promise<void> {\n index.lastUpdated = new Date().toISOString();\n await writeFile(this.indexPath, JSON.stringify(index, null, 2), \"utf-8\");\n }\n\n private async updateIndex(\n trajectory: Trajectory,\n filePath: string,\n ): Promise<void> {\n const index = await this.loadIndex();\n index.trajectories[trajectory.id] = {\n title: trajectory.task.title,\n status: trajectory.status,\n startedAt: trajectory.startedAt,\n completedAt: trajectory.completedAt,\n path: filePath,\n };\n await this.saveIndex(index);\n }\n}\n","/**\n * JSON export for trajectories\n */\n\nimport type { Trajectory } from \"../core/types.js\";\n\nexport interface JSONExportOptions {\n /** Output compact JSON without formatting */\n compact?: boolean;\n}\n\n/**\n * Export a trajectory to JSON format\n * @param trajectory - The trajectory to export\n * @param options - Export options\n * @returns JSON string\n */\nexport function exportToJSON(\n trajectory: Trajectory,\n options?: JSONExportOptions,\n): string {\n if (options?.compact) {\n return JSON.stringify(trajectory);\n }\n return JSON.stringify(trajectory, null, 2);\n}\n","/**\n * Timeline export for trajectories\n *\n * Generates a chronological Linear-style view.\n */\n\nimport type { Trajectory } from \"../core/types.js\";\n\n/**\n * Export a trajectory to timeline format\n * @param trajectory - The trajectory to export\n * @returns Timeline string\n */\nexport function exportToTimeline(trajectory: Trajectory): string {\n const lines: string[] = [];\n\n // Start marker\n lines.push(\n `● ${formatTime(trajectory.startedAt)} Started: ${trajectory.task.title}`,\n );\n lines.push(\"│\");\n\n // Chapters and events\n for (const chapter of trajectory.chapters) {\n lines.push(\n `├─ ${formatTime(chapter.startedAt)} Chapter: ${chapter.title}`,\n );\n lines.push(`│ Agent: ${chapter.agentName}`);\n lines.push(\"│\");\n\n for (const event of chapter.events) {\n const prefix = event.type === \"decision\" ? \"├─ Decision: \" : \"├─ \";\n const timeStr = formatTime(new Date(event.ts).toISOString());\n\n if (event.type === \"decision\") {\n lines.push(`│ ${timeStr} ${prefix}${event.content}`);\n } else if (\n event.significance === \"high\" ||\n event.significance === \"critical\"\n ) {\n lines.push(`│ ${timeStr} ${prefix}${event.content}`);\n }\n }\n\n if (chapter.endedAt) {\n lines.push(\"│\");\n }\n }\n\n // End marker\n if (trajectory.completedAt) {\n const status =\n trajectory.status === \"completed\" ? \"Completed\" : \"Abandoned\";\n lines.push(`○ ${formatTime(trajectory.completedAt)} ${status}`);\n\n if (trajectory.retrospective) {\n lines.push(\"\");\n lines.push(` Summary: ${trajectory.retrospective.summary}`);\n lines.push(\n ` Confidence: ${Math.round(trajectory.retrospective.confidence * 100)}%`,\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatTime(isoString: string): string {\n const date = new Date(isoString);\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n"],"mappings":"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","names":[]}
|