oh-my-claude-sisyphus 1.11.1 → 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 (211) 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 -9
  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 -1
  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/keyword-detector.mjs +209 -0
  160. package/scripts/persistent-mode.mjs +241 -0
  161. package/scripts/post-tool-verifier.mjs +217 -0
  162. package/scripts/pre-tool-enforcer.mjs +99 -0
  163. package/scripts/test-pr25.sh +525 -0
  164. package/dist/agents/model-lists.d.ts +0 -26
  165. package/dist/agents/model-lists.d.ts.map +0 -1
  166. package/dist/agents/model-lists.js +0 -62
  167. package/dist/agents/model-lists.js.map +0 -1
  168. package/dist/auth/index.d.ts +0 -10
  169. package/dist/auth/index.d.ts.map +0 -1
  170. package/dist/auth/index.js +0 -13
  171. package/dist/auth/index.js.map +0 -1
  172. package/dist/auth/manager.d.ts +0 -54
  173. package/dist/auth/manager.d.ts.map +0 -1
  174. package/dist/auth/manager.js +0 -248
  175. package/dist/auth/manager.js.map +0 -1
  176. package/dist/auth/oauth-google.d.ts +0 -47
  177. package/dist/auth/oauth-google.d.ts.map +0 -1
  178. package/dist/auth/oauth-google.js +0 -280
  179. package/dist/auth/oauth-google.js.map +0 -1
  180. package/dist/auth/oauth-openai.d.ts +0 -46
  181. package/dist/auth/oauth-openai.d.ts.map +0 -1
  182. package/dist/auth/oauth-openai.js +0 -264
  183. package/dist/auth/oauth-openai.js.map +0 -1
  184. package/dist/auth/pkce.d.ts +0 -14
  185. package/dist/auth/pkce.d.ts.map +0 -1
  186. package/dist/auth/pkce.js +0 -35
  187. package/dist/auth/pkce.js.map +0 -1
  188. package/dist/auth/storage.d.ts +0 -52
  189. package/dist/auth/storage.d.ts.map +0 -1
  190. package/dist/auth/storage.js +0 -230
  191. package/dist/auth/storage.js.map +0 -1
  192. package/dist/auth/types.d.ts +0 -76
  193. package/dist/auth/types.d.ts.map +0 -1
  194. package/dist/auth/types.js +0 -5
  195. package/dist/auth/types.js.map +0 -1
  196. package/dist/providers/index.d.ts +0 -8
  197. package/dist/providers/index.d.ts.map +0 -1
  198. package/dist/providers/index.js +0 -10
  199. package/dist/providers/index.js.map +0 -1
  200. package/dist/providers/registry.d.ts +0 -29
  201. package/dist/providers/registry.d.ts.map +0 -1
  202. package/dist/providers/registry.js +0 -162
  203. package/dist/providers/registry.js.map +0 -1
  204. package/dist/providers/router.d.ts +0 -40
  205. package/dist/providers/router.d.ts.map +0 -1
  206. package/dist/providers/router.js +0 -88
  207. package/dist/providers/router.js.map +0 -1
  208. package/dist/providers/types.d.ts +0 -92
  209. package/dist/providers/types.d.ts.map +0 -1
  210. package/dist/providers/types.js +0 -27
  211. package/dist/providers/types.js.map +0 -1
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Model Router
3
+ *
4
+ * Main routing engine that determines which model tier to use for a given task.
5
+ * Combines signal extraction, scoring, and rules evaluation.
6
+ */
7
+ import { DEFAULT_ROUTING_CONFIG, TIER_MODELS, TIER_TO_MODEL_TYPE, } from './types.js';
8
+ import { extractAllSignals } from './signals.js';
9
+ import { calculateComplexityScore, calculateConfidence, scoreToTier } from './scorer.js';
10
+ import { evaluateRules, DEFAULT_ROUTING_RULES } from './rules.js';
11
+ /**
12
+ * Route a task to the appropriate model tier
13
+ */
14
+ export function routeTask(context, config = {}) {
15
+ const mergedConfig = { ...DEFAULT_ROUTING_CONFIG, ...config };
16
+ // If routing is disabled, use default tier
17
+ if (!mergedConfig.enabled) {
18
+ return createDecision(mergedConfig.defaultTier, ['Routing disabled, using default tier'], false);
19
+ }
20
+ // If explicit model is specified, respect it
21
+ if (context.explicitModel) {
22
+ const tier = modelTypeToTier(context.explicitModel);
23
+ return createDecision(tier, ['Explicit model specified by user'], false);
24
+ }
25
+ // Check for agent-specific overrides
26
+ if (context.agentType && mergedConfig.agentOverrides?.[context.agentType]) {
27
+ const override = mergedConfig.agentOverrides[context.agentType];
28
+ return createDecision(override.tier, [override.reason], false);
29
+ }
30
+ // Extract signals from the task
31
+ const signals = extractAllSignals(context.taskPrompt, context);
32
+ // Evaluate routing rules
33
+ const ruleResult = evaluateRules(context, signals, DEFAULT_ROUTING_RULES);
34
+ if (ruleResult.tier === 'EXPLICIT') {
35
+ // Explicit model was handled above, this shouldn't happen
36
+ return createDecision('MEDIUM', ['Unexpected EXPLICIT tier'], false);
37
+ }
38
+ // Calculate score for confidence and logging
39
+ const score = calculateComplexityScore(signals);
40
+ const scoreTier = scoreToTier(score);
41
+ const confidence = calculateConfidence(score, ruleResult.tier);
42
+ const reasons = [
43
+ ruleResult.reason,
44
+ `Rule: ${ruleResult.ruleName}`,
45
+ `Score: ${score} (${scoreTier} tier by score)`,
46
+ ];
47
+ return {
48
+ model: mergedConfig.tierModels[ruleResult.tier],
49
+ modelType: TIER_TO_MODEL_TYPE[ruleResult.tier],
50
+ tier: ruleResult.tier,
51
+ confidence,
52
+ reasons,
53
+ escalated: false,
54
+ };
55
+ }
56
+ /**
57
+ * Create a routing decision for a given tier
58
+ */
59
+ function createDecision(tier, reasons, escalated, originalTier) {
60
+ return {
61
+ model: TIER_MODELS[tier],
62
+ modelType: TIER_TO_MODEL_TYPE[tier],
63
+ tier,
64
+ confidence: escalated ? 0.9 : 0.7, // Higher confidence after escalation
65
+ reasons,
66
+ escalated,
67
+ originalTier,
68
+ };
69
+ }
70
+ /**
71
+ * Convert ModelType to ComplexityTier
72
+ */
73
+ function modelTypeToTier(modelType) {
74
+ switch (modelType) {
75
+ case 'opus':
76
+ return 'HIGH';
77
+ case 'haiku':
78
+ return 'LOW';
79
+ case 'sonnet':
80
+ default:
81
+ return 'MEDIUM';
82
+ }
83
+ }
84
+ /**
85
+ * Escalate to a higher tier after failure
86
+ */
87
+ export function escalateModel(currentTier) {
88
+ switch (currentTier) {
89
+ case 'LOW':
90
+ return 'MEDIUM';
91
+ case 'MEDIUM':
92
+ return 'HIGH';
93
+ case 'HIGH':
94
+ return 'HIGH'; // Already at max
95
+ }
96
+ }
97
+ /**
98
+ * Check if we can escalate further
99
+ */
100
+ export function canEscalate(currentTier) {
101
+ return currentTier !== 'HIGH';
102
+ }
103
+ /**
104
+ * Get routing recommendation for orchestrator
105
+ *
106
+ * This is designed for PROACTIVE routing - the orchestrator (Opus) analyzes
107
+ * task complexity BEFORE delegation and chooses the appropriate model tier.
108
+ *
109
+ * NOT reactive escalation - the right model is chosen upfront.
110
+ */
111
+ export function getRoutingRecommendation(context, config = {}) {
112
+ return routeTask(context, config);
113
+ }
114
+ /**
115
+ * Legacy: Route with escalation support
116
+ * @deprecated Use getRoutingRecommendation for proactive routing instead.
117
+ * The orchestrator should analyze complexity upfront, not escalate reactively.
118
+ */
119
+ export function routeWithEscalation(context, config = {}) {
120
+ // Simply return the routing recommendation
121
+ // Reactive escalation is deprecated - orchestrator decides upfront
122
+ return routeTask(context, config);
123
+ }
124
+ /**
125
+ * Get routing explanation for debugging/logging
126
+ */
127
+ export function explainRouting(context, config = {}) {
128
+ const decision = routeTask(context, config);
129
+ const signals = extractAllSignals(context.taskPrompt, context);
130
+ const lines = [
131
+ '=== Model Routing Decision ===',
132
+ `Task: ${context.taskPrompt.substring(0, 100)}${context.taskPrompt.length > 100 ? '...' : ''}`,
133
+ `Agent: ${context.agentType ?? 'unspecified'}`,
134
+ '',
135
+ '--- Signals ---',
136
+ `Word count: ${signals.lexical.wordCount}`,
137
+ `File paths: ${signals.lexical.filePathCount}`,
138
+ `Architecture keywords: ${signals.lexical.hasArchitectureKeywords}`,
139
+ `Debugging keywords: ${signals.lexical.hasDebuggingKeywords}`,
140
+ `Simple keywords: ${signals.lexical.hasSimpleKeywords}`,
141
+ `Risk keywords: ${signals.lexical.hasRiskKeywords}`,
142
+ `Question depth: ${signals.lexical.questionDepth}`,
143
+ `Estimated subtasks: ${signals.structural.estimatedSubtasks}`,
144
+ `Cross-file: ${signals.structural.crossFileDependencies}`,
145
+ `Impact scope: ${signals.structural.impactScope}`,
146
+ `Reversibility: ${signals.structural.reversibility}`,
147
+ `Previous failures: ${signals.context.previousFailures}`,
148
+ '',
149
+ '--- Decision ---',
150
+ `Tier: ${decision.tier}`,
151
+ `Model: ${decision.model}`,
152
+ `Confidence: ${decision.confidence}`,
153
+ `Escalated: ${decision.escalated}`,
154
+ '',
155
+ '--- Reasons ---',
156
+ ...decision.reasons.map(r => ` - ${r}`),
157
+ ];
158
+ return lines.join('\n');
159
+ }
160
+ /**
161
+ * Quick tier lookup for known agent types
162
+ * Useful for cases where we don't need full signal analysis
163
+ */
164
+ export function quickTierForAgent(agentType) {
165
+ const agentTiers = {
166
+ oracle: 'HIGH',
167
+ prometheus: 'HIGH',
168
+ momus: 'HIGH',
169
+ metis: 'HIGH',
170
+ explore: 'LOW',
171
+ 'document-writer': 'LOW',
172
+ librarian: 'MEDIUM',
173
+ 'sisyphus-junior': 'MEDIUM',
174
+ 'frontend-engineer': 'MEDIUM',
175
+ 'multimodal-looker': 'MEDIUM',
176
+ // DEPRECATED: orchestrator-sisyphus merged into default mode (v2.0)
177
+ // Kept for backward compatibility if users still have it installed
178
+ 'orchestrator-sisyphus': 'MEDIUM',
179
+ };
180
+ return agentTiers[agentType] ?? null;
181
+ }
182
+ /**
183
+ * Check if an agent has a fixed tier (cannot be overridden)
184
+ *
185
+ * Only ORCHESTRATOR agents are fixed to Opus - they need to analyze
186
+ * complexity and delegate. All other agents are adaptive.
187
+ *
188
+ * NOTE: orchestrator-sisyphus was deprecated in v2.0 (merged into default mode)
189
+ * but kept here for backward compatibility if users still have it installed.
190
+ */
191
+ export function isFixedTierAgent(agentType) {
192
+ // Only orchestrators are fixed - they need Opus to analyze and delegate
193
+ // DEPRECATED: orchestrator-sisyphus merged into default mode (v2.0)
194
+ const fixedAgents = ['orchestrator-sisyphus'];
195
+ return fixedAgents.includes(agentType);
196
+ }
197
+ /**
198
+ * Get recommended model for an agent based on task complexity
199
+ *
200
+ * This is the main entry point for orchestrator model routing.
201
+ * The orchestrator calls this to determine which model to use when delegating.
202
+ *
203
+ * ALL agents are adaptive EXCEPT orchestrators (which need Opus to analyze and delegate).
204
+ *
205
+ * Routing hierarchy:
206
+ * 1. Fixed-tier (orchestrators only) → always Opus (they analyze complexity)
207
+ * 2. All other agents → adaptive based on task complexity
208
+ *
209
+ * @param agentType - The agent to delegate to
210
+ * @param taskPrompt - The task description
211
+ * @returns The recommended model type ('haiku', 'sonnet', or 'opus')
212
+ */
213
+ export function getModelForTask(agentType, taskPrompt, config = {}) {
214
+ // Fixed-tier agents (orchestrators only) always use Opus
215
+ // They need to analyze complexity and delegate - can't use a simpler model
216
+ if (isFixedTierAgent(agentType)) {
217
+ return {
218
+ model: 'opus',
219
+ tier: 'HIGH',
220
+ reason: `${agentType} is an orchestrator (always Opus - analyzes and delegates)`,
221
+ };
222
+ }
223
+ // All other agents are adaptive based on task complexity
224
+ // Use agent-specific rules for advisory agents, general rules for others
225
+ const decision = routeTask({ taskPrompt, agentType }, config);
226
+ return {
227
+ model: decision.modelType,
228
+ tier: decision.tier,
229
+ reason: decision.reasons[0] ?? 'Complexity analysis',
230
+ };
231
+ }
232
+ /**
233
+ * Generate a complexity analysis summary for the orchestrator
234
+ *
235
+ * Returns a human-readable analysis explaining the routing recommendation.
236
+ */
237
+ export function analyzeTaskComplexity(taskPrompt, agentType) {
238
+ const signals = extractAllSignals(taskPrompt, { taskPrompt, agentType });
239
+ const decision = routeTask({ taskPrompt, agentType });
240
+ const analysis = [
241
+ `**Tier: ${decision.tier}** → ${decision.model}`,
242
+ '',
243
+ '**Why:**',
244
+ ...decision.reasons.map(r => `- ${r}`),
245
+ '',
246
+ '**Signals detected:**',
247
+ signals.lexical.hasArchitectureKeywords ? '- Architecture keywords (refactor, redesign, etc.)' : null,
248
+ signals.lexical.hasRiskKeywords ? '- Risk keywords (migration, production, critical)' : null,
249
+ signals.lexical.hasDebuggingKeywords ? '- Debugging keywords (root cause, investigate)' : null,
250
+ signals.structural.crossFileDependencies ? '- Cross-file dependencies' : null,
251
+ signals.structural.impactScope === 'system-wide' ? '- System-wide impact' : null,
252
+ signals.structural.reversibility === 'difficult' ? '- Difficult to reverse' : null,
253
+ ].filter(Boolean).join('\n');
254
+ return {
255
+ tier: decision.tier,
256
+ model: decision.model,
257
+ analysis,
258
+ signals: {
259
+ wordCount: signals.lexical.wordCount,
260
+ hasArchitectureKeywords: signals.lexical.hasArchitectureKeywords,
261
+ hasRiskKeywords: signals.lexical.hasRiskKeywords,
262
+ estimatedSubtasks: signals.structural.estimatedSubtasks,
263
+ impactScope: signals.structural.impactScope,
264
+ },
265
+ };
266
+ }
267
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/features/model-routing/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Routing Rules
3
+ *
4
+ * Defines the rules engine for model routing decisions.
5
+ * Rules are evaluated in priority order, and the first matching rule wins.
6
+ */
7
+ import type { RoutingRule, RoutingContext, ComplexitySignals, ComplexityTier } from './types.js';
8
+ /**
9
+ * Default routing rules, ordered by priority (highest first)
10
+ */
11
+ export declare const DEFAULT_ROUTING_RULES: RoutingRule[];
12
+ /**
13
+ * Evaluate routing rules and return the first matching rule's action
14
+ */
15
+ export declare function evaluateRules(context: RoutingContext, signals: ComplexitySignals, rules?: RoutingRule[]): {
16
+ tier: ComplexityTier | 'EXPLICIT';
17
+ reason: string;
18
+ ruleName: string;
19
+ };
20
+ /**
21
+ * Get all rules that would match for a given context (for debugging)
22
+ */
23
+ export declare function getMatchingRules(context: RoutingContext, signals: ComplexitySignals, rules?: RoutingRule[]): RoutingRule[];
24
+ /**
25
+ * Create a custom routing rule
26
+ */
27
+ export declare function createRule(name: string, condition: (context: RoutingContext, signals: ComplexitySignals) => boolean, tier: ComplexityTier, reason: string, priority: number): RoutingRule;
28
+ /**
29
+ * Merge custom rules with default rules
30
+ */
31
+ export declare function mergeRules(customRules: RoutingRule[]): RoutingRule[];
32
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/features/model-routing/rules.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,EA+M9C,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,GAAE,WAAW,EAA0B,GAC3C;IAAE,IAAI,EAAE,cAAc,GAAG,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAoBzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,iBAAiB,EAC1B,KAAK,GAAE,WAAW,EAA0B,GAC3C,WAAW,EAAE,CAEf;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,KAAK,OAAO,EAC3E,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,WAAW,CAOb;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAOpE"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Routing Rules
3
+ *
4
+ * Defines the rules engine for model routing decisions.
5
+ * Rules are evaluated in priority order, and the first matching rule wins.
6
+ */
7
+ /**
8
+ * Default routing rules, ordered by priority (highest first)
9
+ */
10
+ export const DEFAULT_ROUTING_RULES = [
11
+ // ============ Override Rules (Highest Priority) ============
12
+ {
13
+ name: 'explicit-model-specified',
14
+ condition: (ctx) => ctx.explicitModel !== undefined,
15
+ action: { tier: 'EXPLICIT', reason: 'User specified model explicitly' },
16
+ priority: 100,
17
+ },
18
+ // NOTE: ALL agents are now ADAPTIVE based on task complexity
19
+ // Only orchestrators (orchestrator-sisyphus) are fixed to Opus
20
+ // This includes: oracle, prometheus, momus, metis, explore, document-writer, etc.
21
+ // ============ Orchestrator Rule (Fixed Tier) ============
22
+ {
23
+ name: 'orchestrator-fixed-opus',
24
+ condition: (ctx) => ctx.agentType === 'orchestrator-sisyphus',
25
+ action: { tier: 'HIGH', reason: 'Orchestrator requires Opus to analyze complexity and delegate' },
26
+ priority: 90,
27
+ },
28
+ // ============ Advisory Agent Adaptive Rules ============
29
+ // Oracle: Simple lookups → LOW, tracing → MEDIUM, debugging/architecture → HIGH
30
+ // Higher priority (85) to override generic rules like short-local-change
31
+ {
32
+ name: 'oracle-complex-debugging',
33
+ condition: (ctx, signals) => ctx.agentType === 'oracle' &&
34
+ (signals.lexical.hasDebuggingKeywords ||
35
+ signals.lexical.hasArchitectureKeywords ||
36
+ signals.lexical.hasRiskKeywords),
37
+ action: { tier: 'HIGH', reason: 'Oracle: Complex debugging/architecture decision' },
38
+ priority: 85,
39
+ },
40
+ {
41
+ name: 'oracle-simple-lookup',
42
+ condition: (ctx, signals) => ctx.agentType === 'oracle' &&
43
+ signals.lexical.hasSimpleKeywords &&
44
+ !signals.lexical.hasDebuggingKeywords &&
45
+ !signals.lexical.hasArchitectureKeywords &&
46
+ !signals.lexical.hasRiskKeywords,
47
+ action: { tier: 'LOW', reason: 'Oracle: Simple lookup query' },
48
+ priority: 80,
49
+ },
50
+ // Prometheus: Simple breakdown → LOW, moderate planning → MEDIUM, cross-domain → HIGH
51
+ {
52
+ name: 'prometheus-simple-breakdown',
53
+ condition: (ctx, signals) => ctx.agentType === 'prometheus' &&
54
+ signals.structural.estimatedSubtasks <= 3 &&
55
+ !signals.lexical.hasRiskKeywords &&
56
+ signals.structural.impactScope === 'local',
57
+ action: { tier: 'LOW', reason: 'Prometheus: Simple task breakdown' },
58
+ priority: 75,
59
+ },
60
+ {
61
+ name: 'prometheus-strategic-planning',
62
+ condition: (ctx, signals) => ctx.agentType === 'prometheus' &&
63
+ (signals.structural.impactScope === 'system-wide' ||
64
+ signals.lexical.hasArchitectureKeywords ||
65
+ signals.structural.estimatedSubtasks > 10),
66
+ action: { tier: 'HIGH', reason: 'Prometheus: Cross-domain strategic planning' },
67
+ priority: 75,
68
+ },
69
+ // Momus: Checklist → LOW, gap analysis → MEDIUM, adversarial review → HIGH
70
+ {
71
+ name: 'momus-checklist-review',
72
+ condition: (ctx, signals) => ctx.agentType === 'momus' &&
73
+ signals.lexical.wordCount < 30 &&
74
+ !signals.lexical.hasRiskKeywords,
75
+ action: { tier: 'LOW', reason: 'Momus: Checklist verification' },
76
+ priority: 75,
77
+ },
78
+ {
79
+ name: 'momus-adversarial-review',
80
+ condition: (ctx, signals) => ctx.agentType === 'momus' &&
81
+ (signals.lexical.hasRiskKeywords || signals.structural.impactScope === 'system-wide'),
82
+ action: { tier: 'HIGH', reason: 'Momus: Adversarial review for critical system' },
83
+ priority: 75,
84
+ },
85
+ // Metis: Simple impact → LOW, dependency mapping → MEDIUM, risk analysis → HIGH
86
+ {
87
+ name: 'metis-simple-impact',
88
+ condition: (ctx, signals) => ctx.agentType === 'metis' &&
89
+ signals.structural.impactScope === 'local' &&
90
+ !signals.lexical.hasRiskKeywords,
91
+ action: { tier: 'LOW', reason: 'Metis: Simple impact analysis' },
92
+ priority: 75,
93
+ },
94
+ {
95
+ name: 'metis-risk-analysis',
96
+ condition: (ctx, signals) => ctx.agentType === 'metis' &&
97
+ (signals.lexical.hasRiskKeywords || signals.structural.impactScope === 'system-wide'),
98
+ action: { tier: 'HIGH', reason: 'Metis: Risk analysis and unknown-unknowns detection' },
99
+ priority: 75,
100
+ },
101
+ // ============ Task-Based Rules ============
102
+ {
103
+ name: 'architecture-system-wide',
104
+ condition: (ctx, signals) => signals.lexical.hasArchitectureKeywords &&
105
+ signals.structural.impactScope === 'system-wide',
106
+ action: { tier: 'HIGH', reason: 'Architectural decisions with system-wide impact' },
107
+ priority: 70,
108
+ },
109
+ {
110
+ name: 'security-domain',
111
+ condition: (ctx, signals) => signals.structural.domainSpecificity === 'security',
112
+ action: { tier: 'HIGH', reason: 'Security-related tasks require careful reasoning' },
113
+ priority: 70,
114
+ },
115
+ {
116
+ name: 'difficult-reversibility-risk',
117
+ condition: (ctx, signals) => signals.structural.reversibility === 'difficult' &&
118
+ signals.lexical.hasRiskKeywords,
119
+ action: { tier: 'HIGH', reason: 'High-risk, difficult-to-reverse changes' },
120
+ priority: 70,
121
+ },
122
+ {
123
+ name: 'deep-debugging',
124
+ condition: (ctx, signals) => signals.lexical.hasDebuggingKeywords &&
125
+ signals.lexical.questionDepth === 'why',
126
+ action: { tier: 'HIGH', reason: 'Root cause analysis requires deep reasoning' },
127
+ priority: 65,
128
+ },
129
+ {
130
+ name: 'complex-multi-step',
131
+ condition: (ctx, signals) => signals.structural.estimatedSubtasks > 5 &&
132
+ signals.structural.crossFileDependencies,
133
+ action: { tier: 'HIGH', reason: 'Complex multi-step task with cross-file changes' },
134
+ priority: 60,
135
+ },
136
+ {
137
+ name: 'simple-search-query',
138
+ condition: (ctx, signals) => signals.lexical.hasSimpleKeywords &&
139
+ signals.structural.estimatedSubtasks <= 1 &&
140
+ signals.structural.impactScope === 'local' &&
141
+ !signals.lexical.hasArchitectureKeywords &&
142
+ !signals.lexical.hasDebuggingKeywords,
143
+ action: { tier: 'LOW', reason: 'Simple search or lookup task' },
144
+ priority: 60,
145
+ },
146
+ {
147
+ name: 'short-local-change',
148
+ condition: (ctx, signals) => signals.lexical.wordCount < 50 &&
149
+ signals.structural.impactScope === 'local' &&
150
+ signals.structural.reversibility === 'easy' &&
151
+ !signals.lexical.hasRiskKeywords,
152
+ action: { tier: 'LOW', reason: 'Short, local, easily reversible change' },
153
+ priority: 55,
154
+ },
155
+ {
156
+ name: 'moderate-complexity',
157
+ condition: (ctx, signals) => signals.structural.estimatedSubtasks > 1 &&
158
+ signals.structural.estimatedSubtasks <= 5,
159
+ action: { tier: 'MEDIUM', reason: 'Moderate complexity with multiple subtasks' },
160
+ priority: 50,
161
+ },
162
+ {
163
+ name: 'module-level-work',
164
+ condition: (ctx, signals) => signals.structural.impactScope === 'module',
165
+ action: { tier: 'MEDIUM', reason: 'Module-level changes' },
166
+ priority: 45,
167
+ },
168
+ // ============ Default Rule ============
169
+ {
170
+ name: 'default-medium',
171
+ condition: () => true,
172
+ action: { tier: 'MEDIUM', reason: 'Default tier for unclassified tasks' },
173
+ priority: 0,
174
+ },
175
+ ];
176
+ /**
177
+ * Evaluate routing rules and return the first matching rule's action
178
+ */
179
+ export function evaluateRules(context, signals, rules = DEFAULT_ROUTING_RULES) {
180
+ // Sort rules by priority (highest first)
181
+ const sortedRules = [...rules].sort((a, b) => b.priority - a.priority);
182
+ for (const rule of sortedRules) {
183
+ if (rule.condition(context, signals)) {
184
+ return {
185
+ tier: rule.action.tier,
186
+ reason: rule.action.reason,
187
+ ruleName: rule.name,
188
+ };
189
+ }
190
+ }
191
+ // Should never reach here due to default rule, but just in case
192
+ return {
193
+ tier: 'MEDIUM',
194
+ reason: 'Fallback to medium tier',
195
+ ruleName: 'fallback',
196
+ };
197
+ }
198
+ /**
199
+ * Get all rules that would match for a given context (for debugging)
200
+ */
201
+ export function getMatchingRules(context, signals, rules = DEFAULT_ROUTING_RULES) {
202
+ return rules.filter(rule => rule.condition(context, signals));
203
+ }
204
+ /**
205
+ * Create a custom routing rule
206
+ */
207
+ export function createRule(name, condition, tier, reason, priority) {
208
+ return {
209
+ name,
210
+ condition,
211
+ action: { tier, reason },
212
+ priority,
213
+ };
214
+ }
215
+ /**
216
+ * Merge custom rules with default rules
217
+ */
218
+ export function mergeRules(customRules) {
219
+ // Custom rules override defaults with the same name
220
+ const customNames = new Set(customRules.map(r => r.name));
221
+ const filteredDefaults = DEFAULT_ROUTING_RULES.filter(r => !customNames.has(r.name));
222
+ return [...customRules, ...filteredDefaults];
223
+ }
224
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/features/model-routing/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
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
+ import type { ComplexitySignals, ComplexityTier } from './types.js';
8
+ /**
9
+ * Calculate total complexity score
10
+ */
11
+ export declare function calculateComplexityScore(signals: ComplexitySignals): number;
12
+ /**
13
+ * Determine complexity tier from score
14
+ */
15
+ export declare function scoreToTier(score: number): ComplexityTier;
16
+ /**
17
+ * Calculate complexity tier from signals
18
+ */
19
+ export declare function calculateComplexityTier(signals: ComplexitySignals): ComplexityTier;
20
+ /**
21
+ * Get detailed score breakdown for debugging/logging
22
+ */
23
+ export declare function getScoreBreakdown(signals: ComplexitySignals): {
24
+ lexical: number;
25
+ structural: number;
26
+ context: number;
27
+ total: number;
28
+ tier: ComplexityTier;
29
+ };
30
+ /**
31
+ * Calculate confidence in the tier assignment
32
+ * Higher confidence when score is far from thresholds
33
+ */
34
+ export declare function calculateConfidence(score: number, tier: ComplexityTier): number;
35
+ //# sourceMappingURL=scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../../../src/features/model-routing/scorer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EAIf,MAAM,YAAY,CAAC;AAmMpB;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAM3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAIzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAGlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,CAAC;CACtB,CAaA;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAsB/E"}