agent-relay 4.0.19 → 4.0.21
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/index.cjs +1407 -537
- package/dist/src/cli/commands/messaging.d.ts +44 -0
- package/dist/src/cli/commands/messaging.d.ts.map +1 -1
- package/dist/src/cli/commands/messaging.js +195 -8
- package/dist/src/cli/commands/messaging.js.map +1 -1
- package/dist/src/cli/commands/setup.d.ts +30 -1
- package/dist/src/cli/commands/setup.d.ts.map +1 -1
- package/dist/src/cli/commands/setup.js +102 -85
- package/dist/src/cli/commands/setup.js.map +1 -1
- package/node_modules/@agent-relay/cloud/dist/auth.d.ts +2 -2
- package/node_modules/@agent-relay/cloud/dist/auth.d.ts.map +1 -1
- package/node_modules/@agent-relay/cloud/dist/auth.js +108 -62
- package/node_modules/@agent-relay/cloud/dist/auth.js.map +1 -1
- package/node_modules/@agent-relay/cloud/package.json +2 -2
- package/node_modules/@agent-relay/config/package.json +1 -1
- package/node_modules/@agent-relay/hooks/package.json +4 -4
- package/node_modules/@agent-relay/sdk/dist/workflows/trajectory.d.ts +5 -35
- package/node_modules/@agent-relay/sdk/dist/workflows/trajectory.d.ts.map +1 -1
- package/node_modules/@agent-relay/sdk/dist/workflows/trajectory.js +158 -292
- package/node_modules/@agent-relay/sdk/dist/workflows/trajectory.js.map +1 -1
- package/node_modules/@agent-relay/sdk/package.json +3 -2
- package/node_modules/@agent-relay/telemetry/package.json +1 -1
- package/node_modules/@agent-relay/trajectory/package.json +2 -2
- package/node_modules/@agent-relay/user-directory/package.json +2 -2
- package/node_modules/@agent-relay/utils/package.json +2 -2
- package/node_modules/@clack/core/CHANGELOG.md +200 -0
- package/node_modules/@clack/core/LICENSE +9 -0
- package/node_modules/@clack/core/README.md +22 -0
- package/node_modules/@clack/core/dist/index.cjs +15 -0
- package/node_modules/@clack/core/dist/index.cjs.map +1 -0
- package/node_modules/@clack/core/dist/index.d.cts +151 -0
- package/node_modules/@clack/core/dist/index.d.mts +151 -0
- package/node_modules/@clack/core/dist/index.d.ts +151 -0
- package/node_modules/@clack/core/dist/index.mjs +15 -0
- package/node_modules/@clack/core/dist/index.mjs.map +1 -0
- package/node_modules/@clack/core/package.json +62 -0
- package/node_modules/@clack/prompts/CHANGELOG.md +256 -0
- package/node_modules/@clack/prompts/LICENSE +23 -0
- package/node_modules/@clack/prompts/README.md +158 -0
- package/node_modules/@clack/prompts/dist/index.cjs +77 -0
- package/node_modules/@clack/prompts/dist/index.d.ts +106 -0
- package/node_modules/@clack/prompts/dist/index.mjs +77 -0
- package/node_modules/@clack/prompts/node_modules/is-unicode-supported/index.d.ts +12 -0
- package/node_modules/@clack/prompts/node_modules/is-unicode-supported/index.js +17 -0
- package/node_modules/@clack/prompts/node_modules/is-unicode-supported/license +9 -0
- package/node_modules/@clack/prompts/node_modules/is-unicode-supported/package.json +43 -0
- package/node_modules/@clack/prompts/node_modules/is-unicode-supported/readme.md +35 -0
- package/node_modules/@clack/prompts/package.json +65 -0
- package/node_modules/@smithy/config-resolver/package.json +2 -2
- package/node_modules/@smithy/util-defaults-mode-node/package.json +2 -2
- package/node_modules/@smithy/util-endpoints/dist-cjs/index.js +154 -61
- package/node_modules/@smithy/util-endpoints/dist-es/bdd/BinaryDecisionDiagram.js +15 -0
- package/node_modules/@smithy/util-endpoints/dist-es/decideEndpoint.js +41 -0
- package/node_modules/@smithy/util-endpoints/dist-es/index.js +2 -0
- package/node_modules/@smithy/util-endpoints/dist-es/lib/coalesce.js +8 -0
- package/node_modules/@smithy/util-endpoints/dist-es/lib/index.js +3 -0
- package/node_modules/@smithy/util-endpoints/dist-es/lib/ite.js +3 -0
- package/node_modules/@smithy/util-endpoints/dist-es/lib/split.js +13 -0
- package/node_modules/@smithy/util-endpoints/dist-es/lib/substring.js +1 -1
- package/node_modules/@smithy/util-endpoints/dist-es/utils/endpointFunctions.js +4 -1
- package/node_modules/@smithy/util-endpoints/dist-es/utils/evaluateExpression.js +20 -5
- package/node_modules/@smithy/util-endpoints/dist-es/utils/evaluateTemplate.js +3 -6
- package/node_modules/@smithy/util-endpoints/dist-es/utils/getReferenceValue.js +1 -5
- package/node_modules/@smithy/util-endpoints/dist-types/bdd/BinaryDecisionDiagram.d.ts +22 -0
- package/node_modules/@smithy/util-endpoints/dist-types/decideEndpoint.d.ts +7 -0
- package/node_modules/@smithy/util-endpoints/dist-types/index.d.ts +2 -0
- package/node_modules/@smithy/util-endpoints/dist-types/lib/coalesce.d.ts +7 -0
- package/node_modules/@smithy/util-endpoints/dist-types/lib/index.d.ts +3 -0
- package/node_modules/@smithy/util-endpoints/dist-types/lib/ite.d.ts +6 -0
- package/node_modules/@smithy/util-endpoints/dist-types/lib/split.d.ts +11 -0
- package/node_modules/@smithy/util-endpoints/dist-types/utils/endpointFunctions.d.ts +4 -0
- package/node_modules/@smithy/util-endpoints/dist-types/utils/getReferenceValue.d.ts +3 -1
- package/node_modules/@smithy/util-endpoints/package.json +1 -1
- package/node_modules/agent-trajectories/README.md +562 -0
- package/node_modules/agent-trajectories/dist/chunk-W222QB6V.js +2036 -0
- package/node_modules/agent-trajectories/dist/chunk-W222QB6V.js.map +1 -0
- package/node_modules/agent-trajectories/dist/cli/index.d.ts +2 -0
- package/node_modules/agent-trajectories/dist/cli/index.js +4592 -0
- package/node_modules/agent-trajectories/dist/cli/index.js.map +1 -0
- package/node_modules/agent-trajectories/dist/index-7tzw_CMS.d.ts +1777 -0
- package/node_modules/agent-trajectories/dist/index.d.ts +90 -0
- package/node_modules/agent-trajectories/dist/index.js +73 -0
- package/node_modules/agent-trajectories/dist/index.js.map +1 -0
- package/node_modules/agent-trajectories/dist/sdk/index.d.ts +2 -0
- package/node_modules/agent-trajectories/dist/sdk/index.js +39 -0
- package/node_modules/agent-trajectories/dist/sdk/index.js.map +1 -0
- package/node_modules/agent-trajectories/package.json +72 -0
- package/node_modules/commander/LICENSE +22 -0
- package/node_modules/commander/Readme.md +1157 -0
- package/node_modules/commander/esm.mjs +16 -0
- package/node_modules/commander/index.js +24 -0
- package/node_modules/commander/lib/argument.js +149 -0
- package/node_modules/commander/lib/command.js +2509 -0
- package/node_modules/commander/lib/error.js +39 -0
- package/node_modules/commander/lib/help.js +520 -0
- package/node_modules/commander/lib/option.js +330 -0
- package/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/node_modules/commander/package-support.json +16 -0
- package/node_modules/commander/package.json +84 -0
- package/node_modules/commander/typings/esm.d.mts +3 -0
- package/node_modules/commander/typings/index.d.ts +969 -0
- package/node_modules/picocolors/LICENSE +15 -0
- package/node_modules/picocolors/README.md +21 -0
- package/node_modules/picocolors/package.json +25 -0
- package/node_modules/picocolors/picocolors.browser.js +4 -0
- package/node_modules/picocolors/picocolors.d.ts +5 -0
- package/node_modules/picocolors/picocolors.js +75 -0
- package/node_modules/picocolors/types.d.ts +51 -0
- package/node_modules/sisteransi/license +21 -0
- package/node_modules/sisteransi/package.json +34 -0
- package/node_modules/sisteransi/readme.md +113 -0
- package/node_modules/sisteransi/src/index.js +58 -0
- package/node_modules/sisteransi/src/sisteransi.d.ts +35 -0
- package/package.json +10 -10
- package/packages/cloud/dist/auth.d.ts +2 -2
- package/packages/cloud/dist/auth.d.ts.map +1 -1
- package/packages/cloud/dist/auth.js +108 -62
- package/packages/cloud/dist/auth.js.map +1 -1
- package/packages/cloud/package.json +2 -2
- package/packages/config/package.json +1 -1
- package/packages/hooks/package.json +4 -4
- package/packages/sdk/dist/workflows/trajectory.d.ts +5 -35
- package/packages/sdk/dist/workflows/trajectory.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/trajectory.js +158 -292
- package/packages/sdk/dist/workflows/trajectory.js.map +1 -1
- package/packages/sdk/package.json +3 -2
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/core/id.ts","../../src/core/schema.ts","../../src/core/trajectory.ts","../../src/storage/file.ts","../../src/export/markdown.ts","../../src/cli/commands/abandon.ts","../../src/cli/commands/compact.ts","../../src/compact/config.ts","../../src/compact/markdown.ts","../../src/compact/parser.ts","../../src/compact/prompts.ts","../../src/compact/provider.ts","../../src/compact/serializer.ts","../../src/cli/commands/complete.ts","../../src/core/trace.ts","../../src/core/trailers.ts","../../src/cli/commands/decision.ts","../../src/cli/commands/enable.ts","../../src/cli/commands/export.ts","../../src/export/json.ts","../../src/export/timeline.ts","../../src/web/styles.ts","../../src/web/generator.ts","../../src/cli/commands/list.ts","../../src/cli/commands/reflect.ts","../../src/cli/commands/show.ts","../../src/cli/commands/start.ts","../../src/cli/commands/status.ts","../../src/cli/commands/index.ts","../../src/cli/version.ts"],"sourcesContent":["/**\n * Trail CLI\n *\n * Leave a trail of your agent work for others to follow.\n *\n * The name \"trail\" comes from \"trajectory\" - while the trajectory is the\n * complete path an agent takes through a task, the trail is what's left\n * behind for future agents and humans to follow. You don't see the whole\n * trajectory in real-time, but you can always follow the trail.\n */\n\nimport { program } from \"commander\";\nimport { registerCommands } from \"./commands/index.js\";\nimport { VERSION } from \"./version.js\";\n\nprogram\n .name(\"trail\")\n .description(\"Leave a trail of your work for others to follow\")\n .version(VERSION)\n .option(\n \"--data-dir <path>\",\n \"Override trajectory storage directory (or set TRAJECTORIES_DATA_DIR)\",\n )\n .hook(\"preAction\", (thisCommand) => {\n // If --data-dir flag is set, override the env var before commands run\n const opts = thisCommand.opts();\n if (opts.dataDir) {\n process.env.TRAJECTORIES_DATA_DIR = opts.dataDir;\n }\n });\n\n// Register all commands\nregisterCommands(program);\n\n// Parse arguments\nprogram.parse();\n","/**\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 // Accept the canonical 12-char form generated by this library AND the\n // legacy `traj_<timestamp>_<hex>` form produced by external writers\n // like the workforce workflow runner.\n return /^traj_[a-z0-9_]+$/.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/** Permissive on read so trajectories from other tools can load even with unknown event types. */\nexport const TrajectoryEventTypeSchema = z.union([\n z.literal(\"prompt\"),\n z.literal(\"thinking\"),\n z.literal(\"tool_call\"),\n z.literal(\"tool_result\"),\n z.literal(\"message_sent\"),\n z.literal(\"message_received\"),\n z.literal(\"decision\"),\n z.literal(\"finding\"),\n z.literal(\"reflection\"),\n z.literal(\"note\"),\n z.literal(\"error\"),\n z.string(), // Allow event types emitted by other tools (e.g. agent-relay's completion-evidence / completion-marker). Downstream code filters to known types.\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.string().min(1, \"Agent role is required\"),\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 * Follows agent-trace.dev specification\n */\nexport const ContributorTypeSchema = z.enum([\n \"human\",\n \"ai\",\n \"mixed\",\n \"unknown\",\n]);\n\n/**\n * Trace contributor schema\n * model_id follows models.dev convention (e.g., 'anthropic/claude-opus-4-5-20251101')\n */\nexport const TraceContributorSchema = z.object({\n type: ContributorTypeSchema,\n model_id: z.string().max(250).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 * Follows agent-trace.dev specification v0.1.0\n */\nexport const TraceRecordSchema = z.object({\n version: z.string().min(1, \"Version is required\"),\n id: z.string().min(1, \"Trace ID is required\"),\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()).default([]),\n filesChanged: z.array(z.string()).default([]),\n projectId: z.string().optional(),\n workflowId: z.string().optional(),\n tags: z.array(z.string()).default([]),\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 * 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 { type Dirent, 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 * Tagged result from reading a trajectory file. Lets callers distinguish\n * missing files, malformed JSON, and schema violations so they can pick\n * their own policy (reconcile counts and moves on; `get()` returns null;\n * a future `getStrict()` could throw).\n */\nexport type ReadTrajectoryResult =\n | { ok: true; trajectory: Trajectory }\n | {\n ok: false;\n reason: \"malformed_json\" | \"schema_violation\" | \"io_error\";\n path: string;\n error: unknown;\n };\n\n/**\n * Aggregated counts emitted by reconcileIndex for observability. Exposed\n * on the return value so tests and callers can assert on counts without\n * parsing log output.\n */\nexport interface ReconcileSummary {\n scanned: number;\n added: number;\n alreadyIndexed: number;\n skippedMalformedJson: number;\n skippedSchemaViolation: number;\n skippedIoError: number;\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 // Reconcile on-disk trajectories with the index. Self-heals cases where\n // files were written by a different process or an older layout that\n // bypassed updateIndex.\n await this.reconcileIndex();\n }\n\n /**\n * Scan active/ and completed/ recursively and add any trajectory files\n * missing from the index. Existing entries are preserved — reconcile\n * only adds, never removes.\n *\n * Handles three on-disk layouts in completed/:\n * - flat: completed/{id}.json (legacy workforce data)\n * - monthly: completed/YYYY-MM/{id}.json (current save() writes)\n * - nested: completed/.../{id}.json (defensive — any depth)\n *\n * Returns a ReconcileSummary so tests and CLI wrappers can observe\n * outcomes without parsing logs. Only writes the index if anything was\n * added.\n */\n async reconcileIndex(): Promise<ReconcileSummary> {\n const summary: ReconcileSummary = {\n scanned: 0,\n added: 0,\n alreadyIndexed: 0,\n skippedMalformedJson: 0,\n skippedSchemaViolation: 0,\n skippedIoError: 0,\n };\n\n const index = await this.loadIndex();\n const before = Object.keys(index.trajectories).length;\n\n const discovered: string[] = [];\n\n // Walk active/ — intentionally NOT recursive; active trajectories\n // always live at the flat root.\n try {\n const activeFiles = await readdir(this.activeDir);\n for (const file of activeFiles) {\n if (!file.endsWith(\".json\")) continue;\n discovered.push(join(this.activeDir, file));\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n\n // Walk completed/ recursively so we transparently support every\n // historical layout without guessing depth.\n await this.walkJsonFilesInto(this.completedDir, discovered);\n\n for (const filePath of discovered) {\n summary.scanned += 1;\n const result = await this.readTrajectoryFile(filePath);\n if (!result.ok) {\n if (result.reason === \"malformed_json\") {\n summary.skippedMalformedJson += 1;\n } else if (result.reason === \"schema_violation\") {\n summary.skippedSchemaViolation += 1;\n } else {\n summary.skippedIoError += 1;\n }\n continue;\n }\n const trajectory = result.trajectory;\n if (index.trajectories[trajectory.id]) {\n summary.alreadyIndexed += 1;\n continue;\n }\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 summary.added += 1;\n }\n\n if (Object.keys(index.trajectories).length !== before) {\n await this.saveIndex(index);\n }\n\n // Only log when something interesting happened. Noise is worse than\n // silence here — the CLI spinner is the user's feedback.\n const hadSkips =\n summary.skippedMalformedJson +\n summary.skippedSchemaViolation +\n summary.skippedIoError >\n 0;\n if (summary.added > 0 || hadSkips) {\n const parts = [`reconciled ${summary.added}/${summary.scanned}`];\n if (summary.skippedMalformedJson > 0) {\n parts.push(`malformed: ${summary.skippedMalformedJson}`);\n }\n if (summary.skippedSchemaViolation > 0) {\n parts.push(`invalid: ${summary.skippedSchemaViolation}`);\n }\n if (summary.skippedIoError > 0) {\n parts.push(`io: ${summary.skippedIoError}`);\n }\n console.warn(`[trajectories] ${parts.join(\", \")}`);\n }\n\n return summary;\n }\n\n /**\n * Recursively collect all .json file paths under `dir` into `out`.\n * Silently treats a missing directory as empty.\n */\n private async walkJsonFilesInto(dir: string, out: string[]): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw error;\n }\n\n for (const entry of entries) {\n const entryPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await this.walkJsonFilesInto(entryPath, out);\n } else if (entry.isFile() && entry.name.endsWith(\".json\")) {\n out.push(entryPath);\n }\n }\n }\n\n /**\n * Save a trajectory.\n *\n * Validates the input against the trajectory schema before touching\n * disk. Closes the historical read/write asymmetry where save() would\n * happily write data that the reader then rejected, producing files\n * that could never be loaded back.\n */\n async save(input: Trajectory): Promise<void> {\n const validation = validateTrajectory(input);\n if (!validation.success) {\n const issues =\n validation.errors?.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"root\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \") ?? \"unknown validation error\";\n throw new Error(`Cannot save invalid trajectory: ${issues}`);\n }\n // Use the parsed (defaulted) trajectory so newly-written files\n // always carry normalized fields like commits/filesChanged/tags.\n const trajectory = validation.data as Trajectory;\n\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.readTrajectoryOrNull(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.readTrajectoryOrNull(entry.path);\n }\n\n // Search completed directories manually if not in index. Handles both\n // the flat `completed/{id}.json` layout (legacy) and the nested\n // `completed/YYYY-MM/{id}.json` layout written by save().\n try {\n const flatPath = join(this.completedDir, `${id}.json`);\n if (existsSync(flatPath)) {\n return this.readTrajectoryOrNull(flatPath);\n }\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.readTrajectoryOrNull(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.readTrajectoryOrNull(\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 /**\n * Read a trajectory file and return a tagged result so callers can\n * distinguish missing files, malformed JSON, and schema violations.\n *\n * Does NOT log. Callers choose whether to warn, swallow, or throw.\n */\n private async readTrajectoryFile(\n path: string,\n ): Promise<ReadTrajectoryResult> {\n let content: string;\n try {\n content = await readFile(path, \"utf-8\");\n } catch (error) {\n return { ok: false, reason: \"io_error\", path, error };\n }\n\n let data: unknown;\n try {\n data = JSON.parse(content);\n } catch (error) {\n return { ok: false, reason: \"malformed_json\", path, error };\n }\n\n const validation = validateTrajectory(data);\n if (validation.success) {\n return { ok: true, trajectory: validation.data as Trajectory };\n }\n return {\n ok: false,\n reason: \"schema_violation\",\n path,\n error: validation.errors,\n };\n }\n\n /**\n * Convenience wrapper for callers that only care whether they got a\n * trajectory. Returns null for any failure and writes nothing to the\n * console — so nothing leaks into test output or the CLI spinner.\n */\n private async readTrajectoryOrNull(path: string): Promise<Trajectory | null> {\n const result = await this.readTrajectoryFile(path);\n return result.ok ? result.trajectory : null;\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 * 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 * trail abandon command\n */\n\nimport type { Command } from \"commander\";\nimport { abandonTrajectory } from \"../../core/trajectory.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerAbandonCommand(program: Command): void {\n program\n .command(\"abandon\")\n .description(\"Abandon the active trajectory\")\n .option(\"-r, --reason <text>\", \"Reason for abandonment\")\n .action(async (options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n throw new Error(\"No active trajectory\");\n }\n\n const abandoned = abandonTrajectory(active, options.reason);\n await storage.save(abandoned);\n\n console.log(`✓ Trajectory abandoned: ${abandoned.id}`);\n if (options.reason) {\n console.log(` Reason: ${options.reason}`);\n }\n });\n}\n","/**\n * trail compact command\n *\n * Compresses multiple trajectories into a single compacted summary.\n * Useful for reducing context after PR merges by organizing similar\n * decisions into grouped, understandable summaries.\n *\n * Default behavior: compact only trajectories that haven't been compacted yet.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { getCompactionConfig } from \"../../compact/config.js\";\nimport { generateCompactionMarkdown } from \"../../compact/markdown.js\";\nimport {\n type CompactedTrajectoryMetadata,\n type LLMCompactedOutput,\n mergeCompactionWithMetadata,\n parseCompactionResponse,\n} from \"../../compact/parser.js\";\nimport { buildCompactionPrompt } from \"../../compact/prompts.js\";\nimport {\n AnthropicProvider,\n CLIProvider,\n type CompactionLLM,\n type Message,\n OpenAIProvider,\n resolveProvider,\n} from \"../../compact/provider.js\";\nimport { serializeForLLM } from \"../../compact/serializer.js\";\nimport { generateRandomId } from \"../../core/id.js\";\nimport type { Decision, Trajectory } from \"../../core/types.js\";\nimport { FileStorage, getSearchPaths } from \"../../storage/file.js\";\n\n/**\n * A group of related decisions\n */\ninterface DecisionGroup {\n category: string;\n decisions: Array<{\n question: string;\n chosen: string;\n reasoning: string;\n fromTrajectory: string;\n }>;\n}\n\n/**\n * Compacted trajectory summary — extends the shared metadata type from parser.ts\n * with mechanical compaction fields and optional LLM output.\n */\ninterface CompactedTrajectory extends CompactedTrajectoryMetadata {\n decisionGroups: DecisionGroup[];\n keyLearnings: string[];\n keyFindings: string[];\n workflowId?: string;\n narrative?: string;\n decisions?: LLMCompactedOutput[\"decisions\"];\n conventions?: LLMCompactedOutput[\"conventions\"];\n lessons?: LLMCompactedOutput[\"lessons\"];\n openQuestions?: string[];\n}\n\n/**\n * Index entry with compaction tracking\n */\ninterface IndexEntry {\n title: string;\n status: string;\n startedAt: string;\n completedAt?: string;\n path: string;\n compactedInto?: string;\n}\n\ninterface CompactCommandOptions {\n since?: string;\n until?: string;\n ids?: string;\n workflow?: string;\n pr?: string;\n branch?: string;\n commits?: string;\n all?: boolean;\n llm?: boolean;\n mechanical?: boolean;\n focus?: string;\n markdown?: boolean;\n dryRun?: boolean;\n output?: string;\n}\n\ninterface LLMCompactionPlan {\n messages: Message[];\n estimatedInputTokens: number;\n estimatedOutputTokens: number;\n focusAreas: string[];\n}\n\nexport function registerCompactCommand(program: Command): void {\n program\n .command(\"compact\")\n .description(\n \"Compact trajectories into a summarized form (default: uncompacted only)\",\n )\n .option(\n \"--since <date>\",\n \"Include trajectories since this date (ISO format or relative like '7d')\",\n )\n .option(\n \"--until <date>\",\n \"Include trajectories until this date (ISO format)\",\n )\n .option(\"--ids <ids>\", \"Comma-separated list of trajectory IDs to compact\")\n .option(\n \"--workflow <id>\",\n \"Compact trajectories with the specified workflow ID\",\n )\n .option(\"--pr <number>\", \"Compact trajectories associated with a PR number\")\n .option(\n \"--branch <name>\",\n \"Compact trajectories with commits not in the specified branch (e.g., main)\",\n )\n .option(\n \"--commits <shas>\",\n \"Comma-separated commit SHAs to match trajectories against\",\n )\n .option(\"--all\", \"Include all trajectories, even previously compacted ones\")\n .option(\"--llm\", \"Use LLM-based compaction when a provider is available\")\n .option(\"--no-llm\", \"Disable LLM-based compaction\")\n .option(\"--mechanical\", \"Force the original mechanical compaction flow\")\n .option(\n \"--focus <areas>\",\n \"Comma-separated focus areas to emphasize in LLM compaction\",\n )\n .option(\"--markdown\", \"Also write a Markdown companion file\")\n .option(\"--no-markdown\", \"Skip writing a Markdown companion file\")\n .option(\"--dry-run\", \"Preview what would be compacted without saving\")\n .option(\"--output <path>\", \"Output path for compacted trajectory\")\n .action(async (options: CompactCommandOptions) => {\n const trajectories = await loadTrajectories(options);\n\n if (trajectories.length === 0) {\n if (\n options.all ||\n options.since ||\n options.ids ||\n options.workflow ||\n options.pr ||\n options.branch ||\n options.commits\n ) {\n console.log(\"No trajectories found matching criteria\");\n } else {\n console.log(\n \"No uncompacted trajectories found. Use --all to include previously compacted.\",\n );\n }\n return;\n }\n\n console.log(`Compacting ${trajectories.length} trajectories...\\n`);\n\n const config = getCompactionConfig();\n const provider = await resolveProvider(config);\n const useLLM = shouldUseLLM(options, provider !== null);\n const markdownEnabled = options.markdown !== false;\n const mechanicalCompacted = compactTrajectories(\n trajectories,\n options.workflow,\n );\n\n if (!useLLM || provider === null) {\n if (options.llm && provider === null && !options.mechanical) {\n console.log(\n \"No LLM provider detected; falling back to mechanical compaction.\\n\",\n );\n }\n\n if (options.dryRun) {\n console.log(\"=== DRY RUN - Preview ===\\n\");\n printCompactedSummary(mechanicalCompacted);\n return;\n }\n\n const outputPath =\n options.output ||\n getDefaultOutputPath(mechanicalCompacted, options.workflow);\n saveCompactionArtifacts(\n mechanicalCompacted,\n outputPath,\n markdownEnabled,\n );\n await markTrajectoriesAsCompacted(trajectories, mechanicalCompacted.id);\n\n console.log(`\\nCompacted trajectory saved to: ${outputPath}`);\n if (markdownEnabled) {\n console.log(\n `Markdown summary saved to: ${getMarkdownOutputPath(outputPath)}`,\n );\n }\n printCompactedSummary(mechanicalCompacted);\n return;\n }\n\n const llmPlan = buildLLMCompactionPlan(\n trajectories,\n parseFocusAreas(options.focus),\n config.maxInputTokens,\n config.maxOutputTokens,\n );\n\n console.log(\n `Using ${getProviderLabel(provider)} compaction${config.model ? ` with model ${config.model}` : \"\"}.`,\n );\n console.log(\n `Estimated: ~${llmPlan.estimatedInputTokens} input tokens, ~${llmPlan.estimatedOutputTokens} output tokens`,\n );\n\n if (options.dryRun) {\n printLLMDryRun(llmPlan, config.model, options.workflow);\n return;\n }\n\n const llmOutput = await provider.complete(llmPlan.messages, {\n maxTokens: config.maxOutputTokens,\n temperature: config.temperature,\n jsonMode: provider instanceof OpenAIProvider,\n });\n const llmCompacted = parseCompactionResponse(llmOutput);\n const mergedCompaction = mergeCompactionWithMetadata(\n {\n id: mechanicalCompacted.id,\n version: mechanicalCompacted.version,\n type: mechanicalCompacted.type,\n compactedAt: mechanicalCompacted.compactedAt,\n sourceTrajectories: mechanicalCompacted.sourceTrajectories,\n dateRange: mechanicalCompacted.dateRange,\n summary: mechanicalCompacted.summary,\n filesAffected: mechanicalCompacted.filesAffected,\n commits: mechanicalCompacted.commits,\n },\n llmCompacted,\n );\n const compacted: CompactedTrajectory = {\n ...mechanicalCompacted,\n ...mergedCompaction,\n };\n\n const outputPath =\n options.output || getDefaultOutputPath(compacted, options.workflow);\n saveCompactionArtifacts(compacted, outputPath, markdownEnabled);\n await markTrajectoriesAsCompacted(trajectories, compacted.id);\n\n console.log(`\\nCompacted trajectory saved to: ${outputPath}`);\n if (markdownEnabled) {\n console.log(\n `Markdown summary saved to: ${getMarkdownOutputPath(outputPath)}`,\n );\n }\n printCompactedSummary(compacted);\n });\n}\n\nasync function loadTrajectories(options: {\n since?: string;\n until?: string;\n ids?: string;\n workflow?: string;\n pr?: string;\n branch?: string;\n commits?: string;\n all?: boolean;\n}): Promise<Trajectory[]> {\n const trajectories: Trajectory[] = [];\n const targetIds = options.ids\n ? options.ids.split(\",\").map((s) => s.trim())\n : null;\n\n // Parse date filters\n const sinceDate = options.since ? parseRelativeDate(options.since) : null;\n const untilDate = options.until ? new Date(options.until) : null;\n\n // Get commits on current branch not in target branch\n const branchCommits = options.branch\n ? getBranchCommits(options.branch)\n : null;\n\n // Parse --commits into a set with both full and short forms\n const targetCommits = options.commits\n ? new Set(\n options.commits.split(\",\").flatMap((sha) => {\n const trimmed = sha.trim();\n if (!trimmed) return [];\n return [trimmed, trimmed.slice(0, 7)];\n }),\n )\n : null;\n\n // Get compaction state from index\n const compactedIds = options.all\n ? new Set<string>()\n : getCompactedTrajectoryIds();\n\n const searchPaths = getSearchPaths();\n const seenIds = new Set<string>();\n\n for (const searchPath of searchPaths) {\n if (!existsSync(searchPath)) continue;\n\n // Set env var only for the synchronous FileStorage constructor, then\n // immediately restore to avoid leaking state across async boundaries.\n const originalDataDir = process.env.TRAJECTORIES_DATA_DIR;\n process.env.TRAJECTORIES_DATA_DIR = searchPath;\n const storage = new FileStorage();\n if (originalDataDir !== undefined) {\n process.env.TRAJECTORIES_DATA_DIR = originalDataDir;\n } else {\n // biome-ignore lint/performance/noDelete: process.env requires delete to truly unset (assignment stores string \"undefined\")\n delete process.env.TRAJECTORIES_DATA_DIR;\n }\n\n await storage.initialize();\n\n const summaries = await storage.list({\n status: \"completed\",\n limit: Number.MAX_SAFE_INTEGER,\n });\n\n for (const summary of summaries) {\n if (seenIds.has(summary.id)) continue;\n\n // Skip already compacted (unless --all)\n if (compactedIds.has(summary.id)) continue;\n\n // Filter by IDs if specified\n if (targetIds && !targetIds.includes(summary.id)) continue;\n\n // Filter by date range\n const startDate = new Date(summary.startedAt);\n if (sinceDate && startDate < sinceDate) continue;\n if (untilDate && startDate > untilDate) continue;\n\n // Load full trajectory\n const trajectory = await storage.get(summary.id);\n if (trajectory) {\n seenIds.add(summary.id);\n\n // Filter by workflow if specified\n if (options.workflow && trajectory.workflowId !== options.workflow) {\n continue;\n }\n\n // Filter by PR if specified\n if (options.pr) {\n const escaped = options.pr.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n // Match \"#N\" or \"PR #N\" / \"PR N\" patterns, requiring word boundaries\n // to avoid false matches on words containing \"pr\" (e.g., \"Improve\")\n const prPattern = new RegExp(\n `#${escaped}\\\\b|\\\\bPR\\\\s*#?\\\\s*${escaped}\\\\b`,\n \"i\",\n );\n const matchesPR =\n prPattern.test(trajectory.task.title) ||\n prPattern.test(trajectory.task.description || \"\") ||\n trajectory.commits.some((c) => prPattern.test(c));\n\n if (!matchesPR) continue;\n }\n\n // Filter by branch if specified\n if (branchCommits) {\n const hasMatchingCommit = trajectory.commits.some(\n (c) => branchCommits.has(c.slice(0, 7)) || branchCommits.has(c),\n );\n if (!hasMatchingCommit && trajectory.commits.length > 0) continue;\n // Include trajectories with no commits (they might still be relevant)\n }\n\n // Filter by commits if specified\n if (targetCommits) {\n const hasMatchingCommit = trajectory.commits.some(\n (c) => targetCommits.has(c) || targetCommits.has(c.slice(0, 7)),\n );\n if (!hasMatchingCommit) continue;\n }\n\n trajectories.push(trajectory);\n }\n }\n }\n\n return trajectories;\n}\n\n/**\n * Get commits that are on the current branch but not in the target branch\n */\nfunction getBranchCommits(targetBranch: string): Set<string> {\n const commits = new Set<string>();\n\n try {\n // Get commits on HEAD that are not in target branch\n const output = execFileSync(\n \"git\",\n [\"log\", `${targetBranch}..HEAD`, \"--format=%H\"],\n {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n\n for (const line of output.trim().split(\"\\n\")) {\n if (line) {\n commits.add(line);\n commits.add(line.slice(0, 7)); // Also add short hash\n }\n }\n } catch {\n // Not in a git repo or branch doesn't exist\n console.warn(\n `Warning: Could not get commits for branch comparison with ${targetBranch}`,\n );\n }\n\n return commits;\n}\n\n/**\n * Get IDs of trajectories that have already been compacted\n */\nfunction getCompactedTrajectoryIds(): Set<string> {\n const compacted = new Set<string>();\n const searchPaths = getSearchPaths();\n\n for (const searchPath of searchPaths) {\n const indexPath = join(searchPath, \"index.json\");\n if (!existsSync(indexPath)) continue;\n\n try {\n const indexContent = readFileSync(indexPath, \"utf-8\");\n const index = JSON.parse(indexContent) as {\n trajectories: Record<string, IndexEntry>;\n };\n\n for (const [id, entry] of Object.entries(index.trajectories || {})) {\n if (entry.compactedInto) {\n compacted.add(id);\n }\n }\n } catch {\n // Index doesn't exist or is malformed\n }\n }\n\n return compacted;\n}\n\n/**\n * Mark trajectories as having been compacted into a specific compaction\n */\nasync function markTrajectoriesAsCompacted(\n trajectories: Trajectory[],\n compactedIntoId: string,\n): Promise<void> {\n const searchPaths = getSearchPaths();\n\n for (const searchPath of searchPaths) {\n const indexPath = join(searchPath, \"index.json\");\n if (!existsSync(indexPath)) continue;\n\n try {\n const indexContent = readFileSync(indexPath, \"utf-8\");\n const index = JSON.parse(indexContent) as {\n version: number;\n lastUpdated: string;\n trajectories: Record<string, IndexEntry>;\n };\n\n let updated = false;\n for (const traj of trajectories) {\n if (index.trajectories[traj.id]) {\n index.trajectories[traj.id].compactedInto = compactedIntoId;\n updated = true;\n }\n }\n\n if (updated) {\n index.lastUpdated = new Date().toISOString();\n writeFileSync(indexPath, JSON.stringify(index, null, 2));\n }\n } catch {\n // Index doesn't exist or is malformed\n }\n }\n}\n\nfunction parseRelativeDate(input: string): Date {\n // Handle relative dates like \"7d\", \"2w\", \"1m\"\n const match = input.match(/^(\\d+)([dwmh])$/);\n if (match) {\n const amount = Number.parseInt(match[1], 10);\n const unit = match[2];\n const now = new Date();\n\n switch (unit) {\n case \"h\":\n return new Date(now.getTime() - amount * 60 * 60 * 1000);\n case \"d\":\n return new Date(now.getTime() - amount * 24 * 60 * 60 * 1000);\n case \"w\":\n return new Date(now.getTime() - amount * 7 * 24 * 60 * 60 * 1000);\n case \"m\":\n return new Date(now.getTime() - amount * 30 * 24 * 60 * 60 * 1000);\n }\n }\n\n // Otherwise try to parse as ISO date\n return new Date(input);\n}\n\nfunction compactTrajectories(\n trajectories: Trajectory[],\n workflowId?: string,\n): CompactedTrajectory {\n const allDecisions: Array<{\n decision: Decision;\n fromTrajectory: string;\n timestamp: number;\n }> = [];\n const allLearnings: string[] = [];\n const allFindings: string[] = [];\n const allFiles = new Set<string>();\n const allCommits = new Set<string>();\n const allAgents = new Set<string>();\n let totalEvents = 0;\n\n // Extract data from all trajectories\n for (const traj of trajectories) {\n // Collect agents\n for (const agent of traj.agents) {\n allAgents.add(agent.name);\n }\n\n // Collect files and commits\n for (const file of traj.filesChanged) {\n allFiles.add(file);\n }\n for (const commit of traj.commits) {\n allCommits.add(commit);\n }\n\n // Extract decisions from chapters\n for (const chapter of traj.chapters) {\n totalEvents += chapter.events.length;\n\n for (const event of chapter.events) {\n if (event.type === \"decision\" && event.raw) {\n const decision = event.raw as Decision;\n allDecisions.push({\n decision,\n fromTrajectory: traj.id,\n timestamp: event.ts,\n });\n }\n\n if (event.type === \"finding\" && event.content) {\n allFindings.push(event.content);\n }\n }\n }\n\n // Extract learnings from retrospective\n if (traj.retrospective?.learnings) {\n allLearnings.push(...traj.retrospective.learnings);\n }\n\n // Also extract decisions from retrospective\n if (traj.retrospective?.decisions) {\n for (const decision of traj.retrospective.decisions) {\n allDecisions.push({\n decision,\n fromTrajectory: traj.id,\n timestamp: new Date(traj.completedAt || traj.startedAt).getTime(),\n });\n }\n }\n }\n\n // Group decisions by category/topic\n const decisionGroups = groupDecisions(allDecisions);\n\n // Dedupe learnings\n const uniqueLearnings = [...new Set(allLearnings)];\n\n // Calculate date range\n const dates = trajectories.map((t) => new Date(t.startedAt).getTime());\n const minDate = new Date(Math.min(...dates));\n const maxDate = new Date(\n Math.max(\n ...trajectories.map((t) =>\n new Date(t.completedAt || t.startedAt).getTime(),\n ),\n ),\n );\n\n return {\n id: `compact_${generateRandomId()}`,\n version: 1,\n type: \"compacted\",\n compactedAt: new Date().toISOString(),\n workflowId,\n sourceTrajectories: trajectories.map((t) => t.id),\n dateRange: {\n start: minDate.toISOString(),\n end: maxDate.toISOString(),\n },\n summary: {\n totalDecisions: allDecisions.length,\n totalEvents,\n uniqueAgents: [...allAgents],\n },\n decisionGroups,\n keyLearnings: uniqueLearnings,\n keyFindings: [...new Set(allFindings)],\n filesAffected: [...allFiles],\n commits: [...allCommits],\n };\n}\n\nfunction groupDecisions(\n decisions: Array<{\n decision: Decision;\n fromTrajectory: string;\n timestamp: number;\n }>,\n): DecisionGroup[] {\n // Simple categorization based on keywords in the question/reasoning\n const categories: Record<string, DecisionGroup> = {};\n\n const categoryKeywords: Record<string, string[]> = {\n architecture: [\n \"architecture\",\n \"structure\",\n \"pattern\",\n \"design\",\n \"module\",\n \"component\",\n ],\n api: [\"api\", \"endpoint\", \"rest\", \"graphql\", \"http\", \"request\", \"response\"],\n database: [\"database\", \"schema\", \"migration\", \"query\", \"sql\", \"model\"],\n testing: [\"test\", \"spec\", \"coverage\", \"assertion\", \"mock\"],\n security: [\n \"security\",\n \"auth\",\n \"permission\",\n \"token\",\n \"credential\",\n \"encrypt\",\n ],\n performance: [\"performance\", \"optimize\", \"cache\", \"speed\", \"memory\"],\n tooling: [\"tool\", \"config\", \"build\", \"lint\", \"format\", \"ci\", \"cd\"],\n naming: [\"name\", \"rename\", \"convention\", \"format\"],\n compliance: [\"spec\", \"standard\", \"compliance\", \"convention\", \"align\"],\n };\n\n for (const { decision, fromTrajectory } of decisions) {\n const text = `${decision.question} ${decision.reasoning}`.toLowerCase();\n\n let matchedCategory = \"other\";\n for (const [category, keywords] of Object.entries(categoryKeywords)) {\n if (keywords.some((kw) => text.includes(kw))) {\n matchedCategory = category;\n break;\n }\n }\n\n if (!categories[matchedCategory]) {\n categories[matchedCategory] = {\n category: matchedCategory,\n decisions: [],\n };\n }\n\n categories[matchedCategory].decisions.push({\n question: decision.question,\n chosen: decision.chosen,\n reasoning: decision.reasoning,\n fromTrajectory,\n });\n }\n\n // Sort categories by number of decisions\n return Object.values(categories).sort(\n (a, b) => b.decisions.length - a.decisions.length,\n );\n}\n\nfunction shouldUseLLM(\n options: Pick<CompactCommandOptions, \"llm\" | \"mechanical\">,\n providerAvailable: boolean,\n): boolean {\n if (options.mechanical) {\n return false;\n }\n\n if (options.llm === false) {\n return false;\n }\n\n if (options.llm === true) {\n return providerAvailable;\n }\n\n return providerAvailable;\n}\n\nfunction buildLLMCompactionPlan(\n trajectories: Trajectory[],\n focusAreas: string[],\n maxInputTokens: number,\n maxOutputTokens: number,\n): LLMCompactionPlan {\n const serialized = serializeForLLM(trajectories, maxInputTokens);\n const messages = buildCompactionPrompt(serialized, {\n focusAreas,\n maxOutputTokens,\n });\n\n return {\n messages,\n estimatedInputTokens: estimateTokens(\n messages.map((message) => message.content).join(\"\\n\\n\"),\n ),\n estimatedOutputTokens: maxOutputTokens,\n focusAreas,\n };\n}\n\nfunction parseFocusAreas(focus?: string): string[] {\n if (!focus) {\n return [];\n }\n\n return focus\n .split(\",\")\n .map((area) => area.trim())\n .filter(Boolean);\n}\n\nfunction estimateTokens(text: string): number {\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nfunction printLLMDryRun(\n plan: LLMCompactionPlan,\n model: string | undefined,\n workflowId?: string,\n): void {\n console.log(\"=== DRY RUN - LLM Prompt Preview ===\\n\");\n console.log(\n `Estimated: ~${plan.estimatedInputTokens} input tokens, ~${plan.estimatedOutputTokens} output tokens`,\n );\n if (model) {\n console.log(`Configured model: ${model}`);\n }\n if (workflowId) {\n console.log(`Workflow: ${workflowId}`);\n }\n if (plan.focusAreas.length > 0) {\n console.log(`Focus: ${plan.focusAreas.join(\", \")}`);\n }\n console.log(\"\");\n\n for (const message of plan.messages) {\n console.log(`[${message.role.toUpperCase()}]`);\n console.log(message.content);\n console.log(\"\");\n }\n}\n\nfunction getProviderLabel(provider: CompactionLLM): string {\n if (provider instanceof OpenAIProvider) {\n return \"OpenAI\";\n }\n\n if (provider instanceof AnthropicProvider) {\n return \"Anthropic\";\n }\n\n if (provider instanceof CLIProvider) {\n return `CLI (${provider.cliName})`;\n }\n\n return \"LLM\";\n}\n\nfunction getDefaultOutputPath(\n compacted: CompactedTrajectory,\n workflowId?: string,\n): string {\n const trajDir = process.env.TRAJECTORIES_DATA_DIR || \".trajectories\";\n const compactedDir = join(trajDir, \"compacted\");\n\n if (!existsSync(compactedDir)) {\n mkdirSync(compactedDir, { recursive: true });\n }\n\n if (workflowId) {\n return join(compactedDir, `workflow-${workflowId}.json`);\n }\n\n const dateStr = new Date().toISOString().slice(0, 10);\n return join(compactedDir, `${compacted.id}_${dateStr}.json`);\n}\n\nfunction saveCompactionArtifacts(\n compacted: CompactedTrajectory,\n outputPath: string,\n markdownEnabled: boolean,\n): void {\n const dir = dirname(outputPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(outputPath, JSON.stringify(compacted, null, 2));\n\n if (markdownEnabled) {\n writeFileSync(\n getMarkdownOutputPath(outputPath),\n renderCompactionMarkdown(compacted),\n );\n }\n}\n\nfunction getMarkdownOutputPath(outputPath: string): string {\n return outputPath.endsWith(\".json\")\n ? outputPath.slice(0, -\".json\".length).concat(\".md\")\n : `${outputPath}.md`;\n}\n\nfunction renderCompactionMarkdown(compacted: CompactedTrajectory): string {\n if (compacted.narrative) {\n return generateCompactionMarkdown(\n compacted as Parameters<typeof generateCompactionMarkdown>[0],\n );\n }\n\n const decisionGroups =\n compacted.decisionGroups.length > 0\n ? compacted.decisionGroups\n .map((group) => {\n const decisions =\n group.decisions.length > 0\n ? group.decisions\n .map(\n (decision) =>\n `- ${decision.question} -> ${decision.chosen} (${decision.fromTrajectory})`,\n )\n .join(\"\\n\")\n : \"- None\";\n return `## ${capitalize(group.category)}\\n${decisions}`;\n })\n .join(\"\\n\\n\")\n : \"## Decision Groups\\n- None\";\n const learnings =\n compacted.keyLearnings.length > 0\n ? compacted.keyLearnings.map((learning) => `- ${learning}`).join(\"\\n\")\n : \"- None\";\n const findings =\n compacted.keyFindings.length > 0\n ? compacted.keyFindings.map((finding) => `- ${finding}`).join(\"\\n\")\n : \"- None\";\n\n return [\n `# Trajectory Compaction: ${formatDate(compacted.dateRange.start)} - ${formatDate(compacted.dateRange.end)}`,\n \"\",\n \"## Summary\",\n `- Sessions: ${compacted.sourceTrajectories.length}`,\n ...(compacted.workflowId ? [`- Workflow: ${compacted.workflowId}`] : []),\n `- Decisions: ${compacted.summary.totalDecisions}`,\n `- Events: ${compacted.summary.totalEvents}`,\n `- Agents: ${compacted.summary.uniqueAgents.join(\", \") || \"None\"}`,\n `- Files: ${compacted.filesAffected.length}`,\n `- Commits: ${compacted.commits.length}`,\n \"\",\n decisionGroups,\n \"\",\n \"## Key Learnings\",\n learnings,\n \"\",\n \"## Key Findings\",\n findings,\n ].join(\"\\n\");\n}\n\nfunction printCompactedSummary(compacted: CompactedTrajectory): void {\n console.log(\"=== Compacted Trajectory Summary ===\\n\");\n console.log(`ID: ${compacted.id}`);\n if (compacted.workflowId) {\n console.log(`Workflow: ${compacted.workflowId}`);\n }\n console.log(`Source trajectories: ${compacted.sourceTrajectories.length}`);\n console.log(\n `Date range: ${formatDate(compacted.dateRange.start)} - ${formatDate(compacted.dateRange.end)}`,\n );\n console.log(`Total decisions: ${compacted.summary.totalDecisions}`);\n console.log(`Total events: ${compacted.summary.totalEvents}`);\n console.log(`Agents: ${compacted.summary.uniqueAgents.join(\", \")}`);\n console.log(\"\");\n\n if (compacted.narrative) {\n console.log(\"=== Narrative ===\\n\");\n console.log(compacted.narrative);\n console.log(\"\");\n\n if (compacted.decisions && compacted.decisions.length > 0) {\n console.log(\"=== Key Decisions ===\\n\");\n for (const decision of compacted.decisions.slice(0, 5)) {\n console.log(` - ${decision.question}`);\n console.log(` Chosen: ${decision.chosen}`);\n if (decision.impact) {\n console.log(` Impact: ${decision.impact}`);\n }\n }\n if (compacted.decisions.length > 5) {\n console.log(` ... and ${compacted.decisions.length - 5} more`);\n }\n console.log(\"\");\n }\n\n if (compacted.openQuestions && compacted.openQuestions.length > 0) {\n console.log(\"=== Open Questions ===\\n\");\n for (const question of compacted.openQuestions.slice(0, 5)) {\n console.log(` - ${question}`);\n }\n if (compacted.openQuestions.length > 5) {\n console.log(` ... and ${compacted.openQuestions.length - 5} more`);\n }\n console.log(\"\");\n }\n } else {\n console.log(\"=== Decision Groups ===\\n\");\n for (const group of compacted.decisionGroups) {\n console.log(\n `${capitalize(group.category)} (${group.decisions.length} decisions):`,\n );\n for (const decision of group.decisions.slice(0, 3)) {\n console.log(` - ${decision.question}`);\n console.log(` Chose: ${decision.chosen}`);\n }\n if (group.decisions.length > 3) {\n console.log(` ... and ${group.decisions.length - 3} more`);\n }\n console.log(\"\");\n }\n\n if (compacted.keyLearnings.length > 0) {\n console.log(\"=== Key Learnings ===\\n\");\n for (const learning of compacted.keyLearnings.slice(0, 5)) {\n console.log(` - ${learning}`);\n }\n if (compacted.keyLearnings.length > 5) {\n console.log(` ... and ${compacted.keyLearnings.length - 5} more`);\n }\n console.log(\"\");\n }\n }\n\n if (compacted.filesAffected.length > 0) {\n console.log(`Files affected: ${compacted.filesAffected.length}`);\n }\n if (compacted.commits.length > 0) {\n console.log(`Commits: ${compacted.commits.length}`);\n }\n}\n\nfunction formatDate(isoString: string): string {\n return new Date(isoString).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getSearchPaths } from \"../storage/file.js\";\n\nexport interface CompactionConfig {\n provider: string;\n model: string | undefined;\n maxInputTokens: number;\n maxOutputTokens: number;\n temperature: number;\n}\n\nconst DEFAULT_CONFIG: CompactionConfig = {\n provider: \"auto\",\n model: undefined,\n maxInputTokens: 30000,\n maxOutputTokens: 4000,\n temperature: 0.3,\n};\n\nexport function getCompactionConfig(): CompactionConfig {\n const fileConfig = loadFileConfig();\n\n return {\n provider:\n readStringEnv(\"TRAJECTORIES_LLM_PROVIDER\") ??\n readString(fileConfig.provider) ??\n DEFAULT_CONFIG.provider,\n model:\n readStringEnv(\"TRAJECTORIES_LLM_MODEL\") ??\n readString(fileConfig.model) ??\n DEFAULT_CONFIG.model,\n maxInputTokens:\n readNumberEnv(\"TRAJECTORIES_LLM_MAX_INPUT_TOKENS\") ??\n readNumber(fileConfig.maxInputTokens) ??\n DEFAULT_CONFIG.maxInputTokens,\n maxOutputTokens:\n readNumberEnv(\"TRAJECTORIES_LLM_MAX_OUTPUT_TOKENS\") ??\n readNumber(fileConfig.maxOutputTokens) ??\n DEFAULT_CONFIG.maxOutputTokens,\n temperature:\n readNumberEnv(\"TRAJECTORIES_LLM_TEMPERATURE\") ??\n readNumber(fileConfig.temperature) ??\n DEFAULT_CONFIG.temperature,\n };\n}\n\nfunction loadFileConfig(): Partial<CompactionConfig> {\n const configPath = join(getPrimaryConfigDir(), \"config.json\");\n if (!existsSync(configPath)) {\n return {};\n }\n\n try {\n const raw = JSON.parse(readFileSync(configPath, \"utf-8\")) as unknown;\n if (!isRecord(raw)) {\n return {};\n }\n\n // Merge precedence (last wins): root < compaction < llm\n // e.g. { \"model\": \"x\", \"compaction\": { \"model\": \"y\" }, \"llm\": { \"model\": \"z\" } }\n // results in model = \"z\"\n const merged: Record<string, unknown> = {};\n for (const section of [raw, raw.compaction, raw.llm]) {\n if (!isRecord(section)) {\n continue;\n }\n\n for (const [key, value] of Object.entries(section)) {\n if (key === \"compaction\" || key === \"llm\") {\n continue;\n }\n merged[key] = value;\n }\n }\n\n return {\n provider: readString(merged.provider),\n model: readString(merged.model),\n maxInputTokens: readNumber(merged.maxInputTokens),\n maxOutputTokens: readNumber(merged.maxOutputTokens),\n temperature: readNumber(merged.temperature),\n };\n } catch {\n return {};\n }\n}\n\nfunction getPrimaryConfigDir(): string {\n const searchPaths = getSearchPaths();\n return searchPaths[0] ?? join(process.cwd(), \".trajectories\");\n}\n\nfunction readStringEnv(name: string): string | undefined {\n return readString(process.env[name]);\n}\n\nfunction readNumberEnv(name: string): number | undefined {\n return readNumber(process.env[name]);\n}\n\nfunction readString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n // Treat empty / whitespace-only strings as unset, matching readString's\n // behavior. Otherwise `Number(\"\") === 0` would silently override the\n // default maxInputTokens / maxOutputTokens (nullish coalescing does NOT\n // fall back for 0), truncating serialized trajectories to an empty\n // string or sending max_tokens: 0 to the LLM API.\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import type { CompactedTrajectory, LLMCompactedOutput } from \"./parser.js\";\n\nexport function generateCompactionMarkdown(\n compacted: CompactedTrajectory & LLMCompactedOutput,\n): string {\n const dateRange = `${formatDate(compacted.dateRange.start)} - ${formatDate(compacted.dateRange.end)}`;\n const agents =\n compacted.summary.uniqueAgents.length > 0\n ? compacted.summary.uniqueAgents.join(\", \")\n : \"None\";\n const decisionRows =\n compacted.decisions.length > 0\n ? compacted.decisions\n .map(\n (decision) =>\n `| ${escapeTableCell(decision.question)} | ${escapeTableCell(decision.chosen)} | ${escapeTableCell(decision.impact)} |`,\n )\n .join(\"\\n\")\n : \"| None identified | | |\";\n const conventions =\n compacted.conventions.length > 0\n ? compacted.conventions\n .map(\n (convention) =>\n `- **${convention.pattern || \"Unnamed pattern\"}**: ${convention.rationale || \"No rationale captured.\"} (scope: ${convention.scope || \"unspecified\"})`,\n )\n .join(\"\\n\")\n : \"- None established.\";\n const lessons =\n compacted.lessons.length > 0\n ? compacted.lessons\n .map((lesson) => {\n const context = lesson.context ? ` (${lesson.context})` : \"\";\n const recommendation = lesson.recommendation\n ? ` - ${lesson.recommendation}`\n : \"\";\n return `- ${lesson.lesson}${context}${recommendation}`;\n })\n .join(\"\\n\")\n : \"- None captured.\";\n const openQuestions =\n compacted.openQuestions.length > 0\n ? compacted.openQuestions.map((question) => `- ${question}`).join(\"\\n\")\n : \"- None.\";\n\n return [\n `# Trajectory Compaction: ${dateRange}`,\n \"\",\n \"## Summary\",\n compacted.narrative || \"No narrative available.\",\n \"\",\n `## Key Decisions (${compacted.decisions.length})`,\n \"| Question | Decision | Impact |\",\n \"|----------|----------|--------|\",\n decisionRows,\n \"\",\n \"## Conventions Established\",\n conventions,\n \"\",\n \"## Lessons Learned\",\n lessons,\n \"\",\n \"## Open Questions\",\n openQuestions,\n \"\",\n \"## Stats\",\n `- Sessions: ${compacted.sourceTrajectories.length}, Agents: ${agents}, Files: ${compacted.filesAffected.length}, Commits: ${compacted.commits.length}`,\n `- Date range: ${compacted.dateRange.start} - ${compacted.dateRange.end}`,\n ].join(\"\\n\");\n}\n\nfunction formatDate(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n\n return date.toISOString().slice(0, 10);\n}\n\nfunction escapeTableCell(value: string): string {\n return value.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n}\n","export interface CompactedDecision {\n question: string;\n chosen: string;\n reasoning: string;\n impact: string;\n}\n\nexport interface CompactedConvention {\n pattern: string;\n rationale: string;\n scope: string;\n}\n\nexport interface CompactedLesson {\n lesson: string;\n context: string;\n recommendation: string;\n}\n\nexport interface LLMCompactedOutput {\n narrative: string;\n decisions: CompactedDecision[];\n conventions: CompactedConvention[];\n lessons: CompactedLesson[];\n openQuestions: string[];\n}\n\nexport interface CompactedTrajectoryMetadata {\n id: string;\n version: number;\n type: \"compacted\";\n compactedAt: string;\n sourceTrajectories: string[];\n dateRange: {\n start: string;\n end: string;\n };\n summary: {\n totalDecisions: number;\n totalEvents: number;\n uniqueAgents: string[];\n };\n filesAffected: string[];\n commits: string[];\n}\n\nexport type CompactedTrajectory = CompactedTrajectoryMetadata &\n LLMCompactedOutput;\n\nexport function parseCompactionResponse(llmOutput: string): LLMCompactedOutput {\n const trimmed = llmOutput.trim();\n const parsedJson =\n parseJsonCandidate(trimmed) ??\n parseJsonCandidate(extractFirstMarkdownJsonBlock(trimmed)) ??\n parseJsonCandidate(extractBalancedJsonObject(trimmed));\n\n if (parsedJson) {\n return normalizeCompactionOutput(parsedJson, trimmed);\n }\n\n return normalizeCompactionOutput(extractFromProse(trimmed), trimmed);\n}\n\nexport function mergeCompactionWithMetadata(\n metadata: CompactedTrajectoryMetadata,\n llmOutput: LLMCompactedOutput,\n): CompactedTrajectory {\n return {\n ...metadata,\n ...llmOutput,\n };\n}\n\nfunction parseJsonCandidate(candidate: string | null): unknown | null {\n if (!candidate) {\n return null;\n }\n\n try {\n return JSON.parse(candidate);\n } catch {\n return null;\n }\n}\n\nfunction extractFirstMarkdownJsonBlock(text: string): string | null {\n const match = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n return match ? match[1].trim() : null;\n}\n\nfunction extractBalancedJsonObject(text: string): string | null {\n const start = text.indexOf(\"{\");\n if (start === -1) {\n return null;\n }\n\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let index = start; index < text.length; index += 1) {\n const char = text[index];\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) {\n continue;\n }\n\n if (char === \"{\") {\n depth += 1;\n } else if (char === \"}\") {\n depth -= 1;\n if (depth === 0) {\n return text.slice(start, index + 1);\n }\n }\n }\n\n return null;\n}\n\nfunction extractFromProse(text: string): Partial<LLMCompactedOutput> {\n const sections = splitSections(text);\n const narrativeSection =\n sections.narrative ?? sections.summary ?? leadingNarrative(text);\n\n return {\n narrative: normalizeText(narrativeSection),\n decisions: parseDecisionSection(\n sections[\"key decisions\"] ?? sections.decisions ?? \"\",\n ),\n conventions: parseConventionSection(\n sections[\"conventions established\"] ?? sections.conventions ?? \"\",\n ),\n lessons: parseLessonSection(\n sections[\"lessons learned\"] ?? sections.lessons ?? \"\",\n ),\n openQuestions: parseStringList(\n sections[\"open questions\"] ?? sections.questions ?? \"\",\n ),\n };\n}\n\nfunction splitSections(text: string): Record<string, string> {\n const matches = [...text.matchAll(/^##+\\s+(.+?)\\s*$/gm)];\n const sections: Record<string, string> = {};\n\n for (let index = 0; index < matches.length; index += 1) {\n const current = matches[index];\n const next = matches[index + 1];\n const title = normalizeHeading(current[1]);\n const start =\n current.index === undefined ? 0 : current.index + current[0].length;\n const end = next?.index ?? text.length;\n sections[title] = text.slice(start, end).trim();\n }\n\n return sections;\n}\n\nfunction normalizeHeading(value: string): string {\n return value\n .toLowerCase()\n .replace(/\\(\\d+\\)/g, \"\")\n .replace(/[^a-z0-9\\s]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction leadingNarrative(text: string): string {\n const beforeHeading = text.split(/^##+\\s+/m, 1)[0] ?? \"\";\n const withoutCode = beforeHeading.replace(/```[\\s\\S]*?```/g, \"\").trim();\n return withoutCode;\n}\n\nfunction normalizeCompactionOutput(\n raw: unknown,\n fallbackNarrativeSource: string,\n): LLMCompactedOutput {\n const candidate = isRecord(raw) ? raw : {};\n\n const narrative = normalizeText(\n typeof candidate.narrative === \"string\"\n ? candidate.narrative\n : typeof candidate.summary === \"string\"\n ? candidate.summary\n : typeof candidate.overview === \"string\"\n ? candidate.overview\n : leadingNarrative(fallbackNarrativeSource),\n );\n\n return {\n narrative:\n narrative ||\n normalizeText(fallbackNarrativeSource) ||\n \"No narrative provided.\",\n decisions: normalizeDecisionArray(candidate.decisions),\n conventions: normalizeConventionArray(candidate.conventions),\n lessons: normalizeLessonArray(candidate.lessons),\n openQuestions: normalizeStringArray(\n candidate.openQuestions ??\n candidate.open_questions ??\n candidate.questions,\n ),\n };\n}\n\nfunction normalizeDecisionArray(value: unknown): CompactedDecision[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((entry) => {\n if (typeof entry === \"string\") {\n return {\n question: normalizeText(entry),\n chosen: \"\",\n reasoning: \"\",\n impact: \"\",\n };\n }\n\n if (!isRecord(entry)) {\n return null;\n }\n\n return {\n question: readString(entry, [\"question\", \"prompt\", \"topic\"]),\n chosen: readString(entry, [\"chosen\", \"decision\", \"answer\"]),\n reasoning: readString(entry, [\"reasoning\", \"why\", \"rationale\"]),\n impact: readString(entry, [\"impact\", \"result\", \"outcome\"]),\n };\n })\n .filter((entry): entry is CompactedDecision => {\n return entry !== null && hasContent(Object.values(entry));\n });\n}\n\nfunction normalizeConventionArray(value: unknown): CompactedConvention[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((entry) => {\n if (typeof entry === \"string\") {\n return {\n pattern: normalizeText(entry),\n rationale: \"\",\n scope: \"\",\n };\n }\n\n if (!isRecord(entry)) {\n return null;\n }\n\n return {\n pattern: readString(entry, [\"pattern\", \"rule\", \"convention\"]),\n rationale: readString(entry, [\"rationale\", \"reasoning\", \"why\"]),\n scope: readString(entry, [\"scope\", \"appliesTo\", \"applies_to\"]),\n };\n })\n .filter((entry): entry is CompactedConvention => {\n return entry !== null && hasContent(Object.values(entry));\n });\n}\n\nfunction normalizeLessonArray(value: unknown): CompactedLesson[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((entry) => {\n if (typeof entry === \"string\") {\n return {\n lesson: normalizeText(entry),\n context: \"\",\n recommendation: \"\",\n };\n }\n\n if (!isRecord(entry)) {\n return null;\n }\n\n return {\n lesson: readString(entry, [\"lesson\", \"learning\", \"takeaway\"]),\n context: readString(entry, [\"context\", \"situation\", \"when\"]),\n recommendation: readString(entry, [\n \"recommendation\",\n \"suggestion\",\n \"nextStep\",\n \"next_step\",\n ]),\n };\n })\n .filter((entry): entry is CompactedLesson => {\n return entry !== null && hasContent(Object.values(entry));\n });\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value\n .map((entry) => (typeof entry === \"string\" ? normalizeText(entry) : \"\"))\n .filter(Boolean);\n}\n\nfunction parseDecisionSection(section: string): CompactedDecision[] {\n const tableDecisions = parseMarkdownTable(section).map((row) => ({\n question: row[0] ?? \"\",\n chosen: row[1] ?? \"\",\n reasoning: row[2] ?? \"\",\n impact: row[3] ?? row[2] ?? \"\",\n }));\n\n if (tableDecisions.length > 0) {\n return tableDecisions.filter((entry) => hasContent(Object.values(entry)));\n }\n\n return parseListItems(section)\n .map((item) => {\n const fields = parseFieldMap(item);\n return {\n question:\n fields.question ??\n fields.prompt ??\n fields.topic ??\n fields.title ??\n item,\n chosen: fields.chosen ?? fields.decision ?? fields.answer ?? \"\",\n reasoning: fields.reasoning ?? fields.rationale ?? fields.why ?? \"\",\n impact: fields.impact ?? fields.outcome ?? fields.result ?? \"\",\n };\n })\n .filter((entry) => hasContent(Object.values(entry)));\n}\n\nfunction parseConventionSection(section: string): CompactedConvention[] {\n return parseListItems(section)\n .map((item) => {\n const emphasized = item.match(/^\\*\\*(.+?)\\*\\*:\\s*(.+)$/);\n const scopeMatch = item.match(/\\((?:scope|applies to):\\s*([^)]+)\\)\\s*$/i);\n const withoutScope = scopeMatch\n ? item.slice(0, scopeMatch.index).trim()\n : item;\n\n if (emphasized) {\n return {\n pattern: normalizeText(emphasized[1]),\n rationale: normalizeText(\n withoutScope.replace(/^\\*\\*(.+?)\\*\\*:\\s*/, \"\"),\n ),\n scope: normalizeText(scopeMatch?.[1] ?? \"\"),\n };\n }\n\n const fields = parseFieldMap(item);\n return {\n pattern: fields.pattern ?? fields.convention ?? fields.rule ?? item,\n rationale: fields.rationale ?? fields.reasoning ?? fields.why ?? \"\",\n scope: fields.scope ?? fields.applies ?? \"\",\n };\n })\n .filter((entry) => hasContent(Object.values(entry)));\n}\n\nfunction parseLessonSection(section: string): CompactedLesson[] {\n return parseListItems(section)\n .map((item) => {\n const fields = parseFieldMap(item);\n const dashParts = item.split(/\\s[—-]\\s/, 2);\n\n return {\n lesson:\n fields.lesson ??\n fields.learning ??\n fields.takeaway ??\n dashParts[0] ??\n item,\n context: fields.context ?? \"\",\n recommendation:\n fields.recommendation ??\n fields.suggestion ??\n fields.nextstep ??\n dashParts[1] ??\n \"\",\n };\n })\n .filter((entry) => hasContent(Object.values(entry)));\n}\n\nfunction parseStringList(section: string): string[] {\n return parseListItems(section).map(normalizeText).filter(Boolean);\n}\n\nfunction parseMarkdownTable(section: string): string[][] {\n const lines = section\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.startsWith(\"|\"));\n\n if (lines.length < 2) {\n return [];\n }\n\n return lines\n .slice(1)\n .filter((line) => !/^\\|?\\s*:?-{3,}/.test(line.replace(/\\|/g, \"\")))\n .map((line) =>\n line\n .split(\"|\")\n .slice(1, -1)\n .map((cell) => normalizeText(cell)),\n );\n}\n\nfunction parseListItems(section: string): string[] {\n return section\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => /^[-*] |\\d+\\.\\s/.test(line))\n .map((line) => line.replace(/^[-*]\\s+|\\d+\\.\\s+/, \"\").trim())\n .filter(Boolean);\n}\n\nfunction parseFieldMap(item: string): Record<string, string> {\n const normalized = item.replace(/\\s+\\|\\s+/g, \"; \");\n const segments = normalized.split(/;\\s+/);\n const fields: Record<string, string> = {};\n\n for (const segment of segments) {\n const match = segment.match(/^([A-Za-z ]+):\\s*(.+)$/);\n if (!match) {\n continue;\n }\n\n const key = match[1].toLowerCase().replace(/\\s+/g, \"\");\n fields[key] = normalizeText(match[2]);\n }\n\n return fields;\n}\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string {\n for (const key of keys) {\n const value = record[key];\n if (typeof value === \"string\") {\n return normalizeText(value);\n }\n }\n\n return \"\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction normalizeText(value: string): string {\n return value.replace(/\\r\\n/g, \"\\n\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction hasContent(values: string[]): boolean {\n return values.some((value) => value.trim().length > 0);\n}\n","export interface Message {\n role: \"system\" | \"user\";\n content: string;\n}\n\nexport interface PromptOptions {\n focusAreas?: string[];\n maxOutputTokens?: number;\n}\n\nexport const COMPACTION_SYSTEM_PROMPT = `You are a technical analyst reviewing agent work sessions (trajectories).\nYour job is to produce a concise, insightful summary that captures:\n- What was accomplished and how\n- Key decisions and their reasoning\n- Patterns/conventions established that should be followed in future work\n- Lessons learned from challenges and failures\n- Open questions or unresolved issues\n\nBe specific. Reference actual file paths, function names, and technical details.\nDon't be generic - this summary replaces the raw data.`;\n\nexport const COMPACTED_OUTPUT_SCHEMA = `{\n \"narrative\": \"string\",\n \"decisions\": [\n {\n \"question\": \"string\",\n \"chosen\": \"string\",\n \"reasoning\": \"string\",\n \"impact\": \"string\"\n }\n ],\n \"conventions\": [\n {\n \"pattern\": \"string\",\n \"rationale\": \"string\",\n \"scope\": \"string\"\n }\n ],\n \"lessons\": [\n {\n \"lesson\": \"string\",\n \"context\": \"string\",\n \"recommendation\": \"string\"\n }\n ],\n \"openQuestions\": [\"string\"]\n}`;\n\nexport function buildCompactionPrompt(\n serializedTrajectories: string,\n options: PromptOptions = {},\n): Message[] {\n const focusAreas =\n options.focusAreas && options.focusAreas.length > 0\n ? options.focusAreas.map((area) => `- ${area}`).join(\"\\n\")\n : [\n \"- What work was attempted, completed, or abandoned\",\n \"- Why specific technical decisions were made\",\n \"- Which conventions should carry forward\",\n \"- What broke, what worked, and what should change next time\",\n ].join(\"\\n\");\n\n const maxOutputInstruction = options.maxOutputTokens\n ? `Keep the full response within approximately ${options.maxOutputTokens} tokens while preserving technical specificity.`\n : \"Keep the response concise, dense with signal, and avoid filler.\";\n\n const userPrompt = [\n \"Review the following serialized agent trajectories and return a single JSON object.\",\n \"The JSON must match this schema exactly:\",\n COMPACTED_OUTPUT_SCHEMA,\n \"\",\n \"Requirements:\",\n \"- Output raw JSON only. Do not wrap it in markdown fences.\",\n \"- `narrative` should be 2-3 tight paragraphs.\",\n \"- `decisions`, `conventions`, and `lessons` must always be arrays, even if empty.\",\n \"- Prefer concrete file paths, symbols, commands, and implementation details over generic summaries.\",\n maxOutputInstruction,\n \"\",\n \"Focus areas:\",\n focusAreas,\n \"\",\n \"Serialized trajectories:\",\n serializedTrajectories.trim(),\n ].join(\"\\n\");\n\n return [\n {\n role: \"system\",\n content: COMPACTION_SYSTEM_PROMPT,\n },\n {\n role: \"user\",\n content: userPrompt,\n },\n ];\n}\n","import { execFile, spawn } from \"node:child_process\";\nimport { constants, accessSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CompactionConfig } from \"./config.js\";\n\nconst execFileAsync = promisify(execFile);\n\n// Note: extends prompts.ts Message with additional \"assistant\" role for provider responses\nexport interface Message {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface CompletionOptions {\n maxTokens?: number;\n temperature?: number;\n jsonMode?: boolean;\n}\n\nexport interface CompactionLLM {\n complete(messages: Message[], options?: CompletionOptions): Promise<string>;\n}\n\ninterface ProviderConfig {\n apiKey: string;\n model: string;\n baseUrl: string;\n}\n\ninterface OpenAIChatResponse {\n choices?: Array<{\n message?: {\n content?: string | null;\n };\n }>;\n error?: {\n message?: string;\n };\n}\n\ninterface AnthropicResponse {\n content?: Array<\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: string;\n }\n >;\n error?: {\n message?: string;\n };\n}\n\nexport const DEFAULT_OPENAI_MODEL = \"gpt-4o\";\nexport const DEFAULT_ANTHROPIC_MODEL = \"claude-sonnet-4-20250514\";\nconst DEFAULT_OPENAI_BASE_URL = \"https://api.openai.com\";\nconst DEFAULT_ANTHROPIC_BASE_URL = \"https://api.anthropic.com\";\nconst DEFAULT_MAX_TOKENS = 4096;\n\nexport class OpenAIProvider implements CompactionLLM {\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n\n constructor(config: Partial<ProviderConfig> = {}) {\n this.apiKey =\n config.apiKey?.trim() || process.env.OPENAI_API_KEY?.trim() || \"\";\n this.model =\n normalizeModel(config.model) ??\n normalizeModel(process.env.TRAJECTORIES_LLM_MODEL) ??\n DEFAULT_OPENAI_MODEL;\n this.baseUrl =\n config.baseUrl ?? process.env.OPENAI_BASE_URL ?? DEFAULT_OPENAI_BASE_URL;\n\n if (this.baseUrl !== DEFAULT_OPENAI_BASE_URL) {\n console.warn(\n `[trajectories] OpenAI base URL overridden to: ${this.baseUrl}`,\n );\n }\n\n if (!this.apiKey) {\n throw new Error(\"OPENAI_API_KEY is required for OpenAIProvider\");\n }\n }\n\n async complete(\n messages: Message[],\n options: CompletionOptions = {},\n ): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 300_000);\n try {\n const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: this.model,\n messages,\n max_tokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,\n temperature: options.temperature ?? 0.2,\n response_format: options.jsonMode\n ? { type: \"json_object\" }\n : undefined,\n }),\n signal: controller.signal,\n });\n\n const body = (await parseJson(response)) as OpenAIChatResponse;\n if (!response.ok) {\n throw new Error(\n body.error?.message ??\n `OpenAI request failed with status ${response.status}`,\n );\n }\n\n const content = body.choices?.[0]?.message?.content;\n if (!content) {\n throw new Error(\"OpenAI response did not include completion content\");\n }\n\n return content;\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nexport class AnthropicProvider implements CompactionLLM {\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n\n constructor(config: Partial<ProviderConfig> = {}) {\n this.apiKey =\n config.apiKey?.trim() || process.env.ANTHROPIC_API_KEY?.trim() || \"\";\n this.model =\n normalizeModel(config.model) ??\n normalizeModel(process.env.TRAJECTORIES_LLM_MODEL) ??\n DEFAULT_ANTHROPIC_MODEL;\n this.baseUrl =\n config.baseUrl ??\n process.env.ANTHROPIC_BASE_URL ??\n DEFAULT_ANTHROPIC_BASE_URL;\n\n if (this.baseUrl !== DEFAULT_ANTHROPIC_BASE_URL) {\n console.warn(\n `[trajectories] Anthropic base URL overridden to: ${this.baseUrl}`,\n );\n }\n\n if (!this.apiKey) {\n throw new Error(\"ANTHROPIC_API_KEY is required for AnthropicProvider\");\n }\n }\n\n async complete(\n messages: Message[],\n options: CompletionOptions = {},\n ): Promise<string> {\n const systemMessages = messages\n .filter((message) => message.role === \"system\")\n .map((message) => message.content.trim())\n .filter(Boolean);\n\n const conversation = messages\n .filter((message) => message.role !== \"system\")\n .map((message) => ({\n role: message.role,\n content: message.content,\n }));\n\n if (conversation.length === 0) {\n throw new Error(\"AnthropicProvider requires at least one user message\");\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 300_000);\n try {\n const response = await fetch(`${this.baseUrl}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"anthropic-version\": \"2024-10-22\",\n \"x-api-key\": this.apiKey,\n },\n body: JSON.stringify({\n model: this.model,\n system:\n systemMessages.length > 0 ? systemMessages.join(\"\\n\\n\") : undefined,\n messages: conversation,\n max_tokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,\n temperature: options.temperature ?? 0.2,\n }),\n signal: controller.signal,\n });\n\n const body = (await parseJson(response)) as AnthropicResponse;\n if (!response.ok) {\n throw new Error(\n body.error?.message ??\n `Anthropic request failed with status ${response.status}`,\n );\n }\n\n const textBlocks = (body.content ?? []).filter(\n (\n block,\n ): block is Extract<\n AnthropicResponse[\"content\"],\n Array<unknown>\n >[number] & {\n type: \"text\";\n text: string;\n } =>\n block.type === \"text\" &&\n typeof (block as { text?: unknown }).text === \"string\",\n );\n const content = textBlocks\n .map((block) => block.text)\n .join(\"\\n\")\n .trim();\n\n if (!content) {\n throw new Error(\"Anthropic response did not include text content\");\n }\n\n return content;\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\n/**\n * Kept inline (not imported from @agent-relay/sdk) because that dep was removed in 7e9783c. When agent-relay ships new compaction-capable CLIs, add them here manually.\n */\nconst SUPPORTED_CLIS = [\"claude\", \"codex\", \"gemini\", \"opencode\"] as const;\ntype SupportedCli = (typeof SUPPORTED_CLIS)[number];\n\nexport class CLIProvider implements CompactionLLM {\n private readonly cli: SupportedCli;\n private readonly binaryPath: string;\n\n constructor(cli: SupportedCli, binaryPath: string) {\n this.cli = cli;\n this.binaryPath = binaryPath;\n }\n\n get cliName(): string {\n return this.cli;\n }\n\n async complete(\n messages: Message[],\n _options: CompletionOptions = {},\n ): Promise<string> {\n const prompt = messagesToPrompt(messages);\n const args = buildCliArgs(this.cli);\n\n // Use stdin to avoid OS argument length limits for large prompts\n const output = await spawnWithStdin(this.binaryPath, args, prompt);\n if (!output) {\n throw new Error(`${this.cli} CLI returned empty output`);\n }\n\n return output;\n }\n}\n\nfunction messagesToPrompt(messages: Message[]): string {\n const systemParts: string[] = [];\n const conversationParts: string[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemParts.push(msg.content.trim());\n } else {\n conversationParts.push(msg.content.trim());\n }\n }\n\n const parts: string[] = [];\n if (systemParts.length > 0) {\n parts.push(systemParts.join(\"\\n\\n\"));\n }\n if (conversationParts.length > 0) {\n parts.push(conversationParts.join(\"\\n\\n\"));\n }\n\n return parts.join(\"\\n\\n---\\n\\n\");\n}\n\nfunction buildCliArgs(cli: SupportedCli): string[] {\n switch (cli) {\n case \"claude\":\n return [\"-p\", \"--output-format\", \"text\"];\n case \"codex\":\n return [\"exec\", \"-q\"];\n case \"gemini\":\n return [\"-p\"];\n case \"opencode\":\n return [\"run\", \"--no-color\"];\n }\n}\n\nfunction spawnWithStdin(\n command: string,\n args: string[],\n input: string,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n timeout: 300_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const chunks: Buffer[] = [];\n child.stdout.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n\n let stderr = \"\";\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code !== 0) {\n reject(\n new Error(`CLI exited with code ${code}: ${stderr.slice(0, 200)}`),\n );\n } else {\n resolve(Buffer.concat(chunks).toString().trim());\n }\n });\n\n child.stdin.write(input);\n child.stdin.end();\n });\n}\n\nexport async function resolveProvider(\n config: Partial<CompactionConfig> = {},\n): Promise<CompactionLLM | null> {\n const explicitProvider = (\n config.provider ?? process.env.TRAJECTORIES_LLM_PROVIDER\n )?.toLowerCase();\n const model = normalizeModel(config.model);\n\n if (explicitProvider === \"openai\") {\n return process.env.OPENAI_API_KEY ? new OpenAIProvider({ model }) : null;\n }\n\n if (explicitProvider === \"anthropic\") {\n return process.env.ANTHROPIC_API_KEY\n ? new AnthropicProvider({ model })\n : null;\n }\n\n if (explicitProvider === \"cli\") {\n return resolveCLIProvider();\n }\n\n if (explicitProvider && explicitProvider !== \"auto\") {\n return null;\n }\n\n const cliProvider = await resolveCLIProvider();\n if (cliProvider) {\n return cliProvider;\n }\n\n if (process.env.OPENAI_API_KEY) {\n return new OpenAIProvider({ model });\n }\n\n if (process.env.ANTHROPIC_API_KEY) {\n return new AnthropicProvider({ model });\n }\n\n return null;\n}\n\nconst CLI_SEARCH_PATHS = [\n \"~/.local/bin\",\n \"~/.claude/local\",\n \"/usr/local/bin\",\n \"/opt/homebrew/bin\",\n];\n\nasync function resolveCLIProvider(): Promise<CLIProvider | null> {\n const requestedCli = process.env.TRAJECTORIES_LLM_CLI?.trim().toLowerCase();\n const clisToTry = (() => {\n if (!requestedCli) {\n return SUPPORTED_CLIS;\n }\n\n if ((SUPPORTED_CLIS as readonly string[]).includes(requestedCli)) {\n return [requestedCli as SupportedCli];\n }\n\n console.warn(\n `[trajectories] Unsupported TRAJECTORIES_LLM_CLI value \"${requestedCli}\", falling back to auto-detect`,\n );\n return SUPPORTED_CLIS;\n })();\n\n for (const cli of clisToTry) {\n const path = await findBinary(cli);\n if (path) {\n return new CLIProvider(cli, path);\n }\n }\n\n return null;\n}\n\nasync function findBinary(name: string): Promise<string | undefined> {\n // Try PATH first via `which`\n try {\n const { stdout } = await execFileAsync(\"which\", [name]);\n const path = stdout.trim();\n if (path) return path;\n } catch {\n // not in PATH\n }\n\n // Fall back to well-known install directories\n const home = homedir();\n for (const dir of CLI_SEARCH_PATHS) {\n const expanded = dir.startsWith(\"~/\") ? join(home, dir.slice(2)) : dir;\n const candidate = join(expanded, name);\n try {\n accessSync(candidate, constants.X_OK);\n return candidate;\n } catch {\n // not found here\n }\n }\n\n return undefined;\n}\n\nfunction normalizeModel(value: string | undefined): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nasync function parseJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return {};\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new Error(\n `Invalid JSON response (status ${response.status}, length ${text.length})`,\n );\n }\n}\n","import type {\n Chapter,\n Decision,\n EventSignificance,\n Finding,\n Retrospective,\n Trajectory,\n TrajectoryEvent,\n} from \"../core/types.js\";\n\nconst DEFAULT_MAX_TOKENS = 30000;\nconst CHARS_PER_TOKEN = 4;\nconst INCLUDED_SIGNIFICANCE = new Set<EventSignificance>([\n \"medium\",\n \"high\",\n \"critical\",\n]);\n\ninterface SessionRender {\n header: string;\n agents: string;\n chapters: string[];\n decisions: string;\n findings: string;\n retrospective: string;\n filesAndCommits: string;\n}\n\nexport function serializeForLLM(\n trajectories: Trajectory[],\n maxTokens = DEFAULT_MAX_TOKENS,\n): string {\n const maxChars = Math.max(0, maxTokens * CHARS_PER_TOKEN);\n const sessions = trajectories.map(renderSession);\n\n let document = joinSessions(sessions);\n if (document.length <= maxChars || sessions.length === 0) {\n return document;\n }\n\n const fixedChars = sessions.reduce(\n (total, session) =>\n total +\n session.header.length +\n session.agents.length +\n session.decisions.length +\n session.findings.length +\n session.retrospective.length +\n session.filesAndCommits.length,\n 0,\n );\n const chapterChars = sessions.reduce(\n (total, session) =>\n total +\n session.chapters.reduce((sum, chapter) => sum + chapter.length, 0),\n 0,\n );\n\n const remainingChapterChars = maxChars - fixedChars;\n if (remainingChapterChars <= 0 || chapterChars === 0) {\n return truncateText(document, maxChars);\n }\n\n const ratio = Math.min(1, remainingChapterChars / chapterChars);\n const truncatedSessions = sessions.map((session) => ({\n ...session,\n chapters: truncateChapters(\n session.chapters,\n session.chapters.reduce((sum, chapter) => sum + chapter.length, 0),\n ratio,\n ),\n }));\n\n document = joinSessions(truncatedSessions);\n return document.length <= maxChars\n ? document\n : truncateText(document, maxChars);\n}\n\nfunction renderSession(trajectory: Trajectory): SessionRender {\n const sessionTitle = trajectory.task.title.trim() || trajectory.id;\n const duration = formatDuration(trajectory.startedAt, trajectory.completedAt);\n const header = [\n `## Session: ${sessionTitle} (${trajectory.status}, ${duration})`,\n trajectory.task.description\n ? `Description: ${trajectory.task.description}`\n : \"\",\n `Started: ${trajectory.startedAt}`,\n trajectory.completedAt ? `Completed: ${trajectory.completedAt}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\")\n .concat(\"\\n\");\n\n const agents =\n trajectory.agents.length > 0\n ? `Agents: ${trajectory.agents\n .map((agent) => `${agent.name} (${agent.role})`)\n .join(\", \")}\\n`\n : \"Agents: none recorded\\n\";\n\n const chapters = trajectory.chapters.map(renderChapter);\n const decisions = renderDecisions(trajectory);\n const findings = renderFindings(trajectory);\n const retrospective = renderRetrospective(trajectory.retrospective);\n const filesAndCommits = [\n `Files changed: ${formatList(trajectory.filesChanged)}`,\n `Commits: ${formatList(trajectory.commits)}`,\n ]\n .join(\"\\n\")\n .concat(\"\\n\");\n\n return {\n header,\n agents,\n chapters,\n decisions,\n findings,\n retrospective,\n filesAndCommits,\n };\n}\n\nfunction renderChapter(chapter: Chapter): string {\n const lines = chapter.events\n .filter(shouldIncludeEvent)\n .map((event) => formatEvent(event));\n\n const chapterBody =\n lines.length > 0\n ? lines.map((line) => `- ${line}`).join(\"\\n\")\n : \"- No medium/high/critical events captured\";\n\n return [\n `### Chapter: ${chapter.title}`,\n `Agent: ${chapter.agentName}`,\n `Window: ${chapter.startedAt} -> ${chapter.endedAt ?? \"ongoing\"}`,\n chapterBody,\n ]\n .join(\"\\n\")\n .concat(\"\\n\");\n}\n\nfunction renderDecisions(trajectory: Trajectory): string {\n const seen = new Set<string>();\n const decisions: Decision[] = [];\n\n for (const chapter of trajectory.chapters) {\n for (const event of chapter.events) {\n if (event.type !== \"decision\") {\n continue;\n }\n\n const decision = asDecision(event.raw);\n if (!decision) {\n continue;\n }\n\n const key = `${decision.question}\\n${decision.chosen}\\n${decision.reasoning}`;\n if (!seen.has(key)) {\n seen.add(key);\n decisions.push(decision);\n }\n }\n }\n\n for (const decision of trajectory.retrospective?.decisions ?? []) {\n const key = `${decision.question}\\n${decision.chosen}\\n${decision.reasoning}`;\n if (!seen.has(key)) {\n seen.add(key);\n decisions.push(decision);\n }\n }\n\n if (decisions.length === 0) {\n return \"Decisions:\\n- None recorded\\n\";\n }\n\n return [\n \"Decisions:\",\n ...decisions.map((decision) =>\n [\n `- Question: ${decision.question}`,\n ` Chosen: ${decision.chosen}`,\n ` Reasoning: ${decision.reasoning}`,\n ].join(\"\\n\"),\n ),\n ]\n .join(\"\\n\")\n .concat(\"\\n\");\n}\n\nfunction renderFindings(trajectory: Trajectory): string {\n const findings = trajectory.chapters.flatMap((chapter) =>\n chapter.events\n .filter((event) => event.type === \"finding\")\n .map((event) => asFinding(event.raw, event.content)),\n );\n\n if (findings.length === 0) {\n return \"Findings:\\n- None recorded\\n\";\n }\n\n return [\n \"Findings:\",\n ...findings.map((finding) =>\n [\n `- What: ${finding.what}`,\n ` Where: ${finding.where}`,\n ` Significance: ${finding.significance}`,\n ].join(\"\\n\"),\n ),\n ]\n .join(\"\\n\")\n .concat(\"\\n\");\n}\n\nfunction renderRetrospective(retrospective?: Retrospective): string {\n if (!retrospective) {\n return \"Retrospective:\\n- None recorded\\n\";\n }\n\n const lines = [\n \"Retrospective:\",\n `- Summary: ${retrospective.summary}`,\n ` Approach: ${retrospective.approach}`,\n ];\n\n if (retrospective.challenges && retrospective.challenges.length > 0) {\n lines.push(` Challenges: ${retrospective.challenges.join(\"; \")}`);\n }\n\n if (retrospective.learnings && retrospective.learnings.length > 0) {\n lines.push(` Learnings: ${retrospective.learnings.join(\"; \")}`);\n }\n\n if (retrospective.suggestions && retrospective.suggestions.length > 0) {\n lines.push(` Suggestions: ${retrospective.suggestions.join(\"; \")}`);\n }\n\n if (retrospective.timeSpent) {\n lines.push(` Time spent: ${retrospective.timeSpent}`);\n }\n\n return lines.join(\"\\n\").concat(\"\\n\");\n}\n\nfunction shouldIncludeEvent(event: TrajectoryEvent): boolean {\n if (event.type === \"tool_call\" || event.type === \"tool_result\") {\n return false;\n }\n\n return INCLUDED_SIGNIFICANCE.has(resolveSignificance(event));\n}\n\nfunction resolveSignificance(event: TrajectoryEvent): EventSignificance {\n if (event.significance) {\n return event.significance;\n }\n\n switch (event.type) {\n case \"decision\":\n case \"finding\":\n case \"error\":\n return \"high\";\n case \"reflection\":\n case \"note\":\n case \"message_sent\":\n case \"message_received\":\n return \"medium\";\n default:\n return \"low\";\n }\n}\n\nfunction formatEvent(event: TrajectoryEvent): string {\n if (event.type === \"decision\") {\n const decision = asDecision(event.raw);\n if (decision) {\n return `[decision/${resolveSignificance(event)}] ${decision.question} -> ${decision.chosen}`;\n }\n }\n\n if (event.type === \"finding\") {\n const finding = asFinding(event.raw, event.content);\n return `[finding/${resolveSignificance(event)}] ${finding.what} @ ${finding.where}`;\n }\n\n return `[${event.type}/${resolveSignificance(event)}] ${event.content}`;\n}\n\nfunction asDecision(raw: unknown): Decision | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const candidate = raw as Partial<Decision>;\n if (\n typeof candidate.question !== \"string\" ||\n typeof candidate.chosen !== \"string\" ||\n typeof candidate.reasoning !== \"string\"\n ) {\n return null;\n }\n\n return {\n question: candidate.question,\n chosen: candidate.chosen,\n reasoning: candidate.reasoning,\n alternatives: Array.isArray(candidate.alternatives)\n ? candidate.alternatives\n : [],\n confidence: candidate.confidence,\n };\n}\n\nfunction asFinding(raw: unknown, fallbackContent: string): Finding {\n if (!raw || typeof raw !== \"object\") {\n return {\n what: fallbackContent,\n where: \"unknown\",\n significance: \"Not structured\",\n category: \"other\",\n };\n }\n\n const candidate = raw as Partial<Finding>;\n return {\n what:\n typeof candidate.what === \"string\" && candidate.what.trim().length > 0\n ? candidate.what\n : fallbackContent,\n where:\n typeof candidate.where === \"string\" && candidate.where.trim().length > 0\n ? candidate.where\n : \"unknown\",\n significance:\n typeof candidate.significance === \"string\" &&\n candidate.significance.trim().length > 0\n ? candidate.significance\n : \"Not structured\",\n category: candidate.category ?? \"other\",\n suggestedAction:\n typeof candidate.suggestedAction === \"string\"\n ? candidate.suggestedAction\n : undefined,\n confidence: candidate.confidence,\n };\n}\n\nfunction truncateChapters(\n chapters: string[],\n totalChapterChars: number,\n ratio: number,\n): string[] {\n if (ratio >= 1 || totalChapterChars === 0) {\n return chapters;\n }\n\n let remaining = Math.floor(totalChapterChars * ratio);\n\n return chapters.map((chapter, index) => {\n if (remaining <= 0) {\n return \"### Chapter: Truncated\\n- Omitted due to token budget\\n\";\n }\n\n const proportionalTarget =\n index === chapters.length - 1\n ? remaining\n : Math.floor(chapter.length * ratio);\n const allowance = Math.max(0, Math.min(chapter.length, proportionalTarget));\n remaining -= allowance;\n\n return truncateText(chapter, allowance);\n });\n}\n\nfunction joinSessions(sessions: SessionRender[]): string {\n return sessions\n .map((session) =>\n [\n session.header,\n session.agents,\n ...session.chapters,\n session.decisions,\n session.findings,\n session.retrospective,\n session.filesAndCommits,\n ]\n .filter(Boolean)\n .join(\"\\n\")\n .trim(),\n )\n .join(\"\\n\\n\");\n}\n\nfunction truncateText(text: string, maxChars: number): string {\n if (maxChars <= 0) {\n return \"\";\n }\n\n if (text.length <= maxChars) {\n return text;\n }\n\n if (maxChars <= 16) {\n return text.slice(0, maxChars);\n }\n\n return `${text.slice(0, maxChars - 16).trimEnd()}\\n[truncated]\\n`;\n}\n\nfunction formatList(values: string[]): string {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction formatDuration(startedAt: string, completedAt?: string): string {\n const start = new Date(startedAt).getTime();\n const end = new Date(completedAt ?? startedAt).getTime();\n const elapsedMs = Math.max(0, end - start);\n const minutes = Math.floor(elapsedMs / 60000);\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n\n if (hours > 0 && remainingMinutes > 0) {\n return `${hours}h ${remainingMinutes}m`;\n }\n\n if (hours > 0) {\n return `${hours}h`;\n }\n\n if (minutes > 0) {\n return `${minutes}m`;\n }\n\n return completedAt ? \"0m\" : \"ongoing\";\n}\n","/**\n * trail complete command\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { generateTrace, getGitHead } from \"../../core/trace.js\";\nimport {\n getCommitsBetween,\n getFilesChangedBetween,\n} from \"../../core/trailers.js\";\nimport { completeTrajectory } from \"../../core/trajectory.js\";\nimport type { TraceRecord, Trajectory } from \"../../core/types.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\n/**\n * Save trace file alongside the trajectory\n */\nasync function saveTraceFile(\n trajectory: Trajectory,\n trace: TraceRecord,\n): Promise<void> {\n // Determine trajectory file location based on status\n const dataDir = process.env.TRAJECTORIES_DATA_DIR;\n const baseDir = dataDir ? dataDir : join(process.cwd(), \".trajectories\");\n const completedDir = join(baseDir, \"completed\");\n\n const date = new Date(trajectory.completedAt ?? trajectory.startedAt);\n const monthDir = join(\n completedDir,\n `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`,\n );\n\n // Ensure directory exists\n if (!existsSync(monthDir)) {\n await mkdir(monthDir, { recursive: true });\n }\n\n // Save trace file with .trace.json extension\n const tracePath = join(monthDir, `${trajectory.id}.trace.json`);\n await writeFile(tracePath, JSON.stringify(trace, null, 2), \"utf-8\");\n}\n\nexport function registerCompleteCommand(program: Command): void {\n program\n .command(\"complete\")\n .description(\"Complete the active trajectory with retrospective\")\n .option(\"--summary <text>\", \"Summary of what was accomplished\")\n .option(\"--approach <text>\", \"How the work was approached\")\n .option(\"--confidence <number>\", \"Confidence level 0-1\", Number.parseFloat)\n .action(async (options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n console.error('Start one with: trail start \"Task description\"');\n throw new Error(\"No active trajectory\");\n }\n\n // Require summary and confidence\n if (!options.summary) {\n console.error(\"Error: --summary is required\");\n throw new Error(\"Summary required\");\n }\n\n const confidence = options.confidence ?? 0.8;\n if (confidence < 0 || confidence > 1) {\n console.error(\"Error: --confidence must be between 0 and 1\");\n throw new Error(\"Invalid confidence\");\n }\n\n let completed = completeTrajectory(active, {\n summary: options.summary,\n approach: options.approach || \"Standard approach\",\n confidence,\n });\n\n // Generate trace if we have a start reference\n let trace: TraceRecord | null = null;\n if (active._trace?.startRef) {\n trace = generateTrace(completed, active._trace.startRef);\n if (trace) {\n // Update trajectory with final trace reference\n const endRef = getGitHead();\n completed = {\n ...completed,\n _trace: {\n ...completed._trace,\n startRef: active._trace.startRef,\n endRef: endRef ?? undefined,\n traceId: trace.id,\n },\n };\n }\n }\n\n // Populate commits and filesChanged from git history\n if (active._trace?.startRef) {\n const commits = getCommitsBetween(active._trace.startRef);\n const filesChanged = getFilesChangedBetween(active._trace.startRef);\n\n if (commits.length > 0 || filesChanged.length > 0) {\n completed = {\n ...completed,\n commits: commits.map((c) => c.hash),\n filesChanged,\n };\n }\n }\n\n await storage.save(completed);\n\n // Save trace file alongside trajectory if generated\n if (trace) {\n await saveTraceFile(completed, trace);\n }\n\n console.log(`✓ Trajectory completed: ${completed.id}`);\n console.log(` Summary: ${options.summary}`);\n console.log(` Confidence: ${Math.round(confidence * 100)}%`);\n if (completed.commits.length > 0) {\n console.log(` Commits: ${completed.commits.length}`);\n }\n if (completed.filesChanged.length > 0) {\n console.log(` Files changed: ${completed.filesChanged.length}`);\n }\n if (trace) {\n console.log(` Trace: ${trace.id} (${trace.files.length} files)`);\n }\n });\n}\n","/**\n * Agent Trace generation logic\n *\n * Captures git state before and after agent work to generate\n * trace records that attribute code contributions to agents.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport type {\n TraceFile,\n TraceRange,\n TraceRecord,\n Trajectory,\n TrajectoryTraceRef,\n} from \"./types.js\";\n\n/**\n * Validate a git reference to prevent command injection\n * @param ref - Git reference to validate\n * @returns True if the ref is safe to use in git commands\n */\nexport function isValidGitRef(ref: string): boolean {\n // Allow HEAD, branch names, and commit hashes\n // Git refs can contain alphanumeric, -, _, /, and .\n // Commit hashes are 7-40 hex characters\n const validRefPattern = /^[a-zA-Z0-9_\\-./]+$/;\n const commitHashPattern = /^[a-fA-F0-9]{7,40}$/;\n\n if (ref === \"HEAD\" || ref === \"working\") {\n return true;\n }\n\n if (commitHashPattern.test(ref)) {\n return true;\n }\n\n // For branch names, ensure no shell metacharacters\n if (validRefPattern.test(ref) && ref.length <= 255) {\n // Additional check: no consecutive dots (prevents .. traversal tricks)\n if (!ref.includes(\"..\") || ref.split(\"..\").every((p) => p.length > 0)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Check if the current directory is inside a git repository\n * @returns True if in a git repo, false otherwise\n */\nexport function isGitRepo(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the current git HEAD reference\n * @returns The current HEAD commit hash, or null if not in a git repo\n */\nexport function getGitHead(): string | null {\n if (!isGitRepo()) {\n return null;\n }\n\n try {\n const head = execSync(\"git rev-parse HEAD\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return head;\n } catch {\n return null;\n }\n}\n\n/**\n * Capture the current git state for trace tracking\n * @returns The start reference (commit hash) or null if not in git repo\n */\nexport function captureGitState(): string | null {\n return getGitHead();\n}\n\n/**\n * Parse git diff output to extract changed files and line ranges\n * @param diffOutput - Raw git diff output\n * @returns Array of file paths with their changed line ranges\n */\nfunction parseDiffOutput(\n diffOutput: string,\n): Array<{ path: string; ranges: TraceRange[] }> {\n const files: Array<{ path: string; ranges: TraceRange[] }> = [];\n const lines = diffOutput.split(\"\\n\");\n\n let currentFile: string | null = null;\n let currentRanges: TraceRange[] = [];\n\n for (const line of lines) {\n // Match diff header for file path\n // Format: diff --git a/path/to/file b/path/to/file\n const diffHeaderMatch = line.match(/^diff --git a\\/.+ b\\/(.+)$/);\n if (diffHeaderMatch) {\n // Save previous file if exists\n if (currentFile) {\n files.push({ path: currentFile, ranges: currentRanges });\n }\n currentFile = diffHeaderMatch[1];\n currentRanges = [];\n continue;\n }\n\n // Match hunk header for line ranges\n // Format: @@ -start,count +start,count @@ optional context\n const hunkMatch = line.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,(\\d+))? @@/);\n if (hunkMatch && currentFile) {\n const startLine = Number.parseInt(hunkMatch[1], 10);\n const lineCount = hunkMatch[2] ? Number.parseInt(hunkMatch[2], 10) : 1;\n\n if (lineCount > 0) {\n currentRanges.push({\n start_line: startLine,\n end_line: startLine + lineCount - 1,\n });\n }\n }\n }\n\n // Don't forget the last file\n if (currentFile) {\n files.push({ path: currentFile, ranges: currentRanges });\n }\n\n return files;\n}\n\n/**\n * Get the list of changed files between two git refs\n * @param startRef - Starting commit reference\n * @param endRef - Ending commit reference (defaults to HEAD)\n * @returns Array of changed file paths with line ranges\n */\nexport function getChangedFiles(\n startRef: string,\n endRef = \"HEAD\",\n): Array<{ path: string; ranges: TraceRange[] }> {\n if (!isGitRepo()) {\n return [];\n }\n\n // Validate git refs to prevent command injection\n if (!isValidGitRef(startRef) || !isValidGitRef(endRef)) {\n return [];\n }\n\n try {\n const diffOutput = execSync(`git diff ${startRef}..${endRef}`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large diffs\n });\n\n return parseDiffOutput(diffOutput);\n } catch {\n return [];\n }\n}\n\n/**\n * Detect the model from environment variables\n * Returns model ID using models.dev convention (org/model-name)\n * @returns Model identifier or 'unknown'\n */\nexport function detectModel(): string {\n // Check custom env var first (pass through as-is if already org/model format)\n if (process.env.TRAIL_TRACE_MODEL) {\n return process.env.TRAIL_TRACE_MODEL;\n }\n\n // Check Anthropic model env var - normalize to models.dev convention\n if (process.env.ANTHROPIC_MODEL) {\n const model = process.env.ANTHROPIC_MODEL;\n return model.includes(\"/\") ? model : `anthropic/${model}`;\n }\n\n // Check common AI provider model env vars - normalize to models.dev convention\n if (process.env.OPENAI_MODEL) {\n const model = process.env.OPENAI_MODEL;\n return model.includes(\"/\") ? model : `openai/${model}`;\n }\n\n return \"unknown\";\n}\n\n/**\n * Generate a unique trace ID using UUID v4\n * Follows agent-trace.dev spec which requires UUID format\n * @returns UUID v4 string\n */\nexport function generateTraceId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Compute content hash for a given string\n * @param content - Content to hash\n * @returns SHA-256 hash (first 16 chars)\n */\nexport function computeContentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Generate a trace record from a trajectory and git state\n * @param trajectory - The trajectory to generate trace for\n * @param startRef - The git ref from when work started\n * @returns TraceRecord with file contributions, or null if not in git repo\n */\nexport function generateTrace(\n trajectory: Trajectory,\n startRef: string,\n): TraceRecord | null {\n if (!isGitRepo()) {\n return null;\n }\n\n const endRef = getGitHead();\n if (!endRef) {\n return null;\n }\n\n // Get changed files with line ranges\n const changedFiles = getChangedFiles(startRef, endRef);\n\n // Return null if no files changed\n if (changedFiles.length === 0) {\n return null;\n }\n\n // Detect the model used\n const model = detectModel();\n\n // Build trace files\n const traceFiles: TraceFile[] = changedFiles.map(({ path, ranges }) => ({\n path,\n conversations: [\n {\n contributor: {\n type: \"ai\",\n ...(model !== \"unknown\" ? { model_id: model } : {}),\n },\n ranges: ranges.map((range) => ({\n ...range,\n revision: endRef,\n })),\n },\n ],\n }));\n\n return {\n version: \"1.0.0\",\n id: generateTraceId(),\n timestamp: new Date().toISOString(),\n trajectory: trajectory.id,\n files: traceFiles,\n };\n}\n\n/**\n * Migrate a legacy trace record to the current spec format.\n * Handles records written before agent-trace 0.1.0 compliance:\n * - version: 1 (number) → \"1.0.0\" (semver string)\n * - contributor.type: \"agent\" → \"ai\"\n * - contributor.model → contributor.model_id (omitted if \"unknown\")\n *\n * The trace ID (trace_xxx format) is intentionally left unchanged\n * to preserve the reference stored in the parent trajectory's _trace.traceId.\n *\n * @returns { record, migrated } — migrated=true means the caller should persist the updated record\n */\nexport function migrateTraceRecord(raw: unknown): {\n record: TraceRecord;\n migrated: boolean;\n} {\n const data = raw as Record<string, unknown>;\n let migrated = false;\n\n // Migrate version: number → semver string\n if (typeof data.version === \"number\") {\n data.version = \"1.0.0\";\n migrated = true;\n }\n\n // Migrate contributor fields in each file's conversations\n if (Array.isArray(data.files)) {\n for (const file of data.files as Array<Record<string, unknown>>) {\n if (Array.isArray(file.conversations)) {\n for (const conv of file.conversations as Array<\n Record<string, unknown>\n >) {\n const contributor = conv.contributor as Record<string, unknown>;\n if (!contributor) continue;\n\n // Migrate type: \"agent\" → \"ai\"\n if (contributor.type === \"agent\") {\n contributor.type = \"ai\";\n migrated = true;\n }\n\n // Migrate model → model_id, drop if \"unknown\"\n if (\"model\" in contributor) {\n const modelValue = contributor.model;\n contributor.model = undefined;\n if (modelValue && modelValue !== \"unknown\") {\n contributor.model_id = modelValue;\n }\n migrated = true;\n }\n }\n }\n }\n }\n\n return { record: data as unknown as TraceRecord, migrated };\n}\n\n/**\n * Create a trace reference for embedding in a trajectory\n * @param startRef - Git ref when trace started\n * @param traceId - Optional ID of the generated trace record\n * @returns TrajectoryTraceRef object\n */\nexport function createTraceRef(\n startRef: string,\n traceId?: string,\n): TrajectoryTraceRef {\n const endRef = getGitHead();\n\n return {\n startRef,\n endRef: endRef ?? undefined,\n traceId,\n };\n}\n","/**\n * Git trailer utilities for linking commits to trajectories\n *\n * Appends structured metadata to commit messages using git's trailer convention:\n * Trajectory: traj_xxxxxxxxxxxx\n *\n * This creates a bidirectional link: trajectories reference commits,\n * and commits reference trajectories.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { isGitRepo, isValidGitRef } from \"./trace.js\";\n\n/** Trailer key for trajectory ID */\nexport const TRAJECTORY_TRAILER_KEY = \"Trajectory\";\n\n/**\n * Format a trajectory trailer for appending to a commit message\n * @param trajectoryId - The trajectory ID to link\n * @returns Formatted trailer string (e.g., \"Trajectory: traj_abc123\")\n */\nexport function formatTrailer(trajectoryId: string): string {\n return `${TRAJECTORY_TRAILER_KEY}: ${trajectoryId}`;\n}\n\n/**\n * Parse trajectory ID from a commit message's trailers\n * @param commitMessage - Full commit message text\n * @returns The trajectory ID if found, null otherwise\n */\nexport function parseTrajectoryFromMessage(\n commitMessage: string,\n): string | null {\n const lines = commitMessage.split(\"\\n\");\n for (const line of lines) {\n // Character class must include `_` to match legacy\n // `traj_<timestamp>_<hex>` ids produced by the workforce workflow runner\n // in addition to the canonical `traj_<12hex>` shape. This must stay in\n // sync with the regex in src/core/schema.ts and src/core/id.ts.\n const match = line.match(\n new RegExp(`^${TRAJECTORY_TRAILER_KEY}:\\\\s*(traj_[a-z0-9_]+)$`),\n );\n if (match) {\n return match[1];\n }\n }\n return null;\n}\n\n/**\n * Get the trajectory ID linked to a specific commit\n * @param commitHash - Git commit hash\n * @returns The trajectory ID if found, null otherwise\n */\nexport function getTrajectoryFromCommit(commitHash: string): string | null {\n if (!isGitRepo() || !isValidGitRef(commitHash)) {\n return null;\n }\n\n try {\n const message = execSync(`git log -1 --format=%B ${commitHash}`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return parseTrajectoryFromMessage(message);\n } catch {\n return null;\n }\n}\n\n/**\n * Commit info returned by getCommitsBetween\n */\nexport interface CommitInfo {\n /** Short commit hash */\n hash: string;\n /** Full commit hash */\n fullHash: string;\n /** Commit subject line */\n subject: string;\n /** Commit author */\n author: string;\n /** Commit timestamp (ISO) */\n date: string;\n}\n\n/**\n * Get all commits between two git refs\n * @param startRef - Starting commit (exclusive)\n * @param endRef - Ending commit (inclusive, defaults to HEAD)\n * @returns Array of commit info objects\n */\nexport function getCommitsBetween(\n startRef: string,\n endRef = \"HEAD\",\n): CommitInfo[] {\n if (!isGitRepo()) {\n return [];\n }\n\n if (!isValidGitRef(startRef) || !isValidGitRef(endRef)) {\n return [];\n }\n\n try {\n const output = execSync(\n `git log --format=%H%n%h%n%s%n%an%n%aI%n--- ${startRef}..${endRef}`,\n {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n\n if (!output.trim()) {\n return [];\n }\n\n const commits: CommitInfo[] = [];\n const entries = output.trim().split(\"\\n---\\n\");\n\n for (const entry of entries) {\n const lines = entry.trim().split(\"\\n\");\n if (lines.length >= 5) {\n commits.push({\n fullHash: lines[0],\n hash: lines[1],\n subject: lines[2],\n author: lines[3],\n date: lines[4],\n });\n }\n }\n\n return commits;\n } catch {\n return [];\n }\n}\n\n/**\n * Get file paths changed between two git refs\n * @param startRef - Starting commit (exclusive)\n * @param endRef - Ending commit (inclusive, defaults to HEAD)\n * @returns Array of changed file paths\n */\nexport function getFilesChangedBetween(\n startRef: string,\n endRef = \"HEAD\",\n): string[] {\n if (!isGitRepo()) {\n return [];\n }\n\n if (!isValidGitRef(startRef) || !isValidGitRef(endRef)) {\n return [];\n }\n\n try {\n const output = execSync(`git diff --name-only ${startRef}..${endRef}`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n return output.trim().split(\"\\n\").filter(Boolean);\n } catch {\n return [];\n }\n}\n\n/**\n * Generate the content of a prepare-commit-msg hook script\n * that appends trajectory trailers to commits\n */\nexport function generateHookScript(): string {\n return `#!/bin/sh\n# Added by agent-trajectories - appends Trajectory trailer to commits\n# This hook reads the active trajectory and links it to your commit.\n\nCOMMIT_MSG_FILE=\"$1\"\nCOMMIT_SOURCE=\"$2\"\n\n# Skip for merge, squash, and amend commits\nif [ \"$COMMIT_SOURCE\" = \"merge\" ] || [ \"$COMMIT_SOURCE\" = \"squash\" ] || [ \"$COMMIT_SOURCE\" = \"commit\" ]; then\n exit 0\nfi\n\n# Find the trajectories data directory\nTRAJ_DIR=\"\\${TRAJECTORIES_DATA_DIR:-\\$(git rev-parse --show-toplevel)/.trajectories}\"\nACTIVE_DIR=\"$TRAJ_DIR/active\"\n\n# Check if there's an active trajectory\nif [ ! -d \"$ACTIVE_DIR\" ]; then\n exit 0\nfi\n\n# Find the most recent active trajectory file\nACTIVE_FILE=$(ls -t \"$ACTIVE_DIR\"/*.json 2>/dev/null | head -1)\nif [ -z \"$ACTIVE_FILE\" ]; then\n exit 0\nfi\n\n# Extract trajectory ID (grep for the \"id\" field). Character class must\n# include underscore to match legacy traj_<timestamp>_<hex> ids -- without\n# it, grep -o silently truncates at the first internal underscore and\n# emits a wrong (shorter) id into the commit trailer.\nTRAJ_ID=$(grep -o '\"id\"[[:space:]]*:[[:space:]]*\"traj_[a-z0-9_]*\"' \"$ACTIVE_FILE\" | head -1 | grep -o 'traj_[a-z0-9_]*')\nif [ -z \"$TRAJ_ID\" ]; then\n exit 0\nfi\n\n# Check if trailer already exists in the message\nif grep -q \"^Trajectory: \" \"$COMMIT_MSG_FILE\" 2>/dev/null; then\n exit 0\nfi\n\n# Append the trailer with a blank line separator\necho \"\" >> \"$COMMIT_MSG_FILE\"\necho \"Trajectory: $TRAJ_ID\" >> \"$COMMIT_MSG_FILE\"\n`;\n}\n\n/**\n * Check if a prepare-commit-msg hook already exists and contains our marker\n * @returns 'none' if no hook exists, 'ours' if our hook, 'other' if different hook\n */\nexport function detectExistingHook(): \"none\" | \"ours\" | \"other\" {\n if (!isGitRepo()) {\n return \"none\";\n }\n\n try {\n const hooksDir = execSync(\"git rev-parse --git-dir\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n\n const hookPath = `${hooksDir}/hooks/prepare-commit-msg`;\n\n try {\n const content = readFileSync(hookPath, \"utf-8\");\n\n if (content.includes(\"agent-trajectories\")) {\n return \"ours\";\n }\n return \"other\";\n } catch {\n return \"none\";\n }\n } catch {\n return \"none\";\n }\n}\n","/**\n * trail decision command\n */\n\nimport type { Command } from \"commander\";\nimport { addDecision } from \"../../core/trajectory.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerDecisionCommand(program: Command): void {\n program\n .command(\"decision <choice>\")\n .description(\"Record a decision\")\n .option(\n \"-r, --reasoning <text>\",\n \"Why this choice was made (optional for minor decisions)\",\n )\n .option(\n \"-a, --alternatives <items>\",\n \"Comma-separated alternatives considered\",\n )\n .action(async (choice: string, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n console.error('Start one with: trail start \"Task description\"');\n throw new Error(\"No active trajectory\");\n }\n\n const alternatives = options.alternatives\n ? options.alternatives\n .split(\",\")\n .map((s: string) => ({ option: s.trim(), reason: \"\" }))\n : [];\n\n const reasoning = options.reasoning || \"\";\n\n const updated = addDecision(active, {\n question: choice,\n chosen: choice,\n alternatives,\n reasoning,\n });\n\n await storage.save(updated);\n\n console.log(`✓ Decision recorded: ${choice}`);\n if (reasoning) {\n console.log(` Reasoning: ${reasoning}`);\n }\n if (alternatives.length > 0) {\n const altStrings = alternatives.map(\n (a: { option: string }) => a.option,\n );\n console.log(` Alternatives: ${altStrings.join(\", \")}`);\n }\n });\n}\n","/**\n * trail enable / trail disable commands\n *\n * Installs or removes a prepare-commit-msg git hook that automatically\n * appends Trajectory trailers to commit messages.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { chmod, mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { isGitRepo } from \"../../core/trace.js\";\nimport { detectExistingHook, generateHookScript } from \"../../core/trailers.js\";\n\n/**\n * Resolve the git hooks directory path\n */\nfunction getHooksDir(): string | null {\n try {\n const gitDir = execSync(\"git rev-parse --git-dir\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return join(gitDir, \"hooks\");\n } catch {\n return null;\n }\n}\n\nexport function registerEnableCommand(program: Command): void {\n program\n .command(\"enable\")\n .description(\n \"Install git hook to automatically link commits to trajectories\",\n )\n .option(\"--force\", \"Overwrite existing prepare-commit-msg hook\")\n .action(async (options) => {\n if (!isGitRepo()) {\n console.error(\"Error: Not inside a git repository\");\n throw new Error(\"Not a git repository\");\n }\n\n const hooksDir = getHooksDir();\n if (!hooksDir) {\n console.error(\"Error: Could not determine git hooks directory\");\n throw new Error(\"Cannot find hooks directory\");\n }\n\n const hookPath = join(hooksDir, \"prepare-commit-msg\");\n const existing = detectExistingHook();\n\n if (existing === \"other\" && !options.force) {\n console.error(\"Error: A prepare-commit-msg hook already exists\");\n console.error(\n \"Use --force to overwrite, or manually add the trailer logic\",\n );\n throw new Error(\"Hook already exists\");\n }\n\n if (existing === \"ours\") {\n console.log(\"Trajectory hook is already installed\");\n return;\n }\n\n // Ensure hooks directory exists\n if (!existsSync(hooksDir)) {\n await mkdir(hooksDir, { recursive: true });\n }\n\n // Write the hook script\n const hookContent = generateHookScript();\n await writeFile(hookPath, hookContent, \"utf-8\");\n await chmod(hookPath, 0o755);\n\n console.log(\"Trajectory hook installed\");\n console.log(` Hook: ${hookPath}`);\n console.log(\n \" Commits will now include a Trajectory trailer when a trajectory is active\",\n );\n });\n\n program\n .command(\"disable\")\n .description(\"Remove the trajectory git hook\")\n .action(async () => {\n if (!isGitRepo()) {\n console.error(\"Error: Not inside a git repository\");\n throw new Error(\"Not a git repository\");\n }\n\n const hooksDir = getHooksDir();\n if (!hooksDir) {\n console.error(\"Error: Could not determine git hooks directory\");\n throw new Error(\"Cannot find hooks directory\");\n }\n\n const hookPath = join(hooksDir, \"prepare-commit-msg\");\n const existing = detectExistingHook();\n\n if (existing === \"none\") {\n console.log(\"No trajectory hook installed\");\n return;\n }\n\n if (existing === \"other\") {\n console.error(\n \"Error: The prepare-commit-msg hook was not installed by agent-trajectories\",\n );\n console.error(\"Remove it manually if needed\");\n throw new Error(\"Hook not ours\");\n }\n\n // Read the hook to confirm it's ours, then remove it\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(hookPath);\n\n console.log(\"Trajectory hook removed\");\n });\n}\n","/**\n * trail export command\n */\n\nimport { exec } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { exportToJSON } from \"../../export/json.js\";\nimport { exportToMarkdown } from \"../../export/markdown.js\";\nimport { exportToTimeline } from \"../../export/timeline.js\";\nimport { FileStorage } from \"../../storage/file.js\";\nimport { generateTrajectoryHtml } from \"../../web/generator.js\";\n\nexport function registerExportCommand(program: Command): void {\n program\n .command(\"export [id]\")\n .description(\"Export a trajectory\")\n .option(\n \"-f, --format <format>\",\n \"Export format (md, json, timeline, html)\",\n \"md\",\n )\n .option(\"-o, --output <path>\", \"Output file path\")\n .option(\"--open\", \"Open in browser (html format only)\")\n .action(async (id: string | undefined, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n // If no ID provided, use active trajectory\n let trajectory;\n if (id) {\n trajectory = await storage.get(id);\n if (!trajectory) {\n console.error(`Error: Trajectory not found: ${id}`);\n throw new Error(\"Trajectory not found\");\n }\n } else {\n trajectory = await storage.getActive();\n if (!trajectory) {\n console.error(\"Error: No active trajectory and no ID provided\");\n console.error(\n \"Usage: trail export <id> or trail export (with active trajectory)\",\n );\n throw new Error(\"No trajectory specified\");\n }\n }\n\n let output: string;\n\n switch (options.format) {\n case \"json\":\n output = exportToJSON(trajectory);\n break;\n case \"timeline\":\n output = exportToTimeline(trajectory);\n break;\n case \"html\":\n output = generateTrajectoryHtml(trajectory);\n break;\n default:\n output = exportToMarkdown(trajectory);\n break;\n }\n\n if (options.output) {\n await writeFile(options.output, output, \"utf-8\");\n console.log(`✓ Exported to ${options.output}`);\n\n if (options.open && options.format === \"html\") {\n openInBrowser(options.output);\n }\n } else if (options.open && options.format === \"html\") {\n // Write to temp location and open\n const outputDir = join(process.cwd(), \".trajectories\", \"html\");\n await mkdir(outputDir, { recursive: true });\n const filePath = join(outputDir, `${trajectory.id}.html`);\n await writeFile(filePath, output, \"utf-8\");\n console.log(`✓ Generated: ${filePath}`);\n openInBrowser(filePath);\n } else {\n console.log(output);\n }\n });\n}\n\nfunction openInBrowser(path: string): void {\n const platform = process.platform;\n let command: string;\n\n if (platform === \"darwin\") {\n command = `open \"${path}\"`;\n } else if (platform === \"win32\") {\n command = `start \"\" \"${path}\"`;\n } else {\n command = `xdg-open \"${path}\"`;\n }\n\n exec(command, (error) => {\n if (error) {\n console.log(`Open manually: file://${path}`);\n }\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","/**\n * Embedded CSS styles for trajectory viewer\n */\n\nexport const styles = `\n:root {\n --bg: #ffffff;\n --bg-secondary: #f8f9fa;\n --text: #1a1a2e;\n --text-muted: #6c757d;\n --border: #e9ecef;\n --accent: #4f46e5;\n --accent-light: #eef2ff;\n --success: #10b981;\n --warning: #f59e0b;\n --error: #ef4444;\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n --bg: #1a1a2e;\n --bg-secondary: #16213e;\n --text: #e9ecef;\n --text-muted: #adb5bd;\n --border: #2d3748;\n --accent: #818cf8;\n --accent-light: #1e1b4b;\n }\n}\n\n* {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: var(--bg);\n color: var(--text);\n line-height: 1.6;\n padding: 2rem;\n max-width: 900px;\n margin: 0 auto;\n}\n\nh1, h2, h3 {\n margin-bottom: 0.5rem;\n}\n\nh1 {\n font-size: 1.75rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\nh2 {\n font-size: 1.25rem;\n color: var(--text-muted);\n border-bottom: 1px solid var(--border);\n padding-bottom: 0.5rem;\n margin-top: 1.5rem;\n}\n\n.header {\n border-bottom: 2px solid var(--border);\n padding-bottom: 1rem;\n margin-bottom: 1.5rem;\n}\n\n.meta {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 1rem;\n margin: 1rem 0;\n padding: 1rem;\n background: var(--bg-secondary);\n border-radius: 8px;\n}\n\n.meta-item {\n display: flex;\n flex-direction: column;\n}\n\n.meta-label {\n font-size: 0.75rem;\n text-transform: uppercase;\n color: var(--text-muted);\n letter-spacing: 0.05em;\n}\n\n.meta-value {\n font-weight: 500;\n}\n\n.status {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.status-active {\n background: var(--accent-light);\n color: var(--accent);\n}\n\n.status-completed {\n background: #d1fae5;\n color: #065f46;\n}\n\n.status-abandoned {\n background: #fee2e2;\n color: #991b1b;\n}\n\n.section {\n margin: 1.5rem 0;\n}\n\n.collapsible {\n cursor: pointer;\n user-select: none;\n}\n\n.collapsible::before {\n content: '▸ ';\n display: inline-block;\n transition: transform 0.2s;\n}\n\n.collapsible.open::before {\n transform: rotate(90deg);\n}\n\n.collapsible-content {\n display: none;\n margin-top: 0.5rem;\n padding-left: 1rem;\n border-left: 2px solid var(--border);\n}\n\n.collapsible.open + .collapsible-content {\n display: block;\n}\n\n.decision {\n background: var(--bg-secondary);\n border-radius: 8px;\n padding: 1rem;\n margin: 0.75rem 0;\n border-left: 3px solid var(--accent);\n}\n\n.decision-title {\n font-weight: 600;\n margin-bottom: 0.5rem;\n}\n\n.decision-reasoning {\n color: var(--text-muted);\n font-size: 0.9rem;\n}\n\n.alternatives {\n margin-top: 0.5rem;\n font-size: 0.85rem;\n}\n\n.alternatives-label {\n color: var(--text-muted);\n}\n\n.timeline {\n position: relative;\n padding-left: 1.5rem;\n}\n\n.timeline::before {\n content: '';\n position: absolute;\n left: 0.35rem;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--border);\n}\n\n.timeline-item {\n position: relative;\n margin: 1rem 0;\n padding-left: 1rem;\n}\n\n.timeline-item::before {\n content: '';\n position: absolute;\n left: -1.15rem;\n top: 0.5rem;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--accent);\n border: 2px solid var(--bg);\n}\n\n.timeline-item.decision::before {\n background: var(--warning);\n}\n\n.timeline-item.chapter::before {\n background: var(--success);\n}\n\n.timeline-time {\n font-size: 0.75rem;\n color: var(--text-muted);\n}\n\n.timeline-content {\n margin-top: 0.25rem;\n}\n\n.chapter {\n background: var(--bg-secondary);\n border-radius: 8px;\n padding: 1rem;\n margin: 1rem 0;\n}\n\n.chapter-title {\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.chapter-agent {\n font-size: 0.85rem;\n color: var(--text-muted);\n}\n\n.retrospective {\n background: linear-gradient(135deg, var(--accent-light), var(--bg-secondary));\n border-radius: 8px;\n padding: 1.5rem;\n margin: 1.5rem 0;\n}\n\n.retrospective h3 {\n margin-bottom: 1rem;\n}\n\n.confidence {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin: 0.5rem 0;\n}\n\n.confidence-bar {\n flex: 1;\n height: 8px;\n background: var(--border);\n border-radius: 4px;\n overflow: hidden;\n max-width: 200px;\n}\n\n.confidence-fill {\n height: 100%;\n background: var(--accent);\n transition: width 0.3s;\n}\n\n.list {\n list-style: none;\n}\n\n.list li {\n padding: 0.25rem 0;\n padding-left: 1rem;\n position: relative;\n}\n\n.list li::before {\n content: '•';\n position: absolute;\n left: 0;\n color: var(--accent);\n}\n\n.files-changed {\n font-family: monospace;\n font-size: 0.85rem;\n background: var(--bg-secondary);\n padding: 0.75rem;\n border-radius: 4px;\n margin: 0.5rem 0;\n}\n\n.empty {\n color: var(--text-muted);\n font-style: italic;\n}\n\n/* Index page styles */\n.trajectory-list {\n list-style: none;\n}\n\n.trajectory-card {\n display: block;\n padding: 1rem;\n margin: 0.5rem 0;\n background: var(--bg-secondary);\n border-radius: 8px;\n text-decoration: none;\n color: var(--text);\n border: 1px solid var(--border);\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n\n.trajectory-card:hover {\n border-color: var(--accent);\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n}\n\n.trajectory-card-title {\n font-weight: 600;\n margin-bottom: 0.25rem;\n}\n\n.trajectory-card-meta {\n font-size: 0.85rem;\n color: var(--text-muted);\n display: flex;\n gap: 1rem;\n}\n\n.group-header {\n font-size: 0.85rem;\n text-transform: uppercase;\n color: var(--text-muted);\n letter-spacing: 0.05em;\n margin-top: 1.5rem;\n margin-bottom: 0.5rem;\n}\n`;\n","/**\n * Static HTML generator for trajectory viewing\n */\n\nimport type {\n Chapter,\n Decision,\n Trajectory,\n TrajectoryEvent,\n} from \"../core/types.js\";\nimport { styles } from \"./styles.js\";\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction formatDate(isoDate: string): string {\n const date = new Date(isoDate);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction formatDuration(startDate: string, endDate?: string): string {\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : Date.now();\n const ms = end - start;\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ${hours % 24}h`;\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m`;\n return `${seconds}s`;\n}\n\nfunction getStatusClass(status: string): string {\n switch (status) {\n case \"active\":\n return \"status-active\";\n case \"completed\":\n return \"status-completed\";\n case \"abandoned\":\n return \"status-abandoned\";\n default:\n return \"\";\n }\n}\n\nfunction renderDecision(decision: Decision): string {\n const alternatives = decision.alternatives?.length\n ? `<div class=\"alternatives\">\n <span class=\"alternatives-label\">Considered:</span>\n ${decision.alternatives.map((a) => escapeHtml(typeof a === \"string\" ? a : a.option)).join(\", \")}\n </div>`\n : \"\";\n\n return `\n <div class=\"decision\">\n <div class=\"decision-title\">${escapeHtml(decision.question)}: ${escapeHtml(decision.chosen)}</div>\n <div class=\"decision-reasoning\">${escapeHtml(decision.reasoning)}</div>\n ${alternatives}\n </div>\n `;\n}\n\nfunction renderEvent(event: TrajectoryEvent): string {\n const time = formatDate(new Date(event.ts).toISOString());\n let content = \"\";\n let typeClass = \"\";\n const rawData = event.raw as Record<string, unknown> | undefined;\n\n switch (event.type) {\n case \"decision\":\n typeClass = \"decision\";\n content = `\n <strong>Decision:</strong> ${escapeHtml(event.content)}\n ${rawData?.reasoning ? `<div class=\"decision-reasoning\">${escapeHtml(String(rawData.reasoning))}</div>` : \"\"}\n `;\n break;\n case \"thinking\":\n content = `<strong>Thinking:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"prompt\":\n content = `<strong>Prompt:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"tool_call\":\n content = `<strong>Tool:</strong> <code>${escapeHtml(event.content)}</code>`;\n break;\n case \"tool_result\":\n content = `<strong>Result:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"message_sent\":\n content = `<strong>Sent:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"message_received\":\n content = `<strong>Received:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"error\":\n content = `<strong style=\"color: var(--error)\">Error:</strong> ${escapeHtml(event.content)}`;\n break;\n case \"note\":\n content = escapeHtml(event.content);\n break;\n default:\n content = escapeHtml(event.content);\n }\n\n return `\n <div class=\"timeline-item ${typeClass}\">\n <div class=\"timeline-time\">${time}</div>\n <div class=\"timeline-content\">${content}</div>\n </div>\n `;\n}\n\nfunction renderChapter(chapter: Chapter, index: number): string {\n const events = chapter.events.map(renderEvent).join(\"\");\n\n return `\n <div class=\"chapter\">\n <div class=\"chapter-title\">\n Chapter ${index + 1}: ${escapeHtml(chapter.title)}\n </div>\n <div class=\"chapter-agent\">Agent: ${escapeHtml(chapter.agentName)}</div>\n ${\n chapter.events.length > 0\n ? `\n <h3 class=\"collapsible\" onclick=\"this.classList.toggle('open')\">Events (${chapter.events.length})</h3>\n <div class=\"collapsible-content\">\n <div class=\"timeline\">${events}</div>\n </div>\n `\n : \"\"\n }\n </div>\n `;\n}\n\nfunction renderRetrospective(trajectory: Trajectory): string {\n if (!trajectory.retrospective) {\n return \"\";\n }\n\n const retro = trajectory.retrospective;\n const confidencePercent = Math.round(retro.confidence * 100);\n\n const approach = retro.approach\n ? `<div><strong>Approach:</strong><p>${escapeHtml(retro.approach)}</p></div>`\n : \"\";\n\n const learnings = retro.learnings?.length\n ? `<div><strong>Learnings:</strong><ul class=\"list\">${retro.learnings.map((l) => `<li>${escapeHtml(l)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n const challenges = retro.challenges?.length\n ? `<div><strong>Challenges:</strong><ul class=\"list\">${retro.challenges.map((c) => `<li>${escapeHtml(c)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n const suggestions = retro.suggestions?.length\n ? `<div><strong>Suggestions:</strong><ul class=\"list\">${retro.suggestions.map((s) => `<li>${escapeHtml(s)}</li>`).join(\"\")}</ul></div>`\n : \"\";\n\n return `\n <div class=\"retrospective\">\n <h3>📝 Retrospective</h3>\n <p>${escapeHtml(retro.summary)}</p>\n\n <div class=\"confidence\">\n <span>Confidence:</span>\n <div class=\"confidence-bar\">\n <div class=\"confidence-fill\" style=\"width: ${confidencePercent}%\"></div>\n </div>\n <span>${confidencePercent}%</span>\n </div>\n\n ${approach}\n ${learnings}\n ${challenges}\n ${suggestions}\n </div>\n `;\n}\n\nexport function generateTrajectoryHtml(trajectory: Trajectory): string {\n const statusClass = getStatusClass(trajectory.status);\n const duration = formatDuration(trajectory.startedAt, trajectory.completedAt);\n\n // Extract all decisions from chapters\n const decisions: Decision[] = trajectory.chapters.flatMap((ch) =>\n ch.events\n .filter((e) => e.type === \"decision\" && e.raw)\n .map((e) => e.raw as Decision)\n .filter(\n (d): d is Decision => d !== undefined && typeof d.question === \"string\",\n ),\n );\n\n const decisionsHtml = decisions.length\n ? `\n <h2 class=\"collapsible open\" onclick=\"this.classList.toggle('open')\">\n Key Decisions (${decisions.length})\n </h2>\n <div class=\"collapsible-content\">\n ${decisions.map(renderDecision).join(\"\")}\n </div>\n `\n : \"\";\n\n const chaptersHtml = trajectory.chapters.length\n ? `\n <h2 class=\"collapsible open\" onclick=\"this.classList.toggle('open')\">\n Chapters (${trajectory.chapters.length})\n </h2>\n <div class=\"collapsible-content\">\n ${trajectory.chapters.map(renderChapter).join(\"\")}\n </div>\n `\n : \"\";\n\n const filesHtml = trajectory.filesChanged.length\n ? `\n <h2>Files Changed (${trajectory.filesChanged.length})</h2>\n <div class=\"files-changed\">\n ${trajectory.filesChanged.map((f) => escapeHtml(f)).join(\"<br>\")}\n </div>\n `\n : \"\";\n\n const commitsHtml = trajectory.commits.length\n ? `\n <h2>Commits (${trajectory.commits.length})</h2>\n <div class=\"files-changed\">\n ${trajectory.commits.map((c) => `<code>${escapeHtml(c)}</code>`).join(\"<br>\")}\n </div>\n `\n : \"\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(trajectory.task.title)} - Trajectory</title>\n <style>${styles}</style>\n</head>\n<body>\n <div class=\"header\">\n <h1>🛤️ ${escapeHtml(trajectory.task.title)}</h1>\n <div class=\"meta\">\n <div class=\"meta-item\">\n <span class=\"meta-label\">ID</span>\n <span class=\"meta-value\"><code>${trajectory.id}</code></span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Status</span>\n <span class=\"meta-value\"><span class=\"status ${statusClass}\">${trajectory.status}</span></span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Duration</span>\n <span class=\"meta-value\">${duration}</span>\n </div>\n <div class=\"meta-item\">\n <span class=\"meta-label\">Started</span>\n <span class=\"meta-value\">${formatDate(trajectory.startedAt)}</span>\n </div>\n ${\n trajectory.task.source\n ? `\n <div class=\"meta-item\">\n <span class=\"meta-label\">Source</span>\n <span class=\"meta-value\">${escapeHtml(trajectory.task.source.system)}:${escapeHtml(trajectory.task.source.id)}</span>\n </div>\n `\n : \"\"\n }\n <div class=\"meta-item\">\n <span class=\"meta-label\">Agents</span>\n <span class=\"meta-value\">${trajectory.agents.map((a) => escapeHtml(a.name)).join(\", \") || \"—\"}</span>\n </div>\n </div>\n </div>\n\n ${renderRetrospective(trajectory)}\n ${decisionsHtml}\n ${chaptersHtml}\n ${filesHtml}\n ${commitsHtml}\n\n <script>\n // Initialize all collapsible sections\n document.querySelectorAll('.collapsible.open').forEach(el => {\n el.nextElementSibling?.style && (el.nextElementSibling.style.display = 'block');\n });\n </script>\n</body>\n</html>`;\n}\n\nexport function generateIndexHtml(trajectories: Trajectory[]): string {\n // Group by status\n const active = trajectories.filter((t) => t.status === \"active\");\n const completed = trajectories.filter((t) => t.status === \"completed\");\n const abandoned = trajectories.filter((t) => t.status === \"abandoned\");\n\n function renderCard(t: Trajectory): string {\n const duration = formatDuration(t.startedAt, t.completedAt);\n const statusClass = getStatusClass(t.status);\n\n return `\n <a href=\"${t.id}.html\" class=\"trajectory-card\">\n <div class=\"trajectory-card-title\">${escapeHtml(t.task.title)}</div>\n <div class=\"trajectory-card-meta\">\n <span class=\"status ${statusClass}\">${t.status}</span>\n <span>${duration}</span>\n <span>${t.chapters.length} chapters</span>\n </div>\n </a>\n `;\n }\n\n function renderGroup(title: string, items: Trajectory[]): string {\n if (items.length === 0) return \"\";\n return `\n <div class=\"group-header\">${title} (${items.length})</div>\n <div class=\"trajectory-list\">\n ${items.map(renderCard).join(\"\")}\n </div>\n `;\n }\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Trajectories</title>\n <style>${styles}</style>\n</head>\n<body>\n <div class=\"header\">\n <h1>🛤️ Trajectories</h1>\n <p>${trajectories.length} total trajectories</p>\n </div>\n\n ${renderGroup(\"Active\", active)}\n ${renderGroup(\"Completed\", completed)}\n ${renderGroup(\"Abandoned\", abandoned)}\n\n ${trajectories.length === 0 ? '<p class=\"empty\">No trajectories yet. Start one with <code>trail start \"Task name\"</code></p>' : \"\"}\n</body>\n</html>`;\n}\n","/**\n * trail list command\n */\n\nimport { existsSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport type { TrajectoryStatus, TrajectorySummary } from \"../../core/types.js\";\nimport { FileStorage, getSearchPaths } from \"../../storage/file.js\";\n\nexport function registerListCommand(program: Command): void {\n program\n .command(\"list\")\n .description(\"List and search trajectories\")\n .option(\n \"-s, --status <status>\",\n \"Filter by status (active, completed, abandoned)\",\n )\n .option(\"-l, --limit <number>\", \"Limit results\", Number.parseInt)\n .option(\"--search <query>\", \"Search trajectories by title or content\")\n .action(async (options) => {\n // Get all search paths and aggregate results\n const searchPaths = getSearchPaths();\n let allTrajectories: TrajectorySummary[] = [];\n const seenIds = new Set<string>();\n\n for (const searchPath of searchPaths) {\n // Skip paths that don't exist\n if (!existsSync(searchPath)) {\n continue;\n }\n\n // Create storage pointing to this path directly\n // We set TRAJECTORIES_DATA_DIR temporarily to use this path\n const originalDataDir = process.env.TRAJECTORIES_DATA_DIR;\n process.env.TRAJECTORIES_DATA_DIR = searchPath;\n\n try {\n const storage = new FileStorage();\n await storage.initialize();\n\n const trajectories = await storage.list({\n status: options.status as TrajectoryStatus | undefined,\n limit: options.search ? undefined : undefined, // Don't limit per-path\n });\n\n // Add to results, avoiding duplicates\n for (const traj of trajectories) {\n if (!seenIds.has(traj.id)) {\n seenIds.add(traj.id);\n allTrajectories.push(traj);\n }\n }\n } finally {\n // Restore original env var\n if (originalDataDir !== undefined) {\n process.env.TRAJECTORIES_DATA_DIR = originalDataDir;\n } else {\n process.env.TRAJECTORIES_DATA_DIR = undefined;\n }\n }\n }\n\n // Sort by startedAt descending (most recent first)\n allTrajectories.sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n );\n\n // Apply search filter if provided\n if (options.search) {\n const query = options.search.toLowerCase();\n allTrajectories = allTrajectories.filter((traj) => {\n // Search in title\n if (traj.title.toLowerCase().includes(query)) return true;\n // Search in ID\n if (traj.id.toLowerCase().includes(query)) return true;\n return false;\n });\n }\n\n // Apply limit after aggregation and search\n if (options.limit) {\n allTrajectories = allTrajectories.slice(0, options.limit);\n }\n\n if (allTrajectories.length === 0) {\n if (options.search) {\n console.log(`No trajectories found matching \"${options.search}\"`);\n } else {\n console.log(\"No trajectories found\");\n }\n return;\n }\n\n const searchNote = options.search ? ` matching \"${options.search}\"` : \"\";\n console.log(\n `Found ${allTrajectories.length} trajectories${searchNote}:\\n`,\n );\n\n for (const traj of allTrajectories) {\n const statusIcon = getStatusIcon(traj.status);\n const confidence = traj.confidence\n ? ` (${Math.round(traj.confidence * 100)}%)`\n : \"\";\n\n console.log(`${statusIcon} ${traj.id}`);\n console.log(` ${traj.title}${confidence}`);\n console.log(` Started: ${formatDate(traj.startedAt)}`);\n if (traj.completedAt) {\n console.log(` Completed: ${formatDate(traj.completedAt)}`);\n }\n console.log(\"\");\n }\n });\n}\n\nfunction getStatusIcon(status: string): string {\n switch (status) {\n case \"active\":\n return \"🔄\";\n case \"completed\":\n return \"✅\";\n case \"abandoned\":\n return \"❌\";\n default:\n return \"•\";\n }\n}\n\nfunction formatDate(isoString: string): string {\n return new Date(isoString).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n","/**\n * trail reflect command\n *\n * Records a reflection event — a higher-level synthesis of recent observations.\n * Used by workflow orchestrators and lead agents to periodically\n * synthesize progress and course-correct.\n */\n\nimport type { Command } from \"commander\";\nimport { addEvent } from \"../../core/trajectory.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerReflectCommand(program: Command): void {\n program\n .command(\"reflect <synthesis>\")\n .description(\"Record a reflection (periodic synthesis of progress)\")\n .option(\n \"-f, --focal-points <items>\",\n \"Comma-separated focal points that prompted this reflection\",\n )\n .option(\n \"-c, --confidence <number>\",\n \"Confidence in current trajectory (0-1)\",\n Number.parseFloat,\n )\n .option(\n \"-a, --adjustments <text>\",\n \"Course corrections triggered by this reflection\",\n )\n .action(async (synthesis: string, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n if (!active) {\n console.error(\"Error: No active trajectory\");\n console.error('Start one with: trail start \"Task description\"');\n throw new Error(\"No active trajectory\");\n }\n\n const tags: string[] = [];\n if (options.focalPoints) {\n for (const fp of options.focalPoints.split(\",\")) {\n tags.push(`focal:${fp.trim()}`);\n }\n }\n if (options.confidence !== undefined) {\n tags.push(`confidence:${options.confidence}`);\n }\n\n const raw: Record<string, unknown> = {};\n if (options.focalPoints) {\n raw.focalPoints = options.focalPoints\n .split(\",\")\n .map((s: string) => s.trim());\n }\n if (options.adjustments) {\n raw.adjustments = options.adjustments;\n }\n if (options.confidence !== undefined) {\n raw.confidence = options.confidence;\n }\n\n const updated = addEvent(active, {\n type: \"reflection\",\n content: synthesis,\n significance: \"high\",\n tags: tags.length > 0 ? tags : undefined,\n raw: Object.keys(raw).length > 0 ? raw : undefined,\n });\n\n await storage.save(updated);\n\n console.log(`✓ Reflection recorded: ${synthesis}`);\n if (options.focalPoints) {\n console.log(` Focal points: ${options.focalPoints}`);\n }\n if (options.confidence !== undefined) {\n console.log(` Confidence: ${options.confidence}`);\n }\n if (options.adjustments) {\n console.log(` Adjustments: ${options.adjustments}`);\n }\n });\n}\n","/**\n * trail show command\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { migrateTraceRecord } from \"../../core/trace.js\";\nimport type {\n Decision,\n TraceConversation,\n TraceRecord,\n Trajectory,\n} from \"../../core/types.js\";\nimport { FileStorage, getSearchPaths } from \"../../storage/file.js\";\n\n/**\n * Search for a trajectory across all search paths\n */\nasync function findTrajectory(id: string): Promise<Trajectory | null> {\n const searchPaths = getSearchPaths();\n\n for (const searchPath of searchPaths) {\n // Skip paths that don't exist\n if (!existsSync(searchPath)) {\n continue;\n }\n\n // Create storage pointing to this path directly\n const originalDataDir = process.env.TRAJECTORIES_DATA_DIR;\n process.env.TRAJECTORIES_DATA_DIR = searchPath;\n\n try {\n const storage = new FileStorage();\n await storage.initialize();\n\n const trajectory = await storage.get(id);\n if (trajectory) {\n return trajectory;\n }\n } finally {\n // Restore original env var\n if (originalDataDir !== undefined) {\n process.env.TRAJECTORIES_DATA_DIR = originalDataDir;\n } else {\n process.env.TRAJECTORIES_DATA_DIR = undefined;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Find and load the trace file for a trajectory\n */\nasync function findTraceFile(id: string): Promise<TraceRecord | null> {\n const searchPaths = getSearchPaths();\n\n for (const searchPath of searchPaths) {\n if (!existsSync(searchPath)) {\n continue;\n }\n\n const completedDir = join(searchPath, \"completed\");\n if (!existsSync(completedDir)) {\n continue;\n }\n\n // Search through month directories\n try {\n const { readdirSync } = await import(\"node:fs\");\n const months = readdirSync(completedDir);\n for (const month of months) {\n const tracePath = join(completedDir, month, `${id}.trace.json`);\n if (existsSync(tracePath)) {\n let record: TraceRecord;\n let migrated: boolean;\n try {\n const content = await readFile(tracePath, \"utf-8\");\n ({ record, migrated } = migrateTraceRecord(JSON.parse(content)));\n } catch {\n continue;\n }\n if (migrated) {\n try {\n const { writeFile } = await import(\"node:fs/promises\");\n await writeFile(\n tracePath,\n JSON.stringify(record, null, 2),\n \"utf-8\",\n );\n } catch {\n // Write-back failed (e.g. read-only fs) — return the migrated\n // record anyway so the caller always gets the parsed data\n }\n }\n return record;\n }\n }\n } catch {\n // Continue searching\n }\n }\n\n return null;\n}\n\nexport function registerShowCommand(program: Command): void {\n program\n .command(\"show <id>\")\n .description(\"Show trajectory details\")\n .option(\"-d, --decisions\", \"Show decisions only\")\n .option(\"-t, --trace\", \"Show trace information\")\n .action(async (id: string, options) => {\n const trajectory = await findTrajectory(id);\n\n if (!trajectory) {\n console.error(`Error: Trajectory not found: ${id}`);\n throw new Error(\"Trajectory not found\");\n }\n\n if (options.trace) {\n // Show trace information\n console.log(`Trace for ${trajectory.task.title}:\\n`);\n\n // Show embedded trace reference\n if (trajectory._trace) {\n console.log(\"Trace Reference:\");\n console.log(` Start Ref: ${trajectory._trace.startRef}`);\n if (trajectory._trace.endRef) {\n console.log(` End Ref: ${trajectory._trace.endRef}`);\n }\n if (trajectory._trace.traceId) {\n console.log(` Trace ID: ${trajectory._trace.traceId}`);\n }\n console.log(\"\");\n }\n\n // Load and display trace file\n const trace = await findTraceFile(id);\n if (trace) {\n console.log(\"Trace Details:\");\n console.log(` ID: ${trace.id}`);\n console.log(` Timestamp: ${trace.timestamp}`);\n console.log(` Files: ${trace.files.length}`);\n console.log(\"\");\n\n if (trace.files.length > 0) {\n console.log(\"Modified Files:\");\n for (const file of trace.files) {\n const rangeCount = file.conversations.reduce(\n (sum: number, conv: TraceConversation) =>\n sum + conv.ranges.length,\n 0,\n );\n const model =\n file.conversations[0]?.contributor.model_id ?? \"unknown\";\n console.log(` • ${file.path}`);\n console.log(` Ranges: ${rangeCount}, Model: ${model}`);\n }\n }\n } else if (!trajectory._trace) {\n console.log(\"No trace information available\");\n console.log(\n \"Trace is captured when starting a trajectory in a git repo\",\n );\n }\n return;\n }\n\n if (options.decisions) {\n // Show decisions only\n const decisions = extractDecisions(trajectory);\n\n if (decisions.length === 0) {\n console.log(\"No decisions recorded\");\n return;\n }\n\n console.log(`Decisions for ${trajectory.task.title}:\\n`);\n for (const decision of decisions) {\n console.log(`• ${decision.question}`);\n console.log(` Chose: ${decision.chosen}`);\n console.log(` Reasoning: ${decision.reasoning}`);\n if (decision.alternatives.length > 0) {\n const altStrings = decision.alternatives.map((a) =>\n typeof a === \"string\" ? a : a.option,\n );\n console.log(` Alternatives: ${altStrings.join(\", \")}`);\n }\n console.log(\"\");\n }\n return;\n }\n\n // Show full details\n console.log(`Trajectory: ${trajectory.id}`);\n console.log(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\");\n console.log(`Title: ${trajectory.task.title}`);\n console.log(`Status: ${trajectory.status}`);\n console.log(`Started: ${trajectory.startedAt}`);\n if (trajectory.completedAt) {\n console.log(`Ended: ${trajectory.completedAt}`);\n }\n\n if (trajectory.task.source) {\n console.log(\n `Source: ${trajectory.task.source.system}:${trajectory.task.source.id}`,\n );\n }\n\n console.log(`\\nChapters: ${trajectory.chapters.length}`);\n for (const chapter of trajectory.chapters) {\n console.log(` • ${chapter.title} (${chapter.agentName})`);\n console.log(` Events: ${chapter.events.length}`);\n }\n\n if (trajectory.retrospective) {\n console.log(\"\\nRetrospective:\");\n console.log(` Summary: ${trajectory.retrospective.summary}`);\n console.log(\n ` Confidence: ${Math.round(trajectory.retrospective.confidence * 100)}%`,\n );\n }\n });\n}\n\nfunction extractDecisions(trajectory: any): 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 if (!decisions.some((d) => d.question === raw.question)) {\n decisions.push(raw);\n }\n }\n }\n }\n }\n\n return decisions;\n}\n","/**\n * trail start command\n */\n\nimport type { Command } from \"commander\";\nimport { captureGitState, createTraceRef } from \"../../core/trace.js\";\nimport { addChapter, createTrajectory } from \"../../core/trajectory.js\";\nimport type { TaskSource } from \"../../core/types.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerStartCommand(program: Command): void {\n program\n .command(\"start <title>\")\n .description(\"Start a new trajectory\")\n .option(\"-t, --task <id>\", \"External task ID\")\n .option(\n \"-s, --source <system>\",\n \"Task system (github, linear, jira, beads)\",\n )\n .option(\"--url <url>\", \"URL to external task\")\n .option(\"-a, --agent <name>\", \"Agent name (or set TRAJECTORIES_AGENT)\")\n .option(\"-p, --project <id>\", \"Project ID (or set TRAJECTORIES_PROJECT)\")\n .option(\n \"-w, --workflow <id>\",\n \"Workflow run id (or set TRAJECTORIES_WORKFLOW_ID). Stamped onto the trajectory so `trail compact --workflow <id>` can collate a run.\",\n )\n .option(\"-q, --quiet\", \"Only output trajectory ID (for scripting)\")\n .action(async (title: string, options) => {\n const storage = new FileStorage();\n await storage.initialize();\n\n // Check if there's already an active trajectory\n const active = await storage.getActive();\n if (active) {\n if (!options.quiet) {\n console.error(`Error: Trajectory already active: ${active.id}`);\n console.error(\n \"Complete or abandon it first with: trail complete or trail abandon\",\n );\n }\n throw new Error(\"Trajectory already active\");\n }\n\n // Build task source if provided\n let source: TaskSource | undefined;\n if (options.task) {\n source = {\n system: options.source || \"plain\",\n id: options.task,\n url: options.url,\n };\n }\n\n // Resolve agent name from CLI flag or env var\n const agentName =\n options.agent ?? process.env.TRAJECTORIES_AGENT ?? undefined;\n\n // Resolve project ID from CLI flag or env var\n const projectId =\n options.project ?? process.env.TRAJECTORIES_PROJECT ?? undefined;\n\n // Resolve workflow id from CLI flag or env var. When set, the trajectory\n // is stamped so `trail compact --workflow <id>` can collate an entire\n // relay workflow run into one tight artifact.\n const workflowId =\n (typeof options.workflow === \"string\" && options.workflow.trim()) ||\n (typeof process.env.TRAJECTORIES_WORKFLOW_ID === \"string\" &&\n process.env.TRAJECTORIES_WORKFLOW_ID.trim()) ||\n undefined;\n\n // Capture git state for trace tracking\n const startRef = captureGitState();\n\n // Create the trajectory\n let trajectory = createTrajectory({\n title,\n source,\n projectId,\n });\n\n if (workflowId) {\n trajectory = { ...trajectory, workflowId };\n }\n\n // Add trace reference if in a git repo\n if (startRef) {\n trajectory = {\n ...trajectory,\n _trace: createTraceRef(startRef),\n };\n }\n\n // If agent specified, add initial chapter with agent name\n if (agentName) {\n trajectory = addChapter(trajectory, {\n title: \"Initial work\",\n agentName,\n });\n }\n\n await storage.save(trajectory);\n\n if (options.quiet) {\n // Only output trajectory ID for scripting\n console.log(trajectory.id);\n } else {\n console.log(`✓ Trajectory started: ${trajectory.id}`);\n console.log(` Title: ${title}`);\n if (agentName) {\n console.log(` Agent: ${agentName}`);\n }\n if (projectId) {\n console.log(` Project: ${projectId}`);\n }\n if (source) {\n console.log(` Linked to: ${source.id} (${source.system})`);\n }\n }\n });\n}\n","/**\n * trail status command\n */\n\nimport type { Command } from \"commander\";\nimport {\n getCommitsBetween,\n getFilesChangedBetween,\n} from \"../../core/trailers.js\";\nimport { FileStorage } from \"../../storage/file.js\";\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command(\"status\")\n .description(\"Show active trajectory status\")\n .action(async () => {\n const storage = new FileStorage();\n await storage.initialize();\n\n const active = await storage.getActive();\n\n if (!active) {\n console.log(\"No active trajectory\");\n console.log('Start one with: trail start \"Task description\"');\n return;\n }\n\n const duration = formatDuration(\n new Date().getTime() - new Date(active.startedAt).getTime(),\n );\n\n const eventCount = active.chapters.reduce(\n (sum, ch) => sum + ch.events.length,\n 0,\n );\n\n const decisionCount = active.chapters.reduce(\n (sum, ch) =>\n sum + ch.events.filter((e) => e.type === \"decision\").length,\n 0,\n );\n\n console.log(`Active Trajectory: ${active.id}`);\n console.log(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\");\n console.log(`Task: ${active.task.title}`);\n if (active.task.source) {\n console.log(\n `Source: ${active.task.source.system}:${active.task.source.id}`,\n );\n }\n console.log(`Status: ${active.status}`);\n console.log(`Started: ${duration} ago`);\n console.log(`Chapters: ${active.chapters.length}`);\n console.log(`Events: ${eventCount}`);\n console.log(`Decisions: ${decisionCount}`);\n\n // Show live commit/file counts from git\n if (active._trace?.startRef) {\n const commits = getCommitsBetween(active._trace.startRef);\n const filesChanged = getFilesChangedBetween(active._trace.startRef);\n if (commits.length > 0) {\n console.log(`Commits: ${commits.length}`);\n }\n if (filesChanged.length > 0) {\n console.log(`Files: ${filesChanged.length}`);\n }\n }\n\n if (active.chapters.length > 0) {\n const currentChapter = active.chapters[active.chapters.length - 1];\n console.log(`\\nCurrent Chapter: ${currentChapter.title}`);\n console.log(` Agent: ${currentChapter.agentName}`);\n }\n });\n}\n\nfunction formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days}d ${hours % 24}h`;\n if (hours > 0) return `${hours}h ${minutes % 60}m`;\n if (minutes > 0) return `${minutes}m`;\n return `${seconds}s`;\n}\n","/**\n * CLI Command Registration\n *\n * Registers all commands with the program.\n *\n * Core commands (12 total):\n * - start: Begin tracking a new task\n * - status: Show current trajectory state\n * - decision: Record a decision point\n * - reflect: Record a reflection (periodic synthesis)\n * - complete: Finish with retrospective\n * - abandon: Stop without completing\n * - list: Browse trajectories (with --search)\n * - show: View trajectory details\n * - export: Output in various formats (with --open)\n * - enable: Install git hook for trajectory trailers\n * - disable: Remove the trajectory git hook\n * - compact: Compress trajectories into summarized form\n */\n\nimport type { Command } from \"commander\";\nimport { registerAbandonCommand } from \"./abandon.js\";\nimport { registerCompactCommand } from \"./compact.js\";\nimport { registerCompleteCommand } from \"./complete.js\";\nimport { registerDecisionCommand } from \"./decision.js\";\nimport { registerEnableCommand } from \"./enable.js\";\nimport { registerExportCommand } from \"./export.js\";\nimport { registerListCommand } from \"./list.js\";\nimport { registerReflectCommand } from \"./reflect.js\";\nimport { registerShowCommand } from \"./show.js\";\nimport { registerStartCommand } from \"./start.js\";\nimport { registerStatusCommand } from \"./status.js\";\n\n/**\n * Register all CLI commands\n */\nexport function registerCommands(program: Command): void {\n registerStartCommand(program);\n registerStatusCommand(program);\n registerCompleteCommand(program);\n registerAbandonCommand(program);\n registerDecisionCommand(program);\n registerReflectCommand(program);\n registerListCommand(program);\n registerShowCommand(program);\n registerExportCommand(program);\n registerEnableCommand(program);\n registerCompactCommand(program);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction findPackageJson(startDir: string): string {\n let dir = startDir;\n while (dir !== path.dirname(dir)) {\n const candidate = path.join(dir, \"package.json\");\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n dir = path.dirname(dir);\n }\n throw new Error(\"Could not find package.json\");\n}\n\nfunction resolveCliVersion(): string {\n try {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const packageJsonPath = findPackageJson(here);\n const packageJson = JSON.parse(\n fs.readFileSync(packageJsonPath, \"utf-8\"),\n ) as { version?: string };\n return packageJson.version ?? \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport const VERSION = resolveCliVersion();\n"],"mappings":"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","names":["path","program","existsSync","readFileSync","join","existsSync","join","join","existsSync","formatDate","isRecord","readString","join","path","DEFAULT_MAX_TOKENS","program","outputPath","existsSync","join","readFileSync","formatDate","existsSync","mkdir","writeFile","join","path","execSync","readFileSync","execSync","readFileSync","join","existsSync","mkdir","writeFile","program","program","execSync","existsSync","mkdir","writeFile","join","execSync","join","program","existsSync","mkdir","writeFile","unlink","mkdir","writeFile","join","formatDate","formatDuration","renderChapter","renderRetrospective","program","writeFile","join","mkdir","path","existsSync","program","existsSync","formatDate","program","existsSync","readFile","join","existsSync","join","readFile","writeFile","program","extractDecisions","program","program","formatDuration","program"]}
|