@ajvikram/relay 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +538 -0
  3. package/dist/cli/commands/branch.d.ts +9 -0
  4. package/dist/cli/commands/branch.d.ts.map +1 -0
  5. package/dist/cli/commands/branch.js +69 -0
  6. package/dist/cli/commands/branch.js.map +1 -0
  7. package/dist/cli/commands/diff.d.ts +8 -0
  8. package/dist/cli/commands/diff.d.ts.map +1 -0
  9. package/dist/cli/commands/diff.js +61 -0
  10. package/dist/cli/commands/diff.js.map +1 -0
  11. package/dist/cli/commands/history.d.ts +8 -0
  12. package/dist/cli/commands/history.d.ts.map +1 -0
  13. package/dist/cli/commands/history.js +32 -0
  14. package/dist/cli/commands/history.js.map +1 -0
  15. package/dist/cli/commands/hook.d.ts +6 -0
  16. package/dist/cli/commands/hook.d.ts.map +1 -0
  17. package/dist/cli/commands/hook.js +118 -0
  18. package/dist/cli/commands/hook.js.map +1 -0
  19. package/dist/cli/commands/init.d.ts +4 -0
  20. package/dist/cli/commands/init.d.ts.map +1 -0
  21. package/dist/cli/commands/init.js +41 -0
  22. package/dist/cli/commands/init.js.map +1 -0
  23. package/dist/cli/commands/install.d.ts +18 -0
  24. package/dist/cli/commands/install.d.ts.map +1 -0
  25. package/dist/cli/commands/install.js +203 -0
  26. package/dist/cli/commands/install.js.map +1 -0
  27. package/dist/cli/commands/load.d.ts +9 -0
  28. package/dist/cli/commands/load.d.ts.map +1 -0
  29. package/dist/cli/commands/load.js +69 -0
  30. package/dist/cli/commands/load.js.map +1 -0
  31. package/dist/cli/commands/repos.d.ts +7 -0
  32. package/dist/cli/commands/repos.d.ts.map +1 -0
  33. package/dist/cli/commands/repos.js +53 -0
  34. package/dist/cli/commands/repos.js.map +1 -0
  35. package/dist/cli/commands/save.d.ts +9 -0
  36. package/dist/cli/commands/save.d.ts.map +1 -0
  37. package/dist/cli/commands/save.js +267 -0
  38. package/dist/cli/commands/save.js.map +1 -0
  39. package/dist/cli/commands/status.d.ts +23 -0
  40. package/dist/cli/commands/status.d.ts.map +1 -0
  41. package/dist/cli/commands/status.js +134 -0
  42. package/dist/cli/commands/status.js.map +1 -0
  43. package/dist/cli/commands/ui.d.ts +9 -0
  44. package/dist/cli/commands/ui.d.ts.map +1 -0
  45. package/dist/cli/commands/ui.js +54 -0
  46. package/dist/cli/commands/ui.js.map +1 -0
  47. package/dist/cli/commands/vscode.d.ts +6 -0
  48. package/dist/cli/commands/vscode.d.ts.map +1 -0
  49. package/dist/cli/commands/vscode.js +86 -0
  50. package/dist/cli/commands/vscode.js.map +1 -0
  51. package/dist/cli/index.d.ts +3 -0
  52. package/dist/cli/index.d.ts.map +1 -0
  53. package/dist/cli/index.js +143 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/format/renderer.d.ts +5 -0
  56. package/dist/format/renderer.d.ts.map +1 -0
  57. package/dist/format/renderer.js +207 -0
  58. package/dist/format/renderer.js.map +1 -0
  59. package/dist/format/schema.d.ts +516 -0
  60. package/dist/format/schema.d.ts.map +1 -0
  61. package/dist/format/schema.js +90 -0
  62. package/dist/format/schema.js.map +1 -0
  63. package/dist/format/template.d.ts +44 -0
  64. package/dist/format/template.d.ts.map +1 -0
  65. package/dist/format/template.js +131 -0
  66. package/dist/format/template.js.map +1 -0
  67. package/dist/git/context.d.ts +23 -0
  68. package/dist/git/context.d.ts.map +1 -0
  69. package/dist/git/context.js +121 -0
  70. package/dist/git/context.js.map +1 -0
  71. package/dist/index.d.ts +8 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +8 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/mcp/server.d.ts +2 -0
  76. package/dist/mcp/server.d.ts.map +1 -0
  77. package/dist/mcp/server.js +164 -0
  78. package/dist/mcp/server.js.map +1 -0
  79. package/dist/server/index.d.ts +12 -0
  80. package/dist/server/index.d.ts.map +1 -0
  81. package/dist/server/index.js +143 -0
  82. package/dist/server/index.js.map +1 -0
  83. package/dist/server/ui.d.ts +2 -0
  84. package/dist/server/ui.d.ts.map +1 -0
  85. package/dist/server/ui.js +797 -0
  86. package/dist/server/ui.js.map +1 -0
  87. package/dist/storage/global.d.ts +40 -0
  88. package/dist/storage/global.d.ts.map +1 -0
  89. package/dist/storage/global.js +126 -0
  90. package/dist/storage/global.js.map +1 -0
  91. package/dist/storage/index.d.ts +59 -0
  92. package/dist/storage/index.d.ts.map +1 -0
  93. package/dist/storage/index.js +253 -0
  94. package/dist/storage/index.js.map +1 -0
  95. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/vscode.ts"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFzE"}
