@kernel.chat/kbot 2.26.0 → 3.0.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 (97) hide show
  1. package/dist/agent.d.ts +15 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +187 -48
  4. package/dist/agent.js.map +1 -1
  5. package/dist/checkpoint.d.ts +79 -0
  6. package/dist/checkpoint.d.ts.map +1 -0
  7. package/dist/checkpoint.js +220 -0
  8. package/dist/checkpoint.js.map +1 -0
  9. package/dist/cli.js +55 -4
  10. package/dist/cli.js.map +1 -1
  11. package/dist/ide/bridge.d.ts +2 -0
  12. package/dist/ide/bridge.d.ts.map +1 -1
  13. package/dist/ide/bridge.js +1 -0
  14. package/dist/ide/bridge.js.map +1 -1
  15. package/dist/ide/mcp-server.d.ts.map +1 -1
  16. package/dist/ide/mcp-server.js +27 -7
  17. package/dist/ide/mcp-server.js.map +1 -1
  18. package/dist/learned-router.d.ts +9 -7
  19. package/dist/learned-router.d.ts.map +1 -1
  20. package/dist/learned-router.js +36 -10
  21. package/dist/learned-router.js.map +1 -1
  22. package/dist/learning.d.ts +4 -0
  23. package/dist/learning.d.ts.map +1 -1
  24. package/dist/learning.js +17 -0
  25. package/dist/learning.js.map +1 -1
  26. package/dist/mcp-plugins.js +1 -1
  27. package/dist/mcp-plugins.js.map +1 -1
  28. package/dist/multimodal.d.ts +6 -0
  29. package/dist/multimodal.d.ts.map +1 -1
  30. package/dist/multimodal.js +45 -0
  31. package/dist/multimodal.js.map +1 -1
  32. package/dist/sdk.d.ts +165 -0
  33. package/dist/sdk.d.ts.map +1 -0
  34. package/dist/sdk.js +230 -0
  35. package/dist/sdk.js.map +1 -0
  36. package/dist/serve.d.ts.map +1 -1
  37. package/dist/serve.js +38 -0
  38. package/dist/serve.js.map +1 -1
  39. package/dist/skill-rating.d.ts +92 -0
  40. package/dist/skill-rating.d.ts.map +1 -0
  41. package/dist/skill-rating.js +352 -0
  42. package/dist/skill-rating.js.map +1 -0
  43. package/dist/streaming.d.ts +75 -1
  44. package/dist/streaming.d.ts.map +1 -1
  45. package/dist/streaming.js +211 -3
  46. package/dist/streaming.js.map +1 -1
  47. package/dist/task-ledger.d.ts +10 -0
  48. package/dist/task-ledger.d.ts.map +1 -1
  49. package/dist/task-ledger.js +28 -0
  50. package/dist/task-ledger.js.map +1 -1
  51. package/dist/telemetry.d.ts +52 -0
  52. package/dist/telemetry.d.ts.map +1 -0
  53. package/dist/telemetry.js +219 -0
  54. package/dist/telemetry.js.map +1 -0
  55. package/dist/terminal-caps.d.ts +20 -0
  56. package/dist/terminal-caps.d.ts.map +1 -0
  57. package/dist/terminal-caps.js +80 -0
  58. package/dist/terminal-caps.js.map +1 -0
  59. package/dist/tool-pipeline.d.ts +86 -0
  60. package/dist/tool-pipeline.d.ts.map +1 -0
  61. package/dist/tool-pipeline.js +200 -0
  62. package/dist/tool-pipeline.js.map +1 -0
  63. package/dist/tools/containers.js +7 -7
  64. package/dist/tools/containers.js.map +1 -1
  65. package/dist/tools/database.js +6 -6
  66. package/dist/tools/database.js.map +1 -1
  67. package/dist/tools/deploy.js +3 -3
  68. package/dist/tools/deploy.js.map +1 -1
  69. package/dist/tools/e2b-sandbox.js +5 -5
  70. package/dist/tools/e2b-sandbox.js.map +1 -1
  71. package/dist/tools/index.d.ts +45 -1
  72. package/dist/tools/index.d.ts.map +1 -1
  73. package/dist/tools/index.js +168 -108
  74. package/dist/tools/index.js.map +1 -1
  75. package/dist/tools/index.test.js +1 -1
  76. package/dist/tools/index.test.js.map +1 -1
  77. package/dist/tools/research.js +1 -1
  78. package/dist/tools/research.js.map +1 -1
  79. package/dist/tools/training.js +7 -7
  80. package/dist/tools/training.js.map +1 -1
  81. package/dist/tools/vfx.js +2 -2
  82. package/dist/tools/vfx.js.map +1 -1
  83. package/dist/tui.d.ts +1 -0
  84. package/dist/tui.d.ts.map +1 -1
  85. package/dist/tui.js +71 -11
  86. package/dist/tui.js.map +1 -1
  87. package/dist/ui-adapter.d.ts +73 -0
  88. package/dist/ui-adapter.d.ts.map +1 -0
  89. package/dist/ui-adapter.js +139 -0
  90. package/dist/ui-adapter.js.map +1 -0
  91. package/dist/ui.d.ts +3 -0
  92. package/dist/ui.d.ts.map +1 -1
  93. package/dist/ui.js +21 -2
  94. package/dist/ui.js.map +1 -1
  95. package/dist/workflows.js +3 -3
  96. package/dist/workflows.js.map +1 -1
  97. package/package.json +22 -3
