@wrongstack/core 0.109.1 → 0.119.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-bridge-mOxbpFcg.d.ts → agent-bridge-PRAbEX-9.d.ts} +1 -1
- package/dist/{agent-subagent-runner-DukQLUcS.d.ts → agent-subagent-runner-DXWImnNV.d.ts} +7 -8
- package/dist/{brain-Dfv4Y82E.d.ts → brain-NZZqL8sn.d.ts} +1 -1
- package/dist/{compactor-DXLxLcmU.d.ts → compactor-C3stu664.d.ts} +1 -1
- package/dist/{config-BSU-6vah.d.ts → config-DZV9VK9n.d.ts} +104 -3
- package/dist/{context-CNRYfhUv.d.ts → context-hvXINa6a.d.ts} +31 -1
- package/dist/coordination/index.d.ts +12 -13
- package/dist/coordination/index.js +198 -0
- package/dist/coordination/index.js.map +1 -1
- package/dist/defaults/index.d.ts +26 -27
- package/dist/defaults/index.js +243 -35
- package/dist/defaults/index.js.map +1 -1
- package/dist/execution/index.d.ts +15 -16
- package/dist/execution/index.js +209 -5
- package/dist/execution/index.js.map +1 -1
- package/dist/extension/index.d.ts +6 -7
- package/dist/{goal-preamble-CI8lxeY1.d.ts → goal-preamble-COpt55W8.d.ts} +10 -10
- package/dist/{index-DIKEcfgC.d.ts → index-4VVHuTZF.d.ts} +7 -6
- package/dist/{index-BWRN6wOb.d.ts → index-Cj3le7TI.d.ts} +9 -10
- package/dist/index.d.ts +40 -41
- package/dist/index.js +298 -43
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +6 -7
- package/dist/kernel/index.d.ts +10 -11
- package/dist/llm-selector-Bmx4PsVM.d.ts +58 -0
- package/dist/{mcp-servers-CXCsANdY.d.ts → mcp-servers-CofNHOqn.d.ts} +3 -3
- package/dist/{mode-ARA3HrkY.d.ts → mode-CZlO9iU1.d.ts} +1 -1
- package/dist/models/index.d.ts +157 -53
- package/dist/models/index.js +423 -1
- package/dist/models/index.js.map +1 -1
- package/dist/{models-registry-DU64QxQa.d.ts → models-registry-BzlsjKcy.d.ts} +1 -1
- package/dist/{multi-agent-coordinator-51LvnXkD.d.ts → multi-agent-coordinator-CmDmUgq2.d.ts} +1 -1
- package/dist/{null-fleet-bus-D09hMzFQ.d.ts → null-fleet-bus-CyH2YqP4.d.ts} +6 -6
- package/dist/observability/index.d.ts +2 -2
- package/dist/{parallel-eternal-engine-B2CbsKpc.d.ts → parallel-eternal-engine-uxVm4y4V.d.ts} +8 -8
- package/dist/{path-resolver-DDJiMAtX.d.ts → path-resolver-gfoGxpdd.d.ts} +3 -3
- package/dist/{permission-BDv7z0mk.d.ts → permission-DhLrgA30.d.ts} +1 -1
- package/dist/{permission-policy-dF74EpDp.d.ts → permission-policy-DGOvne7i.d.ts} +2 -2
- package/dist/{pipeline-BqiA_UMr.d.ts → pipeline-CqF7uju2.d.ts} +2 -2
- package/dist/{plan-templates-BdDxl9cI.d.ts → plan-templates-DoKhzenv.d.ts} +6 -6
- package/dist/{provider-runner-BUunikwY.d.ts → provider-runner-BPlI5sPZ.d.ts} +3 -3
- package/dist/{retry-policy-BcmuT_V0.d.ts → retry-policy-B4Q-FZgE.d.ts} +1 -1
- package/dist/sdd/index.d.ts +8 -9
- package/dist/sdd/index.js +198 -0
- package/dist/sdd/index.js.map +1 -1
- package/dist/{secret-vault-DrOhc2i5.d.ts → secret-vault-B7GnL6o9.d.ts} +1 -1
- package/dist/security/index.d.ts +4 -4
- package/dist/{selector-C7wcdqMA.d.ts → selector-BakeMnWR.d.ts} +1 -1
- package/dist/{session-event-bridge-BpJ5trO9.d.ts → session-event-bridge-DE5Oekwx.d.ts} +1 -1
- package/dist/{session-reader-DDz1Ek4V.d.ts → session-reader-DFC81-4p.d.ts} +1 -1
- package/dist/storage/index.d.ts +11 -12
- package/dist/storage/index.js +43 -34
- package/dist/storage/index.js.map +1 -1
- package/dist/types/index.d.ts +19 -20
- package/dist/types/index.js +35 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +3 -4
- package/dist/utils/index.js +2 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/{wstack-paths-_lqjzErq.d.ts → wstack-paths-DD50Omgn.d.ts} +3 -0
- package/package.json +1 -1
- package/dist/models-registry-B6_KfS65.d.ts +0 -95
package/dist/models/index.js
CHANGED
|
@@ -922,6 +922,428 @@ IMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiv
|
|
|
922
922
|
}
|
|
923
923
|
};
|
|
924
924
|
|
|
925
|
-
|
|
925
|
+
// src/models/model-intelligence.ts
|
|
926
|
+
var MODEL_PROFILES = [
|
|
927
|
+
// ── Anthropic ──
|
|
928
|
+
{
|
|
929
|
+
provider: "anthropic",
|
|
930
|
+
pattern: /claude-opus/i,
|
|
931
|
+
family: "Claude Opus",
|
|
932
|
+
strengths: ["complex reasoning", "multi-step planning", "nuanced judgment", "long-form analysis"],
|
|
933
|
+
weaknesses: ["latency", "cost"],
|
|
934
|
+
bestFor: ["planning", "security", "debugging", "review"],
|
|
935
|
+
costTier: "premium",
|
|
936
|
+
speedTier: "slow"
|
|
937
|
+
},
|
|
938
|
+
{
|
|
939
|
+
provider: "anthropic",
|
|
940
|
+
pattern: /claude-sonnet/i,
|
|
941
|
+
family: "Claude Sonnet",
|
|
942
|
+
strengths: ["coding", "balanced reasoning", "tool use", "fast iteration"],
|
|
943
|
+
bestFor: ["coding", "refactoring", "backend", "general"],
|
|
944
|
+
costTier: "standard",
|
|
945
|
+
speedTier: "fast"
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
provider: "anthropic",
|
|
949
|
+
pattern: /claude-haiku/i,
|
|
950
|
+
family: "Claude Haiku",
|
|
951
|
+
strengths: ["speed", "low cost", "simple tasks"],
|
|
952
|
+
weaknesses: ["complex reasoning", "long context"],
|
|
953
|
+
bestFor: ["lightweight", "docs", "frontend"],
|
|
954
|
+
avoidFor: ["planning", "security"],
|
|
955
|
+
costTier: "budget",
|
|
956
|
+
speedTier: "fast"
|
|
957
|
+
},
|
|
958
|
+
// ── OpenAI ──
|
|
959
|
+
{
|
|
960
|
+
provider: "openai",
|
|
961
|
+
pattern: /gpt-5|o3|o4/i,
|
|
962
|
+
family: "GPT-5 / o3 / o4",
|
|
963
|
+
strengths: ["complex reasoning", "coding", "multi-modal"],
|
|
964
|
+
bestFor: ["planning", "coding", "debugging", "general"],
|
|
965
|
+
costTier: "premium",
|
|
966
|
+
speedTier: "normal"
|
|
967
|
+
},
|
|
968
|
+
{
|
|
969
|
+
provider: "openai",
|
|
970
|
+
pattern: /gpt-4\.1|gpt-4o/i,
|
|
971
|
+
family: "GPT-4.1 / 4o",
|
|
972
|
+
strengths: ["coding", "balanced reasoning", "fast"],
|
|
973
|
+
bestFor: ["coding", "refactoring", "backend", "docs"],
|
|
974
|
+
costTier: "standard",
|
|
975
|
+
speedTier: "fast"
|
|
976
|
+
},
|
|
977
|
+
{
|
|
978
|
+
provider: "openai",
|
|
979
|
+
pattern: /gpt-4o-mini/i,
|
|
980
|
+
family: "GPT-4o Mini",
|
|
981
|
+
strengths: ["speed", "low cost", "simple tasks"],
|
|
982
|
+
weaknesses: ["complex reasoning"],
|
|
983
|
+
bestFor: ["lightweight", "frontend", "docs"],
|
|
984
|
+
avoidFor: ["planning", "security"],
|
|
985
|
+
costTier: "budget",
|
|
986
|
+
speedTier: "fast"
|
|
987
|
+
},
|
|
988
|
+
// ── Google ──
|
|
989
|
+
{
|
|
990
|
+
provider: "google",
|
|
991
|
+
pattern: /gemini-(?:2\.5|3)/i,
|
|
992
|
+
family: "Gemini 2.5 / 3",
|
|
993
|
+
strengths: ["long context", "multi-modal", "coding", "reasoning"],
|
|
994
|
+
bestFor: ["coding", "planning", "data", "general"],
|
|
995
|
+
costTier: "standard",
|
|
996
|
+
speedTier: "normal"
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
provider: "google",
|
|
1000
|
+
pattern: /gemini-2\.0-flash|gemini-flash/i,
|
|
1001
|
+
family: "Gemini Flash",
|
|
1002
|
+
strengths: ["speed", "low cost", "long context"],
|
|
1003
|
+
weaknesses: ["deep reasoning"],
|
|
1004
|
+
bestFor: ["lightweight", "docs", "frontend", "data"],
|
|
1005
|
+
avoidFor: ["planning", "security"],
|
|
1006
|
+
costTier: "budget",
|
|
1007
|
+
speedTier: "fast"
|
|
1008
|
+
},
|
|
1009
|
+
// ── DeepSeek ──
|
|
1010
|
+
{
|
|
1011
|
+
provider: "deepseek",
|
|
1012
|
+
pattern: /deepseek-v3|deepseek-r1/i,
|
|
1013
|
+
family: "DeepSeek V3 / R1",
|
|
1014
|
+
strengths: ["coding", "math", "reasoning", "cost-effective"],
|
|
1015
|
+
bestFor: ["coding", "refactoring", "debugging", "general"],
|
|
1016
|
+
costTier: "standard",
|
|
1017
|
+
speedTier: "normal"
|
|
1018
|
+
},
|
|
1019
|
+
// ── OpenRouter / catch-all ──
|
|
1020
|
+
{
|
|
1021
|
+
provider: "openrouter",
|
|
1022
|
+
pattern: /.*/,
|
|
1023
|
+
family: "OpenRouter (routed)",
|
|
1024
|
+
strengths: ["model variety", "fallback"],
|
|
1025
|
+
bestFor: ["general"],
|
|
1026
|
+
costTier: "standard",
|
|
1027
|
+
speedTier: "normal"
|
|
1028
|
+
}
|
|
1029
|
+
];
|
|
1030
|
+
var TASK_TO_ROLE = {
|
|
1031
|
+
coding: ["executor", "architect", "bug-hunter"],
|
|
1032
|
+
planning: ["planner", "architect", "refactor-planner"],
|
|
1033
|
+
security: ["security-scanner", "security-reviewer"],
|
|
1034
|
+
docs: ["document", "simplifier"],
|
|
1035
|
+
testing: ["test", "e2e"],
|
|
1036
|
+
refactoring: ["refactor-planner", "refactor", "simplifier"],
|
|
1037
|
+
debugging: ["debugger", "bug-hunter", "tracer"],
|
|
1038
|
+
data: ["analyst", "data", "database"],
|
|
1039
|
+
frontend: ["frontend", "designer"],
|
|
1040
|
+
backend: ["backend", "api", "auth"],
|
|
1041
|
+
review: ["code-reviewer", "critic"],
|
|
1042
|
+
lightweight: ["executor", "simplifier"],
|
|
1043
|
+
general: ["executor", "analyst"]
|
|
1044
|
+
};
|
|
1045
|
+
function inferTaskType(description, role) {
|
|
1046
|
+
const d = description.toLowerCase();
|
|
1047
|
+
const keywords = [
|
|
1048
|
+
[/plan|architect|design|strategy|blueprint|system\s*design/i, "planning"],
|
|
1049
|
+
[/security|vuln|exploit|injection|auth/i, "security"],
|
|
1050
|
+
[/doc|readme|explain|write\s*(a|the)\s*doc|tutorial/i, "docs"],
|
|
1051
|
+
[/test|spec|assert|mock|coverage/i, "testing"],
|
|
1052
|
+
[/refactor|clean\s*up|restructure|simplify/i, "refactoring"],
|
|
1053
|
+
[/bug|fix|debug|trace|crash|error/i, "debugging"],
|
|
1054
|
+
[/data|json|sql|query|analyze|parse/i, "data"],
|
|
1055
|
+
[/frontend|react|ui|css|component|jsx/i, "frontend"],
|
|
1056
|
+
[/backend|api|server|endpoint|route|middleware/i, "backend"],
|
|
1057
|
+
[/review|audit|inspect|check/i, "review"],
|
|
1058
|
+
[/simple|quick|one-liner|trivial/i, "lightweight"]
|
|
1059
|
+
];
|
|
1060
|
+
for (const [re, taskType] of keywords) {
|
|
1061
|
+
if (re.test(d)) return taskType;
|
|
1062
|
+
}
|
|
1063
|
+
if (role) {
|
|
1064
|
+
for (const [taskType, roles] of Object.entries(TASK_TO_ROLE)) {
|
|
1065
|
+
if (roles.includes(role)) return taskType;
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
return "general";
|
|
1069
|
+
}
|
|
1070
|
+
function findModelProfile(provider, modelId) {
|
|
1071
|
+
const candidates = MODEL_PROFILES.filter((p) => p.provider === provider);
|
|
1072
|
+
for (const p of candidates) {
|
|
1073
|
+
if (p.pattern.test(modelId)) return p;
|
|
1074
|
+
}
|
|
1075
|
+
return void 0;
|
|
1076
|
+
}
|
|
1077
|
+
function scoreModelForTask(profile, taskType) {
|
|
1078
|
+
if (!profile) return 50;
|
|
1079
|
+
if (profile.avoidFor?.includes(taskType)) return 10;
|
|
1080
|
+
const bestIdx = profile.bestFor.indexOf(taskType);
|
|
1081
|
+
if (bestIdx >= 0) {
|
|
1082
|
+
return 90 - bestIdx * 10;
|
|
1083
|
+
}
|
|
1084
|
+
let score = 50;
|
|
1085
|
+
if (taskType === "lightweight") {
|
|
1086
|
+
score += profile.costTier === "budget" ? 30 : profile.costTier === "standard" ? 15 : 0;
|
|
1087
|
+
score += profile.speedTier === "fast" ? 20 : 0;
|
|
1088
|
+
}
|
|
1089
|
+
if (taskType === "planning" || taskType === "security") {
|
|
1090
|
+
score += profile.costTier === "premium" ? 20 : 0;
|
|
1091
|
+
score += profile.speedTier === "slow" ? 10 : 0;
|
|
1092
|
+
}
|
|
1093
|
+
return score;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
// src/models/model-router.ts
|
|
1097
|
+
var DEFAULT_PROFILES = [
|
|
1098
|
+
{ provider: "anthropic", pattern: /claude-opus/i, family: "Claude Opus", strengths: ["reasoning", "planning"], bestFor: ["planning", "security", "debugging"], costTier: "premium", speedTier: "slow" },
|
|
1099
|
+
{ provider: "anthropic", pattern: /claude-sonnet/i, family: "Claude Sonnet", strengths: ["coding", "balanced"], bestFor: ["coding", "general"], costTier: "standard", speedTier: "fast" },
|
|
1100
|
+
{ provider: "anthropic", pattern: /claude-haiku/i, family: "Claude Haiku", strengths: ["speed"], bestFor: ["lightweight", "docs"], avoidFor: ["planning"], costTier: "budget", speedTier: "fast" },
|
|
1101
|
+
{ provider: "openai", pattern: /gpt-5|o3|o4/i, family: "GPT-5/o3/o4", strengths: ["reasoning", "coding"], bestFor: ["planning", "coding", "debugging"], costTier: "premium", speedTier: "normal" },
|
|
1102
|
+
{ provider: "openai", pattern: /gpt-4/i, family: "GPT-4", strengths: ["coding"], bestFor: ["coding", "docs"], costTier: "standard", speedTier: "fast" },
|
|
1103
|
+
{ provider: "openai", pattern: /gpt-4o-mini/i, family: "GPT-4o Mini", strengths: ["speed"], bestFor: ["lightweight", "docs"], avoidFor: ["planning"], costTier: "budget", speedTier: "fast" },
|
|
1104
|
+
{ provider: "google", pattern: /gemini-(?:2\.5|3)/i, family: "Gemini 2.5/3", strengths: ["context", "coding"], bestFor: ["coding", "data"], costTier: "standard", speedTier: "normal" },
|
|
1105
|
+
{ provider: "google", pattern: /gemini.*flash/i, family: "Gemini Flash", strengths: ["speed"], bestFor: ["lightweight", "docs"], avoidFor: ["planning"], costTier: "budget", speedTier: "fast" },
|
|
1106
|
+
{ provider: "deepseek", pattern: /deepseek/i, family: "DeepSeek", strengths: ["coding", "cost-effective"], bestFor: ["coding", "general"], costTier: "standard", speedTier: "normal" }
|
|
1107
|
+
];
|
|
1108
|
+
var TASK_CATEGORIES = {
|
|
1109
|
+
plan: "planning",
|
|
1110
|
+
architect: "planning",
|
|
1111
|
+
design: "planning",
|
|
1112
|
+
strategy: "planning",
|
|
1113
|
+
security: "security",
|
|
1114
|
+
vuln: "security",
|
|
1115
|
+
exploit: "security",
|
|
1116
|
+
auth: "security",
|
|
1117
|
+
doc: "docs",
|
|
1118
|
+
readme: "docs",
|
|
1119
|
+
explain: "docs",
|
|
1120
|
+
write: "docs",
|
|
1121
|
+
test: "testing",
|
|
1122
|
+
spec: "testing",
|
|
1123
|
+
assert: "testing",
|
|
1124
|
+
coverage: "testing",
|
|
1125
|
+
refactor: "refactoring",
|
|
1126
|
+
cleanup: "refactoring",
|
|
1127
|
+
restructure: "refactoring",
|
|
1128
|
+
bug: "debugging",
|
|
1129
|
+
fix: "debugging",
|
|
1130
|
+
debug: "debugging",
|
|
1131
|
+
trace: "debugging",
|
|
1132
|
+
crash: "debugging",
|
|
1133
|
+
data: "data",
|
|
1134
|
+
json: "data",
|
|
1135
|
+
sql: "data",
|
|
1136
|
+
query: "data",
|
|
1137
|
+
analyze: "data",
|
|
1138
|
+
parse: "data",
|
|
1139
|
+
frontend: "frontend",
|
|
1140
|
+
react: "frontend",
|
|
1141
|
+
ui: "frontend",
|
|
1142
|
+
css: "frontend",
|
|
1143
|
+
component: "frontend",
|
|
1144
|
+
backend: "backend",
|
|
1145
|
+
api: "backend",
|
|
1146
|
+
server: "backend",
|
|
1147
|
+
endpoint: "backend",
|
|
1148
|
+
review: "review",
|
|
1149
|
+
audit: "review",
|
|
1150
|
+
inspect: "review",
|
|
1151
|
+
simple: "lightweight",
|
|
1152
|
+
quick: "lightweight",
|
|
1153
|
+
trivial: "lightweight"
|
|
1154
|
+
};
|
|
1155
|
+
var ModelRouter = class {
|
|
1156
|
+
profiles;
|
|
1157
|
+
matrix;
|
|
1158
|
+
config;
|
|
1159
|
+
costs = { byModel: {}, totalCost: 0 };
|
|
1160
|
+
constructor(opts) {
|
|
1161
|
+
this.profiles = opts.profiles ?? DEFAULT_PROFILES;
|
|
1162
|
+
this.matrix = opts.matrix ?? {};
|
|
1163
|
+
this.config = opts.config;
|
|
1164
|
+
}
|
|
1165
|
+
/** Look up the model matrix resolution for a role (role → phase → * → leader). */
|
|
1166
|
+
resolveMatrix(role) {
|
|
1167
|
+
if (this.matrix[role]) return this.matrix[role];
|
|
1168
|
+
const phase = this.roleToPhase(role);
|
|
1169
|
+
if (phase && this.matrix[phase]) return this.matrix[phase];
|
|
1170
|
+
if (this.matrix["*"]) return this.matrix["*"];
|
|
1171
|
+
return void 0;
|
|
1172
|
+
}
|
|
1173
|
+
/** Simplified phase lookup for common roles. */
|
|
1174
|
+
roleToPhase(role) {
|
|
1175
|
+
const phaseMap = {
|
|
1176
|
+
planner: "plan",
|
|
1177
|
+
architect: "plan",
|
|
1178
|
+
"refactor-planner": "plan",
|
|
1179
|
+
executor: "code",
|
|
1180
|
+
refactor: "code",
|
|
1181
|
+
simplifier: "code",
|
|
1182
|
+
migration: "code",
|
|
1183
|
+
"bug-hunter": "code",
|
|
1184
|
+
debugger: "code",
|
|
1185
|
+
tracer: "code",
|
|
1186
|
+
test: "code",
|
|
1187
|
+
e2e: "code",
|
|
1188
|
+
performance: "code",
|
|
1189
|
+
chaos: "code",
|
|
1190
|
+
"security-scanner": "review",
|
|
1191
|
+
"security-reviewer": "review",
|
|
1192
|
+
"code-reviewer": "review",
|
|
1193
|
+
critic: "review",
|
|
1194
|
+
accessibility: "review",
|
|
1195
|
+
compliance: "review",
|
|
1196
|
+
analyst: "code",
|
|
1197
|
+
data: "code",
|
|
1198
|
+
database: "code",
|
|
1199
|
+
frontend: "code",
|
|
1200
|
+
backend: "code",
|
|
1201
|
+
api: "code",
|
|
1202
|
+
auth: "code",
|
|
1203
|
+
designer: "code",
|
|
1204
|
+
document: "code",
|
|
1205
|
+
researcher: "plan",
|
|
1206
|
+
explore: "plan",
|
|
1207
|
+
search: "plan"
|
|
1208
|
+
};
|
|
1209
|
+
return phaseMap[role];
|
|
1210
|
+
}
|
|
1211
|
+
/**
|
|
1212
|
+
* Pick the best model for a task.
|
|
1213
|
+
*
|
|
1214
|
+
* Priority:
|
|
1215
|
+
* 1. User's /setmodel matrix entry for this role (explicit override)
|
|
1216
|
+
* 2. Best-matching model from intelligence profiles
|
|
1217
|
+
* 3. Leader model (fallback)
|
|
1218
|
+
*/
|
|
1219
|
+
pickForTask(role, description) {
|
|
1220
|
+
const matrixEntry = this.resolveMatrix(role);
|
|
1221
|
+
if (matrixEntry) {
|
|
1222
|
+
const provider = matrixEntry.provider ?? this.config.provider;
|
|
1223
|
+
return {
|
|
1224
|
+
provider,
|
|
1225
|
+
model: matrixEntry.model,
|
|
1226
|
+
reason: `matrix override for role ${role}`,
|
|
1227
|
+
fromMatrix: true
|
|
1228
|
+
};
|
|
1229
|
+
}
|
|
1230
|
+
const category = this.inferCategory(description, role);
|
|
1231
|
+
const best = this.findBestModel(category);
|
|
1232
|
+
if (best) {
|
|
1233
|
+
return { ...best, reason: `best-for ${category} (auto-detected)`, fromMatrix: false };
|
|
1234
|
+
}
|
|
1235
|
+
return {
|
|
1236
|
+
provider: this.config.provider,
|
|
1237
|
+
model: this.config.model,
|
|
1238
|
+
reason: "leader fallback",
|
|
1239
|
+
fromMatrix: false
|
|
1240
|
+
};
|
|
1241
|
+
}
|
|
1242
|
+
/** Infer task category from description keywords + role. */
|
|
1243
|
+
inferCategory(description, role) {
|
|
1244
|
+
const d = description.toLowerCase();
|
|
1245
|
+
for (const [keyword, category] of Object.entries(TASK_CATEGORIES)) {
|
|
1246
|
+
if (d.includes(keyword)) return category;
|
|
1247
|
+
}
|
|
1248
|
+
const roleMap = {
|
|
1249
|
+
"security-scanner": "security",
|
|
1250
|
+
"security-reviewer": "security",
|
|
1251
|
+
"bug-hunter": "debugging",
|
|
1252
|
+
debugger: "debugging",
|
|
1253
|
+
planner: "planning",
|
|
1254
|
+
architect: "planning",
|
|
1255
|
+
"refactor-planner": "refactoring",
|
|
1256
|
+
refactor: "refactoring",
|
|
1257
|
+
test: "testing",
|
|
1258
|
+
e2e: "testing",
|
|
1259
|
+
document: "docs",
|
|
1260
|
+
simplifier: "docs",
|
|
1261
|
+
"code-reviewer": "review",
|
|
1262
|
+
critic: "review",
|
|
1263
|
+
"frontend": "frontend",
|
|
1264
|
+
"backend": "backend"
|
|
1265
|
+
};
|
|
1266
|
+
return roleMap[role] ?? "general";
|
|
1267
|
+
}
|
|
1268
|
+
/** Find the best available model for a task category. */
|
|
1269
|
+
findBestModel(category) {
|
|
1270
|
+
const scored = this.profiles.filter((p) => this.hasKey(p.provider)).map((p) => {
|
|
1271
|
+
let score = 50;
|
|
1272
|
+
if (p.bestFor.includes(category)) score += 40;
|
|
1273
|
+
if (p.avoidFor?.includes(category)) score -= 50;
|
|
1274
|
+
if (category === "lightweight" && p.costTier === "budget") score += 20;
|
|
1275
|
+
if (category === "planning" && p.costTier === "premium") score += 15;
|
|
1276
|
+
if (category === "planning" && p.speedTier === "slow") score += 10;
|
|
1277
|
+
return { profile: p, score };
|
|
1278
|
+
}).filter((s) => s.score > 0).sort((a, b) => b.score - a.score);
|
|
1279
|
+
if (scored.length === 0) return void 0;
|
|
1280
|
+
const best = scored[0].profile;
|
|
1281
|
+
const models = this.getProviderModels(best.provider);
|
|
1282
|
+
const match = models.find((m) => best.pattern.test(m)) ?? models[0];
|
|
1283
|
+
if (!match) return void 0;
|
|
1284
|
+
return { provider: best.provider, model: match };
|
|
1285
|
+
}
|
|
1286
|
+
/** Check if a provider has an API key configured. */
|
|
1287
|
+
hasKey(providerId) {
|
|
1288
|
+
const pc = this.config.providers?.[providerId];
|
|
1289
|
+
if (!pc) return providerId === this.config.provider;
|
|
1290
|
+
if (typeof pc.apiKey === "string" && pc.apiKey.length > 0) return true;
|
|
1291
|
+
if (Array.isArray(pc.apiKeys) && pc.apiKeys.some((k) => k?.apiKey)) return true;
|
|
1292
|
+
return false;
|
|
1293
|
+
}
|
|
1294
|
+
/** Get the configured model list for a provider. */
|
|
1295
|
+
getProviderModels(providerId) {
|
|
1296
|
+
const pc = this.config.providers?.[providerId];
|
|
1297
|
+
return pc?.models ?? [];
|
|
1298
|
+
}
|
|
1299
|
+
/** Record cost for a model. */
|
|
1300
|
+
recordCost(provider, model, cost, tokens) {
|
|
1301
|
+
const key = `${provider}/${model}`;
|
|
1302
|
+
const entry = this.costs.byModel[key] ?? { cost: 0, tokens: { input: 0, output: 0 }, calls: 0 };
|
|
1303
|
+
entry.cost += cost;
|
|
1304
|
+
if (tokens) {
|
|
1305
|
+
entry.tokens.input += tokens.input;
|
|
1306
|
+
entry.tokens.output += tokens.output;
|
|
1307
|
+
}
|
|
1308
|
+
entry.calls += 1;
|
|
1309
|
+
this.costs.byModel[key] = entry;
|
|
1310
|
+
this.costs.totalCost += cost;
|
|
1311
|
+
}
|
|
1312
|
+
/** Get cumulative costs. */
|
|
1313
|
+
getCosts() {
|
|
1314
|
+
return { ...this.costs, byModel: { ...this.costs.byModel } };
|
|
1315
|
+
}
|
|
1316
|
+
/** Reset cost tracking. */
|
|
1317
|
+
resetCosts() {
|
|
1318
|
+
this.costs = { byModel: {}, totalCost: 0 };
|
|
1319
|
+
}
|
|
1320
|
+
/** List all available providers with their best model for each task category. */
|
|
1321
|
+
suggestMatrix() {
|
|
1322
|
+
const matrix = {};
|
|
1323
|
+
const roles = [
|
|
1324
|
+
"security-scanner",
|
|
1325
|
+
"bug-hunter",
|
|
1326
|
+
"planner",
|
|
1327
|
+
"architect",
|
|
1328
|
+
"refactor-planner",
|
|
1329
|
+
"test",
|
|
1330
|
+
"document",
|
|
1331
|
+
"code-reviewer",
|
|
1332
|
+
"executor",
|
|
1333
|
+
"debugger",
|
|
1334
|
+
"analyst"
|
|
1335
|
+
];
|
|
1336
|
+
for (const role of roles) {
|
|
1337
|
+
if (this.matrix[role]) continue;
|
|
1338
|
+
const pick = this.pickForTask(role, role);
|
|
1339
|
+
if (!pick.fromMatrix) {
|
|
1340
|
+
matrix[role] = pick;
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
return matrix;
|
|
1344
|
+
}
|
|
1345
|
+
};
|
|
1346
|
+
|
|
1347
|
+
export { DefaultModeStore, DefaultModelsRegistry, LLMSelector, MODEL_PROFILES, ModelRouter, TASK_TO_ROLE, classifyFamily, findModelProfile, inferTaskType, loadProjectModes, loadUserModes, scoreModelForTask };
|
|
926
1348
|
//# sourceMappingURL=index.js.map
|
|
927
1349
|
//# sourceMappingURL=index.js.map
|