dmux 2.2.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +412 -179
- package/dist/DmuxApp.js.map +1 -1
- package/dist/MergePane.d.ts.map +1 -1
- package/dist/MergePane.js +4 -15
- package/dist/MergePane.js.map +1 -1
- package/dist/PaneAnalyzer.d.ts +45 -0
- package/dist/PaneAnalyzer.d.ts.map +1 -0
- package/dist/PaneAnalyzer.js +278 -0
- package/dist/PaneAnalyzer.js.map +1 -0
- package/dist/_plugin-vue_export-helper.css +1 -0
- package/dist/actions/index.d.ts +19 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +54 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/paneActions.d.ts +45 -0
- package/dist/actions/paneActions.d.ts.map +1 -0
- package/dist/actions/paneActions.js +932 -0
- package/dist/actions/paneActions.js.map +1 -0
- package/dist/actions/types.d.ts +101 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +129 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/adapters/apiActionHandler.d.ts +64 -0
- package/dist/adapters/apiActionHandler.d.ts.map +1 -0
- package/dist/adapters/apiActionHandler.js +170 -0
- package/dist/adapters/apiActionHandler.js.map +1 -0
- package/dist/adapters/tuiActionHandler.d.ts +57 -0
- package/dist/adapters/tuiActionHandler.d.ts.map +1 -0
- package/dist/adapters/tuiActionHandler.js +152 -0
- package/dist/adapters/tuiActionHandler.js.map +1 -0
- package/dist/chunks/_plugin-vue_export-helper-Cvoq67hi.js +28 -0
- package/dist/components/ActionChoiceDialog.d.ts +16 -0
- package/dist/components/ActionChoiceDialog.d.ts.map +1 -0
- package/dist/components/ActionChoiceDialog.js +29 -0
- package/dist/components/ActionChoiceDialog.js.map +1 -0
- package/dist/components/ActionConfirmDialog.d.ts +16 -0
- package/dist/components/ActionConfirmDialog.d.ts.map +1 -0
- package/dist/components/ActionConfirmDialog.js +31 -0
- package/dist/components/ActionConfirmDialog.js.map +1 -0
- package/dist/components/ActionInputDialog.d.ts +16 -0
- package/dist/components/ActionInputDialog.d.ts.map +1 -0
- package/dist/components/ActionInputDialog.js +49 -0
- package/dist/components/ActionInputDialog.js.map +1 -0
- package/dist/components/ActionProgressDialog.d.ts +13 -0
- package/dist/components/ActionProgressDialog.d.ts.map +1 -0
- package/dist/components/ActionProgressDialog.js +20 -0
- package/dist/components/ActionProgressDialog.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +2 -0
- package/dist/components/FooterHelp.d.ts.map +1 -1
- package/dist/components/FooterHelp.js +9 -2
- package/dist/components/FooterHelp.js.map +1 -1
- package/dist/components/KebabMenu.d.ts +10 -0
- package/dist/components/KebabMenu.d.ts.map +1 -0
- package/dist/components/KebabMenu.js +18 -0
- package/dist/components/KebabMenu.js.map +1 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -1
- package/dist/components/LoadingIndicator.js +5 -5
- package/dist/components/LoadingIndicator.js.map +1 -1
- package/dist/components/PaneCard.d.ts +1 -0
- package/dist/components/PaneCard.d.ts.map +1 -1
- package/dist/components/PaneCard.js +21 -20
- package/dist/components/PaneCard.js.map +1 -1
- package/dist/components/PanesGrid.d.ts +1 -0
- package/dist/components/PanesGrid.d.ts.map +1 -1
- package/dist/components/PanesGrid.js +5 -4
- package/dist/components/PanesGrid.js.map +1 -1
- package/dist/components/QRCode.d.ts +7 -0
- package/dist/components/QRCode.d.ts.map +1 -0
- package/dist/components/QRCode.js +19 -0
- package/dist/components/QRCode.js.map +1 -0
- package/dist/components/Spinner.d.ts +10 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +15 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/dashboard.html +14 -0
- package/dist/dashboard.js +2 -0
- package/dist/hooks/useActionSystem.d.ts +31 -0
- package/dist/hooks/useActionSystem.d.ts.map +1 -0
- package/dist/hooks/useActionSystem.js +95 -0
- package/dist/hooks/useActionSystem.js.map +1 -0
- package/dist/hooks/useAgentStatus.d.ts +4 -3
- package/dist/hooks/useAgentStatus.d.ts.map +1 -1
- package/dist/hooks/useAgentStatus.js +45 -194
- package/dist/hooks/useAgentStatus.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +2 -1
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +46 -100
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +5 -3
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +18 -1
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -1
- package/dist/hooks/useWorktreeActions.js +4 -0
- package/dist/hooks/useWorktreeActions.js.map +1 -1
- package/dist/index.js +43 -6
- package/dist/index.js.map +1 -1
- package/dist/server/actionsApi.d.ts +37 -0
- package/dist/server/actionsApi.d.ts.map +1 -0
- package/dist/server/actionsApi.js +256 -0
- package/dist/server/actionsApi.js.map +1 -0
- package/dist/server/embedded-assets.d.ts +13 -0
- package/dist/server/embedded-assets.d.ts.map +1 -0
- package/dist/server/embedded-assets.js +5012 -0
- package/dist/server/embedded-assets.js.map +1 -0
- package/dist/server/index.d.ts +21 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +99 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes.d.ts +3 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/routes.js +672 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/static.d.ts +6 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +3040 -0
- package/dist/server/static.js.map +1 -0
- package/dist/services/ConfigWatcher.d.ts +20 -0
- package/dist/services/ConfigWatcher.d.ts.map +1 -0
- package/dist/services/ConfigWatcher.js +75 -0
- package/dist/services/ConfigWatcher.js.map +1 -0
- package/dist/services/PaneWorkerManager.d.ts +69 -0
- package/dist/services/PaneWorkerManager.d.ts.map +1 -0
- package/dist/services/PaneWorkerManager.js +272 -0
- package/dist/services/PaneWorkerManager.js.map +1 -0
- package/dist/services/StatusDetector.d.ts +87 -0
- package/dist/services/StatusDetector.d.ts.map +1 -0
- package/dist/services/StatusDetector.js +387 -0
- package/dist/services/StatusDetector.js.map +1 -0
- package/dist/services/TerminalDiffer.d.ts +85 -0
- package/dist/services/TerminalDiffer.d.ts.map +1 -0
- package/dist/services/TerminalDiffer.js +499 -0
- package/dist/services/TerminalDiffer.js.map +1 -0
- package/dist/services/TerminalStreamer.d.ts +80 -0
- package/dist/services/TerminalStreamer.d.ts.map +1 -0
- package/dist/services/TerminalStreamer.js +490 -0
- package/dist/services/TerminalStreamer.js.map +1 -0
- package/dist/services/TunnelService.d.ts +9 -0
- package/dist/services/TunnelService.d.ts.map +1 -0
- package/dist/services/TunnelService.js +34 -0
- package/dist/services/TunnelService.js.map +1 -0
- package/dist/services/WorkerMessageBus.d.ts +48 -0
- package/dist/services/WorkerMessageBus.d.ts.map +1 -0
- package/dist/services/WorkerMessageBus.js +120 -0
- package/dist/services/WorkerMessageBus.js.map +1 -0
- package/dist/shared/StateManager.d.ts +34 -0
- package/dist/shared/StateManager.d.ts.map +1 -0
- package/dist/shared/StateManager.js +108 -0
- package/dist/shared/StateManager.js.map +1 -0
- package/dist/shared/StreamProtocol.d.ts +75 -0
- package/dist/shared/StreamProtocol.d.ts.map +1 -0
- package/dist/shared/StreamProtocol.js +37 -0
- package/dist/shared/StreamProtocol.js.map +1 -0
- package/dist/terminal.html +17 -0
- package/dist/terminal.js +3 -0
- package/dist/types.d.ts +21 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/agentDetection.d.ts +18 -0
- package/dist/utils/agentDetection.d.ts.map +1 -0
- package/dist/utils/agentDetection.js +73 -0
- package/dist/utils/agentDetection.js.map +1 -0
- package/dist/utils/aiMerge.d.ts +35 -0
- package/dist/utils/aiMerge.d.ts.map +1 -0
- package/dist/utils/aiMerge.js +298 -0
- package/dist/utils/aiMerge.js.map +1 -0
- package/dist/utils/conflictResolutionPane.d.ts +19 -0
- package/dist/utils/conflictResolutionPane.d.ts.map +1 -0
- package/dist/utils/conflictResolutionPane.js +214 -0
- package/dist/utils/conflictResolutionPane.js.map +1 -0
- package/dist/utils/mergeExecution.d.ts +52 -0
- package/dist/utils/mergeExecution.d.ts.map +1 -0
- package/dist/utils/mergeExecution.js +192 -0
- package/dist/utils/mergeExecution.js.map +1 -0
- package/dist/utils/mergeValidation.d.ts +67 -0
- package/dist/utils/mergeValidation.d.ts.map +1 -0
- package/dist/utils/mergeValidation.js +213 -0
- package/dist/utils/mergeValidation.js.map +1 -0
- package/dist/utils/paneCreation.d.ts +17 -0
- package/dist/utils/paneCreation.d.ts.map +1 -0
- package/dist/utils/paneCreation.js +274 -0
- package/dist/utils/paneCreation.js.map +1 -0
- package/dist/utils/port.d.ts +5 -0
- package/dist/utils/port.d.ts.map +1 -0
- package/dist/utils/port.js +54 -0
- package/dist/utils/port.js.map +1 -0
- package/dist/workers/PaneWorker.d.ts +2 -0
- package/dist/workers/PaneWorker.d.ts.map +1 -0
- package/dist/workers/PaneWorker.js +362 -0
- package/dist/workers/PaneWorker.js.map +1 -0
- package/dist/workers/WorkerMessages.d.ts +36 -0
- package/dist/workers/WorkerMessages.d.ts.map +1 -0
- package/dist/workers/WorkerMessages.js +9 -0
- package/dist/workers/WorkerMessages.js.map +1 -0
- package/package.json +19 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiMerge.d.ts","sourceRoot":"","sources":["../../src/utils/aiMerge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuFH;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiCxF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqCpF;AAqED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkEzE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiC/F"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-Assisted Merge Utilities
|
|
3
|
+
*
|
|
4
|
+
* Uses AI to help resolve merge conflicts intelligently
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import fs from 'fs/promises';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* Fetch with timeout wrapper
|
|
11
|
+
*/
|
|
12
|
+
async function fetchWithTimeout(url, options, timeoutMs) {
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
15
|
+
try {
|
|
16
|
+
const response = await fetch(url, {
|
|
17
|
+
...options,
|
|
18
|
+
signal: controller.signal,
|
|
19
|
+
});
|
|
20
|
+
clearTimeout(timeoutId);
|
|
21
|
+
return response;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
clearTimeout(timeoutId);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Call OpenRouter API for AI assistance
|
|
30
|
+
*/
|
|
31
|
+
async function callOpenRouter(prompt, maxTokens = 1000, timeoutMs = 12000) {
|
|
32
|
+
const apiKey = process.env.OPENROUTER_API_KEY;
|
|
33
|
+
if (!apiKey)
|
|
34
|
+
return null;
|
|
35
|
+
try {
|
|
36
|
+
const response = await fetchWithTimeout('https://openrouter.ai/api/v1/chat/completions', {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
41
|
+
},
|
|
42
|
+
body: JSON.stringify({
|
|
43
|
+
model: 'openai/gpt-4o-mini',
|
|
44
|
+
messages: [
|
|
45
|
+
{
|
|
46
|
+
role: 'user',
|
|
47
|
+
content: prompt,
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
max_tokens: maxTokens,
|
|
51
|
+
temperature: 0.3,
|
|
52
|
+
}),
|
|
53
|
+
}, timeoutMs);
|
|
54
|
+
if (response.ok) {
|
|
55
|
+
const data = (await response.json());
|
|
56
|
+
return data.choices[0].message.content.trim();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Call Claude Code CLI for AI assistance
|
|
66
|
+
*/
|
|
67
|
+
async function callClaudeCode(prompt, timeoutMs = 15000) {
|
|
68
|
+
try {
|
|
69
|
+
const result = execSync(`echo "${prompt.replace(/"/g, '\\"')}" | claude --no-interactive --max-turns 1 2>/dev/null`, {
|
|
70
|
+
encoding: 'utf-8',
|
|
71
|
+
stdio: 'pipe',
|
|
72
|
+
timeout: timeoutMs,
|
|
73
|
+
});
|
|
74
|
+
return result.trim() || null;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get comprehensive git diff with context for commit message generation
|
|
82
|
+
*/
|
|
83
|
+
export function getComprehensiveDiff(repoPath) {
|
|
84
|
+
try {
|
|
85
|
+
// Get staged changes first, then fall back to unstaged if nothing staged
|
|
86
|
+
let diff = execSync('git diff --cached', {
|
|
87
|
+
cwd: repoPath,
|
|
88
|
+
encoding: 'utf-8',
|
|
89
|
+
stdio: 'pipe',
|
|
90
|
+
});
|
|
91
|
+
let staged = true;
|
|
92
|
+
// If nothing staged, check unstaged changes
|
|
93
|
+
if (!diff.trim()) {
|
|
94
|
+
diff = execSync('git diff', {
|
|
95
|
+
cwd: repoPath,
|
|
96
|
+
encoding: 'utf-8',
|
|
97
|
+
stdio: 'pipe',
|
|
98
|
+
});
|
|
99
|
+
staged = false;
|
|
100
|
+
}
|
|
101
|
+
// Get file summary
|
|
102
|
+
const statusCmd = staged ? 'git diff --cached --stat' : 'git diff --stat';
|
|
103
|
+
const summary = execSync(statusCmd, {
|
|
104
|
+
cwd: repoPath,
|
|
105
|
+
encoding: 'utf-8',
|
|
106
|
+
stdio: 'pipe',
|
|
107
|
+
});
|
|
108
|
+
return { diff, summary };
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return { diff: '', summary: '' };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get AI-generated commit message from git diff
|
|
116
|
+
* Returns null if generation fails, so caller can handle fallback
|
|
117
|
+
*/
|
|
118
|
+
export async function generateCommitMessage(repoPath) {
|
|
119
|
+
try {
|
|
120
|
+
const { diff, summary } = getComprehensiveDiff(repoPath);
|
|
121
|
+
if (!diff.trim()) {
|
|
122
|
+
return null; // No changes, let caller handle
|
|
123
|
+
}
|
|
124
|
+
// Include more context (up to 5000 chars) for better commit messages
|
|
125
|
+
const contextDiff = diff.length > 5000 ? diff.slice(0, 5000) + '\n...(truncated)' : diff;
|
|
126
|
+
const prompt = `Generate a concise conventional commit message (e.g., "feat: add feature", "fix: bug") for these changes. Respond with ONLY the commit message, nothing else:\n\nFile changes:\n${summary}\n\nDiff:\n${contextDiff}`;
|
|
127
|
+
// Try OpenRouter first
|
|
128
|
+
let message = await callOpenRouter(prompt, 50);
|
|
129
|
+
if (message) {
|
|
130
|
+
// Clean up the response
|
|
131
|
+
message = message.replace(/^["']|["']$/g, '').trim();
|
|
132
|
+
if (message && message.length < 100) {
|
|
133
|
+
return message;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Try Claude Code as fallback
|
|
137
|
+
message = await callClaudeCode(prompt);
|
|
138
|
+
if (message) {
|
|
139
|
+
message = message.replace(/^["']|["']$/g, '').trim();
|
|
140
|
+
if (message && message.length < 100) {
|
|
141
|
+
return message;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Both methods failed
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Read a file with conflict markers
|
|
153
|
+
*/
|
|
154
|
+
async function readConflictFile(filePath) {
|
|
155
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
156
|
+
}
|
|
157
|
+
function parseConflicts(content) {
|
|
158
|
+
const sections = [];
|
|
159
|
+
const lines = content.split('\n');
|
|
160
|
+
let i = 0;
|
|
161
|
+
while (i < lines.length) {
|
|
162
|
+
if (lines[i].startsWith('<<<<<<<')) {
|
|
163
|
+
let ours = '';
|
|
164
|
+
let theirs = '';
|
|
165
|
+
let base = '';
|
|
166
|
+
i++;
|
|
167
|
+
// Read "ours" section
|
|
168
|
+
while (i < lines.length && !lines[i].startsWith('=======')) {
|
|
169
|
+
ours += lines[i] + '\n';
|
|
170
|
+
i++;
|
|
171
|
+
}
|
|
172
|
+
i++; // Skip =======
|
|
173
|
+
// Read "theirs" section (or base if 3-way)
|
|
174
|
+
while (i < lines.length && !lines[i].startsWith('>>>>>>>') && !lines[i].startsWith('|||||||')) {
|
|
175
|
+
if (lines[i].startsWith('|||||||')) {
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
theirs += lines[i] + '\n';
|
|
179
|
+
i++;
|
|
180
|
+
}
|
|
181
|
+
// Check for 3-way merge (with base)
|
|
182
|
+
if (i < lines.length && lines[i].startsWith('|||||||')) {
|
|
183
|
+
base = theirs;
|
|
184
|
+
theirs = '';
|
|
185
|
+
i++; // Skip |||||||
|
|
186
|
+
while (i < lines.length && !lines[i].startsWith('>>>>>>>')) {
|
|
187
|
+
theirs += lines[i] + '\n';
|
|
188
|
+
i++;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
sections.push({
|
|
192
|
+
ours: ours.trim(),
|
|
193
|
+
theirs: theirs.trim(),
|
|
194
|
+
base: base.trim() || undefined,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
i++;
|
|
198
|
+
}
|
|
199
|
+
return sections;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Use AI to resolve a merge conflict
|
|
203
|
+
*/
|
|
204
|
+
export async function aiResolveConflict(filePath, repoPath) {
|
|
205
|
+
try {
|
|
206
|
+
const fullPath = path.join(repoPath, filePath);
|
|
207
|
+
const content = await readConflictFile(fullPath);
|
|
208
|
+
const conflicts = parseConflicts(content);
|
|
209
|
+
if (conflicts.length === 0) {
|
|
210
|
+
return {
|
|
211
|
+
success: true,
|
|
212
|
+
resolvedContent: content,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
// For now, use a simple strategy: try to intelligently merge both versions
|
|
216
|
+
const prompt = `You are resolving a git merge conflict. Below is a file with conflict markers.
|
|
217
|
+
|
|
218
|
+
Your task: Provide the COMPLETE resolved file content that intelligently combines both versions. Do NOT include any explanations, just the final file content.
|
|
219
|
+
|
|
220
|
+
File: ${filePath}
|
|
221
|
+
|
|
222
|
+
Conflict sections:
|
|
223
|
+
${conflicts
|
|
224
|
+
.map((c, i) => `
|
|
225
|
+
Conflict ${i + 1}:
|
|
226
|
+
<<<<<<< OURS (current branch)
|
|
227
|
+
${c.ours}
|
|
228
|
+
=======
|
|
229
|
+
>>>>>>> THEIRS (incoming branch)
|
|
230
|
+
${c.theirs}
|
|
231
|
+
`)
|
|
232
|
+
.join('\n')}
|
|
233
|
+
|
|
234
|
+
Full file content:
|
|
235
|
+
${content}
|
|
236
|
+
|
|
237
|
+
Respond with ONLY the complete resolved file content, no explanations:`;
|
|
238
|
+
// Try OpenRouter with longer timeout for conflict resolution
|
|
239
|
+
let resolved = await callOpenRouter(prompt, 2000, 20000);
|
|
240
|
+
if (!resolved) {
|
|
241
|
+
// Try Claude Code with longer timeout for conflict resolution
|
|
242
|
+
resolved = await callClaudeCode(prompt, 20000);
|
|
243
|
+
}
|
|
244
|
+
if (!resolved) {
|
|
245
|
+
return {
|
|
246
|
+
success: false,
|
|
247
|
+
error: 'AI resolution unavailable',
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
// Remove any markdown code fences if present
|
|
251
|
+
resolved = resolved.replace(/^```[\w]*\n/gm, '').replace(/\n```$/gm, '');
|
|
252
|
+
return {
|
|
253
|
+
success: true,
|
|
254
|
+
resolvedContent: resolved,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
return {
|
|
259
|
+
success: false,
|
|
260
|
+
error: error instanceof Error ? error.message : String(error),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Resolve all conflicts in a repository using AI
|
|
266
|
+
*/
|
|
267
|
+
export async function aiResolveAllConflicts(repoPath, conflictFiles) {
|
|
268
|
+
const resolvedFiles = [];
|
|
269
|
+
const failedFiles = [];
|
|
270
|
+
for (const file of conflictFiles) {
|
|
271
|
+
const result = await aiResolveConflict(file, repoPath);
|
|
272
|
+
if (result.success && result.resolvedContent) {
|
|
273
|
+
try {
|
|
274
|
+
// Write resolved content
|
|
275
|
+
await fs.writeFile(path.join(repoPath, file), result.resolvedContent, 'utf-8');
|
|
276
|
+
// Stage the resolved file
|
|
277
|
+
execSync(`git add "${file}"`, {
|
|
278
|
+
cwd: repoPath,
|
|
279
|
+
stdio: 'pipe',
|
|
280
|
+
});
|
|
281
|
+
resolvedFiles.push(file);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
failedFiles.push(file);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
failedFiles.push(file);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
success: failedFiles.length === 0,
|
|
293
|
+
resolvedFiles,
|
|
294
|
+
failedFiles,
|
|
295
|
+
error: failedFiles.length > 0 ? `Failed to resolve: ${failedFiles.join(', ')}` : undefined,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=aiMerge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiMerge.js","sourceRoot":"","sources":["../../src/utils/aiMerge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolution Pane Creation
|
|
3
|
+
*
|
|
4
|
+
* Utilities for creating a new pane specifically for AI-assisted merge conflict resolution
|
|
5
|
+
*/
|
|
6
|
+
import type { DmuxPane } from '../types.js';
|
|
7
|
+
export interface ConflictResolutionPaneOptions {
|
|
8
|
+
sourceBranch: string;
|
|
9
|
+
targetBranch: string;
|
|
10
|
+
targetRepoPath: string;
|
|
11
|
+
agent: 'claude' | 'opencode';
|
|
12
|
+
projectName: string;
|
|
13
|
+
existingPanes: DmuxPane[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a pane for resolving merge conflicts with AI assistance
|
|
17
|
+
*/
|
|
18
|
+
export declare function createConflictResolutionPane(options: ConflictResolutionPaneOptions): Promise<DmuxPane>;
|
|
19
|
+
//# sourceMappingURL=conflictResolutionPane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflictResolutionPane.d.ts","sourceRoot":"","sources":["../../src/utils/conflictResolutionPane.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,QAAQ,CAAC,CAgInB"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolution Pane Creation
|
|
3
|
+
*
|
|
4
|
+
* Utilities for creating a new pane specifically for AI-assisted merge conflict resolution
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import { applySmartLayout } from './tmux.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create a pane for resolving merge conflicts with AI assistance
|
|
10
|
+
*/
|
|
11
|
+
export async function createConflictResolutionPane(options) {
|
|
12
|
+
const { sourceBranch, targetBranch, targetRepoPath, agent, projectName, existingPanes } = options;
|
|
13
|
+
// Generate slug for this conflict resolution session
|
|
14
|
+
const slug = `merge-${sourceBranch}-into-${targetBranch}`.substring(0, 50);
|
|
15
|
+
// Get current pane info
|
|
16
|
+
const originalPaneId = execSync('tmux display-message -p "#{pane_id}"', {
|
|
17
|
+
encoding: 'utf-8',
|
|
18
|
+
}).trim();
|
|
19
|
+
// Get current pane count
|
|
20
|
+
const paneCount = parseInt(execSync('tmux list-panes | wc -l', { encoding: 'utf-8' }).trim());
|
|
21
|
+
// Enable pane borders to show titles
|
|
22
|
+
try {
|
|
23
|
+
execSync(`tmux set-option -g pane-border-status top`, { stdio: 'pipe' });
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Ignore if already set or fails
|
|
27
|
+
}
|
|
28
|
+
// Create new pane
|
|
29
|
+
const paneInfo = execSync(`tmux split-window -h -P -F '#{pane_id}'`, {
|
|
30
|
+
encoding: 'utf-8',
|
|
31
|
+
}).trim();
|
|
32
|
+
// Wait for pane creation to settle
|
|
33
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
34
|
+
// Set pane title
|
|
35
|
+
try {
|
|
36
|
+
execSync(`tmux select-pane -t '${paneInfo}' -T "${slug}"`, {
|
|
37
|
+
stdio: 'pipe',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Ignore if setting title fails
|
|
42
|
+
}
|
|
43
|
+
// Apply smart layout based on pane count
|
|
44
|
+
const newPaneCount = paneCount + 1;
|
|
45
|
+
applySmartLayout(newPaneCount);
|
|
46
|
+
// CD into the target repository (where we'll resolve conflicts)
|
|
47
|
+
try {
|
|
48
|
+
execSync(`tmux send-keys -t '${paneInfo}' 'cd "${targetRepoPath}"' Enter`, {
|
|
49
|
+
stdio: 'pipe',
|
|
50
|
+
});
|
|
51
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error('[conflictResolutionPane] Failed to cd into target repo:', error);
|
|
55
|
+
}
|
|
56
|
+
// Construct the AI prompt for conflict resolution
|
|
57
|
+
const prompt = `There are conflicts merging ${sourceBranch} into ${targetBranch}. Both are valid changes, so please keep both feature sets and merge them intelligently. Check git status to see the conflicting files, then resolve each conflict to preserve both sets of changes.`;
|
|
58
|
+
// Launch agent with the conflict resolution prompt
|
|
59
|
+
if (agent === 'claude') {
|
|
60
|
+
const escapedPrompt = prompt
|
|
61
|
+
.replace(/\\/g, '\\\\')
|
|
62
|
+
.replace(/"/g, '\\"')
|
|
63
|
+
.replace(/`/g, '\\`')
|
|
64
|
+
.replace(/\$/g, '\\$');
|
|
65
|
+
const claudeCmd = `claude "${escapedPrompt}" --permission-mode=acceptEdits`;
|
|
66
|
+
const escapedCmd = claudeCmd.replace(/'/g, "'\\''");
|
|
67
|
+
execSync(`tmux send-keys -t '${paneInfo}' '${escapedCmd}'`, {
|
|
68
|
+
stdio: 'pipe',
|
|
69
|
+
});
|
|
70
|
+
execSync(`tmux send-keys -t '${paneInfo}' Enter`, { stdio: 'pipe' });
|
|
71
|
+
// Auto-approve trust prompts for Claude
|
|
72
|
+
autoApproveTrustPrompt(paneInfo).catch(() => {
|
|
73
|
+
// Ignore errors in background monitoring
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (agent === 'opencode') {
|
|
77
|
+
const openCoderCmd = `opencode`;
|
|
78
|
+
const escapedOpenCmd = openCoderCmd.replace(/'/g, "'\\''");
|
|
79
|
+
execSync(`tmux send-keys -t '${paneInfo}' '${escapedOpenCmd}'`, {
|
|
80
|
+
stdio: 'pipe',
|
|
81
|
+
});
|
|
82
|
+
execSync(`tmux send-keys -t '${paneInfo}' Enter`, { stdio: 'pipe' });
|
|
83
|
+
// Wait for opencode to start, then paste the prompt
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
85
|
+
const bufName = `dmux_prompt_${Date.now()}`;
|
|
86
|
+
const promptEsc = prompt.replace(/\\/g, '\\\\').replace(/'/g, "'\\''");
|
|
87
|
+
execSync(`tmux set-buffer -b '${bufName}' -- '${promptEsc}'`, {
|
|
88
|
+
stdio: 'pipe',
|
|
89
|
+
});
|
|
90
|
+
execSync(`tmux paste-buffer -b '${bufName}' -t '${paneInfo}'`, {
|
|
91
|
+
stdio: 'pipe',
|
|
92
|
+
});
|
|
93
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
94
|
+
execSync(`tmux delete-buffer -b '${bufName}'`, { stdio: 'pipe' });
|
|
95
|
+
execSync(`tmux send-keys -t '${paneInfo}' Enter`, { stdio: 'pipe' });
|
|
96
|
+
}
|
|
97
|
+
// Keep focus on the new pane
|
|
98
|
+
execSync(`tmux select-pane -t '${paneInfo}'`, { stdio: 'pipe' });
|
|
99
|
+
// Create the pane object
|
|
100
|
+
const newPane = {
|
|
101
|
+
id: `dmux-${Date.now()}`,
|
|
102
|
+
slug,
|
|
103
|
+
prompt,
|
|
104
|
+
paneId: paneInfo,
|
|
105
|
+
agent,
|
|
106
|
+
// Note: No worktreePath - this pane operates directly in the target repo
|
|
107
|
+
};
|
|
108
|
+
// Switch back to the original pane
|
|
109
|
+
execSync(`tmux select-pane -t '${originalPaneId}'`, { stdio: 'pipe' });
|
|
110
|
+
// Re-set the title for the dmux pane
|
|
111
|
+
try {
|
|
112
|
+
execSync(`tmux select-pane -t '${originalPaneId}' -T "dmux-${projectName}"`, { stdio: 'pipe' });
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Ignore if setting title fails
|
|
116
|
+
}
|
|
117
|
+
return newPane;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Auto-approve Claude trust prompts (reused from paneCreation.ts)
|
|
121
|
+
*/
|
|
122
|
+
async function autoApproveTrustPrompt(paneInfo) {
|
|
123
|
+
// Wait for Claude to start up before checking for prompts
|
|
124
|
+
await new Promise((resolve) => setTimeout(resolve, 800));
|
|
125
|
+
const maxChecks = 100;
|
|
126
|
+
const checkInterval = 100;
|
|
127
|
+
let lastContent = '';
|
|
128
|
+
let stableContentCount = 0;
|
|
129
|
+
let promptHandled = false;
|
|
130
|
+
const trustPromptPatterns = [
|
|
131
|
+
/Do you trust the files in this folder\?/i,
|
|
132
|
+
/Trust the files in this workspace\?/i,
|
|
133
|
+
/Do you trust the authors of the files/i,
|
|
134
|
+
/Do you want to trust this workspace\?/i,
|
|
135
|
+
/trust.*files.*folder/i,
|
|
136
|
+
/trust.*workspace/i,
|
|
137
|
+
/Do you trust/i,
|
|
138
|
+
/Trust this folder/i,
|
|
139
|
+
/trust.*directory/i,
|
|
140
|
+
/permission.*grant/i,
|
|
141
|
+
/allow.*access/i,
|
|
142
|
+
/workspace.*trust/i,
|
|
143
|
+
/accept.*edits/i,
|
|
144
|
+
/permission.*mode/i,
|
|
145
|
+
/allow.*claude/i,
|
|
146
|
+
/\[y\/n\]/i,
|
|
147
|
+
/\(y\/n\)/i,
|
|
148
|
+
/Yes\/No/i,
|
|
149
|
+
/\[Y\/n\]/i,
|
|
150
|
+
/press.*enter.*accept/i,
|
|
151
|
+
/press.*enter.*continue/i,
|
|
152
|
+
/❯\s*1\.\s*Yes,\s*proceed/i,
|
|
153
|
+
/Enter to confirm.*Esc to exit/i,
|
|
154
|
+
/1\.\s*Yes,\s*proceed/i,
|
|
155
|
+
/2\.\s*No,\s*exit/i,
|
|
156
|
+
];
|
|
157
|
+
for (let i = 0; i < maxChecks; i++) {
|
|
158
|
+
await new Promise((resolve) => setTimeout(resolve, checkInterval));
|
|
159
|
+
try {
|
|
160
|
+
const paneContent = execSync(`tmux capture-pane -t '${paneInfo}' -p -S -30`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
161
|
+
if (paneContent === lastContent) {
|
|
162
|
+
stableContentCount++;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
stableContentCount = 0;
|
|
166
|
+
lastContent = paneContent;
|
|
167
|
+
}
|
|
168
|
+
const hasTrustPrompt = trustPromptPatterns.some((pattern) => pattern.test(paneContent));
|
|
169
|
+
const hasClaudePermissionPrompt = paneContent.includes('Do you trust') ||
|
|
170
|
+
paneContent.includes('trust the files') ||
|
|
171
|
+
paneContent.includes('permission') ||
|
|
172
|
+
paneContent.includes('allow') ||
|
|
173
|
+
(paneContent.includes('folder') && paneContent.includes('?'));
|
|
174
|
+
if ((hasTrustPrompt || hasClaudePermissionPrompt) && !promptHandled) {
|
|
175
|
+
if (stableContentCount >= 2) {
|
|
176
|
+
const isNewClaudeFormat = /❯\s*1\.\s*Yes,\s*proceed/i.test(paneContent) ||
|
|
177
|
+
/Enter to confirm.*Esc to exit/i.test(paneContent);
|
|
178
|
+
if (isNewClaudeFormat) {
|
|
179
|
+
execSync(`tmux send-keys -t '${paneInfo}' Enter`, {
|
|
180
|
+
stdio: 'pipe',
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
execSync(`tmux send-keys -t '${paneInfo}' 'y'`, { stdio: 'pipe' });
|
|
185
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
186
|
+
execSync(`tmux send-keys -t '${paneInfo}' Enter`, {
|
|
187
|
+
stdio: 'pipe',
|
|
188
|
+
});
|
|
189
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
190
|
+
execSync(`tmux send-keys -t '${paneInfo}' Enter`, {
|
|
191
|
+
stdio: 'pipe',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
promptHandled = true;
|
|
195
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
196
|
+
const updatedContent = execSync(`tmux capture-pane -t '${paneInfo}' -p -S -10`, { encoding: 'utf-8', stdio: 'pipe' });
|
|
197
|
+
const promptGone = !trustPromptPatterns.some((p) => p.test(updatedContent));
|
|
198
|
+
if (promptGone) {
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (!hasTrustPrompt &&
|
|
204
|
+
!hasClaudePermissionPrompt &&
|
|
205
|
+
(paneContent.includes('Claude') || paneContent.includes('Assistant'))) {
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Continue checking
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=conflictResolutionPane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflictResolutionPane.js","sourceRoot":"","sources":["../../src/utils/conflictResolutionPane.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge Execution Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles the actual merge operations with proper error handling
|
|
5
|
+
*/
|
|
6
|
+
export interface MergeResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
error?: string;
|
|
9
|
+
conflictFiles?: string[];
|
|
10
|
+
needsManualResolution?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Merge main branch into worktree branch
|
|
14
|
+
* This is step 1 of the two-phase merge: get latest changes from main
|
|
15
|
+
*/
|
|
16
|
+
export declare function mergeMainIntoWorktree(worktreePath: string, mainBranch: string): MergeResult;
|
|
17
|
+
/**
|
|
18
|
+
* Merge worktree branch into main (should be clean after resolving conflicts)
|
|
19
|
+
* This is step 2 of the two-phase merge: bring changes back to main
|
|
20
|
+
*/
|
|
21
|
+
export declare function mergeWorktreeIntoMain(mainRepoPath: string, worktreeBranch: string): MergeResult;
|
|
22
|
+
/**
|
|
23
|
+
* Get list of files with merge conflicts
|
|
24
|
+
*/
|
|
25
|
+
export declare function getConflictingFiles(repoPath: string): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Abort an in-progress merge
|
|
28
|
+
*/
|
|
29
|
+
export declare function abortMerge(repoPath: string): {
|
|
30
|
+
success: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Check if repository is in a merge state
|
|
35
|
+
*/
|
|
36
|
+
export declare function isInMergeState(repoPath: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Complete a merge after conflicts are resolved
|
|
39
|
+
*/
|
|
40
|
+
export declare function completeMerge(repoPath: string, message?: string): MergeResult;
|
|
41
|
+
/**
|
|
42
|
+
* Clean up worktree and branch after successful merge
|
|
43
|
+
*/
|
|
44
|
+
export declare function cleanupAfterMerge(mainRepoPath: string, worktreePath: string, branchName: string): {
|
|
45
|
+
success: boolean;
|
|
46
|
+
error?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Get merge status summary for user display
|
|
50
|
+
*/
|
|
51
|
+
export declare function getMergeStatus(repoPath: string): string;
|
|
52
|
+
//# sourceMappingURL=mergeExecution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeExecution.d.ts","sourceRoot":"","sources":["../../src/utils/mergeExecution.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,WAAW,CA6Bb;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,GACrB,WAAW,CA4Bb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAe9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAajF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAaxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CA2B7E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYvD"}
|