@@ -0,0 +1,92 @@
1
+ export interface Rating {
2
+ /** Mean skill estimate */
3
+ mu: number;
4
+ /** Uncertainty (standard deviation) */
5
+ sigma: number;
6
+ }
7
+ export interface AgentCategoryRatings {
8
+ [category: string]: Rating;
9
+ /** Overall rating across all categories */
10
+ _overall: Rating;
11
+ }
12
+ export interface AgentRatings {
13
+ [agentId: string]: AgentCategoryRatings;
14
+ }
15
+ export type TaskCategory = 'coding' | 'debugging' | 'refactoring' | 'research' | 'analysis' | 'writing' | 'devops' | 'security' | 'design' | 'general' | 'data' | 'communication';
16
+ export type Outcome = 'win' | 'loss' | 'draw';
17
+ export declare class SkillRatingSystem {
18
+ private ratings;
19
+ private dirty;
20
+ constructor();
21
+ private loadSync;
22
+ save(): Promise<void>;
23
+ load(): Promise<void>;
24
+ /**
25
+ * Classify a message into a task category using keyword matching.
26
+ * Fast, no LLM call needed.
27
+ */
28
+ categorizeMessage(message: string): TaskCategory;
29
+ /**
30
+ * Get a rating for a specific agent and category.
31
+ * Returns the category-specific rating if it exists, otherwise the overall rating.
32
+ */
33
+ private getRating;
34
+ /**
35
+ * Conservative rating estimate: mu - 2*sigma
36
+ * This is the lower bound of the ~95% confidence interval.
37
+ * Agents need to both be good AND have enough data to rank highly.
38
+ */
39
+ private conservativeEstimate;
40
+ /**
41
+ * Get agents ranked by conservative estimate for a given category.
42
+ */
43
+ getRankedAgents(category: TaskCategory): Array<{
44
+ agent: string;
45
+ rating: Rating;
46
+ confidence: number;
47
+ }>;
48
+ /**
49
+ * Update an agent's rating based on an outcome.
50
+ *
51
+ * Uses a simplified Bradley-Terry model:
52
+ * beta = sigma / 2 (dynamics factor)
53
+ * c = sqrt(2 * beta^2 + sigma^2) (normalization factor)
54
+ * K = sigma^2 / c (update magnitude — bigger when uncertain)
55
+ * mu_new = mu + K * outcome_factor
56
+ * sigma_new = sigma * sqrt(max(1 - sigma^2/c^2, epsilon))
57
+ *
58
+ * outcome_factor: win = +1, loss = -1, draw = 0
59
+ */
60
+ recordOutcome(agent: string, category: TaskCategory, outcome: Outcome): void;
61
+ /**
62
+ * Core Bradley-Terry update step.
63
+ * @param rating The rating to mutate in place
64
+ * @param outcome The match outcome
65
+ * @param dampen Dampen the update (0-1), 1 = full update
66
+ */
67
+ private updateRating;
68
+ /**
69
+ * Get the best agent for a task based on Bayesian skill ratings.
70
+ *
71
+ * Returns null if all agents still have high uncertainty (not enough data).
72
+ * The confidence threshold ensures we only route when we have meaningful signal.
73
+ */
74
+ getAgentForTask(message: string): {
75
+ agent: string;
76
+ confidence: number;
77
+ category: TaskCategory;
78
+ } | null;
79
+ /**
80
+ * Get summary stats for each agent: their top category and confidence level.
81
+ */
82
+ getStats(): Record<string, {
83
+ topCategory: string;
84
+ confidence: number;
85
+ }>;
86
+ /**
87
+ * Get raw ratings for an agent (for debugging/display).
88
+ */
89
+ getAgentRatings(agent: string): AgentCategoryRatings | null;
90
+ }
91
+ export declare function getSkillRatingSystem(): SkillRatingSystem;
92
+ //# sourceMappingURL=skill-rating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-rating.d.ts","sourceRoot":"","sources":["../src/skill-rating.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,MAAM;IACrB,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAAA;CACxC;AAED,MAAM,MAAM,YAAY,GACpB,QAAQ,GAAG,WAAW,GAAG,aAAa,GACtC,UAAU,GAAG,UAAU,GAAG,SAAS,GACnC,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAChC,SAAS,GAAG,MAAM,GAAG,eAAe,CAAA;AAExC,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAoG7C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,KAAK,CAAQ;;IAQrB,OAAO,CAAC,QAAQ;IAiBV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IA6BhD;;;OAGG;IACH,OAAO,CAAC,SAAS;IAMjB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBrG;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAuB5E;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA2BpB;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,GAAG,IAAI;IA6BtG;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA+BvE;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;CAG5D;AAMD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAKxD"}
@@ -0,0 +1,352 @@
1
+ // K:BOT Bayesian Skill Rating — OpenSkill-style Agent Routing
2
+ //
3
+ // Each agent maintains a {mu, sigma} rating per task category.
4
+ // mu = estimated skill level, sigma = uncertainty.
5
+ // Ratings update after each routing outcome using a simplified
6
+ // Bradley-Terry model. Over time, agents with proven track records
7
+ // in specific categories get routed to preferentially.
8
+ //
9
+ // This sits between exact-intent match and keyword voting in the
10
+ // routing cascade (Level 1.5), providing probabilistic confidence
11
+ // that improves with every interaction.
12
+ import { homedir } from 'node:os';
13
+ import { join } from 'node:path';
14
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
15
+ // ── Constants ──
16
+ /** Default mu (mean skill estimate) — standard OpenSkill default */
17
+ const INITIAL_MU = 25.0;
18
+ /** Default sigma (uncertainty) — standard OpenSkill default: mu/3 */
19
+ const INITIAL_SIGMA = INITIAL_MU / 3; // ~8.333
20
+ /** Minimum sigma floor to prevent ratings from becoming completely rigid */
21
+ const MIN_SIGMA = 0.5;
22
+ /** Persistence path */
23
+ const RATINGS_DIR = join(homedir(), '.kbot', 'memory');
24
+ const RATINGS_FILE = join(RATINGS_DIR, 'skill-ratings.json');
25
+ // ── Category keyword maps for fast classification ──
26
+ const CATEGORY_KEYWORDS = {
27
+ coding: [
28
+ 'code', 'function', 'implement', 'build', 'create', 'component', 'module',
29
+ 'class', 'interface', 'type', 'typescript', 'javascript', 'python', 'rust',
30
+ 'react', 'node', 'api', 'endpoint', 'route', 'hook', 'scaffold', 'generate',
31
+ 'import', 'export', 'async', 'package', 'npm', 'install',
32
+ ],
33
+ debugging: [
34
+ 'fix', 'bug', 'error', 'crash', 'debug', 'broken', 'fail', 'issue',
35
+ 'exception', 'stack', 'trace', 'undefined', 'null', 'hang', 'freeze',
36
+ 'memory', 'leak', 'infinite', 'loop', 'regression', 'broken',
37
+ ],
38
+ refactoring: [
39
+ 'refactor', 'clean', 'reorganize', 'restructure', 'simplify', 'extract',
40
+ 'rename', 'move', 'split', 'merge', 'consolidate', 'deduplicate',
41
+ 'optimize', 'improve', 'modernize',
42
+ ],
43
+ research: [
44
+ 'research', 'find', 'compare', 'benchmark', 'search', 'alternative',
45
+ 'documentation', 'docs', 'article', 'paper', 'study', 'investigate',
46
+ 'explore', 'discover', 'learn', 'understand', 'explain', 'difference',
47
+ 'versus', 'pros', 'cons', 'tradeoff', 'best practice',
48
+ ],
49
+ analysis: [
50
+ 'analyze', 'strategy', 'plan', 'architecture', 'review', 'audit',
51
+ 'evaluate', 'assess', 'performance', 'cost', 'pricing', 'metric',
52
+ 'dashboard', 'report', 'insight', 'decision', 'priority', 'roadmap',
53
+ ],
54
+ writing: [
55
+ 'write', 'draft', 'blog', 'email', 'document', 'readme', 'changelog',
56
+ 'announcement', 'copy', 'content', 'marketing', 'social', 'tweet',
57
+ 'newsletter', 'story', 'essay', 'summary', 'summarize', 'proofread',
58
+ 'edit', 'article', 'post',
59
+ ],
60
+ devops: [
61
+ 'deploy', 'ship', 'release', 'publish', 'ci', 'cd', 'pipeline',
62
+ 'docker', 'kubernetes', 'container', 'server', 'host', 'cloud',
63
+ 'aws', 'gcp', 'azure', 'infrastructure', 'terraform', 'nginx',
64
+ 'monitor', 'log', 'uptime',
65
+ ],
66
+ security: [
67
+ 'security', 'vulnerability', 'exploit', 'attack', 'auth', 'permission',
68
+ 'encrypt', 'decrypt', 'token', 'secret', 'credential', 'ssl', 'tls',
69
+ 'certificate', 'firewall', 'audit', 'scan', 'penetration', 'xss',
70
+ 'csrf', 'injection', 'sanitize',
71
+ ],
72
+ design: [
73
+ 'design', 'ui', 'ux', 'layout', 'color', 'font', 'typography',
74
+ 'responsive', 'mobile', 'animation', 'css', 'style', 'theme',
75
+ 'palette', 'icon', 'illustration', 'wireframe', 'mockup', 'figma',
76
+ 'accessibility', 'a11y',
77
+ ],
78
+ data: [
79
+ 'data', 'database', 'sql', 'query', 'table', 'schema', 'migration',
80
+ 'csv', 'json', 'parse', 'transform', 'aggregate', 'statistics',
81
+ 'chart', 'graph', 'visualization', 'analytics', 'etl', 'pipeline',
82
+ ],
83
+ communication: [
84
+ 'email', 'message', 'notify', 'announce', 'broadcast', 'communicate',
85
+ 'present', 'pitch', 'propose', 'negotiate', 'feedback', 'slack',
86
+ 'discord', 'webhook',
87
+ ],
88
+ general: [
89
+ 'help', 'hello', 'hey', 'hi', 'thanks', 'what', 'how', 'why',
90
+ 'general', 'chat', 'talk', 'opinion', 'think', 'advice',
91
+ ],
92
+ };
93
+ // ── All known agent IDs ──
94
+ const ALL_AGENTS = [
95
+ 'kernel', 'researcher', 'coder', 'writer', 'analyst',
96
+ 'aesthete', 'guardian', 'curator', 'strategist',
97
+ 'infrastructure', 'quant', 'investigator', 'oracle',
98
+ 'chronist', 'sage', 'communicator', 'adapter',
99
+ 'creative', 'developer',
100
+ ];
101
+ // ── Core ──
102
+ function ensureDir() {
103
+ if (!existsSync(RATINGS_DIR))
104
+ mkdirSync(RATINGS_DIR, { recursive: true });
105
+ }
106
+ function defaultRating() {
107
+ return { mu: INITIAL_MU, sigma: INITIAL_SIGMA };
108
+ }
109
+ function initializeRatings() {
110
+ const ratings = {};
111
+ for (const agent of ALL_AGENTS) {
112
+ ratings[agent] = { _overall: defaultRating() };
113
+ }
114
+ return ratings;
115
+ }
116
+ export class SkillRatingSystem {
117
+ ratings;
118
+ dirty = false;
119
+ constructor() {
120
+ this.ratings = this.loadSync();
121
+ }
122
+ // ── Persistence ──
123
+ loadSync() {
124
+ ensureDir();
125
+ try {
126
+ if (existsSync(RATINGS_FILE)) {
127
+ const data = JSON.parse(readFileSync(RATINGS_FILE, 'utf-8'));
128
+ // Ensure all known agents exist (in case new agents were added)
129
+ for (const agent of ALL_AGENTS) {
130
+ if (!data[agent]) {
131
+ data[agent] = { _overall: defaultRating() };
132
+ }
133
+ }
134
+ return data;
135
+ }
136
+ }
137
+ catch { /* corrupted file — reinitialize */ }
138
+ return initializeRatings();
139
+ }
140
+ async save() {
141
+ if (!this.dirty)
142
+ return;
143
+ ensureDir();
144
+ try {
145
+ writeFileSync(RATINGS_FILE, JSON.stringify(this.ratings, null, 2));
146
+ this.dirty = false;
147
+ }
148
+ catch { /* non-critical */ }
149
+ }
150
+ async load() {
151
+ this.ratings = this.loadSync();
152
+ }
153
+ // ── Category Classification ──
154
+ /**
155
+ * Classify a message into a task category using keyword matching.
156
+ * Fast, no LLM call needed.
157
+ */
158
+ categorizeMessage(message) {
159
+ const lower = message.toLowerCase().replace(/[^a-z0-9\s]/g, ' ');
160
+ const words = lower.split(/\s+/).filter(w => w.length > 1);
161
+ const wordSet = new Set(words);
162
+ let bestCategory = 'general';
163
+ let bestScore = 0;
164
+ for (const [category, keywords] of Object.entries(CATEGORY_KEYWORDS)) {
165
+ let score = 0;
166
+ for (const kw of keywords) {
167
+ if (kw.includes(' ')) {
168
+ // Multi-word keyword — check substring
169
+ if (lower.includes(kw))
170
+ score += 2;
171
+ }
172
+ else {
173
+ if (wordSet.has(kw))
174
+ score += 1;
175
+ }
176
+ }
177
+ if (score > bestScore) {
178
+ bestScore = score;
179
+ bestCategory = category;
180
+ }
181
+ }
182
+ return bestCategory;
183
+ }
184
+ // ── Rating Queries ──
185
+ /**
186
+ * Get a rating for a specific agent and category.
187
+ * Returns the category-specific rating if it exists, otherwise the overall rating.
188
+ */
189
+ getRating(agent, category) {
190
+ const agentRatings = this.ratings[agent];
191
+ if (!agentRatings)
192
+ return defaultRating();
193
+ return agentRatings[category] || agentRatings._overall || defaultRating();
194
+ }
195
+ /**
196
+ * Conservative rating estimate: mu - 2*sigma
197
+ * This is the lower bound of the ~95% confidence interval.
198
+ * Agents need to both be good AND have enough data to rank highly.
199
+ */
200
+ conservativeEstimate(rating) {
201
+ return rating.mu - 2 * rating.sigma;
202
+ }
203
+ /**
204
+ * Get agents ranked by conservative estimate for a given category.
205
+ */
206
+ getRankedAgents(category) {
207
+ const ranked = [];
208
+ for (const agent of ALL_AGENTS) {
209
+ const rating = this.getRating(agent, category);
210
+ // Confidence: how much uncertainty has been reduced from the initial state
211
+ // 0 = no data (sigma === INITIAL_SIGMA), 1 = fully certain (sigma === MIN_SIGMA)
212
+ const confidence = 1 - (rating.sigma / INITIAL_SIGMA);
213
+ ranked.push({ agent, rating, confidence: Math.max(0, confidence) });
214
+ }
215
+ // Sort by conservative estimate (mu - 2*sigma), descending
216
+ ranked.sort((a, b) => this.conservativeEstimate(b.rating) - this.conservativeEstimate(a.rating));
217
+ return ranked;
218
+ }
219
+ // ── Rating Updates (Bradley-Terry) ──
220
+ /**
221
+ * Update an agent's rating based on an outcome.
222
+ *
223
+ * Uses a simplified Bradley-Terry model:
224
+ * beta = sigma / 2 (dynamics factor)
225
+ * c = sqrt(2 * beta^2 + sigma^2) (normalization factor)
226
+ * K = sigma^2 / c (update magnitude — bigger when uncertain)
227
+ * mu_new = mu + K * outcome_factor
228
+ * sigma_new = sigma * sqrt(max(1 - sigma^2/c^2, epsilon))
229
+ *
230
+ * outcome_factor: win = +1, loss = -1, draw = 0
231
+ */
232
+ recordOutcome(agent, category, outcome) {
233
+ // Ensure agent entry exists
234
+ if (!this.ratings[agent]) {
235
+ this.ratings[agent] = { _overall: defaultRating() };
236
+ }
237
+ // Ensure category entry exists
238
+ if (!this.ratings[agent][category]) {
239
+ this.ratings[agent][category] = defaultRating();
240
+ }
241
+ // Update category-specific rating
242
+ this.updateRating(this.ratings[agent][category], outcome);
243
+ // Also update overall rating (with dampened effect)
244
+ if (!this.ratings[agent]._overall) {
245
+ this.ratings[agent]._overall = defaultRating();
246
+ }
247
+ this.updateRating(this.ratings[agent]._overall, outcome, 0.5);
248
+ this.dirty = true;
249
+ }
250
+ /**
251
+ * Core Bradley-Terry update step.
252
+ * @param rating The rating to mutate in place
253
+ * @param outcome The match outcome
254
+ * @param dampen Dampen the update (0-1), 1 = full update
255
+ */
256
+ updateRating(rating, outcome, dampen = 1.0) {
257
+ const outcomeFactor = outcome === 'win' ? 1 : outcome === 'loss' ? -1 : 0;
258
+ if (outcomeFactor === 0) {
259
+ // Draw: only reduce sigma slightly (we still learned something)
260
+ rating.sigma = Math.max(MIN_SIGMA, rating.sigma * 0.995);
261
+ return;
262
+ }
263
+ const beta = rating.sigma / 2;
264
+ const cSquared = 2 * beta * beta + rating.sigma * rating.sigma;
265
+ const c = Math.sqrt(cSquared);
266
+ // K factor — update magnitude, proportional to uncertainty
267
+ const K = (rating.sigma * rating.sigma) / c;
268
+ // Update mu
269
+ rating.mu += K * outcomeFactor * dampen;
270
+ // Reduce sigma — we're more certain after observing an outcome
271
+ // sigma_new = sigma * sqrt(1 - sigma^2/c^2)
272
+ const sigmaFactor = 1 - (rating.sigma * rating.sigma) / cSquared;
273
+ rating.sigma = Math.max(MIN_SIGMA, rating.sigma * Math.sqrt(Math.max(sigmaFactor, 0.01)));
274
+ }
275
+ // ── High-Level Routing ──
276
+ /**
277
+ * Get the best agent for a task based on Bayesian skill ratings.
278
+ *
279
+ * Returns null if all agents still have high uncertainty (not enough data).
280
+ * The confidence threshold ensures we only route when we have meaningful signal.
281
+ */
282
+ getAgentForTask(message) {
283
+ const category = this.categorizeMessage(message);
284
+ const ranked = this.getRankedAgents(category);
285
+ if (ranked.length === 0)
286
+ return null;
287
+ const top = ranked[0];
288
+ // Only route if confidence > 0.3 (sigma has decreased meaningfully)
289
+ if (top.confidence <= 0.3)
290
+ return null;
291
+ // Also check that the top agent is meaningfully better than the second
292
+ // (avoid routing when all agents are effectively tied)
293
+ if (ranked.length > 1) {
294
+ const topEst = this.conservativeEstimate(top.rating);
295
+ const secondEst = this.conservativeEstimate(ranked[1].rating);
296
+ // Require at least 1.0 point gap for meaningful differentiation
297
+ if (topEst - secondEst < 1.0)
298
+ return null;
299
+ }
300
+ return {
301
+ agent: top.agent,
302
+ confidence: top.confidence,
303
+ category,
304
+ };
305
+ }
306
+ // ── Stats ──
307
+ /**
308
+ * Get summary stats for each agent: their top category and confidence level.
309
+ */
310
+ getStats() {
311
+ const stats = {};
312
+ for (const agent of ALL_AGENTS) {
313
+ const agentRatings = this.ratings[agent];
314
+ if (!agentRatings)
315
+ continue;
316
+ let bestCategory = 'general';
317
+ let bestMu = INITIAL_MU;
318
+ let bestSigma = INITIAL_SIGMA;
319
+ for (const [cat, rating] of Object.entries(agentRatings)) {
320
+ if (cat === '_overall')
321
+ continue;
322
+ const r = rating;
323
+ if (r.mu > bestMu || (r.mu === bestMu && r.sigma < bestSigma)) {
324
+ bestMu = r.mu;
325
+ bestSigma = r.sigma;
326
+ bestCategory = cat;
327
+ }
328
+ }
329
+ const confidence = 1 - (bestSigma / INITIAL_SIGMA);
330
+ stats[agent] = {
331
+ topCategory: bestCategory,
332
+ confidence: Math.max(0, confidence),
333
+ };
334
+ }
335
+ return stats;
336
+ }
337
+ /**
338
+ * Get raw ratings for an agent (for debugging/display).
339
+ */
340
+ getAgentRatings(agent) {
341
+ return this.ratings[agent] || null;
342
+ }
343
+ }
344
+ // ── Singleton ──
345
+ let _instance = null;
346
+ export function getSkillRatingSystem() {
347
+ if (!_instance) {
348
+ _instance = new SkillRatingSystem();
349
+ }
350
+ return _instance;
351
+ }
352
+ //# sourceMappingURL=skill-rating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-rating.js","sourceRoot":"","sources":["../src/skill-rating.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,7 @@ export declare function streamAnthropicResponse(apiKey: string, apiUrl: string,
67
67
  }>, options?: {
68
68
  thinking?: boolean;
69
69
  thinkingBudget?: number;
70
+ responseStream?: ResponseStream;
70
71
  }): Promise<StreamState>;
