oh-my-claude-sisyphus 3.4.0 → 3.4.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 +71 -5
- package/commands/cancel-ecomode.md +71 -0
- package/commands/cancel.md +75 -0
- package/commands/pipeline.md +231 -0
- package/commands/planner.md +174 -0
- package/commands/swarm.md +280 -0
- package/dist/analytics/cost-estimator.d.ts +14 -0
- package/dist/analytics/cost-estimator.d.ts.map +1 -0
- package/dist/analytics/cost-estimator.js +70 -0
- package/dist/analytics/cost-estimator.js.map +1 -0
- package/dist/analytics/export.d.ts +7 -0
- package/dist/analytics/export.d.ts.map +1 -0
- package/dist/analytics/export.js +93 -0
- package/dist/analytics/export.js.map +1 -0
- package/dist/analytics/index.d.ts +14 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +14 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/metrics-collector.d.ts +30 -0
- package/dist/analytics/metrics-collector.d.ts.map +1 -0
- package/dist/analytics/metrics-collector.js +96 -0
- package/dist/analytics/metrics-collector.js.map +1 -0
- package/dist/analytics/query-engine.d.ts +32 -0
- package/dist/analytics/query-engine.d.ts.map +1 -0
- package/dist/analytics/query-engine.js +151 -0
- package/dist/analytics/query-engine.js.map +1 -0
- package/dist/analytics/session-manager.d.ts +26 -0
- package/dist/analytics/session-manager.d.ts.map +1 -0
- package/dist/analytics/session-manager.js +201 -0
- package/dist/analytics/session-manager.js.map +1 -0
- package/dist/analytics/session-types.d.ts +37 -0
- package/dist/analytics/session-types.d.ts.map +1 -0
- package/dist/analytics/session-types.js +2 -0
- package/dist/analytics/session-types.js.map +1 -0
- package/dist/analytics/token-tracker.d.ts +24 -0
- package/dist/analytics/token-tracker.d.ts.map +1 -0
- package/dist/analytics/token-tracker.js +161 -0
- package/dist/analytics/token-tracker.js.map +1 -0
- package/dist/analytics/types.d.ts +37 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +21 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/cli/analytics.d.ts +3 -0
- package/dist/cli/analytics.d.ts.map +1 -0
- package/dist/cli/analytics.js +74 -0
- package/dist/cli/analytics.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +5 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +29 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +4 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/cleanup.js +17 -0
- package/dist/cli/commands/cleanup.js.map +1 -0
- package/dist/cli/commands/cost.d.ts +4 -0
- package/dist/cli/commands/cost.d.ts.map +1 -0
- package/dist/cli/commands/cost.js +53 -0
- package/dist/cli/commands/cost.js.map +1 -0
- package/dist/cli/commands/export.d.ts +5 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +30 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/sessions.d.ts +5 -0
- package/dist/cli/commands/sessions.d.ts.map +1 -0
- package/dist/cli/commands/sessions.js +37 -0
- package/dist/cli/commands/sessions.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +4 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +43 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/utils/formatting.d.ts +22 -0
- package/dist/cli/utils/formatting.d.ts.map +1 -0
- package/dist/cli/utils/formatting.js +70 -0
- package/dist/cli/utils/formatting.js.map +1 -0
- package/dist/hud/analytics-display.d.ts +28 -0
- package/dist/hud/analytics-display.d.ts.map +1 -0
- package/dist/hud/analytics-display.js +105 -0
- package/dist/hud/analytics-display.js.map +1 -0
- package/dist/hud/background-cleanup.d.ts +28 -0
- package/dist/hud/background-cleanup.d.ts.map +1 -0
- package/dist/hud/background-cleanup.js +92 -0
- package/dist/hud/background-cleanup.js.map +1 -0
- package/dist/hud/index.js +4 -2
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/render.d.ts +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +32 -1
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts +5 -0
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +13 -0
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/types.d.ts +11 -1
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +19 -0
- package/dist/hud/types.js.map +1 -1
- package/docs/FULL-README.md +130 -16
- package/docs/MIGRATION.md +222 -1
- package/docs/SYNC-SYSTEM.md +528 -0
- package/package.json +8 -2
- package/scripts/sync-metadata.ts +363 -0
- package/skills/build-fix/SKILL.md +123 -0
- package/skills/code-review/SKILL.md +179 -0
- package/skills/security-review/SKILL.md +254 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { getTokenTracker } from '../../analytics/token-tracker.js';
|
|
2
|
+
import { getSessionManager } from '../../analytics/session-manager.js';
|
|
3
|
+
import { colors, formatCostWithColor, formatTokenCount, formatDuration } from '../utils/formatting.js';
|
|
4
|
+
export async function statsCommand(options) {
|
|
5
|
+
const tracker = getTokenTracker();
|
|
6
|
+
const manager = getSessionManager();
|
|
7
|
+
const stats = tracker.getSessionStats();
|
|
8
|
+
const session = await manager.getCurrentSession();
|
|
9
|
+
const topAgents = await tracker.getTopAgents(5);
|
|
10
|
+
if (options.json) {
|
|
11
|
+
console.log(JSON.stringify({ stats, session, topAgents }, null, 2));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// Display session info
|
|
15
|
+
console.log(colors.bold('\n📊 Current Session Stats\n'));
|
|
16
|
+
if (session) {
|
|
17
|
+
const duration = Date.now() - new Date(session.startTime).getTime();
|
|
18
|
+
console.log(`Session ID: ${colors.cyan(session.id)}`);
|
|
19
|
+
console.log(`Duration: ${formatDuration(duration)}`);
|
|
20
|
+
console.log(`Tags: ${session.tags.join(', ')}`);
|
|
21
|
+
console.log(`Goals: ${session.goals.length}`);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.log(colors.gray('No active session'));
|
|
25
|
+
}
|
|
26
|
+
// Display token stats
|
|
27
|
+
console.log(colors.bold('\n💰 Token Usage & Cost\n'));
|
|
28
|
+
const totalTokens = stats.totalInputTokens + stats.totalOutputTokens;
|
|
29
|
+
const totalCost = topAgents.reduce((sum, a) => sum + a.cost, 0);
|
|
30
|
+
console.log(`Total Tokens: ${colors.blue(formatTokenCount(totalTokens))}`);
|
|
31
|
+
console.log(`Input: ${formatTokenCount(stats.totalInputTokens)} | Output: ${formatTokenCount(stats.totalOutputTokens)}`);
|
|
32
|
+
console.log(`Cache Read: ${formatTokenCount(stats.totalCacheRead)} | Cache Write: ${formatTokenCount(stats.totalCacheCreation)}`);
|
|
33
|
+
console.log(`Total Cost: ${formatCostWithColor(totalCost)}`);
|
|
34
|
+
// Display top agents
|
|
35
|
+
if (topAgents.length > 0) {
|
|
36
|
+
console.log(colors.bold('\n🤖 Top Agents by Cost\n'));
|
|
37
|
+
for (const agent of topAgents) {
|
|
38
|
+
console.log(` ${agent.agent.padEnd(25)} ${formatTokenCount(agent.tokens).padStart(8)} tokens ${formatCostWithColor(agent.cost)}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
console.log('');
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface TableColumn {
|
|
2
|
+
header: string;
|
|
3
|
+
field: string;
|
|
4
|
+
width: number;
|
|
5
|
+
align?: 'left' | 'right' | 'center';
|
|
6
|
+
format?: (value: any) => string;
|
|
7
|
+
}
|
|
8
|
+
export declare function renderTable(data: any[], columns: TableColumn[]): string;
|
|
9
|
+
export declare const colors: {
|
|
10
|
+
red: (text: string) => string;
|
|
11
|
+
green: (text: string) => string;
|
|
12
|
+
yellow: (text: string) => string;
|
|
13
|
+
blue: (text: string) => string;
|
|
14
|
+
magenta: (text: string) => string;
|
|
15
|
+
cyan: (text: string) => string;
|
|
16
|
+
gray: (text: string) => string;
|
|
17
|
+
bold: (text: string) => string;
|
|
18
|
+
};
|
|
19
|
+
export declare function formatCostWithColor(cost: number): string;
|
|
20
|
+
export declare function formatTokenCount(tokens: number): string;
|
|
21
|
+
export declare function formatDuration(ms: number): string;
|
|
22
|
+
//# sourceMappingURL=formatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/formatting.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC;CACjC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAuBvE;AAkBD,eAAO,MAAM,MAAM;gBACL,MAAM;kBACJ,MAAM;mBACL,MAAM;iBACR,MAAM;oBACH,MAAM;iBACT,MAAM;iBACN,MAAM;iBACN,MAAM;CACpB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export function renderTable(data, columns) {
|
|
2
|
+
const lines = [];
|
|
3
|
+
// Header
|
|
4
|
+
const headerRow = columns.map(col => {
|
|
5
|
+
return padString(col.header, col.width, col.align || 'left');
|
|
6
|
+
}).join(' | ');
|
|
7
|
+
lines.push(headerRow);
|
|
8
|
+
lines.push(columns.map(col => '-'.repeat(col.width)).join('-+-'));
|
|
9
|
+
// Data rows
|
|
10
|
+
for (const row of data) {
|
|
11
|
+
const dataRow = columns.map(col => {
|
|
12
|
+
const value = row[col.field];
|
|
13
|
+
const formatted = col.format ? col.format(value) : String(value ?? '');
|
|
14
|
+
return padString(formatted, col.width, col.align || 'left');
|
|
15
|
+
}).join(' | ');
|
|
16
|
+
lines.push(dataRow);
|
|
17
|
+
}
|
|
18
|
+
return lines.join('\n');
|
|
19
|
+
}
|
|
20
|
+
function padString(str, width, align) {
|
|
21
|
+
const stripAnsi = (s) => s.replace(/\x1b\[[0-9;]*m/g, '');
|
|
22
|
+
const visibleLength = stripAnsi(str).length;
|
|
23
|
+
const padding = Math.max(0, width - visibleLength);
|
|
24
|
+
if (align === 'right') {
|
|
25
|
+
return ' '.repeat(padding) + str;
|
|
26
|
+
}
|
|
27
|
+
else if (align === 'center') {
|
|
28
|
+
const leftPad = Math.floor(padding / 2);
|
|
29
|
+
const rightPad = padding - leftPad;
|
|
30
|
+
return ' '.repeat(leftPad) + str + ' '.repeat(rightPad);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return str + ' '.repeat(padding);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export const colors = {
|
|
37
|
+
red: (text) => `\x1b[31m${text}\x1b[0m`,
|
|
38
|
+
green: (text) => `\x1b[32m${text}\x1b[0m`,
|
|
39
|
+
yellow: (text) => `\x1b[33m${text}\x1b[0m`,
|
|
40
|
+
blue: (text) => `\x1b[34m${text}\x1b[0m`,
|
|
41
|
+
magenta: (text) => `\x1b[35m${text}\x1b[0m`,
|
|
42
|
+
cyan: (text) => `\x1b[36m${text}\x1b[0m`,
|
|
43
|
+
gray: (text) => `\x1b[90m${text}\x1b[0m`,
|
|
44
|
+
bold: (text) => `\x1b[1m${text}\x1b[0m`
|
|
45
|
+
};
|
|
46
|
+
export function formatCostWithColor(cost) {
|
|
47
|
+
if (cost < 1.0)
|
|
48
|
+
return colors.green(`$${cost.toFixed(4)}`);
|
|
49
|
+
if (cost < 5.0)
|
|
50
|
+
return colors.yellow(`$${cost.toFixed(4)}`);
|
|
51
|
+
return colors.red(`$${cost.toFixed(4)}`);
|
|
52
|
+
}
|
|
53
|
+
export function formatTokenCount(tokens) {
|
|
54
|
+
if (tokens < 1000)
|
|
55
|
+
return `${tokens}`;
|
|
56
|
+
if (tokens < 1000000)
|
|
57
|
+
return `${(tokens / 1000).toFixed(1)}k`;
|
|
58
|
+
return `${(tokens / 1000000).toFixed(2)}M`;
|
|
59
|
+
}
|
|
60
|
+
export function formatDuration(ms) {
|
|
61
|
+
const seconds = Math.floor(ms / 1000);
|
|
62
|
+
const minutes = Math.floor(seconds / 60);
|
|
63
|
+
const hours = Math.floor(minutes / 60);
|
|
64
|
+
if (hours > 0)
|
|
65
|
+
return `${hours}h ${minutes % 60}m`;
|
|
66
|
+
if (minutes > 0)
|
|
67
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
68
|
+
return `${seconds}s`;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../src/cli/utils/formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMC HUD - Analytics Display
|
|
3
|
+
*
|
|
4
|
+
* Display components for token tracking and cost analytics in the HUD.
|
|
5
|
+
*/
|
|
6
|
+
export interface AnalyticsDisplay {
|
|
7
|
+
sessionCost: string;
|
|
8
|
+
sessionTokens: string;
|
|
9
|
+
topAgents: string;
|
|
10
|
+
cacheEfficiency: string;
|
|
11
|
+
costColor: 'green' | 'yellow' | 'red';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get analytics display data for the current session.
|
|
15
|
+
* Safe to call even if analytics modules are not initialized.
|
|
16
|
+
*
|
|
17
|
+
* @returns Analytics display data with safe defaults
|
|
18
|
+
*/
|
|
19
|
+
export declare function getAnalyticsDisplay(): Promise<AnalyticsDisplay>;
|
|
20
|
+
/**
|
|
21
|
+
* Render analytics as a single-line string for HUD display.
|
|
22
|
+
*/
|
|
23
|
+
export declare function renderAnalyticsLine(analytics: AnalyticsDisplay): string;
|
|
24
|
+
/**
|
|
25
|
+
* Get current session info for HUD display.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getSessionInfo(): Promise<string>;
|
|
28
|
+
//# sourceMappingURL=analytics-display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-display.d.ts","sourceRoot":"","sources":["../../src/hud/analytics-display.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA2DrE;AAWD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAKvE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBtD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMC HUD - Analytics Display
|
|
3
|
+
*
|
|
4
|
+
* Display components for token tracking and cost analytics in the HUD.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get analytics display data for the current session.
|
|
8
|
+
* Safe to call even if analytics modules are not initialized.
|
|
9
|
+
*
|
|
10
|
+
* @returns Analytics display data with safe defaults
|
|
11
|
+
*/
|
|
12
|
+
export async function getAnalyticsDisplay() {
|
|
13
|
+
try {
|
|
14
|
+
// Dynamic imports to avoid circular dependencies and handle missing modules
|
|
15
|
+
const { getTokenTracker } = await import('../analytics/token-tracker.js');
|
|
16
|
+
const { calculateCost, formatCost, getCostColor } = await import('../analytics/cost-estimator.js');
|
|
17
|
+
const tracker = getTokenTracker();
|
|
18
|
+
const stats = tracker.getSessionStats();
|
|
19
|
+
// Calculate total cost
|
|
20
|
+
let totalCost = 0;
|
|
21
|
+
for (const [model, usages] of Object.entries(stats.byModel)) {
|
|
22
|
+
for (const usage of usages) {
|
|
23
|
+
const cost = calculateCost({
|
|
24
|
+
modelName: model,
|
|
25
|
+
inputTokens: usage.inputTokens,
|
|
26
|
+
outputTokens: usage.outputTokens,
|
|
27
|
+
cacheCreationTokens: usage.cacheCreationTokens,
|
|
28
|
+
cacheReadTokens: usage.cacheReadTokens
|
|
29
|
+
});
|
|
30
|
+
totalCost += cost.totalCost;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Get top agents
|
|
34
|
+
const topAgents = await tracker.getTopAgents(3);
|
|
35
|
+
const topAgentsStr = topAgents.length > 0
|
|
36
|
+
? topAgents.map(a => `${a.agent}:${formatCost(a.cost)}`).join(' ')
|
|
37
|
+
: 'none';
|
|
38
|
+
// Calculate cache efficiency
|
|
39
|
+
const totalCacheRead = stats.totalCacheRead;
|
|
40
|
+
const totalInput = stats.totalInputTokens;
|
|
41
|
+
const cacheHitRate = totalInput > 0 ? (totalCacheRead / totalInput) * 100 : 0;
|
|
42
|
+
const cacheEfficiency = `${cacheHitRate.toFixed(1)}%`;
|
|
43
|
+
// Format totals
|
|
44
|
+
const totalTokens = stats.totalInputTokens + stats.totalOutputTokens;
|
|
45
|
+
const sessionTokens = formatTokenCount(totalTokens);
|
|
46
|
+
const sessionCost = formatCost(totalCost);
|
|
47
|
+
const costColor = getCostColor(totalCost);
|
|
48
|
+
return {
|
|
49
|
+
sessionCost,
|
|
50
|
+
sessionTokens,
|
|
51
|
+
topAgents: topAgentsStr,
|
|
52
|
+
cacheEfficiency,
|
|
53
|
+
costColor
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
// Return safe defaults if analytics not yet initialized
|
|
58
|
+
return {
|
|
59
|
+
sessionCost: '$0.00',
|
|
60
|
+
sessionTokens: '0',
|
|
61
|
+
topAgents: 'none',
|
|
62
|
+
cacheEfficiency: '0%',
|
|
63
|
+
costColor: 'green'
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format token count with K/M suffix for readability.
|
|
69
|
+
*/
|
|
70
|
+
function formatTokenCount(tokens) {
|
|
71
|
+
if (tokens < 1000)
|
|
72
|
+
return `${tokens}`;
|
|
73
|
+
if (tokens < 1000000)
|
|
74
|
+
return `${(tokens / 1000).toFixed(1)}k`;
|
|
75
|
+
return `${(tokens / 1000000).toFixed(2)}M`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Render analytics as a single-line string for HUD display.
|
|
79
|
+
*/
|
|
80
|
+
export function renderAnalyticsLine(analytics) {
|
|
81
|
+
const costIndicator = analytics.costColor === 'green' ? '●' :
|
|
82
|
+
analytics.costColor === 'yellow' ? '●' : '●';
|
|
83
|
+
return `${costIndicator} Cost: ${analytics.sessionCost} | Tokens: ${analytics.sessionTokens} | Cache: ${analytics.cacheEfficiency} | Top: ${analytics.topAgents}`;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get current session info for HUD display.
|
|
87
|
+
*/
|
|
88
|
+
export async function getSessionInfo() {
|
|
89
|
+
try {
|
|
90
|
+
const { getSessionManager } = await import('../analytics/session-manager.js');
|
|
91
|
+
const manager = getSessionManager();
|
|
92
|
+
const session = await manager.getCurrentSession();
|
|
93
|
+
if (!session) {
|
|
94
|
+
return 'No active session';
|
|
95
|
+
}
|
|
96
|
+
const duration = Date.now() - new Date(session.startTime).getTime();
|
|
97
|
+
const durationMinutes = Math.floor(duration / 60000);
|
|
98
|
+
const tags = session.tags.join(',');
|
|
99
|
+
return `Session: ${session.id.slice(-8)} | ${durationMinutes}m | Tags: ${tags}`;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return 'Session info unavailable';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=analytics-display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-display.js","sourceRoot":"","sources":["../../src/hud/analytics-display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMC HUD - Background Task Cleanup
|
|
3
|
+
*
|
|
4
|
+
* Handles cleanup of stale and orphaned background tasks on HUD startup.
|
|
5
|
+
*/
|
|
6
|
+
import type { BackgroundTask } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Clean up stale background tasks from HUD state.
|
|
9
|
+
* Removes tasks that are old and not recently completed.
|
|
10
|
+
*
|
|
11
|
+
* @param thresholdMs Age threshold in milliseconds (default: 30 minutes)
|
|
12
|
+
* @returns Number of tasks removed
|
|
13
|
+
*/
|
|
14
|
+
export declare function cleanupStaleBackgroundTasks(thresholdMs?: number): Promise<number>;
|
|
15
|
+
/**
|
|
16
|
+
* Detect orphaned background tasks that are still marked as running
|
|
17
|
+
* but are likely from a previous session crash.
|
|
18
|
+
*
|
|
19
|
+
* @returns Array of orphaned tasks
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectOrphanedTasks(): Promise<BackgroundTask[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Mark orphaned tasks as stale/completed to clean up the display.
|
|
24
|
+
*
|
|
25
|
+
* @returns Number of tasks marked
|
|
26
|
+
*/
|
|
27
|
+
export declare function markOrphanedTasksAsStale(): Promise<number>;
|
|
28
|
+
//# sourceMappingURL=background-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-cleanup.d.ts","sourceRoot":"","sources":["../../src/hud/background-cleanup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,YAAY,CAAC;AAK9D;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,GAAE,MAAgC,GAC5C,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAyBrE;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAuBhE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OMC HUD - Background Task Cleanup
|
|
3
|
+
*
|
|
4
|
+
* Handles cleanup of stale and orphaned background tasks on HUD startup.
|
|
5
|
+
*/
|
|
6
|
+
import { readHudState, writeHudState } from './state.js';
|
|
7
|
+
const STALE_TASK_THRESHOLD_MS = 30 * 60 * 1000; // 30 minutes default
|
|
8
|
+
/**
|
|
9
|
+
* Clean up stale background tasks from HUD state.
|
|
10
|
+
* Removes tasks that are old and not recently completed.
|
|
11
|
+
*
|
|
12
|
+
* @param thresholdMs Age threshold in milliseconds (default: 30 minutes)
|
|
13
|
+
* @returns Number of tasks removed
|
|
14
|
+
*/
|
|
15
|
+
export async function cleanupStaleBackgroundTasks(thresholdMs = STALE_TASK_THRESHOLD_MS) {
|
|
16
|
+
const state = readHudState();
|
|
17
|
+
if (!state || !state.backgroundTasks) {
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
const originalCount = state.backgroundTasks.length;
|
|
22
|
+
// Filter out stale tasks
|
|
23
|
+
state.backgroundTasks = state.backgroundTasks.filter(task => {
|
|
24
|
+
// Use startedAt for age calculation
|
|
25
|
+
const taskAge = now - new Date(task.startedAt).getTime();
|
|
26
|
+
// Keep if:
|
|
27
|
+
// - Task is completed (for history)
|
|
28
|
+
// - Task is recent (within threshold)
|
|
29
|
+
return task.status === 'completed' || taskAge < thresholdMs;
|
|
30
|
+
});
|
|
31
|
+
// Limit history to 20 most recent
|
|
32
|
+
if (state.backgroundTasks.length > 20) {
|
|
33
|
+
state.backgroundTasks = state.backgroundTasks.slice(-20);
|
|
34
|
+
}
|
|
35
|
+
const removedCount = originalCount - state.backgroundTasks.length;
|
|
36
|
+
if (removedCount > 0) {
|
|
37
|
+
writeHudState(state);
|
|
38
|
+
}
|
|
39
|
+
return removedCount;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Detect orphaned background tasks that are still marked as running
|
|
43
|
+
* but are likely from a previous session crash.
|
|
44
|
+
*
|
|
45
|
+
* @returns Array of orphaned tasks
|
|
46
|
+
*/
|
|
47
|
+
export async function detectOrphanedTasks() {
|
|
48
|
+
const state = readHudState();
|
|
49
|
+
if (!state || !state.backgroundTasks) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
// Detect tasks that are marked as running but should have completed
|
|
53
|
+
// (e.g., from previous session crashes)
|
|
54
|
+
const orphaned = [];
|
|
55
|
+
for (const task of state.backgroundTasks) {
|
|
56
|
+
if (task.status === 'running') {
|
|
57
|
+
// Check if task is from a previous HUD session
|
|
58
|
+
// (simple heuristic: running for more than 2 hours is likely orphaned)
|
|
59
|
+
const taskAge = Date.now() - new Date(task.startedAt).getTime();
|
|
60
|
+
const TWO_HOURS_MS = 2 * 60 * 60 * 1000;
|
|
61
|
+
if (taskAge > TWO_HOURS_MS) {
|
|
62
|
+
orphaned.push(task);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return orphaned;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Mark orphaned tasks as stale/completed to clean up the display.
|
|
70
|
+
*
|
|
71
|
+
* @returns Number of tasks marked
|
|
72
|
+
*/
|
|
73
|
+
export async function markOrphanedTasksAsStale() {
|
|
74
|
+
const state = readHudState();
|
|
75
|
+
if (!state || !state.backgroundTasks) {
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
const orphaned = await detectOrphanedTasks();
|
|
79
|
+
let marked = 0;
|
|
80
|
+
for (const orphanedTask of orphaned) {
|
|
81
|
+
const task = state.backgroundTasks.find(t => t.id === orphanedTask.id);
|
|
82
|
+
if (task && task.status === 'running') {
|
|
83
|
+
task.status = 'completed'; // Mark as completed to remove from active display
|
|
84
|
+
marked++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (marked > 0) {
|
|
88
|
+
writeHudState(state);
|
|
89
|
+
}
|
|
90
|
+
return marked;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=background-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-cleanup.js","sourceRoot":"","sources":["../../src/hud/background-cleanup.ts"],"names":[],"mappings":"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"}
|
package/dist/hud/index.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { readStdin, getContextPercent, getModelName } from './stdin.js';
|
|
9
9
|
import { parseTranscript } from './transcript.js';
|
|
10
|
-
import { readHudState, readHudConfig, getRunningTasks } from './state.js';
|
|
10
|
+
import { readHudState, readHudConfig, getRunningTasks, initializeHUDState } from './state.js';
|
|
11
11
|
import { readRalphStateForHud, readUltraworkStateForHud, readPrdStateForHud, readAutopilotStateForHud, } from './omc-state.js';
|
|
12
12
|
import { getUsage } from './usage-api.js';
|
|
13
13
|
import { render } from './render.js';
|
|
@@ -33,6 +33,8 @@ function calculateSessionHealth(sessionStart, contextPercent) {
|
|
|
33
33
|
*/
|
|
34
34
|
async function main() {
|
|
35
35
|
try {
|
|
36
|
+
// Initialize HUD state (cleanup stale/orphaned tasks)
|
|
37
|
+
await initializeHUDState();
|
|
36
38
|
// Read stdin from Claude Code
|
|
37
39
|
const stdin = await readStdin();
|
|
38
40
|
if (!stdin) {
|
|
@@ -76,7 +78,7 @@ async function main() {
|
|
|
76
78
|
sessionHealth: calculateSessionHealth(transcriptData.sessionStart, getContextPercent(stdin))
|
|
77
79
|
};
|
|
78
80
|
// Render and output
|
|
79
|
-
const output = render(context, config);
|
|
81
|
+
const output = await render(context, config);
|
|
80
82
|
// Replace spaces with non-breaking spaces for terminal alignment
|
|
81
83
|
const formattedOutput = output.replace(/ /g, '\u00A0');
|
|
82
84
|
console.log(formattedOutput);
|
package/dist/hud/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hud/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hud/index.ts"],"names":[],"mappings":"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"}
|
package/dist/hud/render.d.ts
CHANGED
|
@@ -7,5 +7,5 @@ import type { HudRenderContext, HudConfig } from './types.js';
|
|
|
7
7
|
/**
|
|
8
8
|
* Render the complete statusline (single or multi-line)
|
|
9
9
|
*/
|
|
10
|
-
export declare function render(context: HudRenderContext, config: HudConfig): string
|
|
10
|
+
export declare function render(context: HudRenderContext, config: HudConfig): Promise<string>;
|
|
11
11
|
//# sourceMappingURL=render.d.ts.map
|
package/dist/hud/render.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAgB9D;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAqJ1F"}
|
package/dist/hud/render.js
CHANGED
|
@@ -16,13 +16,34 @@ import { renderPermission } from './elements/permission.js';
|
|
|
16
16
|
import { renderThinking } from './elements/thinking.js';
|
|
17
17
|
import { renderSession } from './elements/session.js';
|
|
18
18
|
import { renderAutopilot } from './elements/autopilot.js';
|
|
19
|
+
import { getAnalyticsDisplay, renderAnalyticsLine, getSessionInfo } from './analytics-display.js';
|
|
19
20
|
/**
|
|
20
21
|
* Render the complete statusline (single or multi-line)
|
|
21
22
|
*/
|
|
22
|
-
export function render(context, config) {
|
|
23
|
+
export async function render(context, config) {
|
|
23
24
|
const elements = [];
|
|
24
25
|
const detailLines = [];
|
|
25
26
|
const { elements: enabledElements } = config;
|
|
27
|
+
// Check if analytics preset is active
|
|
28
|
+
if (config.preset === 'analytics') {
|
|
29
|
+
const analytics = await getAnalyticsDisplay();
|
|
30
|
+
const sessionInfo = await getSessionInfo();
|
|
31
|
+
// Render analytics-focused layout
|
|
32
|
+
const lines = [sessionInfo, renderAnalyticsLine(analytics)];
|
|
33
|
+
// Add agents if available
|
|
34
|
+
if (context.activeAgents.length > 0) {
|
|
35
|
+
const agents = renderAgentsByFormat(context.activeAgents, enabledElements.agentsFormat || 'codes');
|
|
36
|
+
if (agents)
|
|
37
|
+
lines.push(agents);
|
|
38
|
+
}
|
|
39
|
+
// Add todos if available
|
|
40
|
+
if (enabledElements.todos) {
|
|
41
|
+
const todos = renderTodosWithCurrent(context.todos);
|
|
42
|
+
if (todos)
|
|
43
|
+
lines.push(todos);
|
|
44
|
+
}
|
|
45
|
+
return lines.join('\n');
|
|
46
|
+
}
|
|
26
47
|
// [OMC] label
|
|
27
48
|
if (enabledElements.omcLabel) {
|
|
28
49
|
elements.push(bold('[OMC]'));
|
|
@@ -123,6 +144,16 @@ export function render(context, config) {
|
|
|
123
144
|
if (todos)
|
|
124
145
|
detailLines.push(todos);
|
|
125
146
|
}
|
|
147
|
+
// Optionally add analytics line for full/dense presets
|
|
148
|
+
if (config.preset === 'full' || config.preset === 'dense') {
|
|
149
|
+
try {
|
|
150
|
+
const analytics = await getAnalyticsDisplay();
|
|
151
|
+
detailLines.push(renderAnalyticsLine(analytics));
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Analytics not available, skip
|
|
155
|
+
}
|
|
156
|
+
}
|
|
126
157
|
// If we have detail lines, output multi-line
|
|
127
158
|
if (detailLines.length > 0) {
|
|
128
159
|
return [headerLine, ...detailLines].join('\n');
|
package/dist/hud/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/hud/render.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/hud/render.ts"],"names":[],"mappings":"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"}
|
package/dist/hud/state.d.ts
CHANGED
|
@@ -40,4 +40,9 @@ export declare function writeHudConfig(config: HudConfig): boolean;
|
|
|
40
40
|
* Apply a preset to the configuration
|
|
41
41
|
*/
|
|
42
42
|
export declare function applyPreset(preset: HudConfig['preset']): HudConfig;
|
|
43
|
+
/**
|
|
44
|
+
* Initialize HUD state with cleanup of stale/orphaned tasks.
|
|
45
|
+
* Should be called on HUD startup.
|
|
46
|
+
*/
|
|
47
|
+
export declare function initializeHUDState(): Promise<void>;
|
|
43
48
|
//# sourceMappingURL=state.d.ts.map
|
package/dist/hud/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/hud/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/hud/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkEzE;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAwBnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAgBT;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAKjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,cAAc,EAAE,CAG3E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb,CAMA;AAMD;;GAEG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAyBzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CASzD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,SAAS,CAelE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQxD"}
|
package/dist/hud/state.js
CHANGED
|
@@ -8,6 +8,7 @@ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
|
8
8
|
import { join } from 'path';
|
|
9
9
|
import { homedir } from 'os';
|
|
10
10
|
import { DEFAULT_HUD_CONFIG, PRESET_CONFIGS } from './types.js';
|
|
11
|
+
import { cleanupStaleBackgroundTasks, markOrphanedTasksAsStale } from './background-cleanup.js';
|
|
11
12
|
// ============================================================================
|
|
12
13
|
// Path Helpers
|
|
13
14
|
// ============================================================================
|
|
@@ -198,4 +199,16 @@ export function applyPreset(preset) {
|
|
|
198
199
|
writeHudConfig(newConfig);
|
|
199
200
|
return newConfig;
|
|
200
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Initialize HUD state with cleanup of stale/orphaned tasks.
|
|
204
|
+
* Should be called on HUD startup.
|
|
205
|
+
*/
|
|
206
|
+
export async function initializeHUDState() {
|
|
207
|
+
// Clean up stale background tasks from previous sessions
|
|
208
|
+
const removedStale = await cleanupStaleBackgroundTasks();
|
|
209
|
+
const markedOrphaned = await markOrphanedTasksAsStale();
|
|
210
|
+
if (removedStale > 0 || markedOrphaned > 0) {
|
|
211
|
+
console.error(`HUD cleanup: removed ${removedStale} stale tasks, marked ${markedOrphaned} orphaned tasks`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
201
214
|
//# sourceMappingURL=state.js.map
|