oh-my-codex 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +269 -0
- package/bin/omx.js +25 -0
- package/dist/agents/definitions.d.ts +22 -0
- package/dist/agents/definitions.d.ts.map +1 -0
- package/dist/agents/definitions.js +235 -0
- package/dist/agents/definitions.js.map +1 -0
- package/dist/cli/doctor.d.ts +11 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +157 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +266 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/setup.d.ts +12 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +175 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +17 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/config/generator.d.ts +14 -0
- package/dist/config/generator.d.ts.map +1 -0
- package/dist/config/generator.js +106 -0
- package/dist/config/generator.js.map +1 -0
- package/dist/hooks/__tests__/agents-overlay.test.d.ts +8 -0
- package/dist/hooks/__tests__/agents-overlay.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/agents-overlay.test.js +148 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -0
- package/dist/hooks/agents-overlay.d.ts +34 -0
- package/dist/hooks/agents-overlay.d.ts.map +1 -0
- package/dist/hooks/agents-overlay.js +265 -0
- package/dist/hooks/agents-overlay.js.map +1 -0
- package/dist/hooks/emulator.d.ts +44 -0
- package/dist/hooks/emulator.d.ts.map +1 -0
- package/dist/hooks/emulator.js +108 -0
- package/dist/hooks/emulator.js.map +1 -0
- package/dist/hooks/keyword-detector.d.ts +27 -0
- package/dist/hooks/keyword-detector.d.ts.map +1 -0
- package/dist/hooks/keyword-detector.js +63 -0
- package/dist/hooks/keyword-detector.js.map +1 -0
- package/dist/hooks/session.d.ts +38 -0
- package/dist/hooks/session.d.ts.map +1 -0
- package/dist/hooks/session.js +135 -0
- package/dist/hooks/session.js.map +1 -0
- package/dist/hud/colors.d.ts +26 -0
- package/dist/hud/colors.d.ts.map +1 -0
- package/dist/hud/colors.js +71 -0
- package/dist/hud/colors.js.map +1 -0
- package/dist/hud/index.d.ts +12 -0
- package/dist/hud/index.d.ts.map +1 -0
- package/dist/hud/index.js +107 -0
- package/dist/hud/index.js.map +1 -0
- package/dist/hud/render.d.ts +9 -0
- package/dist/hud/render.d.ts.map +1 -0
- package/dist/hud/render.js +192 -0
- package/dist/hud/render.js.map +1 -0
- package/dist/hud/state.d.ts +21 -0
- package/dist/hud/state.d.ts.map +1 -0
- package/dist/hud/state.js +101 -0
- package/dist/hud/state.js.map +1 -0
- package/dist/hud/types.d.ts +87 -0
- package/dist/hud/types.d.ts.map +1 -0
- package/dist/hud/types.js +8 -0
- package/dist/hud/types.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/code-intel-server.d.ts +7 -0
- package/dist/mcp/code-intel-server.d.ts.map +1 -0
- package/dist/mcp/code-intel-server.js +567 -0
- package/dist/mcp/code-intel-server.js.map +1 -0
- package/dist/mcp/memory-server.d.ts +7 -0
- package/dist/mcp/memory-server.d.ts.map +1 -0
- package/dist/mcp/memory-server.js +359 -0
- package/dist/mcp/memory-server.js.map +1 -0
- package/dist/mcp/state-server.d.ts +7 -0
- package/dist/mcp/state-server.d.ts.map +1 -0
- package/dist/mcp/state-server.js +181 -0
- package/dist/mcp/state-server.js.map +1 -0
- package/dist/mcp/trace-server.d.ts +7 -0
- package/dist/mcp/trace-server.d.ts.map +1 -0
- package/dist/mcp/trace-server.js +205 -0
- package/dist/mcp/trace-server.js.map +1 -0
- package/dist/modes/base.d.ts +50 -0
- package/dist/modes/base.d.ts.map +1 -0
- package/dist/modes/base.js +140 -0
- package/dist/modes/base.js.map +1 -0
- package/dist/notifications/notifier.d.ts +30 -0
- package/dist/notifications/notifier.d.ts.map +1 -0
- package/dist/notifications/notifier.js +124 -0
- package/dist/notifications/notifier.js.map +1 -0
- package/dist/team/orchestrator.d.ts +54 -0
- package/dist/team/orchestrator.d.ts.map +1 -0
- package/dist/team/orchestrator.js +106 -0
- package/dist/team/orchestrator.js.map +1 -0
- package/dist/utils/package.d.ts +9 -0
- package/dist/utils/package.d.ts.map +1 -0
- package/dist/utils/package.js +31 -0
- package/dist/utils/package.js.map +1 -0
- package/dist/utils/paths.d.ts +27 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +60 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/verification/verifier.d.ts +32 -0
- package/dist/verification/verifier.d.ts.map +1 -0
- package/dist/verification/verifier.js +81 -0
- package/dist/verification/verifier.js.map +1 -0
- package/package.json +54 -0
- package/prompts/analyst.md +110 -0
- package/prompts/api-reviewer.md +98 -0
- package/prompts/architect.md +109 -0
- package/prompts/build-fixer.md +89 -0
- package/prompts/code-reviewer.md +105 -0
- package/prompts/critic.md +87 -0
- package/prompts/debugger.md +93 -0
- package/prompts/deep-executor.md +112 -0
- package/prompts/dependency-expert.md +99 -0
- package/prompts/designer.md +103 -0
- package/prompts/executor.md +99 -0
- package/prompts/explore.md +112 -0
- package/prompts/git-master.md +92 -0
- package/prompts/information-architect.md +267 -0
- package/prompts/performance-reviewer.md +94 -0
- package/prompts/planner.md +116 -0
- package/prompts/product-analyst.md +299 -0
- package/prompts/product-manager.md +255 -0
- package/prompts/qa-tester.md +98 -0
- package/prompts/quality-reviewer.md +105 -0
- package/prompts/quality-strategist.md +227 -0
- package/prompts/researcher.md +96 -0
- package/prompts/scientist.md +92 -0
- package/prompts/security-reviewer.md +125 -0
- package/prompts/style-reviewer.md +87 -0
- package/prompts/test-engineer.md +103 -0
- package/prompts/ux-researcher.md +282 -0
- package/prompts/verifier.md +95 -0
- package/prompts/vision.md +75 -0
- package/prompts/writer.md +86 -0
- package/scripts/notify-hook.js +237 -0
- package/skills/analyze/SKILL.md +93 -0
- package/skills/autopilot/SKILL.md +175 -0
- package/skills/build-fix/SKILL.md +123 -0
- package/skills/cancel/SKILL.md +387 -0
- package/skills/code-review/SKILL.md +208 -0
- package/skills/configure-discord/SKILL.md +256 -0
- package/skills/configure-telegram/SKILL.md +232 -0
- package/skills/deepinit/SKILL.md +320 -0
- package/skills/deepsearch/SKILL.md +38 -0
- package/skills/doctor/SKILL.md +193 -0
- package/skills/ecomode/SKILL.md +114 -0
- package/skills/frontend-ui-ux/SKILL.md +34 -0
- package/skills/git-master/SKILL.md +29 -0
- package/skills/help/SKILL.md +192 -0
- package/skills/hud/SKILL.md +97 -0
- package/skills/learn-about-omx/SKILL.md +37 -0
- package/skills/learner/SKILL.md +135 -0
- package/skills/note/SKILL.md +62 -0
- package/skills/omx-setup/SKILL.md +1147 -0
- package/skills/pipeline/SKILL.md +407 -0
- package/skills/plan/SKILL.md +223 -0
- package/skills/project-session-manager/SKILL.md +560 -0
- package/skills/psm/SKILL.md +20 -0
- package/skills/ralph/SKILL.md +197 -0
- package/skills/ralph-init/SKILL.md +38 -0
- package/skills/ralplan/SKILL.md +34 -0
- package/skills/release/SKILL.md +83 -0
- package/skills/research/SKILL.md +510 -0
- package/skills/review/SKILL.md +30 -0
- package/skills/security-review/SKILL.md +284 -0
- package/skills/skill/SKILL.md +837 -0
- package/skills/swarm/SKILL.md +25 -0
- package/skills/tdd/SKILL.md +106 -0
- package/skills/team/SKILL.md +860 -0
- package/skills/trace/SKILL.md +33 -0
- package/skills/ultrapilot/SKILL.md +632 -0
- package/skills/ultraqa/SKILL.md +130 -0
- package/skills/ultrawork/SKILL.md +143 -0
- package/skills/writer-memory/SKILL.md +443 -0
- package/templates/AGENTS.md +326 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMX Trace MCP Server
|
|
3
|
+
* Provides trace timeline and summary tools for debugging agent flows.
|
|
4
|
+
* Reads .omx/logs/ turn JSONL files produced by the notify hook.
|
|
5
|
+
*/
|
|
6
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { readFile, readdir } from 'fs/promises';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
function text(data) {
|
|
13
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
14
|
+
}
|
|
15
|
+
async function readLogFiles(logsDir, last) {
|
|
16
|
+
if (!existsSync(logsDir))
|
|
17
|
+
return [];
|
|
18
|
+
const files = (await readdir(logsDir))
|
|
19
|
+
.filter(f => f.startsWith('turns-') && f.endsWith('.jsonl'))
|
|
20
|
+
.sort();
|
|
21
|
+
const entries = [];
|
|
22
|
+
for (const file of files) {
|
|
23
|
+
const content = await readFile(join(logsDir, file), 'utf-8');
|
|
24
|
+
for (const line of content.split('\n')) {
|
|
25
|
+
if (!line.trim())
|
|
26
|
+
continue;
|
|
27
|
+
try {
|
|
28
|
+
entries.push(JSON.parse(line));
|
|
29
|
+
}
|
|
30
|
+
catch { /* skip malformed */ }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Sort by timestamp
|
|
34
|
+
entries.sort((a, b) => (a.timestamp || '').localeCompare(b.timestamp || ''));
|
|
35
|
+
if (last && last > 0) {
|
|
36
|
+
return entries.slice(-last);
|
|
37
|
+
}
|
|
38
|
+
return entries;
|
|
39
|
+
}
|
|
40
|
+
async function readModeEvents(stateDir) {
|
|
41
|
+
if (!existsSync(stateDir))
|
|
42
|
+
return [];
|
|
43
|
+
const events = [];
|
|
44
|
+
const files = await readdir(stateDir);
|
|
45
|
+
for (const f of files) {
|
|
46
|
+
if (!f.endsWith('-state.json'))
|
|
47
|
+
continue;
|
|
48
|
+
try {
|
|
49
|
+
const data = JSON.parse(await readFile(join(stateDir, f), 'utf-8'));
|
|
50
|
+
const mode = f.replace('-state.json', '');
|
|
51
|
+
if (data.started_at) {
|
|
52
|
+
events.push({
|
|
53
|
+
timestamp: data.started_at,
|
|
54
|
+
event: 'mode_start',
|
|
55
|
+
mode,
|
|
56
|
+
details: { phase: data.current_phase, active: data.active },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (data.completed_at) {
|
|
60
|
+
events.push({
|
|
61
|
+
timestamp: data.completed_at,
|
|
62
|
+
event: 'mode_end',
|
|
63
|
+
mode,
|
|
64
|
+
details: { phase: data.current_phase },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch { /* skip */ }
|
|
69
|
+
}
|
|
70
|
+
return events.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
71
|
+
}
|
|
72
|
+
async function readMetrics(omxDir) {
|
|
73
|
+
const metricsPath = join(omxDir, 'metrics.json');
|
|
74
|
+
if (!existsSync(metricsPath))
|
|
75
|
+
return null;
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(await readFile(metricsPath, 'utf-8'));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ── MCP Server ──────────────────────────────────────────────────────────────
|
|
84
|
+
const server = new Server({ name: 'omx-trace', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
85
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
86
|
+
tools: [
|
|
87
|
+
{
|
|
88
|
+
name: 'trace_timeline',
|
|
89
|
+
description: 'Show chronological agent flow trace timeline. Displays turns, mode transitions, and agent activity in time order.',
|
|
90
|
+
inputSchema: {
|
|
91
|
+
type: 'object',
|
|
92
|
+
properties: {
|
|
93
|
+
last: { type: 'number', description: 'Show only the last N entries' },
|
|
94
|
+
filter: {
|
|
95
|
+
type: 'string',
|
|
96
|
+
enum: ['all', 'turns', 'modes'],
|
|
97
|
+
description: 'Filter: all (default), turns (agent turns only), modes (mode transitions only)',
|
|
98
|
+
},
|
|
99
|
+
workingDirectory: { type: 'string' },
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'trace_summary',
|
|
105
|
+
description: 'Show aggregate statistics for agent flow trace. Includes turn counts, mode usage, token consumption, and timing.',
|
|
106
|
+
inputSchema: {
|
|
107
|
+
type: 'object',
|
|
108
|
+
properties: {
|
|
109
|
+
workingDirectory: { type: 'string' },
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
}));
|
|
115
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
116
|
+
const { name, arguments: args } = request.params;
|
|
117
|
+
const a = (args || {});
|
|
118
|
+
const wd = a.workingDirectory || process.cwd();
|
|
119
|
+
const omxDir = join(wd, '.omx');
|
|
120
|
+
const logsDir = join(omxDir, 'logs');
|
|
121
|
+
const stateDir = join(omxDir, 'state');
|
|
122
|
+
switch (name) {
|
|
123
|
+
case 'trace_timeline': {
|
|
124
|
+
const last = a.last;
|
|
125
|
+
const filter = a.filter || 'all';
|
|
126
|
+
const [turns, modeEvents] = await Promise.all([
|
|
127
|
+
filter !== 'modes' ? readLogFiles(logsDir, last) : Promise.resolve([]),
|
|
128
|
+
filter !== 'turns' ? readModeEvents(stateDir) : Promise.resolve([]),
|
|
129
|
+
]);
|
|
130
|
+
const timeline = [
|
|
131
|
+
...turns.map(t => ({
|
|
132
|
+
timestamp: t.timestamp,
|
|
133
|
+
type: 'turn',
|
|
134
|
+
turn_type: t.type,
|
|
135
|
+
thread_id: t.thread_id,
|
|
136
|
+
input_preview: t.input_preview,
|
|
137
|
+
output_preview: t.output_preview,
|
|
138
|
+
})),
|
|
139
|
+
...modeEvents.map(e => ({
|
|
140
|
+
timestamp: e.timestamp,
|
|
141
|
+
type: e.event,
|
|
142
|
+
mode: e.mode,
|
|
143
|
+
...e.details,
|
|
144
|
+
})),
|
|
145
|
+
];
|
|
146
|
+
timeline.sort((a, b) => (a.timestamp || '').localeCompare(b.timestamp || ''));
|
|
147
|
+
const result = last ? timeline.slice(-last) : timeline;
|
|
148
|
+
return text({
|
|
149
|
+
entryCount: result.length,
|
|
150
|
+
totalAvailable: timeline.length,
|
|
151
|
+
filter,
|
|
152
|
+
timeline: result,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
case 'trace_summary': {
|
|
156
|
+
const [turns, modeEvents, metrics] = await Promise.all([
|
|
157
|
+
readLogFiles(logsDir),
|
|
158
|
+
readModeEvents(stateDir),
|
|
159
|
+
readMetrics(omxDir),
|
|
160
|
+
]);
|
|
161
|
+
// Turn statistics
|
|
162
|
+
const turnsByType = {};
|
|
163
|
+
for (const t of turns) {
|
|
164
|
+
const type = t.type || 'unknown';
|
|
165
|
+
turnsByType[type] = (turnsByType[type] || 0) + 1;
|
|
166
|
+
}
|
|
167
|
+
// Mode statistics
|
|
168
|
+
const modesByName = {};
|
|
169
|
+
for (const e of modeEvents) {
|
|
170
|
+
if (!modesByName[e.mode])
|
|
171
|
+
modesByName[e.mode] = { starts: 0, ends: 0 };
|
|
172
|
+
if (e.event === 'mode_start')
|
|
173
|
+
modesByName[e.mode].starts++;
|
|
174
|
+
if (e.event === 'mode_end')
|
|
175
|
+
modesByName[e.mode].ends++;
|
|
176
|
+
}
|
|
177
|
+
// Timing
|
|
178
|
+
const firstTurn = turns.length > 0 ? turns[0].timestamp : null;
|
|
179
|
+
const lastTurn = turns.length > 0 ? turns[turns.length - 1].timestamp : null;
|
|
180
|
+
let durationMs = 0;
|
|
181
|
+
if (firstTurn && lastTurn) {
|
|
182
|
+
durationMs = new Date(lastTurn).getTime() - new Date(firstTurn).getTime();
|
|
183
|
+
}
|
|
184
|
+
return text({
|
|
185
|
+
turns: {
|
|
186
|
+
total: turns.length,
|
|
187
|
+
byType: turnsByType,
|
|
188
|
+
firstAt: firstTurn,
|
|
189
|
+
lastAt: lastTurn,
|
|
190
|
+
durationMs,
|
|
191
|
+
durationFormatted: durationMs > 0
|
|
192
|
+
? `${Math.floor(durationMs / 60000)}m ${Math.floor((durationMs % 60000) / 1000)}s`
|
|
193
|
+
: 'N/A',
|
|
194
|
+
},
|
|
195
|
+
modes: modesByName,
|
|
196
|
+
metrics: metrics || { note: 'No metrics file found' },
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
default:
|
|
200
|
+
return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
const transport = new StdioServerTransport();
|
|
204
|
+
server.connect(transport).catch(console.error);
|
|
205
|
+
//# sourceMappingURL=trace-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-server.js","sourceRoot":"","sources":["../../src/mcp/trace-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base mode lifecycle management for oh-my-codex
|
|
3
|
+
* All execution modes (autopilot, ralph, ultrawork, ecomode) share this base.
|
|
4
|
+
*/
|
|
5
|
+
export interface ModeState {
|
|
6
|
+
active: boolean;
|
|
7
|
+
mode: string;
|
|
8
|
+
iteration: number;
|
|
9
|
+
max_iterations: number;
|
|
10
|
+
current_phase: string;
|
|
11
|
+
task_description?: string;
|
|
12
|
+
started_at: string;
|
|
13
|
+
completed_at?: string;
|
|
14
|
+
last_turn_at?: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
export type ModeName = 'autopilot' | 'ralph' | 'ultrawork' | 'ecomode' | 'ultrapilot' | 'team' | 'pipeline' | 'ultraqa' | 'ralplan';
|
|
19
|
+
/**
|
|
20
|
+
* Start a mode. Checks for exclusive mode conflicts.
|
|
21
|
+
*/
|
|
22
|
+
export declare function startMode(mode: ModeName, taskDescription: string, maxIterations?: number, projectRoot?: string): Promise<ModeState>;
|
|
23
|
+
/**
|
|
24
|
+
* Read current mode state
|
|
25
|
+
*/
|
|
26
|
+
export declare function readModeState(mode: string, projectRoot?: string): Promise<ModeState | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Update mode state (merge fields)
|
|
29
|
+
*/
|
|
30
|
+
export declare function updateModeState(mode: string, updates: Partial<ModeState>, projectRoot?: string): Promise<ModeState>;
|
|
31
|
+
/**
|
|
32
|
+
* Cancel a mode
|
|
33
|
+
*/
|
|
34
|
+
export declare function cancelMode(mode: string, projectRoot?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Cancel all active modes
|
|
37
|
+
*/
|
|
38
|
+
export declare function cancelAllModes(projectRoot?: string): Promise<string[]>;
|
|
39
|
+
/**
|
|
40
|
+
* List all active modes
|
|
41
|
+
*/
|
|
42
|
+
export declare function listActiveModes(projectRoot?: string): Promise<Array<{
|
|
43
|
+
mode: string;
|
|
44
|
+
state: ModeState;
|
|
45
|
+
}>>;
|
|
46
|
+
/**
|
|
47
|
+
* Check if mode should continue (not exceeded max iterations, still active)
|
|
48
|
+
*/
|
|
49
|
+
export declare function shouldContinue(state: ModeState): boolean;
|
|
50
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/modes/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,GACpE,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAY7D;;GAEG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,QAAQ,EACd,eAAe,EAAE,MAAM,EACvB,aAAa,GAAE,MAAW,EAC1B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,CAAC,CAkCpB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAQjG;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,EAC3B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,CAAC,CAOpB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB5E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC,CAiB9G;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAExD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base mode lifecycle management for oh-my-codex
|
|
3
|
+
* All execution modes (autopilot, ralph, ultrawork, ecomode) share this base.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
const EXCLUSIVE_MODES = ['autopilot', 'ralph', 'ultrawork', 'ultrapilot'];
|
|
9
|
+
function stateDir(projectRoot) {
|
|
10
|
+
return join(projectRoot || process.cwd(), '.omx', 'state');
|
|
11
|
+
}
|
|
12
|
+
function statePath(mode, projectRoot) {
|
|
13
|
+
return join(stateDir(projectRoot), `${mode}-state.json`);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Start a mode. Checks for exclusive mode conflicts.
|
|
17
|
+
*/
|
|
18
|
+
export async function startMode(mode, taskDescription, maxIterations = 50, projectRoot) {
|
|
19
|
+
const dir = stateDir(projectRoot);
|
|
20
|
+
await mkdir(dir, { recursive: true });
|
|
21
|
+
// Check for exclusive mode conflicts
|
|
22
|
+
if (EXCLUSIVE_MODES.includes(mode)) {
|
|
23
|
+
for (const other of EXCLUSIVE_MODES) {
|
|
24
|
+
if (other === mode)
|
|
25
|
+
continue;
|
|
26
|
+
const otherPath = statePath(other, projectRoot);
|
|
27
|
+
if (existsSync(otherPath)) {
|
|
28
|
+
try {
|
|
29
|
+
const otherState = JSON.parse(await readFile(otherPath, 'utf-8'));
|
|
30
|
+
if (otherState.active) {
|
|
31
|
+
throw new Error(`Cannot start ${mode}: ${other} is already active. Run cancel first.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
if (e.message.includes('Cannot start'))
|
|
36
|
+
throw e;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const state = {
|
|
42
|
+
active: true,
|
|
43
|
+
mode,
|
|
44
|
+
iteration: 0,
|
|
45
|
+
max_iterations: maxIterations,
|
|
46
|
+
current_phase: 'starting',
|
|
47
|
+
task_description: taskDescription,
|
|
48
|
+
started_at: new Date().toISOString(),
|
|
49
|
+
};
|
|
50
|
+
await writeFile(statePath(mode, projectRoot), JSON.stringify(state, null, 2));
|
|
51
|
+
return state;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Read current mode state
|
|
55
|
+
*/
|
|
56
|
+
export async function readModeState(mode, projectRoot) {
|
|
57
|
+
const path = statePath(mode, projectRoot);
|
|
58
|
+
if (!existsSync(path))
|
|
59
|
+
return null;
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(await readFile(path, 'utf-8'));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Update mode state (merge fields)
|
|
69
|
+
*/
|
|
70
|
+
export async function updateModeState(mode, updates, projectRoot) {
|
|
71
|
+
const current = await readModeState(mode, projectRoot);
|
|
72
|
+
if (!current)
|
|
73
|
+
throw new Error(`Mode ${mode} not found`);
|
|
74
|
+
const updated = { ...current, ...updates };
|
|
75
|
+
await writeFile(statePath(mode, projectRoot), JSON.stringify(updated, null, 2));
|
|
76
|
+
return updated;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Cancel a mode
|
|
80
|
+
*/
|
|
81
|
+
export async function cancelMode(mode, projectRoot) {
|
|
82
|
+
const state = await readModeState(mode, projectRoot);
|
|
83
|
+
if (state && state.active) {
|
|
84
|
+
await updateModeState(mode, {
|
|
85
|
+
active: false,
|
|
86
|
+
current_phase: 'cancelled',
|
|
87
|
+
completed_at: new Date().toISOString(),
|
|
88
|
+
}, projectRoot);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Cancel all active modes
|
|
93
|
+
*/
|
|
94
|
+
export async function cancelAllModes(projectRoot) {
|
|
95
|
+
const { readdir } = await import('fs/promises');
|
|
96
|
+
const dir = stateDir(projectRoot);
|
|
97
|
+
const cancelled = [];
|
|
98
|
+
if (!existsSync(dir))
|
|
99
|
+
return cancelled;
|
|
100
|
+
const files = await readdir(dir);
|
|
101
|
+
for (const f of files) {
|
|
102
|
+
if (!f.endsWith('-state.json'))
|
|
103
|
+
continue;
|
|
104
|
+
const mode = f.replace('-state.json', '');
|
|
105
|
+
const state = await readModeState(mode, projectRoot);
|
|
106
|
+
if (state?.active) {
|
|
107
|
+
await cancelMode(mode, projectRoot);
|
|
108
|
+
cancelled.push(mode);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return cancelled;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* List all active modes
|
|
115
|
+
*/
|
|
116
|
+
export async function listActiveModes(projectRoot) {
|
|
117
|
+
const { readdir } = await import('fs/promises');
|
|
118
|
+
const dir = stateDir(projectRoot);
|
|
119
|
+
const active = [];
|
|
120
|
+
if (!existsSync(dir))
|
|
121
|
+
return active;
|
|
122
|
+
const files = await readdir(dir);
|
|
123
|
+
for (const f of files) {
|
|
124
|
+
if (!f.endsWith('-state.json'))
|
|
125
|
+
continue;
|
|
126
|
+
const mode = f.replace('-state.json', '');
|
|
127
|
+
const state = await readModeState(mode, projectRoot);
|
|
128
|
+
if (state?.active) {
|
|
129
|
+
active.push({ mode, state });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return active;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if mode should continue (not exceeded max iterations, still active)
|
|
136
|
+
*/
|
|
137
|
+
export function shouldContinue(state) {
|
|
138
|
+
return state.active && state.iteration < state.max_iterations;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/modes/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification system for oh-my-codex
|
|
3
|
+
* Supports desktop notifications, Discord webhooks, and Telegram bots
|
|
4
|
+
*/
|
|
5
|
+
export interface NotificationConfig {
|
|
6
|
+
desktop?: boolean;
|
|
7
|
+
discord?: {
|
|
8
|
+
webhookUrl: string;
|
|
9
|
+
};
|
|
10
|
+
telegram?: {
|
|
11
|
+
botToken: string;
|
|
12
|
+
chatId: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface NotificationPayload {
|
|
16
|
+
title: string;
|
|
17
|
+
message: string;
|
|
18
|
+
type: 'info' | 'success' | 'warning' | 'error';
|
|
19
|
+
mode?: string;
|
|
20
|
+
projectPath?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Load notification config from .omx/notifications.json
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadNotificationConfig(projectRoot?: string): Promise<NotificationConfig | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Send notification via all configured channels
|
|
28
|
+
*/
|
|
29
|
+
export declare function notify(payload: NotificationPayload, config?: NotificationConfig | null): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=notifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/notifications/notifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAQrG;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB5G"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification system for oh-my-codex
|
|
3
|
+
* Supports desktop notifications, Discord webhooks, and Telegram bots
|
|
4
|
+
*/
|
|
5
|
+
import { exec } from 'child_process';
|
|
6
|
+
import { readFile } from 'fs/promises';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { existsSync } from 'fs';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
/**
|
|
12
|
+
* Load notification config from .omx/notifications.json
|
|
13
|
+
*/
|
|
14
|
+
export async function loadNotificationConfig(projectRoot) {
|
|
15
|
+
const configPath = join(projectRoot || process.cwd(), '.omx', 'notifications.json');
|
|
16
|
+
if (!existsSync(configPath))
|
|
17
|
+
return null;
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(await readFile(configPath, 'utf-8'));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Send notification via all configured channels
|
|
27
|
+
*/
|
|
28
|
+
export async function notify(payload, config) {
|
|
29
|
+
if (!config) {
|
|
30
|
+
config = await loadNotificationConfig();
|
|
31
|
+
if (!config)
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const promises = [];
|
|
35
|
+
if (config.desktop) {
|
|
36
|
+
promises.push(sendDesktopNotification(payload));
|
|
37
|
+
}
|
|
38
|
+
if (config.discord?.webhookUrl) {
|
|
39
|
+
promises.push(sendDiscordNotification(payload, config.discord.webhookUrl));
|
|
40
|
+
}
|
|
41
|
+
if (config.telegram?.botToken && config.telegram?.chatId) {
|
|
42
|
+
promises.push(sendTelegramNotification(payload, config.telegram.botToken, config.telegram.chatId));
|
|
43
|
+
}
|
|
44
|
+
await Promise.allSettled(promises);
|
|
45
|
+
}
|
|
46
|
+
async function sendDesktopNotification(payload) {
|
|
47
|
+
const { title, message } = payload;
|
|
48
|
+
const platform = process.platform;
|
|
49
|
+
try {
|
|
50
|
+
if (platform === 'darwin') {
|
|
51
|
+
await execAsync(`osascript -e 'display notification "${message}" with title "${title}"'`);
|
|
52
|
+
}
|
|
53
|
+
else if (platform === 'linux') {
|
|
54
|
+
await execAsync(`notify-send "${title}" "${message}"`);
|
|
55
|
+
}
|
|
56
|
+
else if (platform === 'win32') {
|
|
57
|
+
// PowerShell toast notification
|
|
58
|
+
const ps = `[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null; $xml = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent(0); $text = $xml.GetElementsByTagName('text'); $text[0].AppendChild($xml.CreateTextNode('${title}')) > $null; $text[1].AppendChild($xml.CreateTextNode('${message}')) > $null; [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('oh-my-codex').Show($xml)`;
|
|
59
|
+
await execAsync(`powershell -Command "${ps}"`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Desktop notification is best-effort
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function sendDiscordNotification(payload, webhookUrl) {
|
|
67
|
+
const colorMap = { info: 3447003, success: 3066993, warning: 15105570, error: 15158332 };
|
|
68
|
+
const body = JSON.stringify({
|
|
69
|
+
embeds: [{
|
|
70
|
+
title: `[OMX] ${payload.title}`,
|
|
71
|
+
description: payload.message,
|
|
72
|
+
color: colorMap[payload.type],
|
|
73
|
+
footer: { text: `oh-my-codex | ${payload.mode || 'general'}` },
|
|
74
|
+
timestamp: new Date().toISOString(),
|
|
75
|
+
}],
|
|
76
|
+
});
|
|
77
|
+
try {
|
|
78
|
+
const { default: https } = await import('https');
|
|
79
|
+
await new Promise((resolve, reject) => {
|
|
80
|
+
const url = new URL(webhookUrl);
|
|
81
|
+
const req = https.request({
|
|
82
|
+
hostname: url.hostname,
|
|
83
|
+
path: url.pathname,
|
|
84
|
+
method: 'POST',
|
|
85
|
+
headers: { 'Content-Type': 'application/json' },
|
|
86
|
+
}, (res) => {
|
|
87
|
+
res.resume();
|
|
88
|
+
resolve();
|
|
89
|
+
});
|
|
90
|
+
req.on('error', reject);
|
|
91
|
+
req.write(body);
|
|
92
|
+
req.end();
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Discord notification is best-effort
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function sendTelegramNotification(payload, botToken, chatId) {
|
|
100
|
+
const iconMap = { info: 'info', success: 'white_check_mark', warning: 'warning', error: 'x' };
|
|
101
|
+
const text = `*[OMX] ${payload.title}*\n${payload.message}`;
|
|
102
|
+
try {
|
|
103
|
+
const { default: https } = await import('https');
|
|
104
|
+
const body = JSON.stringify({ chat_id: chatId, text, parse_mode: 'Markdown' });
|
|
105
|
+
await new Promise((resolve, reject) => {
|
|
106
|
+
const req = https.request({
|
|
107
|
+
hostname: 'api.telegram.org',
|
|
108
|
+
path: `/bot${botToken}/sendMessage`,
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: { 'Content-Type': 'application/json' },
|
|
111
|
+
}, (res) => {
|
|
112
|
+
res.resume();
|
|
113
|
+
resolve();
|
|
114
|
+
});
|
|
115
|
+
req.on('error', reject);
|
|
116
|
+
req.write(body);
|
|
117
|
+
req.end();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Telegram notification is best-effort
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/notifications/notifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Orchestration for oh-my-codex
|
|
3
|
+
*
|
|
4
|
+
* Leverages Codex CLI's native collab feature for multi-agent coordination.
|
|
5
|
+
* Provides the staged pipeline: plan -> prd -> exec -> verify -> fix (loop)
|
|
6
|
+
*/
|
|
7
|
+
export type TeamPhase = 'team-plan' | 'team-prd' | 'team-exec' | 'team-verify' | 'team-fix';
|
|
8
|
+
export type TerminalPhase = 'complete' | 'failed' | 'cancelled';
|
|
9
|
+
export interface TeamState {
|
|
10
|
+
active: boolean;
|
|
11
|
+
phase: TeamPhase | TerminalPhase;
|
|
12
|
+
task_description: string;
|
|
13
|
+
created_at: string;
|
|
14
|
+
phase_transitions: Array<{
|
|
15
|
+
from: string;
|
|
16
|
+
to: string;
|
|
17
|
+
at: string;
|
|
18
|
+
reason?: string;
|
|
19
|
+
}>;
|
|
20
|
+
tasks: TeamTask[];
|
|
21
|
+
max_fix_attempts: number;
|
|
22
|
+
current_fix_attempt: number;
|
|
23
|
+
}
|
|
24
|
+
export interface TeamTask {
|
|
25
|
+
id: string;
|
|
26
|
+
subject: string;
|
|
27
|
+
description: string;
|
|
28
|
+
status: 'pending' | 'in_progress' | 'completed' | 'blocked';
|
|
29
|
+
owner?: string;
|
|
30
|
+
blockedBy?: string[];
|
|
31
|
+
createdAt: string;
|
|
32
|
+
completedAt?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate a phase transition
|
|
36
|
+
*/
|
|
37
|
+
export declare function isValidTransition(from: TeamPhase, to: TeamPhase | TerminalPhase): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Create initial team state
|
|
40
|
+
*/
|
|
41
|
+
export declare function createTeamState(taskDescription: string, maxFixAttempts?: number): TeamState;
|
|
42
|
+
/**
|
|
43
|
+
* Transition to next phase
|
|
44
|
+
*/
|
|
45
|
+
export declare function transitionPhase(state: TeamState, to: TeamPhase | TerminalPhase, reason?: string): TeamState;
|
|
46
|
+
/**
|
|
47
|
+
* Get agent roles recommended for each phase
|
|
48
|
+
*/
|
|
49
|
+
export declare function getPhaseAgents(phase: TeamPhase): string[];
|
|
50
|
+
/**
|
|
51
|
+
* Generate phase instructions for AGENTS.md context
|
|
52
|
+
*/
|
|
53
|
+
export declare function getPhaseInstructions(phase: TeamPhase): string;
|
|
54
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/team/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;AAC5F,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,SAAS,GAAG,aAAa,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpF,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAaD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,GAAG,aAAa,GAAG,OAAO,CAGzF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,cAAc,GAAE,MAAU,GAAG,SAAS,CAW9F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,SAAS,GAAG,aAAa,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,SAAS,CAiCX;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAazD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAa7D"}
|