oh-my-claude-sisyphus 3.4.2 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +45 -0
  2. package/commands/cancel-ultraqa.md +1 -1
  3. package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
  4. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
  5. package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
  6. package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
  7. package/dist/__tests__/analytics/backfill-dedup.test.d.ts +2 -0
  8. package/dist/__tests__/analytics/backfill-dedup.test.d.ts.map +1 -0
  9. package/dist/__tests__/analytics/backfill-dedup.test.js +179 -0
  10. package/dist/__tests__/analytics/backfill-dedup.test.js.map +1 -0
  11. package/dist/__tests__/analytics/backfill-engine.test.d.ts +2 -0
  12. package/dist/__tests__/analytics/backfill-engine.test.d.ts.map +1 -0
  13. package/dist/__tests__/analytics/backfill-engine.test.js +362 -0
  14. package/dist/__tests__/analytics/backfill-engine.test.js.map +1 -0
  15. package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
  16. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
  17. package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
  18. package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
  19. package/dist/__tests__/analytics/output-estimator.test.d.ts +2 -0
  20. package/dist/__tests__/analytics/output-estimator.test.d.ts.map +1 -0
  21. package/dist/__tests__/analytics/output-estimator.test.js +106 -0
  22. package/dist/__tests__/analytics/output-estimator.test.js.map +1 -0
  23. package/dist/__tests__/analytics/token-extractor.test.d.ts +2 -0
  24. package/dist/__tests__/analytics/token-extractor.test.d.ts.map +1 -0
  25. package/dist/__tests__/analytics/token-extractor.test.js +121 -0
  26. package/dist/__tests__/analytics/token-extractor.test.js.map +1 -0
  27. package/dist/__tests__/analytics/transcript-parser.test.d.ts +2 -0
  28. package/dist/__tests__/analytics/transcript-parser.test.d.ts.map +1 -0
  29. package/dist/__tests__/analytics/transcript-parser.test.js +285 -0
  30. package/dist/__tests__/analytics/transcript-parser.test.js.map +1 -0
  31. package/dist/__tests__/analytics/transcript-scanner.test.d.ts +2 -0
  32. package/dist/__tests__/analytics/transcript-scanner.test.d.ts.map +1 -0
  33. package/dist/__tests__/analytics/transcript-scanner.test.js +401 -0
  34. package/dist/__tests__/analytics/transcript-scanner.test.js.map +1 -0
  35. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts +2 -0
  36. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts.map +1 -0
  37. package/dist/__tests__/analytics/transcript-token-extractor.test.js +175 -0
  38. package/dist/__tests__/analytics/transcript-token-extractor.test.js.map +1 -0
  39. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
  40. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
  41. package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
  42. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
  43. package/dist/__tests__/learner/auto-learner.test.d.ts +7 -0
  44. package/dist/__tests__/learner/auto-learner.test.d.ts.map +1 -0
  45. package/dist/__tests__/learner/auto-learner.test.js +507 -0
  46. package/dist/__tests__/learner/auto-learner.test.js.map +1 -0
  47. package/dist/__tests__/learner/matcher.test.d.ts +2 -0
  48. package/dist/__tests__/learner/matcher.test.d.ts.map +1 -0
  49. package/dist/__tests__/learner/matcher.test.js +330 -0
  50. package/dist/__tests__/learner/matcher.test.js.map +1 -0
  51. package/dist/analytics/analytics-summary.d.ts +47 -0
  52. package/dist/analytics/analytics-summary.d.ts.map +1 -0
  53. package/dist/analytics/analytics-summary.js +171 -0
  54. package/dist/analytics/analytics-summary.js.map +1 -0
  55. package/dist/analytics/backfill-dedup.d.ts +49 -0
  56. package/dist/analytics/backfill-dedup.d.ts.map +1 -0
  57. package/dist/analytics/backfill-dedup.js +115 -0
  58. package/dist/analytics/backfill-dedup.js.map +1 -0
  59. package/dist/analytics/backfill-engine.d.ts +59 -0
  60. package/dist/analytics/backfill-engine.d.ts.map +1 -0
  61. package/dist/analytics/backfill-engine.js +172 -0
  62. package/dist/analytics/backfill-engine.js.map +1 -0
  63. package/dist/analytics/index.d.ts +8 -0
  64. package/dist/analytics/index.d.ts.map +1 -1
  65. package/dist/analytics/index.js +10 -0
  66. package/dist/analytics/index.js.map +1 -1
  67. package/dist/analytics/output-estimator.d.ts +26 -0
  68. package/dist/analytics/output-estimator.d.ts.map +1 -0
  69. package/dist/analytics/output-estimator.js +61 -0
  70. package/dist/analytics/output-estimator.js.map +1 -0
  71. package/dist/analytics/query-engine.d.ts.map +1 -1
  72. package/dist/analytics/query-engine.js +3 -2
  73. package/dist/analytics/query-engine.js.map +1 -1
  74. package/dist/analytics/token-extractor.d.ts +31 -0
  75. package/dist/analytics/token-extractor.d.ts.map +1 -0
  76. package/dist/analytics/token-extractor.js +57 -0
  77. package/dist/analytics/token-extractor.js.map +1 -0
  78. package/dist/analytics/token-tracker.d.ts +7 -1
  79. package/dist/analytics/token-tracker.d.ts.map +1 -1
  80. package/dist/analytics/token-tracker.js +94 -18
  81. package/dist/analytics/token-tracker.js.map +1 -1
  82. package/dist/analytics/transcript-parser.d.ts +42 -0
  83. package/dist/analytics/transcript-parser.d.ts.map +1 -0
  84. package/dist/analytics/transcript-parser.js +90 -0
  85. package/dist/analytics/transcript-parser.js.map +1 -0
  86. package/dist/analytics/transcript-scanner.d.ts +50 -0
  87. package/dist/analytics/transcript-scanner.d.ts.map +1 -0
  88. package/dist/analytics/transcript-scanner.js +149 -0
  89. package/dist/analytics/transcript-scanner.js.map +1 -0
  90. package/dist/analytics/transcript-token-extractor.d.ts +35 -0
  91. package/dist/analytics/transcript-token-extractor.d.ts.map +1 -0
  92. package/dist/analytics/transcript-token-extractor.js +136 -0
  93. package/dist/analytics/transcript-token-extractor.js.map +1 -0
  94. package/dist/analytics/types.d.ts +65 -0
  95. package/dist/analytics/types.d.ts.map +1 -1
  96. package/dist/analytics/types.js.map +1 -1
  97. package/dist/cli/analytics.js +26 -1
  98. package/dist/cli/analytics.js.map +1 -1
  99. package/dist/cli/commands/backfill.d.ts +15 -0
  100. package/dist/cli/commands/backfill.d.ts.map +1 -0
  101. package/dist/cli/commands/backfill.js +146 -0
  102. package/dist/cli/commands/backfill.js.map +1 -0
  103. package/dist/cli/commands/stats.d.ts +1 -0
  104. package/dist/cli/commands/stats.d.ts.map +1 -1
  105. package/dist/cli/commands/stats.js +67 -31
  106. package/dist/cli/commands/stats.js.map +1 -1
  107. package/dist/cli/components/CostDashboard.d.ts +15 -0
  108. package/dist/cli/components/CostDashboard.d.ts.map +1 -0
  109. package/dist/cli/components/CostDashboard.js +15 -0
  110. package/dist/cli/components/CostDashboard.js.map +1 -0
  111. package/dist/cli/components/LiveStats.d.ts +16 -0
  112. package/dist/cli/components/LiveStats.d.ts.map +1 -0
  113. package/dist/cli/components/LiveStats.js +16 -0
  114. package/dist/cli/components/LiveStats.js.map +1 -0
  115. package/dist/cli/components/SessionBrowser.d.ts +14 -0
  116. package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
  117. package/dist/cli/components/SessionBrowser.js +14 -0
  118. package/dist/cli/components/SessionBrowser.js.map +1 -0
  119. package/dist/cli/index.js +159 -3
  120. package/dist/cli/index.js.map +1 -1
  121. package/dist/cli/tui.d.ts +21 -0
  122. package/dist/cli/tui.d.ts.map +1 -0
  123. package/dist/cli/tui.js +21 -0
  124. package/dist/cli/tui.js.map +1 -0
  125. package/dist/hooks/learner/auto-invoke.d.ts +82 -0
  126. package/dist/hooks/learner/auto-invoke.d.ts.map +1 -0
  127. package/dist/hooks/learner/auto-invoke.js +234 -0
  128. package/dist/hooks/learner/auto-invoke.js.map +1 -0
  129. package/dist/hooks/learner/auto-learner.d.ts +55 -0
  130. package/dist/hooks/learner/auto-learner.d.ts.map +1 -0
  131. package/dist/hooks/learner/auto-learner.js +361 -0
  132. package/dist/hooks/learner/auto-learner.js.map +1 -0
  133. package/dist/hooks/learner/index.d.ts +3 -0
  134. package/dist/hooks/learner/index.d.ts.map +1 -1
  135. package/dist/hooks/learner/index.js +4 -0
  136. package/dist/hooks/learner/index.js.map +1 -1
  137. package/dist/hooks/learner/matcher.d.ts +40 -0
  138. package/dist/hooks/learner/matcher.d.ts.map +1 -0
  139. package/dist/hooks/learner/matcher.js +230 -0
  140. package/dist/hooks/learner/matcher.js.map +1 -0
  141. package/dist/hud/analytics-display.d.ts +16 -0
  142. package/dist/hud/analytics-display.d.ts.map +1 -1
  143. package/dist/hud/analytics-display.js +42 -0
  144. package/dist/hud/analytics-display.js.map +1 -1
  145. package/dist/hud/index.js +90 -3
  146. package/dist/hud/index.js.map +1 -1
  147. package/dist/hud/render.d.ts.map +1 -1
  148. package/dist/hud/render.js +27 -1
  149. package/dist/hud/render.js.map +1 -1
  150. package/dist/hud/types.d.ts +2 -0
  151. package/dist/hud/types.d.ts.map +1 -1
  152. package/dist/hud/types.js.map +1 -1
  153. package/docs/ANALYTICS-SYSTEM.md +150 -0
  154. package/hooks/keyword-detector.sh +1 -1
  155. package/package.json +1 -1
  156. package/scripts/keyword-detector.mjs +1 -1
  157. package/scripts/persistent-mode.mjs +1 -1
  158. package/scripts/test-mutual-exclusion.ts +4 -4
  159. package/scripts/test-remember-tags.ts +6 -6
  160. package/scripts/test-session-injection.ts +4 -4
  161. package/skills/cancel-ultraqa/SKILL.md +1 -1
  162. package/skills/local-skills-setup/SKILL.md +465 -0
  163. package/skills/omc-setup/SKILL.md +30 -5
  164. package/skills/skill/SKILL.md +406 -0
