oh-my-claude-sisyphus 1.11.2 → 2.0.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.
Files changed (207) hide show
  1. package/README.md +37 -12
  2. package/dist/__tests__/example.test.d.ts +2 -0
  3. package/dist/__tests__/example.test.d.ts.map +1 -0
  4. package/dist/__tests__/example.test.js +20 -0
  5. package/dist/__tests__/example.test.js.map +1 -0
  6. package/dist/__tests__/hooks.test.d.ts +2 -0
  7. package/dist/__tests__/hooks.test.d.ts.map +1 -0
  8. package/dist/__tests__/hooks.test.js +644 -0
  9. package/dist/__tests__/hooks.test.js.map +1 -0
  10. package/dist/__tests__/installer.test.d.ts +2 -0
  11. package/dist/__tests__/installer.test.d.ts.map +1 -0
  12. package/dist/__tests__/installer.test.js +369 -0
  13. package/dist/__tests__/installer.test.js.map +1 -0
  14. package/dist/__tests__/model-routing.test.d.ts +2 -0
  15. package/dist/__tests__/model-routing.test.d.ts.map +1 -0
  16. package/dist/__tests__/model-routing.test.js +814 -0
  17. package/dist/__tests__/model-routing.test.js.map +1 -0
  18. package/dist/__tests__/skills.test.d.ts +2 -0
  19. package/dist/__tests__/skills.test.d.ts.map +1 -0
  20. package/dist/__tests__/skills.test.js +126 -0
  21. package/dist/__tests__/skills.test.js.map +1 -0
  22. package/dist/__tests__/types.test.d.ts +2 -0
  23. package/dist/__tests__/types.test.d.ts.map +1 -0
  24. package/dist/__tests__/types.test.js +77 -0
  25. package/dist/__tests__/types.test.js.map +1 -0
  26. package/dist/agents/definitions.d.ts +1 -1
  27. package/dist/agents/definitions.d.ts.map +1 -1
  28. package/dist/agents/definitions.js +35 -3
  29. package/dist/agents/definitions.js.map +1 -1
  30. package/dist/agents/index.d.ts +1 -1
  31. package/dist/agents/index.d.ts.map +1 -1
  32. package/dist/agents/index.js +3 -1
  33. package/dist/agents/index.js.map +1 -1
  34. package/dist/agents/oracle.d.ts.map +1 -1
  35. package/dist/agents/oracle.js +43 -1
  36. package/dist/agents/oracle.js.map +1 -1
  37. package/dist/agents/orchestrator-sisyphus.js +2 -2
  38. package/dist/agents/orchestrator-sisyphus.js.map +1 -1
  39. package/dist/cli/index.js +22 -11
  40. package/dist/cli/index.js.map +1 -1
  41. package/dist/config/loader.d.ts.map +1 -1
  42. package/dist/config/loader.js +49 -0
  43. package/dist/config/loader.js.map +1 -1
  44. package/dist/features/auto-update.d.ts.map +1 -1
  45. package/dist/features/auto-update.js +14 -3
  46. package/dist/features/auto-update.js.map +1 -1
  47. package/dist/features/builtin-skills/skills.d.ts.map +1 -1
  48. package/dist/features/builtin-skills/skills.js +0 -1351
  49. package/dist/features/builtin-skills/skills.js.map +1 -1
  50. package/dist/features/index.d.ts +1 -0
  51. package/dist/features/index.d.ts.map +1 -1
  52. package/dist/features/index.js +14 -0
  53. package/dist/features/index.js.map +1 -1
  54. package/dist/features/model-routing/index.d.ts +34 -0
  55. package/dist/features/model-routing/index.d.ts.map +1 -0
  56. package/dist/features/model-routing/index.js +48 -0
  57. package/dist/features/model-routing/index.js.map +1 -0
  58. package/dist/features/model-routing/prompts/haiku.d.ts +54 -0
  59. package/dist/features/model-routing/prompts/haiku.d.ts.map +1 -0
  60. package/dist/features/model-routing/prompts/haiku.js +141 -0
  61. package/dist/features/model-routing/prompts/haiku.js.map +1 -0
  62. package/dist/features/model-routing/prompts/index.d.ts +45 -0
  63. package/dist/features/model-routing/prompts/index.d.ts.map +1 -0
  64. package/dist/features/model-routing/prompts/index.js +116 -0
  65. package/dist/features/model-routing/prompts/index.js.map +1 -0
  66. package/dist/features/model-routing/prompts/opus.d.ts +34 -0
  67. package/dist/features/model-routing/prompts/opus.d.ts.map +1 -0
  68. package/dist/features/model-routing/prompts/opus.js +153 -0
  69. package/dist/features/model-routing/prompts/opus.js.map +1 -0
  70. package/dist/features/model-routing/prompts/sonnet.d.ts +38 -0
  71. package/dist/features/model-routing/prompts/sonnet.d.ts.map +1 -0
  72. package/dist/features/model-routing/prompts/sonnet.js +149 -0
  73. package/dist/features/model-routing/prompts/sonnet.js.map +1 -0
  74. package/dist/features/model-routing/router.d.ts +92 -0
  75. package/dist/features/model-routing/router.d.ts.map +1 -0
  76. package/dist/features/model-routing/router.js +267 -0
  77. package/dist/features/model-routing/router.js.map +1 -0
  78. package/dist/features/model-routing/rules.d.ts +32 -0
  79. package/dist/features/model-routing/rules.d.ts.map +1 -0
  80. package/dist/features/model-routing/rules.js +224 -0
  81. package/dist/features/model-routing/rules.js.map +1 -0
  82. package/dist/features/model-routing/scorer.d.ts +35 -0
  83. package/dist/features/model-routing/scorer.d.ts.map +1 -0
  84. package/dist/features/model-routing/scorer.js +241 -0
  85. package/dist/features/model-routing/scorer.js.map +1 -0
  86. package/dist/features/model-routing/signals.d.ts +26 -0
  87. package/dist/features/model-routing/signals.d.ts.map +1 -0
  88. package/dist/features/model-routing/signals.js +283 -0
  89. package/dist/features/model-routing/signals.js.map +1 -0
  90. package/dist/features/model-routing/types.d.ts +195 -0
  91. package/dist/features/model-routing/types.d.ts.map +1 -0
  92. package/dist/features/model-routing/types.js +86 -0
  93. package/dist/features/model-routing/types.js.map +1 -0
  94. package/dist/hooks/agent-usage-reminder/index.d.ts +1 -1
  95. package/dist/hooks/agent-usage-reminder/index.d.ts.map +1 -1
  96. package/dist/hooks/agent-usage-reminder/index.js +1 -1
  97. package/dist/hooks/agent-usage-reminder/index.js.map +1 -1
  98. package/dist/hooks/auto-slash-command/executor.js.map +1 -1
  99. package/dist/hooks/auto-slash-command/index.d.ts +3 -3
  100. package/dist/hooks/auto-slash-command/index.d.ts.map +1 -1
  101. package/dist/hooks/auto-slash-command/index.js.map +1 -1
  102. package/dist/hooks/background-notification/index.js +1 -1
  103. package/dist/hooks/background-notification/index.js.map +1 -1
  104. package/dist/hooks/bridge.d.ts.map +1 -1
  105. package/dist/hooks/bridge.js.map +1 -1
  106. package/dist/hooks/comment-checker/filters.d.ts +1 -1
  107. package/dist/hooks/comment-checker/filters.d.ts.map +1 -1
  108. package/dist/hooks/comment-checker/filters.js +1 -1
  109. package/dist/hooks/comment-checker/filters.js.map +1 -1
  110. package/dist/hooks/comment-checker/index.js +1 -1
  111. package/dist/hooks/comment-checker/index.js.map +1 -1
  112. package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -1
  113. package/dist/hooks/context-window-limit-recovery/index.js.map +1 -1
  114. package/dist/hooks/index.d.ts +3 -3
  115. package/dist/hooks/index.d.ts.map +1 -1
  116. package/dist/hooks/index.js +3 -3
  117. package/dist/hooks/index.js.map +1 -1
  118. package/dist/hooks/keyword-detector/index.d.ts +1 -1
  119. package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
  120. package/dist/hooks/keyword-detector/index.js +1 -1
  121. package/dist/hooks/keyword-detector/index.js.map +1 -1
  122. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  123. package/dist/hooks/persistent-mode/index.js.map +1 -1
  124. package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
  125. package/dist/hooks/plugin-patterns/index.js +12 -22
  126. package/dist/hooks/plugin-patterns/index.js.map +1 -1
  127. package/dist/hooks/preemptive-compaction/index.d.ts +2 -2
  128. package/dist/hooks/preemptive-compaction/index.d.ts.map +1 -1
  129. package/dist/hooks/preemptive-compaction/index.js +1 -11
  130. package/dist/hooks/preemptive-compaction/index.js.map +1 -1
  131. package/dist/hooks/ralph-loop/index.js.map +1 -1
  132. package/dist/hooks/rules-injector/matcher.js +1 -1
  133. package/dist/hooks/rules-injector/matcher.js.map +1 -1
  134. package/dist/hooks/session-recovery/index.d.ts +1 -1
  135. package/dist/hooks/session-recovery/index.d.ts.map +1 -1
  136. package/dist/hooks/session-recovery/index.js +1 -1
  137. package/dist/hooks/session-recovery/index.js.map +1 -1
  138. package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -1
  139. package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -1
  140. package/dist/hooks/ultrawork-state/index.js +1 -1
  141. package/dist/hooks/ultrawork-state/index.js.map +1 -1
  142. package/dist/index.d.ts +2 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +4 -2
  145. package/dist/index.js.map +1 -1
  146. package/dist/installer/hooks.d.ts +1 -1
  147. package/dist/installer/hooks.js +1 -1
  148. package/dist/installer/index.d.ts +8 -7
  149. package/dist/installer/index.d.ts.map +1 -1
  150. package/dist/installer/index.js +648 -2141
  151. package/dist/installer/index.js.map +1 -1
  152. package/dist/shared/types.d.ts +25 -0
  153. package/dist/shared/types.d.ts.map +1 -1
  154. package/dist/tools/lsp/servers.d.ts.map +1 -1
  155. package/dist/tools/lsp/servers.js +2 -14
  156. package/dist/tools/lsp/servers.js.map +1 -1
  157. package/package.json +18 -10
  158. package/scripts/install.sh +236 -260
  159. package/scripts/test-pr25.sh +525 -0
  160. package/dist/agents/model-lists.d.ts +0 -26
  161. package/dist/agents/model-lists.d.ts.map +0 -1
  162. package/dist/agents/model-lists.js +0 -62
  163. package/dist/agents/model-lists.js.map +0 -1
  164. package/dist/auth/index.d.ts +0 -10
  165. package/dist/auth/index.d.ts.map +0 -1
  166. package/dist/auth/index.js +0 -13
  167. package/dist/auth/index.js.map +0 -1
  168. package/dist/auth/manager.d.ts +0 -54
  169. package/dist/auth/manager.d.ts.map +0 -1
  170. package/dist/auth/manager.js +0 -248
  171. package/dist/auth/manager.js.map +0 -1
  172. package/dist/auth/oauth-google.d.ts +0 -47
  173. package/dist/auth/oauth-google.d.ts.map +0 -1
  174. package/dist/auth/oauth-google.js +0 -280
  175. package/dist/auth/oauth-google.js.map +0 -1
  176. package/dist/auth/oauth-openai.d.ts +0 -46
  177. package/dist/auth/oauth-openai.d.ts.map +0 -1
  178. package/dist/auth/oauth-openai.js +0 -264
  179. package/dist/auth/oauth-openai.js.map +0 -1
  180. package/dist/auth/pkce.d.ts +0 -14
  181. package/dist/auth/pkce.d.ts.map +0 -1
  182. package/dist/auth/pkce.js +0 -35
  183. package/dist/auth/pkce.js.map +0 -1
  184. package/dist/auth/storage.d.ts +0 -52
  185. package/dist/auth/storage.d.ts.map +0 -1
  186. package/dist/auth/storage.js +0 -230
  187. package/dist/auth/storage.js.map +0 -1
  188. package/dist/auth/types.d.ts +0 -76
  189. package/dist/auth/types.d.ts.map +0 -1
  190. package/dist/auth/types.js +0 -5
  191. package/dist/auth/types.js.map +0 -1
  192. package/dist/providers/index.d.ts +0 -8
  193. package/dist/providers/index.d.ts.map +0 -1
  194. package/dist/providers/index.js +0 -10
  195. package/dist/providers/index.js.map +0 -1
  196. package/dist/providers/registry.d.ts +0 -29
  197. package/dist/providers/registry.d.ts.map +0 -1
  198. package/dist/providers/registry.js +0 -162
  199. package/dist/providers/registry.js.map +0 -1
  200. package/dist/providers/router.d.ts +0 -40
  201. package/dist/providers/router.d.ts.map +0 -1
  202. package/dist/providers/router.js +0 -88
  203. package/dist/providers/router.js.map +0 -1
  204. package/dist/providers/types.d.ts +0 -92
  205. package/dist/providers/types.d.ts.map +0 -1
  206. package/dist/providers/types.js +0 -27
  207. package/dist/providers/types.js.map +0 -1
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Complexity Scorer
3
+ *
4
+ * Calculates complexity tier based on extracted signals.
5
+ * Uses weighted scoring to determine LOW/MEDIUM/HIGH tier.
6
+ */
7
+ /**
8
+ * Score thresholds for tier classification
9
+ */
10
+ const TIER_THRESHOLDS = {
11
+ HIGH: 8, // Score >= 8 -> HIGH (Opus)
12
+ MEDIUM: 4, // Score >= 4 -> MEDIUM (Sonnet)
13
+ // Score < 4 -> LOW (Haiku)
14
+ };
15
+ /**
16
+ * Weight configuration for different signal categories
17
+ * Total should roughly sum to enable score range 0-15+
18
+ */
19
+ const WEIGHTS = {
20
+ lexical: {
21
+ wordCountHigh: 2, // Long prompts (+2)
22
+ wordCountVeryHigh: 1, // Very long prompts (+1 additional)
23
+ filePathsMultiple: 1, // Multiple file paths (+1)
24
+ codeBlocksPresent: 1, // Code blocks (+1)
25
+ architectureKeywords: 3, // Architecture keywords (+3)
26
+ debuggingKeywords: 2, // Debugging keywords (+2)
27
+ simpleKeywords: -2, // Simple keywords (-2)
28
+ riskKeywords: 2, // Risk keywords (+2)
29
+ questionDepthWhy: 2, // 'Why' questions (+2)
30
+ questionDepthHow: 1, // 'How' questions (+1)
31
+ implicitRequirements: 1, // Vague requirements (+1)
32
+ },
33
+ structural: {
34
+ subtasksMany: 3, // Many subtasks (+3)
35
+ subtasksSome: 1, // Some subtasks (+1)
36
+ crossFile: 2, // Cross-file changes (+2)
37
+ testRequired: 1, // Tests required (+1)
38
+ securityDomain: 2, // Security domain (+2)
39
+ infrastructureDomain: 1, // Infrastructure domain (+1)
40
+ externalKnowledge: 1, // External knowledge needed (+1)
41
+ reversibilityDifficult: 2, // Difficult to reverse (+2)
42
+ reversibilityModerate: 1, // Moderate reversibility (+1)
43
+ impactSystemWide: 3, // System-wide impact (+3)
44
+ impactModule: 1, // Module-level impact (+1)
45
+ },
46
+ context: {
47
+ previousFailure: 2, // Per previous failure (+2 each)
48
+ previousFailureMax: 4, // Max from failures
49
+ deepChain: 2, // Deep agent chain (+2)
50
+ complexPlan: 1, // Complex plan (+1)
51
+ },
52
+ };
53
+ /**
54
+ * Calculate complexity score from lexical signals
55
+ */
56
+ function scoreLexicalSignals(signals) {
57
+ let score = 0;
58
+ // Word count scoring
59
+ if (signals.wordCount > 200) {
60
+ score += WEIGHTS.lexical.wordCountHigh;
61
+ if (signals.wordCount > 500) {
62
+ score += WEIGHTS.lexical.wordCountVeryHigh;
63
+ }
64
+ }
65
+ // File paths
66
+ if (signals.filePathCount >= 2) {
67
+ score += WEIGHTS.lexical.filePathsMultiple;
68
+ }
69
+ // Code blocks
70
+ if (signals.codeBlockCount > 0) {
71
+ score += WEIGHTS.lexical.codeBlocksPresent;
72
+ }
73
+ // Keyword scoring
74
+ if (signals.hasArchitectureKeywords) {
75
+ score += WEIGHTS.lexical.architectureKeywords;
76
+ }
77
+ if (signals.hasDebuggingKeywords) {
78
+ score += WEIGHTS.lexical.debuggingKeywords;
79
+ }
80
+ if (signals.hasSimpleKeywords) {
81
+ score += WEIGHTS.lexical.simpleKeywords; // Negative weight
82
+ }
83
+ if (signals.hasRiskKeywords) {
84
+ score += WEIGHTS.lexical.riskKeywords;
85
+ }
86
+ // Question depth
87
+ switch (signals.questionDepth) {
88
+ case 'why':
89
+ score += WEIGHTS.lexical.questionDepthWhy;
90
+ break;
91
+ case 'how':
92
+ score += WEIGHTS.lexical.questionDepthHow;
93
+ break;
94
+ // 'what', 'where', 'none' add nothing
95
+ }
96
+ // Implicit requirements
97
+ if (signals.hasImplicitRequirements) {
98
+ score += WEIGHTS.lexical.implicitRequirements;
99
+ }
100
+ return score;
101
+ }
102
+ /**
103
+ * Calculate complexity score from structural signals
104
+ */
105
+ function scoreStructuralSignals(signals) {
106
+ let score = 0;
107
+ // Subtask scoring
108
+ if (signals.estimatedSubtasks > 3) {
109
+ score += WEIGHTS.structural.subtasksMany;
110
+ }
111
+ else if (signals.estimatedSubtasks > 1) {
112
+ score += WEIGHTS.structural.subtasksSome;
113
+ }
114
+ // Cross-file dependencies
115
+ if (signals.crossFileDependencies) {
116
+ score += WEIGHTS.structural.crossFile;
117
+ }
118
+ // Test requirements
119
+ if (signals.hasTestRequirements) {
120
+ score += WEIGHTS.structural.testRequired;
121
+ }
122
+ // Domain specificity
123
+ switch (signals.domainSpecificity) {
124
+ case 'security':
125
+ score += WEIGHTS.structural.securityDomain;
126
+ break;
127
+ case 'infrastructure':
128
+ score += WEIGHTS.structural.infrastructureDomain;
129
+ break;
130
+ // Other domains add nothing
131
+ }
132
+ // External knowledge
133
+ if (signals.requiresExternalKnowledge) {
134
+ score += WEIGHTS.structural.externalKnowledge;
135
+ }
136
+ // Reversibility
137
+ switch (signals.reversibility) {
138
+ case 'difficult':
139
+ score += WEIGHTS.structural.reversibilityDifficult;
140
+ break;
141
+ case 'moderate':
142
+ score += WEIGHTS.structural.reversibilityModerate;
143
+ break;
144
+ }
145
+ // Impact scope
146
+ switch (signals.impactScope) {
147
+ case 'system-wide':
148
+ score += WEIGHTS.structural.impactSystemWide;
149
+ break;
150
+ case 'module':
151
+ score += WEIGHTS.structural.impactModule;
152
+ break;
153
+ }
154
+ return score;
155
+ }
156
+ /**
157
+ * Calculate complexity score from context signals
158
+ */
159
+ function scoreContextSignals(signals) {
160
+ let score = 0;
161
+ // Previous failures (capped)
162
+ const failureScore = Math.min(signals.previousFailures * WEIGHTS.context.previousFailure, WEIGHTS.context.previousFailureMax);
163
+ score += failureScore;
164
+ // Deep agent chain (3+ levels)
165
+ if (signals.agentChainDepth >= 3) {
166
+ score += WEIGHTS.context.deepChain;
167
+ }
168
+ // Complex plan (5+ tasks)
169
+ if (signals.planComplexity >= 5) {
170
+ score += WEIGHTS.context.complexPlan;
171
+ }
172
+ return score;
173
+ }
174
+ /**
175
+ * Calculate total complexity score
176
+ */
177
+ export function calculateComplexityScore(signals) {
178
+ const lexicalScore = scoreLexicalSignals(signals.lexical);
179
+ const structuralScore = scoreStructuralSignals(signals.structural);
180
+ const contextScore = scoreContextSignals(signals.context);
181
+ return lexicalScore + structuralScore + contextScore;
182
+ }
183
+ /**
184
+ * Determine complexity tier from score
185
+ */
186
+ export function scoreToTier(score) {
187
+ if (score >= TIER_THRESHOLDS.HIGH)
188
+ return 'HIGH';
189
+ if (score >= TIER_THRESHOLDS.MEDIUM)
190
+ return 'MEDIUM';
191
+ return 'LOW';
192
+ }
193
+ /**
194
+ * Calculate complexity tier from signals
195
+ */
196
+ export function calculateComplexityTier(signals) {
197
+ const score = calculateComplexityScore(signals);
198
+ return scoreToTier(score);
199
+ }
200
+ /**
201
+ * Get detailed score breakdown for debugging/logging
202
+ */
203
+ export function getScoreBreakdown(signals) {
204
+ const lexical = scoreLexicalSignals(signals.lexical);
205
+ const structural = scoreStructuralSignals(signals.structural);
206
+ const context = scoreContextSignals(signals.context);
207
+ const total = lexical + structural + context;
208
+ return {
209
+ lexical,
210
+ structural,
211
+ context,
212
+ total,
213
+ tier: scoreToTier(total),
214
+ };
215
+ }
216
+ /**
217
+ * Calculate confidence in the tier assignment
218
+ * Higher confidence when score is far from thresholds
219
+ */
220
+ export function calculateConfidence(score, tier) {
221
+ const distanceFromLow = Math.abs(score - TIER_THRESHOLDS.MEDIUM);
222
+ const distanceFromHigh = Math.abs(score - TIER_THRESHOLDS.HIGH);
223
+ // Minimum distance from any threshold
224
+ let minDistance;
225
+ switch (tier) {
226
+ case 'LOW':
227
+ minDistance = TIER_THRESHOLDS.MEDIUM - score;
228
+ break;
229
+ case 'MEDIUM':
230
+ minDistance = Math.min(distanceFromLow, distanceFromHigh);
231
+ break;
232
+ case 'HIGH':
233
+ minDistance = score - TIER_THRESHOLDS.HIGH;
234
+ break;
235
+ }
236
+ // Convert distance to confidence (0-1)
237
+ // Distance of 0 = 0.5 confidence, distance of 4+ = 0.9+ confidence
238
+ const confidence = 0.5 + (Math.min(minDistance, 4) / 4) * 0.4;
239
+ return Math.round(confidence * 100) / 100;
240
+ }
241
+ //# sourceMappingURL=scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../../src/features/model-routing/scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Complexity Signal Extraction
3
+ *
4
+ * Extracts complexity signals from task prompts to inform routing decisions.
5
+ * Signals are categorized into lexical, structural, and context types.
6
+ */
7
+ import type { LexicalSignals, StructuralSignals, ContextSignals, ComplexitySignals, RoutingContext } from './types.js';
8
+ /**
9
+ * Extract lexical signals from task prompt
10
+ * These are fast, regex-based extractions that don't require model calls
11
+ */
12
+ export declare function extractLexicalSignals(prompt: string): LexicalSignals;
13
+ /**
14
+ * Extract structural signals from task prompt
15
+ * These require more sophisticated parsing
16
+ */
17
+ export declare function extractStructuralSignals(prompt: string): StructuralSignals;
18
+ /**
19
+ * Extract context signals from routing context
20
+ */
21
+ export declare function extractContextSignals(context: RoutingContext): ContextSignals;
22
+ /**
23
+ * Extract all complexity signals
24
+ */
25
+ export declare function extractAllSignals(prompt: string, context: RoutingContext): ComplexitySignals;
26
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../../src/features/model-routing/signals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAepE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAY1E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CAQ7E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,GACtB,iBAAiB,CAMnB"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Complexity Signal Extraction
3
+ *
4
+ * Extracts complexity signals from task prompts to inform routing decisions.
5
+ * Signals are categorized into lexical, structural, and context types.
6
+ */
7
+ import { COMPLEXITY_KEYWORDS } from './types.js';
8
+ /**
9
+ * Extract lexical signals from task prompt
10
+ * These are fast, regex-based extractions that don't require model calls
11
+ */
12
+ export function extractLexicalSignals(prompt) {
13
+ const lowerPrompt = prompt.toLowerCase();
14
+ const words = prompt.split(/\s+/).filter(w => w.length > 0);
15
+ return {
16
+ wordCount: words.length,
17
+ filePathCount: countFilePaths(prompt),
18
+ codeBlockCount: countCodeBlocks(prompt),
19
+ hasArchitectureKeywords: hasKeywords(lowerPrompt, COMPLEXITY_KEYWORDS.architecture),
20
+ hasDebuggingKeywords: hasKeywords(lowerPrompt, COMPLEXITY_KEYWORDS.debugging),
21
+ hasSimpleKeywords: hasKeywords(lowerPrompt, COMPLEXITY_KEYWORDS.simple),
22
+ hasRiskKeywords: hasKeywords(lowerPrompt, COMPLEXITY_KEYWORDS.risk),
23
+ questionDepth: detectQuestionDepth(lowerPrompt),
24
+ hasImplicitRequirements: detectImplicitRequirements(lowerPrompt),
25
+ };
26
+ }
27
+ /**
28
+ * Extract structural signals from task prompt
29
+ * These require more sophisticated parsing
30
+ */
31
+ export function extractStructuralSignals(prompt) {
32
+ const lowerPrompt = prompt.toLowerCase();
33
+ return {
34
+ estimatedSubtasks: estimateSubtasks(prompt),
35
+ crossFileDependencies: detectCrossFileDependencies(prompt),
36
+ hasTestRequirements: detectTestRequirements(lowerPrompt),
37
+ domainSpecificity: detectDomain(lowerPrompt),
38
+ requiresExternalKnowledge: detectExternalKnowledge(lowerPrompt),
39
+ reversibility: assessReversibility(lowerPrompt),
40
+ impactScope: assessImpactScope(prompt),
41
+ };
42
+ }
43
+ /**
44
+ * Extract context signals from routing context
45
+ */
46
+ export function extractContextSignals(context) {
47
+ return {
48
+ previousFailures: context.previousFailures ?? 0,
49
+ conversationTurns: context.conversationTurns ?? 0,
50
+ planComplexity: context.planTasks ?? 0,
51
+ remainingTasks: context.remainingTasks ?? 0,
52
+ agentChainDepth: context.agentChainDepth ?? 0,
53
+ };
54
+ }
55
+ /**
56
+ * Extract all complexity signals
57
+ */
58
+ export function extractAllSignals(prompt, context) {
59
+ return {
60
+ lexical: extractLexicalSignals(prompt),
61
+ structural: extractStructuralSignals(prompt),
62
+ context: extractContextSignals(context),
63
+ };
64
+ }
65
+ // ============ Helper Functions ============
66
+ /**
67
+ * Count file paths in prompt
68
+ */
69
+ function countFilePaths(prompt) {
70
+ // Match common file path patterns
71
+ const patterns = [
72
+ /(?:^|\s)[.\/~]?(?:[\w-]+\/)+[\w.-]+\.\w+/gm, // Unix-style paths
73
+ /`[^`]+\.\w+`/g, // Backtick-quoted files
74
+ /['"][^'"]+\.\w+['"]/g, // Quoted files
75
+ ];
76
+ let count = 0;
77
+ for (const pattern of patterns) {
78
+ const matches = prompt.match(pattern);
79
+ if (matches)
80
+ count += matches.length;
81
+ }
82
+ return Math.min(count, 20); // Cap at reasonable max
83
+ }
84
+ /**
85
+ * Count code blocks in prompt
86
+ */
87
+ function countCodeBlocks(prompt) {
88
+ const fencedBlocks = (prompt.match(/```[\s\S]*?```/g) || []).length;
89
+ const indentedBlocks = (prompt.match(/(?:^|\n)(?:\s{4}|\t)[^\n]+(?:\n(?:\s{4}|\t)[^\n]+)*/g) || []).length;
90
+ return fencedBlocks + Math.floor(indentedBlocks / 2);
91
+ }
92
+ /**
93
+ * Check if prompt contains any of the keywords
94
+ */
95
+ function hasKeywords(prompt, keywords) {
96
+ return keywords.some(kw => prompt.includes(kw));
97
+ }
98
+ /**
99
+ * Detect question depth
100
+ * 'why' questions require deeper reasoning than 'what' or 'where'
101
+ */
102
+ function detectQuestionDepth(prompt) {
103
+ if (/\bwhy\b.*\?|\bwhy\s+(is|are|does|do|did|would|should|can)/i.test(prompt)) {
104
+ return 'why';
105
+ }
106
+ if (/\bhow\b.*\?|\bhow\s+(do|does|can|should|would|to)/i.test(prompt)) {
107
+ return 'how';
108
+ }
109
+ if (/\bwhat\b.*\?|\bwhat\s+(is|are|does|do)/i.test(prompt)) {
110
+ return 'what';
111
+ }
112
+ if (/\bwhere\b.*\?|\bwhere\s+(is|are|does|do|can)/i.test(prompt)) {
113
+ return 'where';
114
+ }
115
+ return 'none';
116
+ }
117
+ /**
118
+ * Detect implicit requirements (vague statements without clear deliverables)
119
+ */
120
+ function detectImplicitRequirements(prompt) {
121
+ const vaguePatterns = [
122
+ /\bmake it better\b/,
123
+ /\bimprove\b(?!.*(?:by|to|so that))/,
124
+ /\bfix\b(?!.*(?:the|this|that|in|at))/,
125
+ /\boptimize\b(?!.*(?:by|for|to))/,
126
+ /\bclean up\b/,
127
+ /\brefactor\b(?!.*(?:to|by|into))/,
128
+ ];
129
+ return vaguePatterns.some(p => p.test(prompt));
130
+ }
131
+ /**
132
+ * Estimate number of subtasks
133
+ */
134
+ function estimateSubtasks(prompt) {
135
+ let count = 1;
136
+ // Count explicit list items
137
+ const bulletPoints = (prompt.match(/^[\s]*[-*•]\s/gm) || []).length;
138
+ const numberedItems = (prompt.match(/^[\s]*\d+[.)]\s/gm) || []).length;
139
+ count += bulletPoints + numberedItems;
140
+ // Count 'and' conjunctions that might indicate multiple tasks
141
+ const andCount = (prompt.match(/\band\b/gi) || []).length;
142
+ count += Math.floor(andCount / 2);
143
+ // Count 'then' indicators
144
+ const thenCount = (prompt.match(/\bthen\b/gi) || []).length;
145
+ count += thenCount;
146
+ return Math.min(count, 10);
147
+ }
148
+ /**
149
+ * Detect if task involves changes across multiple files
150
+ */
151
+ function detectCrossFileDependencies(prompt) {
152
+ const fileCount = countFilePaths(prompt);
153
+ if (fileCount >= 2)
154
+ return true;
155
+ const crossFileIndicators = [
156
+ /multiple files/i,
157
+ /across.*files/i,
158
+ /several.*files/i,
159
+ /all.*files/i,
160
+ /throughout.*codebase/i,
161
+ /entire.*project/i,
162
+ /whole.*system/i,
163
+ ];
164
+ return crossFileIndicators.some(p => p.test(prompt));
165
+ }
166
+ /**
167
+ * Detect test requirements
168
+ */
169
+ function detectTestRequirements(prompt) {
170
+ const testIndicators = [
171
+ /\btest/i,
172
+ /\bspec\b/i,
173
+ /make sure.*work/i,
174
+ /verify/i,
175
+ /ensure.*pass/i,
176
+ /\bTDD\b/,
177
+ /unit test/i,
178
+ /integration test/i,
179
+ ];
180
+ return testIndicators.some(p => p.test(prompt));
181
+ }
182
+ /**
183
+ * Detect domain specificity
184
+ */
185
+ function detectDomain(prompt) {
186
+ const domains = {
187
+ frontend: [
188
+ /\b(react|vue|angular|svelte|css|html|jsx|tsx|component|ui|ux|styling|tailwind|sass|scss)\b/i,
189
+ /\b(button|modal|form|input|layout|responsive|animation)\b/i,
190
+ ],
191
+ backend: [
192
+ /\b(api|endpoint|database|query|sql|graphql|rest|server|auth|middleware)\b/i,
193
+ /\b(node|express|fastify|nest|django|flask|rails)\b/i,
194
+ ],
195
+ infrastructure: [
196
+ /\b(docker|kubernetes|k8s|terraform|aws|gcp|azure|ci|cd|deploy|container)\b/i,
197
+ /\b(nginx|load.?balancer|scaling|monitoring|logging)\b/i,
198
+ ],
199
+ security: [
200
+ /\b(security|auth|oauth|jwt|encryption|vulnerability|xss|csrf|injection)\b/i,
201
+ /\b(password|credential|secret|token|permission)\b/i,
202
+ ],
203
+ };
204
+ for (const [domain, patterns] of Object.entries(domains)) {
205
+ if (patterns.some(p => p.test(prompt))) {
206
+ return domain;
207
+ }
208
+ }
209
+ return 'generic';
210
+ }
211
+ /**
212
+ * Detect if external knowledge is required
213
+ */
214
+ function detectExternalKnowledge(prompt) {
215
+ const externalIndicators = [
216
+ /\bdocs?\b/i,
217
+ /\bdocumentation\b/i,
218
+ /\bofficial\b/i,
219
+ /\blibrary\b/i,
220
+ /\bpackage\b/i,
221
+ /\bframework\b/i,
222
+ /\bhow does.*work\b/i,
223
+ /\bbest practice/i,
224
+ ];
225
+ return externalIndicators.some(p => p.test(prompt));
226
+ }
227
+ /**
228
+ * Assess reversibility of changes
229
+ */
230
+ function assessReversibility(prompt) {
231
+ const difficultIndicators = [
232
+ /\bmigrat/i,
233
+ /\bproduction\b/i,
234
+ /\bdata.*loss/i,
235
+ /\bdelete.*all/i,
236
+ /\bdrop.*table/i,
237
+ /\birreversible/i,
238
+ /\bpermanent/i,
239
+ ];
240
+ const moderateIndicators = [
241
+ /\brefactor/i,
242
+ /\brestructure/i,
243
+ /\brename.*across/i,
244
+ /\bmove.*files/i,
245
+ /\bchange.*schema/i,
246
+ ];
247
+ if (difficultIndicators.some(p => p.test(prompt)))
248
+ return 'difficult';
249
+ if (moderateIndicators.some(p => p.test(prompt)))
250
+ return 'moderate';
251
+ return 'easy';
252
+ }
253
+ /**
254
+ * Assess impact scope of changes
255
+ */
256
+ function assessImpactScope(prompt) {
257
+ const systemWideIndicators = [
258
+ /\bentire\b/i,
259
+ /\ball\s+(?:files|components|modules)/i,
260
+ /\bwhole\s+(?:project|codebase|system)/i,
261
+ /\bsystem.?wide/i,
262
+ /\bglobal/i,
263
+ /\beverywhere/i,
264
+ /\bthroughout/i,
265
+ ];
266
+ const moduleIndicators = [
267
+ /\bmodule/i,
268
+ /\bpackage/i,
269
+ /\bservice/i,
270
+ /\bfeature/i,
271
+ /\bcomponent/i,
272
+ /\blayer/i,
273
+ ];
274
+ if (systemWideIndicators.some(p => p.test(prompt)))
275
+ return 'system-wide';
276
+ // Check for multiple files (indicates module-level at least)
277
+ if (countFilePaths(prompt) >= 3)
278
+ return 'module';
279
+ if (moduleIndicators.some(p => p.test(prompt)))
280
+ return 'module';
281
+ return 'local';
282
+ }
283
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/features/model-routing/signals.ts"],"names":[],"mappings":"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"}