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,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Lifecycle Manager for oh-my-codex
|
|
3
|
+
*
|
|
4
|
+
* Tracks session start/end, detects stale sessions from crashed launches,
|
|
5
|
+
* and provides structured logging for session events.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir, unlink, appendFile } from 'fs/promises';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { omxStateDir, omxLogsDir } from '../utils/paths.js';
|
|
11
|
+
const SESSION_FILE = 'session.json';
|
|
12
|
+
const HISTORY_FILE = 'session-history.jsonl';
|
|
13
|
+
// No age-based threshold: only PID liveness determines staleness.
|
|
14
|
+
// Long-running sessions (>2h) are legitimate and should not be reaped.
|
|
15
|
+
function sessionPath(cwd) {
|
|
16
|
+
return join(omxStateDir(cwd), SESSION_FILE);
|
|
17
|
+
}
|
|
18
|
+
function historyPath(cwd) {
|
|
19
|
+
return join(omxLogsDir(cwd), HISTORY_FILE);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Reset session-scoped HUD/metrics files at launch so stale values do not leak
|
|
23
|
+
* into a new Codex session.
|
|
24
|
+
*/
|
|
25
|
+
export async function resetSessionMetrics(cwd) {
|
|
26
|
+
const omxDir = join(cwd, '.omx');
|
|
27
|
+
const stateDir = omxStateDir(cwd);
|
|
28
|
+
await mkdir(omxDir, { recursive: true });
|
|
29
|
+
await mkdir(stateDir, { recursive: true });
|
|
30
|
+
const now = new Date().toISOString();
|
|
31
|
+
await writeFile(join(omxDir, 'metrics.json'), JSON.stringify({
|
|
32
|
+
total_turns: 0,
|
|
33
|
+
session_turns: 0,
|
|
34
|
+
last_activity: now,
|
|
35
|
+
session_input_tokens: 0,
|
|
36
|
+
session_output_tokens: 0,
|
|
37
|
+
session_total_tokens: 0,
|
|
38
|
+
five_hour_limit_pct: 0,
|
|
39
|
+
weekly_limit_pct: 0,
|
|
40
|
+
}, null, 2));
|
|
41
|
+
await writeFile(join(stateDir, 'hud-state.json'), JSON.stringify({
|
|
42
|
+
last_turn_at: now,
|
|
43
|
+
turn_count: 0,
|
|
44
|
+
last_agent_output: '',
|
|
45
|
+
}, null, 2));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Read current session state. Returns null if no session file exists.
|
|
49
|
+
*/
|
|
50
|
+
export async function readSessionState(cwd) {
|
|
51
|
+
const path = sessionPath(cwd);
|
|
52
|
+
if (!existsSync(path))
|
|
53
|
+
return null;
|
|
54
|
+
try {
|
|
55
|
+
const content = await readFile(path, 'utf-8');
|
|
56
|
+
return JSON.parse(content);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if a session is stale (PID dead or started >2h ago).
|
|
64
|
+
*/
|
|
65
|
+
export function isSessionStale(state) {
|
|
66
|
+
// Only consider a session stale if the owning PID is dead.
|
|
67
|
+
// Long-running sessions are legitimate and must not be reaped by age alone.
|
|
68
|
+
try {
|
|
69
|
+
process.kill(state.pid, 0);
|
|
70
|
+
return false; // PID is alive, session is active
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return true; // PID is dead, session is stale
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Write session start state.
|
|
78
|
+
*/
|
|
79
|
+
export async function writeSessionStart(cwd, sessionId) {
|
|
80
|
+
const stateDir = omxStateDir(cwd);
|
|
81
|
+
await mkdir(stateDir, { recursive: true });
|
|
82
|
+
const state = {
|
|
83
|
+
session_id: sessionId,
|
|
84
|
+
started_at: new Date().toISOString(),
|
|
85
|
+
cwd,
|
|
86
|
+
pid: process.pid,
|
|
87
|
+
};
|
|
88
|
+
await writeFile(sessionPath(cwd), JSON.stringify(state, null, 2));
|
|
89
|
+
await appendToLog(cwd, {
|
|
90
|
+
event: 'session_start',
|
|
91
|
+
session_id: sessionId,
|
|
92
|
+
pid: process.pid,
|
|
93
|
+
timestamp: state.started_at,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Write session end: archive to history, delete session.json.
|
|
98
|
+
*/
|
|
99
|
+
export async function writeSessionEnd(cwd, sessionId) {
|
|
100
|
+
const state = await readSessionState(cwd);
|
|
101
|
+
const endTime = new Date().toISOString();
|
|
102
|
+
// Archive to session history
|
|
103
|
+
const logsDir = omxLogsDir(cwd);
|
|
104
|
+
await mkdir(logsDir, { recursive: true });
|
|
105
|
+
const historyEntry = {
|
|
106
|
+
session_id: sessionId,
|
|
107
|
+
started_at: state?.started_at || 'unknown',
|
|
108
|
+
ended_at: endTime,
|
|
109
|
+
cwd,
|
|
110
|
+
pid: state?.pid || process.pid,
|
|
111
|
+
};
|
|
112
|
+
await appendFile(historyPath(cwd), JSON.stringify(historyEntry) + '\n');
|
|
113
|
+
// Delete session.json
|
|
114
|
+
try {
|
|
115
|
+
await unlink(sessionPath(cwd));
|
|
116
|
+
}
|
|
117
|
+
catch { /* already gone */ }
|
|
118
|
+
await appendToLog(cwd, {
|
|
119
|
+
event: 'session_end',
|
|
120
|
+
session_id: sessionId,
|
|
121
|
+
timestamp: endTime,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Append a structured JSONL entry to the daily log file.
|
|
126
|
+
*/
|
|
127
|
+
export async function appendToLog(cwd, entry) {
|
|
128
|
+
const logsDir = omxLogsDir(cwd);
|
|
129
|
+
await mkdir(logsDir, { recursive: true });
|
|
130
|
+
const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
131
|
+
const logFile = join(logsDir, `omx-${date}.jsonl`);
|
|
132
|
+
const line = JSON.stringify({ ...entry, _ts: new Date().toISOString() }) + '\n';
|
|
133
|
+
await appendFile(logFile, line);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/hooks/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMX HUD - ANSI Color Utilities
|
|
3
|
+
*
|
|
4
|
+
* Terminal color codes for statusline rendering.
|
|
5
|
+
* Ported from oh-my-claudecode.
|
|
6
|
+
*/
|
|
7
|
+
export declare const RESET = "\u001B[0m";
|
|
8
|
+
export declare function green(text: string): string;
|
|
9
|
+
export declare function yellow(text: string): string;
|
|
10
|
+
export declare function red(text: string): string;
|
|
11
|
+
export declare function cyan(text: string): string;
|
|
12
|
+
export declare function dim(text: string): string;
|
|
13
|
+
export declare function bold(text: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Get color code based on ralph iteration progress.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getRalphColor(iteration: number, maxIterations: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get color for todo/turn progress.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getTodoColor(completed: number, total: number): string;
|
|
22
|
+
/**
|
|
23
|
+
* Create a colored progress bar.
|
|
24
|
+
*/
|
|
25
|
+
export declare function coloredBar(percent: number, width?: number): string;
|
|
26
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/hud/colors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,eAAO,MAAM,KAAK,cAAY,CAAC;AAQ/B,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAO9E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,CAWtE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMX HUD - ANSI Color Utilities
|
|
3
|
+
*
|
|
4
|
+
* Terminal color codes for statusline rendering.
|
|
5
|
+
* Ported from oh-my-claudecode.
|
|
6
|
+
*/
|
|
7
|
+
// ANSI escape codes
|
|
8
|
+
export const RESET = '\x1b[0m';
|
|
9
|
+
const DIM = '\x1b[2m';
|
|
10
|
+
const BOLD = '\x1b[1m';
|
|
11
|
+
const RED = '\x1b[31m';
|
|
12
|
+
const GREEN = '\x1b[32m';
|
|
13
|
+
const YELLOW = '\x1b[33m';
|
|
14
|
+
const CYAN = '\x1b[36m';
|
|
15
|
+
export function green(text) {
|
|
16
|
+
return `${GREEN}${text}${RESET}`;
|
|
17
|
+
}
|
|
18
|
+
export function yellow(text) {
|
|
19
|
+
return `${YELLOW}${text}${RESET}`;
|
|
20
|
+
}
|
|
21
|
+
export function red(text) {
|
|
22
|
+
return `${RED}${text}${RESET}`;
|
|
23
|
+
}
|
|
24
|
+
export function cyan(text) {
|
|
25
|
+
return `${CYAN}${text}${RESET}`;
|
|
26
|
+
}
|
|
27
|
+
export function dim(text) {
|
|
28
|
+
return `${DIM}${text}${RESET}`;
|
|
29
|
+
}
|
|
30
|
+
export function bold(text) {
|
|
31
|
+
return `${BOLD}${text}${RESET}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get color code based on ralph iteration progress.
|
|
35
|
+
*/
|
|
36
|
+
export function getRalphColor(iteration, maxIterations) {
|
|
37
|
+
const warningThreshold = Math.floor(maxIterations * 0.7);
|
|
38
|
+
const criticalThreshold = Math.floor(maxIterations * 0.9);
|
|
39
|
+
if (iteration >= criticalThreshold)
|
|
40
|
+
return RED;
|
|
41
|
+
if (iteration >= warningThreshold)
|
|
42
|
+
return YELLOW;
|
|
43
|
+
return GREEN;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get color for todo/turn progress.
|
|
47
|
+
*/
|
|
48
|
+
export function getTodoColor(completed, total) {
|
|
49
|
+
if (total === 0)
|
|
50
|
+
return DIM;
|
|
51
|
+
const percent = (completed / total) * 100;
|
|
52
|
+
if (percent >= 80)
|
|
53
|
+
return GREEN;
|
|
54
|
+
if (percent >= 50)
|
|
55
|
+
return YELLOW;
|
|
56
|
+
return CYAN;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a colored progress bar.
|
|
60
|
+
*/
|
|
61
|
+
export function coloredBar(percent, width = 10) {
|
|
62
|
+
const safeWidth = Number.isFinite(width) ? Math.max(0, Math.round(width)) : 0;
|
|
63
|
+
const safePercent = Number.isFinite(percent)
|
|
64
|
+
? Math.min(100, Math.max(0, percent))
|
|
65
|
+
: 0;
|
|
66
|
+
const filled = Math.round((safePercent / 100) * safeWidth);
|
|
67
|
+
const empty = safeWidth - filled;
|
|
68
|
+
const color = safePercent >= 85 ? RED : safePercent >= 70 ? YELLOW : GREEN;
|
|
69
|
+
return `${color}${'█'.repeat(filled)}${DIM}${'░'.repeat(empty)}${RESET}`;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/hud/colors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMX HUD - CLI entry point
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* omx hud Show current HUD state
|
|
6
|
+
* omx hud --watch Poll every 1s with terminal clear
|
|
7
|
+
* omx hud --json Output raw state as JSON
|
|
8
|
+
* omx hud --preset=X Use preset: minimal, focused, full
|
|
9
|
+
* omx hud --tmux Open HUD in a tmux split pane (auto-detects orientation)
|
|
10
|
+
*/
|
|
11
|
+
export declare function hudCommand(args: string[]): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hud/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA4CH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C9D"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMX HUD - CLI entry point
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* omx hud Show current HUD state
|
|
6
|
+
* omx hud --watch Poll every 1s with terminal clear
|
|
7
|
+
* omx hud --json Output raw state as JSON
|
|
8
|
+
* omx hud --preset=X Use preset: minimal, focused, full
|
|
9
|
+
* omx hud --tmux Open HUD in a tmux split pane (auto-detects orientation)
|
|
10
|
+
*/
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
import { readAllState, readHudConfig } from './state.js';
|
|
13
|
+
import { renderHud } from './render.js';
|
|
14
|
+
function parseFlags(args) {
|
|
15
|
+
const flags = { watch: false, json: false, tmux: false };
|
|
16
|
+
for (const arg of args) {
|
|
17
|
+
if (arg === '--watch' || arg === '-w') {
|
|
18
|
+
flags.watch = true;
|
|
19
|
+
}
|
|
20
|
+
else if (arg === '--json') {
|
|
21
|
+
flags.json = true;
|
|
22
|
+
}
|
|
23
|
+
else if (arg === '--tmux') {
|
|
24
|
+
flags.tmux = true;
|
|
25
|
+
}
|
|
26
|
+
else if (arg.startsWith('--preset=')) {
|
|
27
|
+
const value = arg.slice('--preset='.length);
|
|
28
|
+
if (['minimal', 'focused', 'full'].includes(value)) {
|
|
29
|
+
flags.preset = value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return flags;
|
|
34
|
+
}
|
|
35
|
+
async function renderOnce(cwd, flags) {
|
|
36
|
+
const [ctx, config] = await Promise.all([
|
|
37
|
+
readAllState(cwd),
|
|
38
|
+
readHudConfig(cwd),
|
|
39
|
+
]);
|
|
40
|
+
const preset = flags.preset ?? config.preset;
|
|
41
|
+
if (flags.json) {
|
|
42
|
+
console.log(JSON.stringify(ctx, null, 2));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
console.log(renderHud(ctx, preset));
|
|
46
|
+
}
|
|
47
|
+
export async function hudCommand(args) {
|
|
48
|
+
const flags = parseFlags(args);
|
|
49
|
+
const cwd = process.cwd();
|
|
50
|
+
if (flags.tmux) {
|
|
51
|
+
await launchTmuxPane(cwd, flags);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (!flags.watch) {
|
|
55
|
+
await renderOnce(cwd, flags);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Watch mode: overwrite in-place (no flicker)
|
|
59
|
+
let firstRender = true;
|
|
60
|
+
const render = async () => {
|
|
61
|
+
if (firstRender) {
|
|
62
|
+
process.stdout.write('\x1b[2J\x1b[H'); // Clear screen on first render only
|
|
63
|
+
firstRender = false;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.stdout.write('\x1b[H'); // Move cursor to top-left (no clear)
|
|
67
|
+
}
|
|
68
|
+
const [ctx, config] = await Promise.all([
|
|
69
|
+
readAllState(cwd),
|
|
70
|
+
readHudConfig(cwd),
|
|
71
|
+
]);
|
|
72
|
+
const preset = flags.preset ?? config.preset;
|
|
73
|
+
const line = renderHud(ctx, preset);
|
|
74
|
+
process.stdout.write(line + '\x1b[K\n\x1b[J'); // Write line, clear rest of line + below
|
|
75
|
+
};
|
|
76
|
+
process.stdout.write('\x1b[?25l'); // Hide cursor
|
|
77
|
+
await render();
|
|
78
|
+
const interval = setInterval(render, 1000);
|
|
79
|
+
// Graceful exit on Ctrl+C
|
|
80
|
+
process.on('SIGINT', () => {
|
|
81
|
+
clearInterval(interval);
|
|
82
|
+
process.stdout.write('\x1b[?25h\x1b[2J\x1b[H'); // Show cursor + clear
|
|
83
|
+
process.exit(0);
|
|
84
|
+
});
|
|
85
|
+
// Keep process alive
|
|
86
|
+
await new Promise(() => { }); // Never resolves - exits via SIGINT
|
|
87
|
+
}
|
|
88
|
+
async function launchTmuxPane(cwd, flags) {
|
|
89
|
+
// Check if we're inside tmux
|
|
90
|
+
if (!process.env.TMUX) {
|
|
91
|
+
console.error('Not inside a tmux session. Start tmux first, then run: omx hud --tmux');
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
const presetArg = flags.preset ? ` --preset=${flags.preset}` : '';
|
|
95
|
+
const omxBin = process.argv[1]; // path to bin/omx.js
|
|
96
|
+
const cmd = `node ${omxBin} hud --watch${presetArg}`;
|
|
97
|
+
try {
|
|
98
|
+
// Split bottom pane, 4 lines tall, running omx hud --watch
|
|
99
|
+
execSync(`tmux split-window -v -l 4 -c "${cwd}" '${cmd}'`, { stdio: 'inherit' });
|
|
100
|
+
console.log('HUD launched in tmux pane below. Close with: Ctrl+C in that pane, or `tmux kill-pane -t bottom`');
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
console.error('Failed to create tmux split. Ensure tmux is available.');
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hud/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMX HUD - Statusline composer
|
|
3
|
+
*
|
|
4
|
+
* Renders HudRenderContext into formatted ANSI strings.
|
|
5
|
+
*/
|
|
6
|
+
import type { HudRenderContext, HudPreset } from './types.js';
|
|
7
|
+
/** Render the HUD statusline from context and preset */
|
|
8
|
+
export declare function renderHud(ctx: HudRenderContext, preset: HudPreset): string;
|
|
9
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/hud/render.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA2L9D,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAc1E"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMX HUD - Statusline composer
|
|
3
|
+
*
|
|
4
|
+
* Renders HudRenderContext into formatted ANSI strings.
|
|
5
|
+
*/
|
|
6
|
+
import { green, yellow, cyan, dim, bold, getRalphColor, RESET } from './colors.js';
|
|
7
|
+
const SEP = dim(' | ');
|
|
8
|
+
function formatTokenCount(value) {
|
|
9
|
+
if (value >= 1_000_000)
|
|
10
|
+
return `${(value / 1_000_000).toFixed(1)}M`;
|
|
11
|
+
if (value >= 1_000)
|
|
12
|
+
return `${(value / 1_000).toFixed(1)}k`;
|
|
13
|
+
return `${value}`;
|
|
14
|
+
}
|
|
15
|
+
function isCurrentSessionMetrics(ctx) {
|
|
16
|
+
if (!ctx.metrics || !ctx.session?.started_at || !ctx.metrics.last_activity)
|
|
17
|
+
return true;
|
|
18
|
+
const sessionStart = new Date(ctx.session.started_at).getTime();
|
|
19
|
+
const lastActivity = new Date(ctx.metrics.last_activity).getTime();
|
|
20
|
+
if (!Number.isFinite(sessionStart) || !Number.isFinite(lastActivity))
|
|
21
|
+
return true;
|
|
22
|
+
return lastActivity >= sessionStart;
|
|
23
|
+
}
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Element Renderers
|
|
26
|
+
// ============================================================================
|
|
27
|
+
function renderGitBranch(ctx) {
|
|
28
|
+
if (!ctx.gitBranch)
|
|
29
|
+
return null;
|
|
30
|
+
return cyan(ctx.gitBranch);
|
|
31
|
+
}
|
|
32
|
+
function renderRalph(ctx) {
|
|
33
|
+
if (!ctx.ralph)
|
|
34
|
+
return null;
|
|
35
|
+
const { iteration, max_iterations } = ctx.ralph;
|
|
36
|
+
const color = getRalphColor(iteration, max_iterations);
|
|
37
|
+
return `${color}ralph:${iteration}/${max_iterations}${RESET}`;
|
|
38
|
+
}
|
|
39
|
+
function renderUltrawork(ctx) {
|
|
40
|
+
if (!ctx.ultrawork)
|
|
41
|
+
return null;
|
|
42
|
+
return cyan('ultrawork');
|
|
43
|
+
}
|
|
44
|
+
function renderAutopilot(ctx) {
|
|
45
|
+
if (!ctx.autopilot)
|
|
46
|
+
return null;
|
|
47
|
+
const phase = ctx.autopilot.current_phase || 'active';
|
|
48
|
+
return yellow(`autopilot:${phase}`);
|
|
49
|
+
}
|
|
50
|
+
function renderTeam(ctx) {
|
|
51
|
+
if (!ctx.team)
|
|
52
|
+
return null;
|
|
53
|
+
const count = ctx.team.agent_count;
|
|
54
|
+
const name = ctx.team.team_name;
|
|
55
|
+
if (count !== undefined && count > 0) {
|
|
56
|
+
return green(`team:${count} workers`);
|
|
57
|
+
}
|
|
58
|
+
if (name) {
|
|
59
|
+
return green(`team:${name}`);
|
|
60
|
+
}
|
|
61
|
+
return green('team');
|
|
62
|
+
}
|
|
63
|
+
function renderEcomode(ctx) {
|
|
64
|
+
if (!ctx.ecomode)
|
|
65
|
+
return null;
|
|
66
|
+
return dim('ecomode');
|
|
67
|
+
}
|
|
68
|
+
function renderPipeline(ctx) {
|
|
69
|
+
if (!ctx.pipeline)
|
|
70
|
+
return null;
|
|
71
|
+
const phase = ctx.pipeline.current_phase || 'active';
|
|
72
|
+
return cyan(`pipeline:${phase}`);
|
|
73
|
+
}
|
|
74
|
+
function renderTurns(ctx) {
|
|
75
|
+
if (!ctx.metrics || !isCurrentSessionMetrics(ctx))
|
|
76
|
+
return null;
|
|
77
|
+
return dim(`turns:${ctx.metrics.session_turns}`);
|
|
78
|
+
}
|
|
79
|
+
function renderTokens(ctx) {
|
|
80
|
+
if (!ctx.metrics || !isCurrentSessionMetrics(ctx))
|
|
81
|
+
return null;
|
|
82
|
+
const total = ctx.metrics.session_total_tokens
|
|
83
|
+
?? ((ctx.metrics.session_input_tokens ?? 0) + (ctx.metrics.session_output_tokens ?? 0));
|
|
84
|
+
if (!Number.isFinite(total) || total <= 0)
|
|
85
|
+
return null;
|
|
86
|
+
return dim(`tokens:${formatTokenCount(total)}`);
|
|
87
|
+
}
|
|
88
|
+
function renderQuota(ctx) {
|
|
89
|
+
if (!ctx.metrics || !isCurrentSessionMetrics(ctx))
|
|
90
|
+
return null;
|
|
91
|
+
const fiveHour = ctx.metrics.five_hour_limit_pct;
|
|
92
|
+
const weekly = ctx.metrics.weekly_limit_pct;
|
|
93
|
+
const parts = [];
|
|
94
|
+
if (typeof fiveHour === 'number' && Number.isFinite(fiveHour) && fiveHour > 0)
|
|
95
|
+
parts.push(`5h:${Math.round(fiveHour)}%`);
|
|
96
|
+
if (typeof weekly === 'number' && Number.isFinite(weekly) && weekly > 0)
|
|
97
|
+
parts.push(`wk:${Math.round(weekly)}%`);
|
|
98
|
+
if (parts.length === 0)
|
|
99
|
+
return null;
|
|
100
|
+
return dim(`quota:${parts.join(',')}`);
|
|
101
|
+
}
|
|
102
|
+
function renderLastActivity(ctx) {
|
|
103
|
+
if (!ctx.hudNotify?.last_turn_at)
|
|
104
|
+
return null;
|
|
105
|
+
const lastAt = new Date(ctx.hudNotify.last_turn_at).getTime();
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
const diffSec = Math.round((now - lastAt) / 1000);
|
|
108
|
+
if (diffSec < 60)
|
|
109
|
+
return dim(`last:${diffSec}s ago`);
|
|
110
|
+
const diffMin = Math.round(diffSec / 60);
|
|
111
|
+
return dim(`last:${diffMin}m ago`);
|
|
112
|
+
}
|
|
113
|
+
function renderTotalTurns(ctx) {
|
|
114
|
+
if (!ctx.metrics?.total_turns)
|
|
115
|
+
return null;
|
|
116
|
+
return dim(`total-turns:${ctx.metrics.total_turns}`);
|
|
117
|
+
}
|
|
118
|
+
function renderSessionDuration(ctx) {
|
|
119
|
+
if (!ctx.session?.started_at)
|
|
120
|
+
return null;
|
|
121
|
+
const startedAt = new Date(ctx.session.started_at).getTime();
|
|
122
|
+
const now = Date.now();
|
|
123
|
+
const diffSec = Math.round((now - startedAt) / 1000);
|
|
124
|
+
if (diffSec < 60)
|
|
125
|
+
return dim(`session:${diffSec}s`);
|
|
126
|
+
if (diffSec < 3600)
|
|
127
|
+
return dim(`session:${Math.round(diffSec / 60)}m`);
|
|
128
|
+
const hours = Math.floor(diffSec / 3600);
|
|
129
|
+
const mins = Math.round((diffSec % 3600) / 60);
|
|
130
|
+
return dim(`session:${hours}h${mins}m`);
|
|
131
|
+
}
|
|
132
|
+
const MINIMAL_ELEMENTS = [
|
|
133
|
+
renderGitBranch,
|
|
134
|
+
renderRalph,
|
|
135
|
+
renderUltrawork,
|
|
136
|
+
renderTeam,
|
|
137
|
+
renderTurns,
|
|
138
|
+
];
|
|
139
|
+
const FOCUSED_ELEMENTS = [
|
|
140
|
+
renderGitBranch,
|
|
141
|
+
renderRalph,
|
|
142
|
+
renderUltrawork,
|
|
143
|
+
renderAutopilot,
|
|
144
|
+
renderTeam,
|
|
145
|
+
renderPipeline,
|
|
146
|
+
renderEcomode,
|
|
147
|
+
renderTurns,
|
|
148
|
+
renderTokens,
|
|
149
|
+
renderQuota,
|
|
150
|
+
renderSessionDuration,
|
|
151
|
+
renderLastActivity,
|
|
152
|
+
];
|
|
153
|
+
const FULL_ELEMENTS = [
|
|
154
|
+
renderGitBranch,
|
|
155
|
+
renderRalph,
|
|
156
|
+
renderUltrawork,
|
|
157
|
+
renderAutopilot,
|
|
158
|
+
renderTeam,
|
|
159
|
+
renderPipeline,
|
|
160
|
+
renderEcomode,
|
|
161
|
+
renderTurns,
|
|
162
|
+
renderTokens,
|
|
163
|
+
renderQuota,
|
|
164
|
+
renderSessionDuration,
|
|
165
|
+
renderLastActivity,
|
|
166
|
+
renderTotalTurns,
|
|
167
|
+
];
|
|
168
|
+
function getElements(preset) {
|
|
169
|
+
switch (preset) {
|
|
170
|
+
case 'minimal': return MINIMAL_ELEMENTS;
|
|
171
|
+
case 'full': return FULL_ELEMENTS;
|
|
172
|
+
case 'focused':
|
|
173
|
+
default: return FOCUSED_ELEMENTS;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// ============================================================================
|
|
177
|
+
// Main Render
|
|
178
|
+
// ============================================================================
|
|
179
|
+
/** Render the HUD statusline from context and preset */
|
|
180
|
+
export function renderHud(ctx, preset) {
|
|
181
|
+
const elements = getElements(preset);
|
|
182
|
+
const parts = elements
|
|
183
|
+
.map(fn => fn(ctx))
|
|
184
|
+
.filter((s) => s !== null);
|
|
185
|
+
const ver = ctx.version ? `#${ctx.version.replace(/^v/, '')}` : '';
|
|
186
|
+
const label = bold(`[OMX${ver}]`);
|
|
187
|
+
if (parts.length === 0) {
|
|
188
|
+
return label + ' ' + dim('No active modes.');
|
|
189
|
+
}
|
|
190
|
+
return label + ' ' + parts.join(SEP);
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/hud/render.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEnF,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAEvB,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,IAAI,KAAK,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,OAAO,GAAG,KAAK,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAqB;IACpD,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAExF,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IAChE,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAElF,OAAO,YAAY,IAAI,YAAY,CAAC;AACtC,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,SAAS,eAAe,CAAC,GAAqB;IAC5C,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,GAAqB;IACxC,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;IAChD,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACvD,OAAO,GAAG,KAAK,SAAS,SAAS,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,eAAe,CAAC,GAAqB;IAC5C,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,eAAe,CAAC,GAAqB;IAC5C,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,aAAa,IAAI,QAAQ,CAAC;IACtD,OAAO,MAAM,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,GAAqB;IACvC,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,aAAa,CAAC,GAAqB;IAC1C,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,GAAqB;IAC3C,IAAI,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC;IACrD,OAAO,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,WAAW,CAAC,GAAqB;IACxC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,GAAG,CAAC,SAAS,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,YAAY,CAAC,GAAqB;IACzC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/D,MAAM,KAAK,GACT,GAAG,CAAC,OAAO,CAAC,oBAAoB;WAC7B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,GAAG,CAAC,UAAU,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,GAAqB;IACxC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACjD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAE5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACzH,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAqB;IAC/C,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAElD,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,QAAQ,OAAO,OAAO,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC,QAAQ,OAAO,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAqB;IAC7C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,GAAG,CAAC,eAAe,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAqB;IAClD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;IAErD,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,WAAW,OAAO,GAAG,CAAC,CAAC;IACpD,IAAI,OAAO,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,WAAW,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAC1C,CAAC;AAQD,MAAM,gBAAgB,GAAsB;IAC1C,eAAe;IACf,WAAW;IACX,eAAe;IACf,UAAU;IACV,WAAW;CACZ,CAAC;AAEF,MAAM,gBAAgB,GAAsB;IAC1C,eAAe;IACf,WAAW;IACX,eAAe;IACf,eAAe;IACf,UAAU;IACV,cAAc;IACd,aAAa;IACb,WAAW;IACX,YAAY;IACZ,WAAW;IACX,qBAAqB;IACrB,kBAAkB;CACnB,CAAC;AAEF,MAAM,aAAa,GAAsB;IACvC,eAAe;IACf,WAAW;IACX,eAAe;IACf,eAAe;IACf,UAAU;IACV,cAAc;IACd,aAAa;IACb,WAAW;IACX,YAAY;IACZ,WAAW;IACX,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;CACjB,CAAC;AAEF,SAAS,WAAW,CAAC,MAAiB;IACpC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS,CAAC,CAAC,OAAO,gBAAgB,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,OAAO,aAAa,CAAC;QAClC,KAAK,SAAS,CAAC;QACf,OAAO,CAAC,CAAC,OAAO,gBAAgB,CAAC;IACnC,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,wDAAwD;AACxD,MAAM,UAAU,SAAS,CAAC,GAAqB,EAAE,MAAiB;IAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ;SACnB,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAE1C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;IAElC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMX HUD - State file readers
|
|
3
|
+
*
|
|
4
|
+
* Reads .omx/state/ files to build HUD render context.
|
|
5
|
+
*/
|
|
6
|
+
import type { RalphStateForHud, UltraworkStateForHud, AutopilotStateForHud, TeamStateForHud, EcomodeStateForHud, PipelineStateForHud, HudMetrics, HudNotifyState, HudConfig, HudRenderContext, SessionStateForHud } from './types.js';
|
|
7
|
+
export declare function readRalphState(cwd: string): Promise<RalphStateForHud | null>;
|
|
8
|
+
export declare function readUltraworkState(cwd: string): Promise<UltraworkStateForHud | null>;
|
|
9
|
+
export declare function readAutopilotState(cwd: string): Promise<AutopilotStateForHud | null>;
|
|
10
|
+
export declare function readTeamState(cwd: string): Promise<TeamStateForHud | null>;
|
|
11
|
+
export declare function readEcomodeState(cwd: string): Promise<EcomodeStateForHud | null>;
|
|
12
|
+
export declare function readPipelineState(cwd: string): Promise<PipelineStateForHud | null>;
|
|
13
|
+
export declare function readMetrics(cwd: string): Promise<HudMetrics | null>;
|
|
14
|
+
export declare function readHudNotifyState(cwd: string): Promise<HudNotifyState | null>;
|
|
15
|
+
export declare function readSessionState(cwd: string): Promise<SessionStateForHud | null>;
|
|
16
|
+
export declare function readHudConfig(cwd: string): Promise<HudConfig>;
|
|
17
|
+
export declare function readVersion(): string | null;
|
|
18
|
+
export declare function readGitBranch(cwd: string): string | null;
|
|
19
|
+
/** Read all state files and build the full render context */
|
|
20
|
+
export declare function readAllState(cwd: string): Promise<HudRenderContext>;
|
|
21
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/hud/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAYpB,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGlF;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAG1F;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAG1F;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAGhF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAGtF;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAGxF;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAEzE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAEpF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAGtF;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAGnE;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAS3C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxD;AAED,6DAA6D;AAC7D,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkBzE"}
|