oh-my-claude-sisyphus 3.4.0 → 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +71 -5
  2. package/commands/cancel-ecomode.md +71 -0
  3. package/commands/cancel.md +75 -0
  4. package/commands/pipeline.md +231 -0
  5. package/commands/planner.md +174 -0
  6. package/commands/swarm.md +280 -0
  7. package/dist/analytics/cost-estimator.d.ts +14 -0
  8. package/dist/analytics/cost-estimator.d.ts.map +1 -0
  9. package/dist/analytics/cost-estimator.js +70 -0
  10. package/dist/analytics/cost-estimator.js.map +1 -0
  11. package/dist/analytics/export.d.ts +7 -0
  12. package/dist/analytics/export.d.ts.map +1 -0
  13. package/dist/analytics/export.js +93 -0
  14. package/dist/analytics/export.js.map +1 -0
  15. package/dist/analytics/index.d.ts +14 -0
  16. package/dist/analytics/index.d.ts.map +1 -0
  17. package/dist/analytics/index.js +14 -0
  18. package/dist/analytics/index.js.map +1 -0
  19. package/dist/analytics/metrics-collector.d.ts +30 -0
  20. package/dist/analytics/metrics-collector.d.ts.map +1 -0
  21. package/dist/analytics/metrics-collector.js +96 -0
  22. package/dist/analytics/metrics-collector.js.map +1 -0
  23. package/dist/analytics/query-engine.d.ts +32 -0
  24. package/dist/analytics/query-engine.d.ts.map +1 -0
  25. package/dist/analytics/query-engine.js +151 -0
  26. package/dist/analytics/query-engine.js.map +1 -0
  27. package/dist/analytics/session-manager.d.ts +26 -0
  28. package/dist/analytics/session-manager.d.ts.map +1 -0
  29. package/dist/analytics/session-manager.js +201 -0
  30. package/dist/analytics/session-manager.js.map +1 -0
  31. package/dist/analytics/session-types.d.ts +37 -0
  32. package/dist/analytics/session-types.d.ts.map +1 -0
  33. package/dist/analytics/session-types.js +2 -0
  34. package/dist/analytics/session-types.js.map +1 -0
  35. package/dist/analytics/token-tracker.d.ts +24 -0
  36. package/dist/analytics/token-tracker.d.ts.map +1 -0
  37. package/dist/analytics/token-tracker.js +161 -0
  38. package/dist/analytics/token-tracker.js.map +1 -0
  39. package/dist/analytics/types.d.ts +37 -0
  40. package/dist/analytics/types.d.ts.map +1 -0
  41. package/dist/analytics/types.js +21 -0
  42. package/dist/analytics/types.js.map +1 -0
  43. package/dist/cli/analytics.d.ts +3 -0
  44. package/dist/cli/analytics.d.ts.map +1 -0
  45. package/dist/cli/analytics.js +74 -0
  46. package/dist/cli/analytics.js.map +1 -0
  47. package/dist/cli/commands/agents.d.ts +5 -0
  48. package/dist/cli/commands/agents.d.ts.map +1 -0
  49. package/dist/cli/commands/agents.js +29 -0
  50. package/dist/cli/commands/agents.js.map +1 -0
  51. package/dist/cli/commands/cleanup.d.ts +4 -0
  52. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  53. package/dist/cli/commands/cleanup.js +17 -0
  54. package/dist/cli/commands/cleanup.js.map +1 -0
  55. package/dist/cli/commands/cost.d.ts +4 -0
  56. package/dist/cli/commands/cost.d.ts.map +1 -0
  57. package/dist/cli/commands/cost.js +53 -0
  58. package/dist/cli/commands/cost.js.map +1 -0
  59. package/dist/cli/commands/export.d.ts +5 -0
  60. package/dist/cli/commands/export.d.ts.map +1 -0
  61. package/dist/cli/commands/export.js +30 -0
  62. package/dist/cli/commands/export.js.map +1 -0
  63. package/dist/cli/commands/sessions.d.ts +5 -0
  64. package/dist/cli/commands/sessions.d.ts.map +1 -0
  65. package/dist/cli/commands/sessions.js +37 -0
  66. package/dist/cli/commands/sessions.js.map +1 -0
  67. package/dist/cli/commands/stats.d.ts +4 -0
  68. package/dist/cli/commands/stats.d.ts.map +1 -0
  69. package/dist/cli/commands/stats.js +43 -0
  70. package/dist/cli/commands/stats.js.map +1 -0
  71. package/dist/cli/utils/formatting.d.ts +22 -0
  72. package/dist/cli/utils/formatting.d.ts.map +1 -0
  73. package/dist/cli/utils/formatting.js +70 -0
  74. package/dist/cli/utils/formatting.js.map +1 -0
  75. package/dist/hud/analytics-display.d.ts +28 -0
  76. package/dist/hud/analytics-display.d.ts.map +1 -0
  77. package/dist/hud/analytics-display.js +105 -0
  78. package/dist/hud/analytics-display.js.map +1 -0
  79. package/dist/hud/background-cleanup.d.ts +28 -0
  80. package/dist/hud/background-cleanup.d.ts.map +1 -0
  81. package/dist/hud/background-cleanup.js +92 -0
  82. package/dist/hud/background-cleanup.js.map +1 -0
  83. package/dist/hud/index.js +4 -2
  84. package/dist/hud/index.js.map +1 -1
  85. package/dist/hud/render.d.ts +1 -1
  86. package/dist/hud/render.d.ts.map +1 -1
  87. package/dist/hud/render.js +32 -1
  88. package/dist/hud/render.js.map +1 -1
  89. package/dist/hud/state.d.ts +5 -0
  90. package/dist/hud/state.d.ts.map +1 -1
  91. package/dist/hud/state.js +13 -0
  92. package/dist/hud/state.js.map +1 -1
  93. package/dist/hud/types.d.ts +11 -1
  94. package/dist/hud/types.d.ts.map +1 -1
  95. package/dist/hud/types.js +19 -0
  96. package/dist/hud/types.js.map +1 -1
  97. package/docs/FULL-README.md +130 -16
  98. package/docs/MIGRATION.md +222 -1
  99. package/docs/SYNC-SYSTEM.md +528 -0
  100. package/package.json +8 -2
  101. package/scripts/sync-metadata.ts +363 -0
  102. package/skills/build-fix/SKILL.md +123 -0
  103. package/skills/code-review/SKILL.md +179 -0
  104. package/skills/security-review/SKILL.md +254 -0