@@ -0,0 +1,82 @@
1
+ export interface InvocationConfig {
2
+ enabled: boolean;
3
+ confidenceThreshold: number;
4
+ maxAutoInvokes: number;
5
+ cooldownMs: number;
6
+ }
7
+ export interface InvocationRecord {
8
+ skillId: string;
9
+ skillName: string;
10
+ timestamp: number;
11
+ confidence: number;
12
+ prompt: string;
13
+ wasSuccessful: boolean | null;
14
+ feedbackScore: number | null;
15
+ }
16
+ export interface AutoInvokeState {
17
+ sessionId: string;
18
+ config: InvocationConfig;
19
+ invocations: InvocationRecord[];
20
+ lastInvokeTime: number;
21
+ }
22
+ /**
23
+ * Load auto-invocation config from ~/.claude/.omc-config.json
24
+ */
25
+ export declare function loadInvocationConfig(): InvocationConfig;
26
+ /**
27
+ * Initialize auto-invoke state for a session
28
+ */
29
+ export declare function initAutoInvoke(sessionId: string): AutoInvokeState;
30
+ /**
31
+ * Decide whether to auto-invoke a skill based on confidence and constraints
32
+ */
33
+ export declare function shouldAutoInvoke(state: AutoInvokeState, skillId: string, confidence: number): boolean;
34
+ /**
35
+ * Record a skill invocation
36
+ */
37
+ export declare function recordInvocation(state: AutoInvokeState, record: Omit<InvocationRecord, 'timestamp'>): void;
38
+ /**
39
+ * Update the success status of a skill invocation
40
+ */
41
+ export declare function updateInvocationSuccess(state: AutoInvokeState, skillId: string, wasSuccessful: boolean): void;
42
+ /**
43
+ * Format skill for auto-invocation (more prominent than passive injection)
44
+ */
45
+ export declare function formatAutoInvoke(skill: {
46
+ name: string;
47
+ content: string;
48
+ confidence: number;
49
+ }): string;
50
+ /**
51
+ * Get invocation statistics for the session
52
+ */
53
+ export declare function getInvocationStats(state: AutoInvokeState): {
54
+ total: number;
55
+ successful: number;
56
+ failed: number;
57
+ unknown: number;
58
+ averageConfidence: number;
59
+ };
60
+ /**
61
+ * Save invocation history to disk for analytics
62
+ */
63
+ export declare function saveInvocationHistory(state: AutoInvokeState): void;
64
+ /**
65
+ * Load invocation history from disk
66
+ */
67
+ export declare function loadInvocationHistory(sessionId: string): AutoInvokeState | null;
68
+ /**
69
+ * Get aggregated invocation analytics across all sessions
70
+ */
71
+ export declare function getAggregatedStats(): {
72
+ totalSessions: number;
73
+ totalInvocations: number;
74
+ successRate: number;
75
+ topSkills: Array<{
76
+ skillId: string;
77
+ skillName: string;
78
+ count: number;
79
+ successRate: number;
80
+ }>;
81
+ };
82
+ //# sourceMappingURL=auto-invoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-invoke.d.ts","sourceRoot":"","sources":["../../../src/hooks/learner/auto-invoke.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;CACxB;AASD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,CAsBvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CAOjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CA+BT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GAC1C,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,OAAO,GACrB,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAeT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAkBA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAgBlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA2B/E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9F,CA2DA"}
@@ -0,0 +1,234 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ const DEFAULT_CONFIG = {
5
+ enabled: true,
6
+ confidenceThreshold: 80,
7
+ maxAutoInvokes: 3,
8
+ cooldownMs: 30000,
9
+ };
10
+ /**
11
+ * Load auto-invocation config from ~/.claude/.omc-config.json
12
+ */
13
+ export function loadInvocationConfig() {
14
+ const configPath = path.join(os.homedir(), '.claude', '.omc-config.json');
15
+ try {
16
+ if (!fs.existsSync(configPath)) {
17
+ return { ...DEFAULT_CONFIG };
18
+ }
19
+ const configFile = fs.readFileSync(configPath, 'utf-8');
20
+ const config = JSON.parse(configFile);
21
+ // Merge with defaults
22
+ return {
23
+ enabled: config.autoInvoke?.enabled ?? DEFAULT_CONFIG.enabled,
24
+ confidenceThreshold: config.autoInvoke?.confidenceThreshold ?? DEFAULT_CONFIG.confidenceThreshold,
25
+ maxAutoInvokes: config.autoInvoke?.maxAutoInvokes ?? DEFAULT_CONFIG.maxAutoInvokes,
26
+ cooldownMs: config.autoInvoke?.cooldownMs ?? DEFAULT_CONFIG.cooldownMs,
27
+ };
28
+ }
29
+ catch (error) {
30
+ console.error('[auto-invoke] Failed to load config:', error);
31
+ return { ...DEFAULT_CONFIG };
32
+ }
33
+ }
34
+ /**
35
+ * Initialize auto-invoke state for a session
36
+ */
37
+ export function initAutoInvoke(sessionId) {
38
+ return {
39
+ sessionId,
40
+ config: loadInvocationConfig(),
41
+ invocations: [],
42
+ lastInvokeTime: 0,
43
+ };
44
+ }
45
+ /**
46
+ * Decide whether to auto-invoke a skill based on confidence and constraints
47
+ */
48
+ export function shouldAutoInvoke(state, skillId, confidence) {
49
+ const { config, invocations, lastInvokeTime } = state;
50
+ // Check if auto-invoke is enabled
51
+ if (!config.enabled) {
52
+ return false;
53
+ }
54
+ // Check confidence threshold
55
+ if (confidence < config.confidenceThreshold) {
56
+ return false;
57
+ }
58
+ // Check max invocations per session
59
+ if (invocations.length >= config.maxAutoInvokes) {
60
+ return false;
61
+ }
62
+ // Check cooldown
63
+ const now = Date.now();
64
+ if (now - lastInvokeTime < config.cooldownMs) {
65
+ return false;
66
+ }
67
+ // Check if this skill was already invoked in this session
68
+ const alreadyInvoked = invocations.some(inv => inv.skillId === skillId);
69
+ if (alreadyInvoked) {
70
+ return false;
71
+ }
72
+ return true;
73
+ }
74
+ /**
75
+ * Record a skill invocation
76
+ */
77
+ export function recordInvocation(state, record) {
78
+ state.invocations.push({
79
+ ...record,
80
+ timestamp: Date.now(),
81
+ });
82
+ state.lastInvokeTime = Date.now();
83
+ }
84
+ /**
85
+ * Update the success status of a skill invocation
86
+ */
87
+ export function updateInvocationSuccess(state, skillId, wasSuccessful) {
88
+ // Update the most recent invocation of this skill
89
+ const invocation = [...state.invocations]
90
+ .reverse()
91
+ .find(inv => inv.skillId === skillId);
92
+ if (invocation) {
93
+ invocation.wasSuccessful = wasSuccessful;
94
+ }
95
+ }
96
+ /**
97
+ * Format skill for auto-invocation (more prominent than passive injection)
98
+ */
99
+ export function formatAutoInvoke(skill) {
100
+ return `
101
+ <auto_invoke_skill>
102
+ HIGH CONFIDENCE MATCH (${skill.confidence.toFixed(1)}%) - AUTO-INVOKING SKILL
103
+
104
+ SKILL: ${skill.name}
105
+ CONFIDENCE: ${skill.confidence.toFixed(1)}%
106
+ STATUS: AUTOMATICALLY INVOKED
107
+
108
+ ${skill.content}
109
+
110
+ INSTRUCTION: This skill has been automatically invoked due to high confidence match.
111
+ Please follow the skill's instructions immediately.
112
+ </auto_invoke_skill>
113
+ `;
114
+ }
115
+ /**
116
+ * Get invocation statistics for the session
117
+ */
118
+ export function getInvocationStats(state) {
119
+ const { invocations } = state;
120
+ const successful = invocations.filter(inv => inv.wasSuccessful === true).length;
121
+ const failed = invocations.filter(inv => inv.wasSuccessful === false).length;
122
+ const unknown = invocations.filter(inv => inv.wasSuccessful === null).length;
123
+ const averageConfidence = invocations.length > 0
124
+ ? invocations.reduce((sum, inv) => sum + inv.confidence, 0) / invocations.length
125
+ : 0;
126
+ return {
127
+ total: invocations.length,
128
+ successful,
129
+ failed,
130
+ unknown,
131
+ averageConfidence,
132
+ };
133
+ }
134
+ /**
135
+ * Save invocation history to disk for analytics
136
+ */
137
+ export function saveInvocationHistory(state) {
138
+ const historyDir = path.join(os.homedir(), '.omc', 'analytics', 'invocations');
139
+ try {
140
+ fs.mkdirSync(historyDir, { recursive: true });
141
+ const historyFile = path.join(historyDir, `${state.sessionId}.json`);
142
+ fs.writeFileSync(historyFile, JSON.stringify({
143
+ sessionId: state.sessionId,
144
+ config: state.config,
145
+ invocations: state.invocations,
146
+ stats: getInvocationStats(state),
147
+ }, null, 2));
148
+ }
149
+ catch (error) {
150
+ console.error('[auto-invoke] Failed to save invocation history:', error);
151
+ }
152
+ }
153
+ /**
154
+ * Load invocation history from disk
155
+ */
156
+ export function loadInvocationHistory(sessionId) {
157
+ const historyFile = path.join(os.homedir(), '.omc', 'analytics', 'invocations', `${sessionId}.json`);
158
+ try {
159
+ if (!fs.existsSync(historyFile)) {
160
+ return null;
161
+ }
162
+ const data = JSON.parse(fs.readFileSync(historyFile, 'utf-8'));
163
+ return {
164
+ sessionId: data.sessionId,
165
+ config: data.config,
166
+ invocations: data.invocations,
167
+ lastInvokeTime: data.invocations.length > 0
168
+ ? Math.max(...data.invocations.map((inv) => inv.timestamp))
169
+ : 0,
170
+ };
171
+ }
172
+ catch (error) {
173
+ console.error('[auto-invoke] Failed to load invocation history:', error);
174
+ return null;
175
+ }
176
+ }
177
+ /**
178
+ * Get aggregated invocation analytics across all sessions
179
+ */
180
+ export function getAggregatedStats() {
181
+ const historyDir = path.join(os.homedir(), '.omc', 'analytics', 'invocations');
182
+ try {
183
+ if (!fs.existsSync(historyDir)) {
184
+ return {
185
+ totalSessions: 0,
186
+ totalInvocations: 0,
187
+ successRate: 0,
188
+ topSkills: [],
189
+ };
190
+ }
191
+ const files = fs.readdirSync(historyDir).filter(f => f.endsWith('.json'));
192
+ const allInvocations = [];
193
+ const skillStats = new Map();
194
+ for (const file of files) {
195
+ const data = JSON.parse(fs.readFileSync(path.join(historyDir, file), 'utf-8'));
196
+ allInvocations.push(...data.invocations);
197
+ for (const inv of data.invocations) {
198
+ const existing = skillStats.get(inv.skillId) || { name: inv.skillName, total: 0, successful: 0 };
199
+ existing.total++;
200
+ if (inv.wasSuccessful === true) {
201
+ existing.successful++;
202
+ }
203
+ skillStats.set(inv.skillId, existing);
204
+ }
205
+ }
206
+ const successful = allInvocations.filter(inv => inv.wasSuccessful === true).length;
207
+ const withKnownStatus = allInvocations.filter(inv => inv.wasSuccessful !== null).length;
208
+ const topSkills = Array.from(skillStats.entries())
209
+ .map(([skillId, stats]) => ({
210
+ skillId,
211
+ skillName: stats.name,
212
+ count: stats.total,
213
+ successRate: stats.total > 0 ? (stats.successful / stats.total) * 100 : 0,
214
+ }))
215
+ .sort((a, b) => b.count - a.count)
216
+ .slice(0, 10);
217
+ return {
218
+ totalSessions: files.length,
219
+ totalInvocations: allInvocations.length,
220
+ successRate: withKnownStatus > 0 ? (successful / withKnownStatus) * 100 : 0,
221
+ topSkills,
222
+ };
223
+ }
224
+ catch (error) {
225
+ console.error('[auto-invoke] Failed to get aggregated stats:', error);
226
+ return {
227
+ totalSessions: 0,
228
+ totalInvocations: 0,
229
+ successRate: 0,
230
+ topSkills: [],
231
+ };
232
+ }
233
+ }
234
+ //# sourceMappingURL=auto-invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-invoke.js","sourceRoot":"","sources":["../../../src/hooks/learner/auto-invoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Auto-Learner Module
3
+ *
4
+ * Automatically detects skill-worthy patterns during work sessions.
5
+ * Tracks problem-solution pairs and suggests skill extraction.
6
+ */
7
+ import type { SkillMetadata } from './types.js';
8
+ /**
9
+ * Detected pattern that could become a skill.
10
+ */
11
+ export interface PatternDetection {
12
+ id: string;
13
+ problem: string;
14
+ solution: string;
15
+ confidence: number;
16
+ occurrences: number;
17
+ firstSeen: number;
18
+ lastSeen: number;
19
+ suggestedTriggers: string[];
20
+ suggestedTags: string[];
21
+ }
22
+ /**
23
+ * Auto-learner session state.
24
+ */
25
+ export interface AutoLearnerState {
26
+ sessionId: string;
27
+ patterns: Map<string, PatternDetection>;
28
+ suggestedSkills: PatternDetection[];
29
+ }
30
+ /**
31
+ * Initialize state for a session.
32
+ */
33
+ export declare function initAutoLearner(sessionId: string): AutoLearnerState;
34
+ /**
35
+ * Extract triggers from problem and solution text.
36
+ */
37
+ export declare function extractTriggers(problem: string, solution: string): string[];
38
+ /**
39
+ * Calculate skill-worthiness score (0-100).
40
+ */
41
+ export declare function calculateSkillWorthiness(pattern: PatternDetection): number;
42
+ /**
43
+ * Record a problem-solution pair.
44
+ * Returns the pattern if it's new or updated, null if ignored.
45
+ */
46
+ export declare function recordPattern(state: AutoLearnerState, problem: string, solution: string): PatternDetection | null;
47
+ /**
48
+ * Get ready-to-suggest skills (confidence above threshold).
49
+ */
50
+ export declare function getSuggestedSkills(state: AutoLearnerState, threshold?: number): PatternDetection[];
51
+ /**
52
+ * Convert pattern to skill metadata (partial).
53
+ */
54
+ export declare function patternToSkillMetadata(pattern: PatternDetection): Partial<SkillMetadata>;
55
+ //# sourceMappingURL=auto-learner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-learner.d.ts","sourceRoot":"","sources":["../../../src/hooks/learner/auto-learner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACxC,eAAe,EAAE,gBAAgB,EAAE,CAAC;CACrC;AAiDD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAMnE;AA6FD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA0C3E;AA4DD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA0D1E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,gBAAgB,GAAG,IAAI,CAgEzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,SAAS,GAAE,MAAqC,GAC/C,gBAAgB,EAAE,CAEpB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAcxF"}