71
72
  /**
72
73
  * Stream a response from OpenAI-compatible APIs.
@@ -79,7 +80,80 @@ export declare function streamOpenAIResponse(apiKey: string, apiUrl: string, mod
79
80
  name: string;
80
81
  description: string;
81
82
  input_schema: Record<string, unknown>;
82
- }>): Promise<StreamState>;
83
+ }>, options?: {
84
+ responseStream?: ResponseStream;
85
+ }): Promise<StreamState>;
86
+ export type ResponseStreamEvent = {
87
+ type: 'thinking_start';
88
+ } | {
89
+ type: 'thinking_delta';
90
+ text: string;
91
+ } | {
92
+ type: 'thinking_end';
93
+ } | {
94
+ type: 'content_delta';
95
+ text: string;
96
+ } | {
97
+ type: 'content_end';
98
+ } | {
99
+ type: 'tool_call_start';
100
+ id: string;
101
+ name: string;
102
+ } | {
103
+ type: 'tool_call_delta';
104
+ id: string;
105
+ json: string;
106
+ } | {
107
+ type: 'tool_call_end';
108
+ id: string;
109
+ name: string;
110
+ } | {
111
+ type: 'tool_result';
112
+ id: string;
113
+ name: string;
114
+ result: string;
115
+ error?: string;
116
+ } | {
117
+ type: 'usage';
118
+ inputTokens: number;
119
+ outputTokens: number;
120
+ } | {
121
+ type: 'error';
122
+ message: string;
123
+ code?: string;
124
+ } | {
125
+ type: 'done';
126
+ content: string;
127
+ thinking?: string;
128
+ };
129
+ export type ResponseStreamListener = (event: ResponseStreamEvent) => void;
130
+ export declare class ResponseStream {
131
+ private listeners;
132
+ private _content;
133
+ private _thinking;
134
+ private _toolCalls;
135
+ private _usage;
136
+ private _done;
137
+ /** Subscribe to events. Returns an unsubscribe function. */
138
+ on(listener: ResponseStreamListener): () => void;
139
+ /** Emit an event to all listeners, tracking accumulated state. */
140
+ emit(event: ResponseStreamEvent): void;
141
+ get content(): string;
142
+ get thinking(): string;
143
+ get usage(): {
144
+ inputTokens: number;
145
+ outputTokens: number;
146
+ };
147
+ get isDone(): boolean;
148
+ /** Async iterator for SDK consumers: `for await (const event of stream) { ... }` */
149
+ [Symbol.asyncIterator](): AsyncGenerator<ResponseStreamEvent>;
150
+ /** Create terminal listener (writes to stdout/stderr like current behavior) */
151
+ static createTerminalListener(): ResponseStreamListener;
152
+ /** Create SSE listener (for HTTP serve mode) */
153
+ static createSSEListener(res: {
154
+ write: (data: string) => void;
155
+ }): ResponseStreamListener;
156
+ }
83
157
  /**
84
158
  * Format thinking text for display (summarized).
85
159
  * Used when showing thinking after the fact rather than streaming.
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}