@@ -0,0 +1,32 @@
1
+ export interface TimeRange {
2
+ start: string;
3
+ end: string;
4
+ }
5
+ export interface CostReport {
6
+ totalCost: number;
7
+ byAgent: Record<string, number>;
8
+ byModel: Record<string, number>;
9
+ byDay?: Record<string, number>;
10
+ period: 'daily' | 'weekly' | 'monthly';
11
+ range: TimeRange;
12
+ }
13
+ export interface UsagePattern {
14
+ peakHours: number[];
15
+ mostExpensiveOperations: Array<{
16
+ operation: string;
17
+ cost: number;
18
+ }>;
19
+ averageCostPerSession: number;
20
+ totalSessions: number;
21
+ }
22
+ export declare class QueryEngine {
23
+ getCostReport(period: 'daily' | 'weekly' | 'monthly'): Promise<CostReport>;
24
+ getUsagePatterns(): Promise<UsagePattern>;
25
+ cleanupOldData(retentionDays?: number): Promise<{
26
+ removedTokens: number;
27
+ removedMetrics: number;
28
+ }>;
29
+ private calculateTimeRange;
30
+ }
31
+ export declare function getQueryEngine(): QueryEngine;
32
+ //# sourceMappingURL=query-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-engine.d.ts","sourceRoot":"","sources":["../../src/analytics/query-engine.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uBAAuB,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,WAAW;IAChB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAkE1E,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC;IAiEzC,cAAc,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAU5G,OAAO,CAAC,kBAAkB;CAiB3B;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
@@ -0,0 +1,151 @@
1
+ import { getTokenTracker } from './token-tracker.js';
2
+ import { getSessionManager } from './session-manager.js';
3
+ import { calculateCost } from './cost-estimator.js';
4
+ import * as fs from 'fs/promises';
5
+ import * as path from 'path';
6
+ export class QueryEngine {
7
+ async getCostReport(period) {
8
+ const range = this.calculateTimeRange(period);
9
+ const tokenLogPath = path.resolve(process.cwd(), '.omc/state/token-tracking.jsonl');
10
+ try {
11
+ const content = await fs.readFile(tokenLogPath, 'utf-8');
12
+ const lines = content.trim().split('\n').filter(l => l.length > 0);
13
+ let totalCost = 0;
14
+ const byAgent = {};
15
+ const byModel = {};
16
+ const byDay = {};
17
+ for (const line of lines) {
18
+ const record = JSON.parse(line);
19
+ // Filter by time range
20
+ if (record.timestamp < range.start || record.timestamp > range.end) {
21
+ continue;
22
+ }
23
+ // Calculate cost for this record
24
+ const cost = calculateCost({
25
+ modelName: record.modelName,
26
+ inputTokens: record.inputTokens,
27
+ outputTokens: record.outputTokens,
28
+ cacheCreationTokens: record.cacheCreationTokens,
29
+ cacheReadTokens: record.cacheReadTokens
30
+ });
31
+ totalCost += cost.totalCost;
32
+ // Aggregate by agent
33
+ if (record.agentName) {
34
+ byAgent[record.agentName] = (byAgent[record.agentName] || 0) + cost.totalCost;
35
+ }
36
+ // Aggregate by model
37
+ byModel[record.modelName] = (byModel[record.modelName] || 0) + cost.totalCost;
38
+ // Aggregate by day
39
+ const day = record.timestamp.split('T')[0];
40
+ byDay[day] = (byDay[day] || 0) + cost.totalCost;
41
+ }
42
+ return {
43
+ totalCost,
44
+ byAgent,
45
+ byModel,
46
+ byDay,
47
+ period,
48
+ range
49
+ };
50
+ }
51
+ catch (error) {
52
+ // Return empty report if no data
53
+ return {
54
+ totalCost: 0,
55
+ byAgent: {},
56
+ byModel: {},
57
+ byDay: {},
58
+ period,
59
+ range
60
+ };
61
+ }
62
+ }
63
+ async getUsagePatterns() {
64
+ const tokenLogPath = path.resolve(process.cwd(), '.omc/state/token-tracking.jsonl');
65
+ const manager = getSessionManager();
66
+ const history = await manager.getHistory();
67
+ try {
68
+ const content = await fs.readFile(tokenLogPath, 'utf-8');
69
+ const lines = content.trim().split('\n').filter(l => l.length > 0);
70
+ const hourCounts = {};
71
+ const operationCosts = {};
72
+ for (const line of lines) {
73
+ const record = JSON.parse(line);
74
+ // Track peak hours
75
+ const hour = new Date(record.timestamp).getHours();
76
+ hourCounts[hour] = (hourCounts[hour] || 0) + 1;
77
+ // Track operation costs (by agent)
78
+ if (record.agentName) {
79
+ const cost = calculateCost({
80
+ modelName: record.modelName,
81
+ inputTokens: record.inputTokens,
82
+ outputTokens: record.outputTokens,
83
+ cacheCreationTokens: record.cacheCreationTokens,
84
+ cacheReadTokens: record.cacheReadTokens
85
+ });
86
+ operationCosts[record.agentName] = (operationCosts[record.agentName] || 0) + cost.totalCost;
87
+ }
88
+ }
89
+ // Find peak hours (top 3)
90
+ const peakHours = Object.entries(hourCounts)
91
+ .sort(([, a], [, b]) => b - a)
92
+ .slice(0, 3)
93
+ .map(([hour]) => parseInt(hour));
94
+ // Find most expensive operations (top 5)
95
+ const mostExpensiveOperations = Object.entries(operationCosts)
96
+ .sort(([, a], [, b]) => b - a)
97
+ .slice(0, 5)
98
+ .map(([operation, cost]) => ({ operation, cost }));
99
+ const averageCostPerSession = history.totalSessions > 0
100
+ ? history.totalCost / history.totalSessions
101
+ : 0;
102
+ return {
103
+ peakHours,
104
+ mostExpensiveOperations,
105
+ averageCostPerSession,
106
+ totalSessions: history.totalSessions
107
+ };
108
+ }
109
+ catch (error) {
110
+ return {
111
+ peakHours: [],
112
+ mostExpensiveOperations: [],
113
+ averageCostPerSession: 0,
114
+ totalSessions: 0
115
+ };
116
+ }
117
+ }
118
+ async cleanupOldData(retentionDays = 30) {
119
+ const tracker = getTokenTracker();
120
+ const removedTokens = await tracker.cleanupOldLogs(retentionDays);
121
+ // TODO: Add metrics cleanup when metrics collector is integrated
122
+ const removedMetrics = 0;
123
+ return { removedTokens, removedMetrics };
124
+ }
125
+ calculateTimeRange(period) {
126
+ const end = new Date();
127
+ const start = new Date();
128
+ if (period === 'daily') {
129
+ start.setDate(start.getDate() - 1);
130
+ }
131
+ else if (period === 'weekly') {
132
+ start.setDate(start.getDate() - 7);
133
+ }
134
+ else if (period === 'monthly') {
135
+ start.setDate(start.getDate() - 30);
136
+ }
137
+ return {
138
+ start: start.toISOString(),
139
+ end: end.toISOString()
140
+ };
141
+ }
142
+ }
143
+ // Singleton instance
144
+ let globalEngine = null;
145
+ export function getQueryEngine() {
146
+ if (!globalEngine) {
147
+ globalEngine = new QueryEngine();
148
+ }
149
+ return globalEngine;
150
+ }
151
+ //# sourceMappingURL=query-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-engine.js","sourceRoot":"","sources":["../../src/analytics/query-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { SessionMetadata, SessionAnalytics, SessionHistory, SessionSummary, SessionTag } from './session-types.js';
2
+ export declare class SessionManager {
3
+ private currentSession;
4
+ private history;
5
+ startSession(goals: string[], tags?: SessionTag[], notes?: string): Promise<SessionMetadata>;
6
+ endSession(outcomes: string[], status?: 'completed' | 'abandoned'): Promise<SessionMetadata>;
7
+ getCurrentSession(): Promise<SessionMetadata | null>;
8
+ resumeSession(sessionId: string): Promise<SessionMetadata>;
9
+ getSessionAnalytics(sessionId: string): Promise<SessionAnalytics>;
10
+ getSessionSummary(sessionId: string): Promise<SessionSummary>;
11
+ getHistory(): Promise<SessionHistory>;
12
+ searchSessions(query: {
13
+ tags?: SessionTag[];
14
+ startDate?: string;
15
+ endDate?: string;
16
+ status?: SessionMetadata['status'];
17
+ projectPath?: string;
18
+ }): Promise<SessionMetadata[]>;
19
+ private saveCurrentSession;
20
+ private loadHistory;
21
+ private addToHistory;
22
+ private generateSessionId;
23
+ }
24
+ export declare function getSessionManager(): SessionManager;
25
+ export declare function resetSessionManager(): SessionManager;
26
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/analytics/session-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOnH,qBAAa,cAAc;IACzB,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,OAAO,CAA+B;IAExC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,UAAU,EAAc,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAkB3G,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,WAAW,GAAG,WAAyB,GAAG,OAAO,CAAC,eAAe,CAAC;IAuBzG,iBAAiB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAWpD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAqB1D,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8CjE,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAa7D,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAIrC,cAAc,CAAC,KAAK,EAAE;QAC1B,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;QACnC,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YA4BhB,kBAAkB;YAMlB,WAAW;YAyBX,YAAY;IA4B1B,OAAO,CAAC,iBAAiB;CAG1B;AAKD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED,wBAAgB,mBAAmB,IAAI,cAAc,CAGpD"}
@@ -0,0 +1,201 @@
1
+ import { readState, writeState, StateLocation } from '../features/state-manager/index.js';
2
+ import { getTokenTracker } from './token-tracker.js';
3
+ const SESSION_HISTORY_FILE = 'session-history';
4
+ export class SessionManager {
5
+ currentSession = null;
6
+ history = null;
7
+ async startSession(goals, tags = ['other'], notes = '') {
8
+ const session = {
9
+ id: this.generateSessionId(),
10
+ projectPath: process.cwd(),
11
+ goals,
12
+ tags,
13
+ startTime: new Date().toISOString(),
14
+ status: 'active',
15
+ outcomes: [],
16
+ notes
17
+ };
18
+ this.currentSession = session;
19
+ await this.saveCurrentSession();
20
+ return session;
21
+ }
22
+ async endSession(outcomes, status = 'completed') {
23
+ if (!this.currentSession) {
24
+ throw new Error('No active session to end');
25
+ }
26
+ const endTime = new Date().toISOString();
27
+ const startTime = new Date(this.currentSession.startTime);
28
+ const duration = new Date(endTime).getTime() - startTime.getTime();
29
+ this.currentSession.endTime = endTime;
30
+ this.currentSession.duration = duration;
31
+ this.currentSession.status = status;
32
+ this.currentSession.outcomes = outcomes;
33
+ // Add to history
34
+ await this.addToHistory(this.currentSession);
35
+ const completedSession = { ...this.currentSession };
36
+ this.currentSession = null;
37
+ return completedSession;
38
+ }
39
+ async getCurrentSession() {
40
+ if (!this.currentSession) {
41
+ // Try to load from state
42
+ const result = readState('current-session', StateLocation.LOCAL);
43
+ if (result.exists && result.data && result.data.status === 'active') {
44
+ this.currentSession = result.data;
45
+ }
46
+ }
47
+ return this.currentSession;
48
+ }
49
+ async resumeSession(sessionId) {
50
+ const history = await this.loadHistory();
51
+ const session = history.sessions.find(s => s.id === sessionId);
52
+ if (!session) {
53
+ throw new Error(`Session ${sessionId} not found in history`);
54
+ }
55
+ if (session.status !== 'active') {
56
+ // Reactivate session
57
+ session.status = 'active';
58
+ delete session.endTime;
59
+ delete session.duration;
60
+ }
61
+ this.currentSession = session;
62
+ await this.saveCurrentSession();
63
+ return session;
64
+ }
65
+ async getSessionAnalytics(sessionId) {
66
+ const tracker = getTokenTracker();
67
+ const stats = await tracker.loadSessionStats(sessionId);
68
+ if (!stats) {
69
+ // Return empty analytics
70
+ return {
71
+ sessionId,
72
+ totalTokens: 0,
73
+ totalCost: 0,
74
+ agentUsage: {},
75
+ modelUsage: {},
76
+ filesModified: [],
77
+ tasksCompleted: 0,
78
+ errorCount: 0,
79
+ successRate: 0
80
+ };
81
+ }
82
+ // Aggregate agent usage
83
+ const agentUsage = {};
84
+ for (const [agent, usages] of Object.entries(stats.byAgent)) {
85
+ agentUsage[agent] = usages.reduce((sum, u) => sum + u.inputTokens + u.outputTokens, 0);
86
+ }
87
+ // Aggregate model usage
88
+ const modelUsage = {};
89
+ for (const [model, usages] of Object.entries(stats.byModel)) {
90
+ modelUsage[model] = usages.reduce((sum, u) => sum + u.inputTokens + u.outputTokens, 0);
91
+ }
92
+ const totalTokens = stats.totalInputTokens + stats.totalOutputTokens;
93
+ return {
94
+ sessionId,
95
+ totalTokens,
96
+ totalCost: stats.totalCost,
97
+ agentUsage,
98
+ modelUsage,
99
+ filesModified: [], // TODO: Track via git or file watcher
100
+ tasksCompleted: 0, // TODO: Integrate with task list
101
+ errorCount: 0, // TODO: Track errors
102
+ successRate: 1.0 // TODO: Calculate based on tasks/errors
103
+ };
104
+ }
105
+ async getSessionSummary(sessionId) {
106
+ const history = await this.loadHistory();
107
+ const metadata = history.sessions.find(s => s.id === sessionId);
108
+ if (!metadata) {
109
+ throw new Error(`Session ${sessionId} not found`);
110
+ }
111
+ const analytics = await this.getSessionAnalytics(sessionId);
112
+ return { metadata, analytics };
113
+ }
114
+ async getHistory() {
115
+ return this.loadHistory();
116
+ }
117
+ async searchSessions(query) {
118
+ const history = await this.loadHistory();
119
+ return history.sessions.filter(session => {
120
+ if (query.tags && !query.tags.some(tag => session.tags.includes(tag))) {
121
+ return false;
122
+ }
123
+ if (query.status && session.status !== query.status) {
124
+ return false;
125
+ }
126
+ if (query.projectPath && session.projectPath !== query.projectPath) {
127
+ return false;
128
+ }
129
+ if (query.startDate && session.startTime < query.startDate) {
130
+ return false;
131
+ }
132
+ if (query.endDate && session.endTime && session.endTime > query.endDate) {
133
+ return false;
134
+ }
135
+ return true;
136
+ });
137
+ }
138
+ async saveCurrentSession() {
139
+ if (this.currentSession) {
140
+ writeState('current-session', this.currentSession, StateLocation.LOCAL);
141
+ }
142
+ }
143
+ async loadHistory() {
144
+ if (this.history) {
145
+ return this.history;
146
+ }
147
+ const result = readState(SESSION_HISTORY_FILE, StateLocation.LOCAL);
148
+ if (result.exists && result.data) {
149
+ this.history = result.data;
150
+ return result.data;
151
+ }
152
+ // Initialize empty history
153
+ this.history = {
154
+ sessions: [],
155
+ totalSessions: 0,
156
+ totalCost: 0,
157
+ averageDuration: 0,
158
+ successRate: 0,
159
+ lastUpdated: new Date().toISOString()
160
+ };
161
+ return this.history;
162
+ }
163
+ async addToHistory(session) {
164
+ const history = await this.loadHistory();
165
+ history.sessions.push(session);
166
+ history.totalSessions++;
167
+ history.lastUpdated = new Date().toISOString();
168
+ // Recalculate aggregates
169
+ const completedSessions = history.sessions.filter(s => s.status === 'completed');
170
+ if (completedSessions.length > 0) {
171
+ const totalDuration = completedSessions.reduce((sum, s) => sum + (s.duration || 0), 0);
172
+ history.averageDuration = totalDuration / completedSessions.length;
173
+ history.successRate = completedSessions.length / history.totalSessions;
174
+ }
175
+ // Calculate total cost (requires analytics for each session)
176
+ let totalCost = 0;
177
+ for (const s of history.sessions) {
178
+ const analytics = await this.getSessionAnalytics(s.id);
179
+ totalCost += analytics.totalCost;
180
+ }
181
+ history.totalCost = totalCost;
182
+ writeState(SESSION_HISTORY_FILE, history, StateLocation.LOCAL);
183
+ this.history = history;
184
+ }
185
+ generateSessionId() {
186
+ return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
187
+ }
188
+ }
189
+ // Singleton instance
190
+ let globalManager = null;
191
+ export function getSessionManager() {
192
+ if (!globalManager) {
193
+ globalManager = new SessionManager();
194
+ }
195
+ return globalManager;
196
+ }
197
+ export function resetSessionManager() {
198
+ globalManager = new SessionManager();
199
+ return globalManager;
200
+ }
201
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/analytics/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type SessionTag = 'feature' | 'bugfix' | 'refactor' | 'exploration' | 'testing' | 'documentation' | 'other';
2
+ export interface SessionMetadata {
3
+ id: string;
4
+ projectPath: string;
5
+ goals: string[];
6
+ tags: SessionTag[];
7
+ startTime: string;
8
+ endTime?: string;
9
+ duration?: number;
10
+ status: 'active' | 'completed' | 'abandoned';
11
+ outcomes: string[];
12
+ notes: string;
13
+ }
14
+ export interface SessionAnalytics {
15
+ sessionId: string;
16
+ totalTokens: number;
17
+ totalCost: number;
18
+ agentUsage: Record<string, number>;
19
+ modelUsage: Record<string, number>;
20
+ filesModified: string[];
21
+ tasksCompleted: number;
22
+ errorCount: number;
23
+ successRate: number;
24
+ }
25
+ export interface SessionHistory {
26
+ sessions: SessionMetadata[];
27
+ totalSessions: number;
28
+ totalCost: number;
29
+ averageDuration: number;
30
+ successRate: number;
31
+ lastUpdated: string;
32
+ }
33
+ export interface SessionSummary {
34
+ metadata: SessionMetadata;
35
+ analytics: SessionAnalytics;
36
+ }
37
+ //# sourceMappingURL=session-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-types.d.ts","sourceRoot":"","sources":["../../src/analytics/session-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,eAAe,GAAG,OAAO,CAAC;AAEnH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,gBAAgB,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-types.js","sourceRoot":"","sources":["../../src/analytics/session-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { TokenUsage, SessionTokenStats } from './types.js';
2
+ export declare class TokenTracker {
3
+ private currentSessionId;
4
+ private sessionStats;
5
+ constructor(sessionId?: string);
6
+ private generateSessionId;
7
+ private initializeSessionStats;
8
+ recordTokenUsage(usage: Omit<TokenUsage, 'sessionId' | 'timestamp'>): Promise<void>;
9
+ private appendToLog;
10
+ private updateSessionStats;
11
+ private saveSessionStats;
12
+ loadSessionStats(sessionId?: string): Promise<SessionTokenStats | null>;
13
+ private rebuildStatsFromLog;
14
+ getSessionStats(): SessionTokenStats;
15
+ getTopAgents(limit?: number): Promise<Array<{
16
+ agent: string;
17
+ tokens: number;
18
+ cost: number;
19
+ }>>;
20
+ cleanupOldLogs(retentionDays?: number): Promise<number>;
21
+ }
22
+ export declare function getTokenTracker(sessionId?: string): TokenTracker;
23
+ export declare function resetTokenTracker(sessionId?: string): TokenTracker;
24
+ //# sourceMappingURL=token-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/analytics/token-tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAO3D,qBAAa,YAAY;IACvB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAoB;gBAE5B,SAAS,CAAC,EAAE,MAAM;IAK9B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,sBAAsB;IAexB,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAiB3E,WAAW;IAQzB,OAAO,CAAC,kBAAkB;YAsBZ,gBAAgB;IAIxB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAe/D,mBAAmB;IAsBjC,eAAe,IAAI,iBAAiB;IAI9B,YAAY,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAsBhG,cAAc,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CA4BlE;AAKD,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAKhE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAGlE"}