@@ -0,0 +1,86 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { getRepoRoot } from '../../git/context.js';
5
+ import { resolveCwd } from '../../storage/index.js';
6
+ export async function vscodeCommand(options) {
7
+ const cwd = resolveCwd(options.dir);
8
+ const repoRoot = await getRepoRoot(cwd);
9
+ if (!repoRoot) {
10
+ console.error(chalk.red('✗ Not a git repository.'));
11
+ process.exit(1);
12
+ }
13
+ const vscodeDir = join(repoRoot, '.vscode');
14
+ mkdirSync(vscodeDir, { recursive: true });
15
+ const tasksPath = join(vscodeDir, 'tasks.json');
16
+ let tasksJson = { version: '2.0.0', tasks: [] };
17
+ if (existsSync(tasksPath)) {
18
+ try {
19
+ tasksJson = JSON.parse(readFileSync(tasksPath, 'utf-8'));
20
+ if (!Array.isArray(tasksJson.tasks)) {
21
+ tasksJson.tasks = [];
22
+ }
23
+ }
24
+ catch {
25
+ tasksJson = { version: '2.0.0', tasks: [] };
26
+ }
27
+ }
28
+ const relayTasks = [
29
+ {
30
+ label: 'Relay: Launch Dashboard',
31
+ type: 'shell',
32
+ command: 'relay ui',
33
+ problemMatcher: [],
34
+ presentation: {
35
+ reveal: 'silent',
36
+ panel: 'dedicated',
37
+ },
38
+ },
39
+ {
40
+ label: 'Relay: Save Context Handoff',
41
+ type: 'shell',
42
+ command: 'relay save',
43
+ problemMatcher: [],
44
+ presentation: {
45
+ reveal: 'always',
46
+ panel: 'shared',
47
+ },
48
+ },
49
+ {
50
+ label: 'Relay: Copy Agent Prompt',
51
+ type: 'shell',
52
+ command: 'relay load --prompt --clipboard',
53
+ problemMatcher: [],
54
+ presentation: {
55
+ reveal: 'silent',
56
+ },
57
+ },
58
+ {
59
+ label: 'Relay: Check Workspace Status',
60
+ type: 'shell',
61
+ command: 'relay status',
62
+ problemMatcher: [],
63
+ presentation: {
64
+ reveal: 'always',
65
+ },
66
+ },
67
+ ];
68
+ // Merge tasks avoiding duplicates
69
+ const existingLabels = new Set(tasksJson.tasks.map((t) => t.label).filter(Boolean));
70
+ for (const task of relayTasks) {
71
+ if (!existingLabels.has(task.label)) {
72
+ tasksJson.tasks.push(task);
73
+ }
74
+ }
75
+ writeFileSync(tasksPath, JSON.stringify(tasksJson, null, 2));
76
+ console.log(chalk.bold('\n⚡ VS Code / Cursor Integration Configured'));
77
+ console.log(chalk.dim('─'.repeat(60)));
78
+ console.log(chalk.green('✓ Created/Updated:'), '.vscode/tasks.json');
79
+ console.log(chalk.dim('\nAvailable Tasks (run via Command Palette: "Tasks: Run Task"):'));
80
+ console.log(' • Relay: Launch Dashboard');
81
+ console.log(' • Relay: Save Context Handoff');
82
+ console.log(' • Relay: Copy Agent Prompt');
83
+ console.log(' • Relay: Check Workspace Status');
84
+ console.log('');
85
+ }
86
+ //# sourceMappingURL=vscode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.js","sourceRoot":"","sources":["../../../src/cli/commands/vscode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { initCommand } from './commands/init.js';
5
+ import { saveCommand } from './commands/save.js';
6
+ import { loadCommand } from './commands/load.js';
7
+ import { historyCommand } from './commands/history.js';
8
+ import { installCommand } from './commands/install.js';
9
+ import { statusCommand } from './commands/status.js';
10
+ import { diffCommand } from './commands/diff.js';
11
+ import { uiCommand } from './commands/ui.js';
12
+ import { branchCommand } from './commands/branch.js';
13
+ import { hookCommand } from './commands/hook.js';
14
+ import { vscodeCommand } from './commands/vscode.js';
15
+ import { reposCommand } from './commands/repos.js';
16
+ const program = new Command();
17
+ program
18
+ .name('relay')
19
+ .description(chalk.bold('Relay') + ' — Seamless AI context handoff across platforms\n' +
20
+ chalk.dim(' Transfer context between Claude, Cursor, Copilot, Antigravity and more'))
21
+ .version('0.1.0');
22
+ // ─── relay init ───────────────────────────────────────────────────────────────
23
+ program
24
+ .command('init')
25
+ .description('Initialize Relay in the current git repository')
26
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
27
+ .action(initCommand);
28
+ // ─── relay save ───────────────────────────────────────────────────────────────
29
+ program
30
+ .command('save')
31
+ .description('Save current session context as a handoff document')
32
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
33
+ .option('-p, --platform <name>', 'Override source platform (claude|cursor|copilot|antigravity|other)')
34
+ .option('-a, --agent', 'Agent-assisted mode: generate prompt to paste into current AI agent')
35
+ .option('-q, --quick', 'Quick save with minimal prompts')
36
+ .action(saveCommand);
37
+ // ─── relay load ───────────────────────────────────────────────────────────────
38
+ program
39
+ .command('load')
40
+ .description('Load and display the current handoff context')
41
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
42
+ .option('--prompt', 'Output as a compact agent prompt (for pasting into a new session)')
43
+ .option('--clipboard', 'Copy output to clipboard')
44
+ .option('--json', 'Output raw JSON')
45
+ .action(loadCommand);
46
+ // ─── relay status / check ─────────────────────────────────────────────────────
47
+ program
48
+ .command('status')
49
+ .alias('check')
50
+ .description('Inspect workspace drift and alignment against current handoff')
51
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
52
+ .option('--json', 'Output raw JSON report')
53
+ .action(statusCommand);
54
+ // ─── relay diff ───────────────────────────────────────────────────────────────
55
+ program
56
+ .command('diff')
57
+ .description('Compare current handoff against previous history')
58
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
59
+ .option('--from <id>', 'Starting handoff ID')
60
+ .option('--to <id>', 'Target handoff ID (defaults to current)')
61
+ .option('--json', 'Output comparison as JSON')
62
+ .action(diffCommand);
63
+ // ─── relay branch ─────────────────────────────────────────────────────────────
64
+ program
65
+ .command('branch [subcommand] [name]')
66
+ .description('Manage branch-scoped handoffs (list, show, apply)')
67
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
68
+ .option('-l, --list', 'List all saved branch handoffs')
69
+ .option('-s, --show <name>', 'Show handoff for a specific branch')
70
+ .option('-a, --apply <name>', 'Apply a branch handoff as active')
71
+ .action((subcommand, name, options) => branchCommand(subcommand, name, options));
72
+ // ─── relay hook ───────────────────────────────────────────────────────────────
73
+ program
74
+ .command('hook <action>')
75
+ .description('Manage Git hooks for auto-drafting handoffs (install, uninstall, run)')
76
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
77
+ .action((action, options) => hookCommand(action, options));
78
+ // ─── relay vscode ─────────────────────────────────────────────────────────────
79
+ program
80
+ .command('vscode')
81
+ .description('Configure VS Code and Cursor tasks and shortcuts')
82
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
83
+ .action(vscodeCommand);
84
+ // ─── relay repos / list ───────────────────────────────────────────────────────
85
+ program
86
+ .command('repos')
87
+ .alias('list')
88
+ .description('List and manage registered Relay repositories across the machine')
89
+ .option('--json', 'Output registered repositories as JSON')
90
+ .option('--remove <path>', 'Remove a repository from the global registry')
91
+ .option('--no-prune', 'Do not prune deleted directories')
92
+ .action(reposCommand);
93
+ // ─── relay ui / dashboard ─────────────────────────────────────────────────────
94
+ program
95
+ .command('ui')
96
+ .alias('dashboard')
97
+ .description('Launch the Relay Web Dashboard on localhost')
98
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
99
+ .option('-g, --global', 'Launch global multi-repo dashboard')
100
+ .option('-p, --port <number>', 'Custom port (default: 4242)', parseInt)
101
+ .option('--no-open', 'Do not automatically open browser')
102
+ .action(uiCommand);
103
+ // ─── relay history ────────────────────────────────────────────────────────────
104
+ program
105
+ .command('history')
106
+ .description('View past handoffs')
107
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
108
+ .option('--show <id>', 'Show a specific handoff by ID')
109
+ .option('-n, --limit <number>', 'Limit number of entries shown', parseInt)
110
+ .action(historyCommand);
111
+ // ─── relay install ────────────────────────────────────────────────────────────
112
+ program
113
+ .command('install [platform]')
114
+ .description('Install bootstrap rules for an AI platform')
115
+ .addHelpText('after', `
116
+ Platforms:
117
+ claude — Appends to CLAUDE.md (or ~/.claude/CLAUDE.md with -g)
118
+ cursor — Creates .cursor/rules/relay.mdc (or ~/.cursor/rules/relay.mdc with -g)
119
+ antigravity — Appends to AGENTS.md (or ~/.antigravity/AGENTS.md with -g)
120
+ copilot — Appends to .github/copilot-instructions.md (or ~/.config/github-copilot/... with -g)
121
+ all — Installs for all platforms
122
+
123
+ Examples:
124
+ relay install claude
125
+ relay install all
126
+ relay install all --global
127
+ relay install cursor -g --dry-run`)
128
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
129
+ .option('-g, --global', 'Install system-wide global rules in user home directory')
130
+ .option('--dry-run', 'Show what would be written without modifying files')
131
+ .action((platform = 'all', options) => installCommand(platform, options));
132
+ // ─── relay serve ──────────────────────────────────────────────────────────────
133
+ program
134
+ .command('serve')
135
+ .description('Start the Relay MCP server (for Claude, Cursor, Antigravity integration)')
136
+ .option('-d, --dir <path>', 'Repository directory (defaults to cwd)')
137
+ .option('--port <number>', 'HTTP port (default: stdio transport)', parseInt)
138
+ .action(async () => {
139
+ const { startMcpServer } = await import('../mcp/server.js');
140
+ await startMcpServer();
141
+ });
142
+ program.parse();
143
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Handoff, HistoryEntry } from './schema.js';
2
+ export declare function renderMarkdown(handoff: Handoff): string;
3
+ export declare function renderAgentPrompt(handoff: Handoff): string;
4
+ export declare function renderHistoryList(entries: HistoryEntry[]): string;
5
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/format/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKzD,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqIvD;AAMD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqE1D;AAID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAmBjE"}
@@ -0,0 +1,207 @@
1
+ // ─── Markdown Renderer ────────────────────────────────────────────────────────
2
+ // Produces the .relay/handoff.md file
3
+ export function renderMarkdown(handoff) {
4
+ const lines = [];
5
+ const ts = new Date(handoff.timestamp).toLocaleString();
6
+ lines.push(`# 🔄 Relay Handoff`);
7
+ lines.push(``);
8
+ lines.push(`> Generated: ${ts} | Source: ${handoff.source_platform} | Status: **${handoff.session.status}**`);
9
+ if (handoff.session.token_exhausted) {
10
+ lines.push(`> ⚠️ Session ended due to token limit`);
11
+ }
12
+ lines.push(``);
13
+ lines.push(`<!-- relay:id=${handoff.id} relay:version=${handoff.version} -->`);
14
+ lines.push(``);
15
+ // ── Goal ──────────────────────────────────────────────────────────────────
16
+ lines.push(`## 🎯 Goal`);
17
+ lines.push(``);
18
+ lines.push(handoff.session.goal);
19
+ lines.push(``);
20
+ // ── Repository ────────────────────────────────────────────────────────────
21
+ lines.push(`## 📁 Repository State`);
22
+ lines.push(``);
23
+ lines.push(`| Field | Value |`);
24
+ lines.push(`|-------|-------|`);
25
+ lines.push(`| Branch | \`${handoff.repository.branch}\` |`);
26
+ lines.push(`| HEAD commit | \`${handoff.repository.head_commit}\` |`);
27
+ if (handoff.repository.head_message) {
28
+ lines.push(`| HEAD message | ${handoff.repository.head_message} |`);
29
+ }
30
+ lines.push(``);
31
+ // ── Modified files ────────────────────────────────────────────────────────
32
+ if (handoff.files_modified.length > 0) {
33
+ lines.push(`## 📝 Files Modified This Session`);
34
+ lines.push(``);
35
+ for (const f of handoff.files_modified) {
36
+ const icon = f.status === 'added' ? '🟢' : f.status === 'deleted' ? '🔴' : '🟡';
37
+ lines.push(`- ${icon} \`${f.path}\` — ${f.summary}`);
38
+ }
39
+ lines.push(``);
40
+ }
41
+ // ── Decisions ─────────────────────────────────────────────────────────────
42
+ if (handoff.decisions.length > 0) {
43
+ lines.push(`## 🏛️ Decisions Made`);
44
+ lines.push(``);
45
+ lines.push(`These decisions were made during this session. Do NOT reverse them without strong justification.`);
46
+ lines.push(``);
47
+ for (const d of handoff.decisions) {
48
+ lines.push(`### ${d.what}`);
49
+ lines.push(`**Why:** ${d.why}`);
50
+ if (d.evidence) {
51
+ lines.push(`**Evidence:** ${d.evidence}`);
52
+ }
53
+ lines.push(``);
54
+ }
55
+ }
56
+ // ── Constraints ───────────────────────────────────────────────────────────
57
+ if (handoff.constraints.length > 0) {
58
+ lines.push(`## 🚫 Non-Negotiable Constraints`);
59
+ lines.push(``);
60
+ lines.push(`The following constraints MUST be respected. They are hard requirements, not preferences.`);
61
+ lines.push(``);
62
+ for (const c of handoff.constraints) {
63
+ lines.push(`- ❌ ${c}`);
64
+ }
65
+ lines.push(``);
66
+ }
67
+ // ── Failed approaches ─────────────────────────────────────────────────────
68
+ if (handoff.failed_approaches.length > 0) {
69
+ lines.push(`## ⚠️ Failed Approaches — Do NOT Repeat`);
70
+ lines.push(``);
71
+ lines.push(`These approaches were already tried and failed. Do not suggest or attempt them again.`);
72
+ lines.push(``);
73
+ for (const f of handoff.failed_approaches) {
74
+ lines.push(`### ~~${f.approach}~~`);
75
+ lines.push(`**Why it failed:** ${f.why_failed}`);
76
+ lines.push(``);
77
+ }
78
+ }
79
+ // ── Next steps ────────────────────────────────────────────────────────────
80
+ if (handoff.next_steps.length > 0) {
81
+ lines.push(`## ✅ Next Steps`);
82
+ lines.push(``);
83
+ lines.push(`Execute these in order. Do not skip ahead.`);
84
+ lines.push(``);
85
+ const immediate = handoff.next_steps.filter((s) => s.priority === 'immediate');
86
+ const soon = handoff.next_steps.filter((s) => s.priority === 'soon');
87
+ const later = handoff.next_steps.filter((s) => s.priority === 'later');
88
+ const renderSteps = (steps, label) => {
89
+ if (steps.length === 0)
90
+ return;
91
+ if (label) {
92
+ lines.push(`### ${label}`);
93
+ lines.push(``);
94
+ }
95
+ steps.forEach((s, i) => {
96
+ lines.push(`${i + 1}. **${s.task}**`);
97
+ if (s.context)
98
+ lines.push(` - Context: ${s.context}`);
99
+ if (s.file_hint)
100
+ lines.push(` - Start at: \`${s.file_hint}\``);
101
+ });
102
+ lines.push(``);
103
+ };
104
+ renderSteps(immediate, immediate.length > 0 && (soon.length > 0 || later.length > 0) ? '🔴 Do Now' : undefined);
105
+ renderSteps(soon, '🟡 Do Soon');
106
+ renderSteps(later, '🔵 Do Later');
107
+ }
108
+ // ── Raw diff ──────────────────────────────────────────────────────────────
109
+ if (handoff.raw_diff) {
110
+ lines.push(`## 🔍 Git Diff (Reference)`);
111
+ lines.push(``);
112
+ lines.push(`<details>`);
113
+ lines.push(`<summary>Click to expand raw diff</summary>`);
114
+ lines.push(``);
115
+ lines.push('```diff');
116
+ lines.push(handoff.raw_diff);
117
+ lines.push('```');
118
+ lines.push(``);
119
+ lines.push(`</details>`);
120
+ lines.push(``);
121
+ }
122
+ lines.push(`---`);
123
+ lines.push(`*Generated by [Relay](https://github.com/relay-ai/relay) — cross-platform AI context handoff*`);
124
+ lines.push(``);
125
+ return lines.join('\n');
126
+ }
127
+ // ─── Agent Prompt Renderer ────────────────────────────────────────────────────
128
+ // Produces a compact structured prompt for pasting into or injecting into an agent.
129
+ // Optimised for minimal token usage while preserving all critical context.
130
+ export function renderAgentPrompt(handoff) {
131
+ const lines = [];
132
+ lines.push(`## RELAY CONTEXT HANDOFF`);
133
+ lines.push(`You are continuing work that was started on ${handoff.source_platform}.`);
134
+ lines.push(`Read this handoff carefully before doing anything else.`);
135
+ lines.push(``);
136
+ lines.push(`**GOAL:** ${handoff.session.goal}`);
137
+ lines.push(`**STATUS:** ${handoff.session.status}`);
138
+ lines.push(`**BRANCH:** ${handoff.repository.branch} @ ${handoff.repository.head_commit}`);
139
+ lines.push(``);
140
+ if (handoff.files_modified.length > 0) {
141
+ lines.push(`**FILES CHANGED THIS SESSION:**`);
142
+ for (const f of handoff.files_modified) {
143
+ lines.push(`- ${f.path} (${f.status}): ${f.summary}`);
144
+ }
145
+ lines.push(``);
146
+ }
147
+ if (handoff.decisions.length > 0) {
148
+ lines.push(`**DECISIONS ALREADY MADE (do not reverse without flagging):**`);
149
+ for (const d of handoff.decisions) {
150
+ lines.push(`- ${d.what} — because: ${d.why}${d.evidence ? ` [${d.evidence}]` : ''}`);
151
+ }
152
+ lines.push(``);
153
+ }
154
+ if (handoff.constraints.length > 0) {
155
+ lines.push(`**HARD CONSTRAINTS (MUST NOT be violated):**`);
156
+ for (const c of handoff.constraints) {
157
+ lines.push(`- ${c}`);
158
+ }
159
+ lines.push(``);
160
+ }
161
+ if (handoff.failed_approaches.length > 0) {
162
+ lines.push(`**APPROACHES THAT FAILED — DO NOT REPEAT:**`);
163
+ for (const f of handoff.failed_approaches) {
164
+ lines.push(`- ${f.approach}: ${f.why_failed}`);
165
+ }
166
+ lines.push(``);
167
+ }
168
+ if (handoff.next_steps.length > 0) {
169
+ const immediate = handoff.next_steps.filter((s) => s.priority === 'immediate');
170
+ const rest = handoff.next_steps.filter((s) => s.priority !== 'immediate');
171
+ if (immediate.length > 0) {
172
+ lines.push(`**IMMEDIATE NEXT STEPS (do these first, in order):**`);
173
+ immediate.forEach((s, i) => {
174
+ lines.push(`${i + 1}. ${s.task}${s.context ? ` (${s.context})` : ''}${s.file_hint ? ` → start at \`${s.file_hint}\`` : ''}`);
175
+ });
176
+ lines.push(``);
177
+ }
178
+ if (rest.length > 0) {
179
+ lines.push(`**BACKLOG (after immediate steps):**`);
180
+ for (const s of rest) {
181
+ lines.push(`- [${s.priority.toUpperCase()}] ${s.task}`);
182
+ }
183
+ lines.push(``);
184
+ }
185
+ }
186
+ lines.push(`**BEGIN** — Acknowledge this handoff and state what you will do first.`);
187
+ return lines.join('\n');
188
+ }
189
+ // ─── History summary renderer ─────────────────────────────────────────────────
190
+ export function renderHistoryList(entries) {
191
+ if (entries.length === 0) {
192
+ return 'No handoff history found. Run `relay save` to create your first handoff.';
193
+ }
194
+ const lines = [];
195
+ lines.push(`Handoff History (${entries.length} total)`);
196
+ lines.push(`${'─'.repeat(60)}`);
197
+ for (const e of entries) {
198
+ const ts = new Date(e.timestamp).toLocaleString();
199
+ const statusIcon = e.status === 'completed' ? '✅' : e.status === 'blocked' ? '🔴' : '🟡';
200
+ lines.push(`${statusIcon} [${e.id}] ${ts}`);
201
+ lines.push(` Platform: ${e.source_platform} | Status: ${e.status}`);
202
+ lines.push(` Goal: ${e.goal}`);
203
+ lines.push(``);
204
+ }
205
+ return lines.join('\n');
206
+ }
207
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/format/renderer.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,sCAAsC;AAEtC,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;IAExD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,OAAO,CAAC,eAAe,gBAAgB,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9G,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,EAAE,kBAAkB,OAAO,CAAC,OAAO,MAAM,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,6EAA6E;IAC7E,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,6EAA6E;IAC7E,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,UAAU,CAAC,WAAW,MAAM,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC;IACtE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,6EAA6E;IAC7E,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAChF,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,6EAA6E;IAC7E,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kGAAkG,CAAC,CAAC;QAC/G,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,2FAA2F,CAAC,CAAC;QACxG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,6EAA6E;IAC7E,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;QACpG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;QAEvE,MAAM,WAAW,GAAG,CAAC,KAAgC,EAAE,KAAc,EAAE,EAAE;YACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC/B,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;gBACtC,IAAI,CAAC,CAAC,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxD,IAAI,CAAC,CAAC,SAAS;oBAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC,CAAC;QAEF,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChH,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAChC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpC,CAAC;IAED,6EAA6E;IAC7E,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;IAC5G,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,iFAAiF;AACjF,oFAAoF;AACpF,2EAA2E;AAE3E,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,+CAA+C,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC;IACtF,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,UAAU,CAAC,MAAM,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC5E,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;QAE1E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACnE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACzB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/H,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IAErF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,0EAA0E,CAAC;IACpF,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACzF,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,eAAe,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}