@kilnai/core 0.1.15 → 0.9.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 (211) hide show
  1. package/dist/agents/agent-rag.d.ts +21 -0
  2. package/dist/agents/agent-rag.d.ts.map +1 -0
  3. package/dist/agents/agent-rag.js +79 -0
  4. package/dist/agents/agent-rag.js.map +1 -0
  5. package/dist/agents/complexity-scorer.d.ts +8 -0
  6. package/dist/agents/complexity-scorer.d.ts.map +1 -0
  7. package/dist/agents/complexity-scorer.js +58 -0
  8. package/dist/agents/complexity-scorer.js.map +1 -0
  9. package/dist/agents/index.d.ts +14 -0
  10. package/dist/agents/index.d.ts.map +1 -1
  11. package/dist/agents/index.js +9 -0
  12. package/dist/agents/index.js.map +1 -1
  13. package/dist/agents/infrastructure/deepgram-stt.d.ts +15 -0
  14. package/dist/agents/infrastructure/deepgram-stt.d.ts.map +1 -0
  15. package/dist/agents/infrastructure/deepgram-stt.js +56 -0
  16. package/dist/agents/infrastructure/deepgram-stt.js.map +1 -0
  17. package/dist/agents/infrastructure/openai-stt.d.ts +15 -0
  18. package/dist/agents/infrastructure/openai-stt.d.ts.map +1 -0
  19. package/dist/agents/infrastructure/openai-stt.js +65 -0
  20. package/dist/agents/infrastructure/openai-stt.js.map +1 -0
  21. package/dist/agents/mcp-client.d.ts +4 -0
  22. package/dist/agents/mcp-client.d.ts.map +1 -1
  23. package/dist/agents/mcp-client.js +15 -2
  24. package/dist/agents/mcp-client.js.map +1 -1
  25. package/dist/agents/model-capability-registry.d.ts +13 -0
  26. package/dist/agents/model-capability-registry.d.ts.map +1 -0
  27. package/dist/agents/model-capability-registry.js +64 -0
  28. package/dist/agents/model-capability-registry.js.map +1 -0
  29. package/dist/agents/rules-router.d.ts +14 -0
  30. package/dist/agents/rules-router.d.ts.map +1 -0
  31. package/dist/agents/rules-router.js +59 -0
  32. package/dist/agents/rules-router.js.map +1 -0
  33. package/dist/agents/sliding-window-rate-limiter.d.ts +11 -0
  34. package/dist/agents/sliding-window-rate-limiter.d.ts.map +1 -0
  35. package/dist/agents/sliding-window-rate-limiter.js +56 -0
  36. package/dist/agents/sliding-window-rate-limiter.js.map +1 -0
  37. package/dist/agents/tool-error-classifier.d.ts +4 -0
  38. package/dist/agents/tool-error-classifier.d.ts.map +1 -0
  39. package/dist/agents/tool-error-classifier.js +32 -0
  40. package/dist/agents/tool-error-classifier.js.map +1 -0
  41. package/dist/agents/tool-execution-engine.d.ts +4 -0
  42. package/dist/agents/tool-execution-engine.d.ts.map +1 -0
  43. package/dist/agents/tool-execution-engine.js +100 -0
  44. package/dist/agents/tool-execution-engine.js.map +1 -0
  45. package/dist/cost/cost-tracker.d.ts +12 -2
  46. package/dist/cost/cost-tracker.d.ts.map +1 -1
  47. package/dist/cost/cost-tracker.js +73 -13
  48. package/dist/cost/cost-tracker.js.map +1 -1
  49. package/dist/cost/index.d.ts +11 -1
  50. package/dist/cost/index.d.ts.map +1 -1
  51. package/dist/cost/index.js +1 -1
  52. package/dist/cost/index.js.map +1 -1
  53. package/dist/domains/routing-templates.d.ts +12 -0
  54. package/dist/domains/routing-templates.d.ts.map +1 -0
  55. package/dist/domains/routing-templates.js +109 -0
  56. package/dist/domains/routing-templates.js.map +1 -0
  57. package/dist/engine/domain/capability.d.ts +2 -0
  58. package/dist/engine/domain/capability.d.ts.map +1 -1
  59. package/dist/engine/domain/chunker.d.ts +4 -0
  60. package/dist/engine/domain/chunker.d.ts.map +1 -1
  61. package/dist/engine/domain/contact-memory.d.ts +30 -0
  62. package/dist/engine/domain/contact-memory.d.ts.map +1 -0
  63. package/dist/engine/domain/contact-memory.js +4 -0
  64. package/dist/engine/domain/contact-memory.js.map +1 -0
  65. package/dist/engine/domain/knowledge-config.d.ts +26 -1
  66. package/dist/engine/domain/knowledge-config.d.ts.map +1 -1
  67. package/dist/engine/domain/knowledge-config.js +41 -3
  68. package/dist/engine/domain/knowledge-config.js.map +1 -1
  69. package/dist/engine/domain/knowledge-source.d.ts +31 -0
  70. package/dist/engine/domain/knowledge-source.d.ts.map +1 -0
  71. package/dist/engine/domain/knowledge-source.js +3 -0
  72. package/dist/engine/domain/knowledge-source.js.map +1 -0
  73. package/dist/engine/domain/model-router.d.ts +87 -0
  74. package/dist/engine/domain/model-router.d.ts.map +1 -0
  75. package/dist/engine/domain/model-router.js +4 -0
  76. package/dist/engine/domain/model-router.js.map +1 -0
  77. package/dist/engine/domain/rate-limiter.d.ts +15 -0
  78. package/dist/engine/domain/rate-limiter.d.ts.map +1 -0
  79. package/dist/engine/domain/rate-limiter.js +3 -0
  80. package/dist/engine/domain/rate-limiter.js.map +1 -0
  81. package/dist/engine/domain/tool-execution.d.ts +33 -0
  82. package/dist/engine/domain/tool-execution.d.ts.map +1 -0
  83. package/dist/engine/domain/tool-execution.js +3 -0
  84. package/dist/engine/domain/tool-execution.js.map +1 -0
  85. package/dist/engine/domain/vector-store.d.ts +1 -0
  86. package/dist/engine/domain/vector-store.d.ts.map +1 -1
  87. package/dist/engine/error-catalog.d.ts.map +1 -1
  88. package/dist/engine/error-catalog.js +110 -0
  89. package/dist/engine/error-catalog.js.map +1 -1
  90. package/dist/engine/errors.d.ts +1 -1
  91. package/dist/engine/errors.d.ts.map +1 -1
  92. package/dist/engine/errors.js.map +1 -1
  93. package/dist/engine/gateway/conversation-event.d.ts +69 -1
  94. package/dist/engine/gateway/conversation-event.d.ts.map +1 -1
  95. package/dist/engine/gateway/events-config.d.ts +4 -0
  96. package/dist/engine/gateway/events-config.d.ts.map +1 -1
  97. package/dist/engine/gateway/tenant-config.d.ts +65 -0
  98. package/dist/engine/gateway/tenant-config.d.ts.map +1 -1
  99. package/dist/engine/gateway/tenant-config.js +181 -0
  100. package/dist/engine/gateway/tenant-config.js.map +1 -1
  101. package/dist/engine/index.d.ts +6 -2
  102. package/dist/engine/index.d.ts.map +1 -1
  103. package/dist/engine/index.js.map +1 -1
  104. package/dist/engine/loader/app-loader.d.ts.map +1 -1
  105. package/dist/engine/loader/app-loader.js +41 -0
  106. package/dist/engine/loader/app-loader.js.map +1 -1
  107. package/dist/enrichment/effort-score.d.ts +7 -0
  108. package/dist/enrichment/effort-score.d.ts.map +1 -0
  109. package/dist/enrichment/effort-score.js +15 -0
  110. package/dist/enrichment/effort-score.js.map +1 -0
  111. package/dist/enrichment/enrichment-pipeline.d.ts +13 -0
  112. package/dist/enrichment/enrichment-pipeline.d.ts.map +1 -0
  113. package/dist/enrichment/enrichment-pipeline.js +191 -0
  114. package/dist/enrichment/enrichment-pipeline.js.map +1 -0
  115. package/dist/enrichment/index.d.ts +4 -0
  116. package/dist/enrichment/index.d.ts.map +1 -0
  117. package/dist/enrichment/index.js +3 -0
  118. package/dist/enrichment/index.js.map +1 -0
  119. package/dist/enrichment/types.d.ts +105 -0
  120. package/dist/enrichment/types.d.ts.map +1 -0
  121. package/dist/enrichment/types.js +3 -0
  122. package/dist/enrichment/types.js.map +1 -0
  123. package/dist/events/index.d.ts +71 -1
  124. package/dist/events/index.d.ts.map +1 -1
  125. package/dist/events/index.js +10 -0
  126. package/dist/events/index.js.map +1 -1
  127. package/dist/index.d.ts +18 -1
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +6 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/knowledge/contact-memory.d.ts +26 -0
  132. package/dist/knowledge/contact-memory.d.ts.map +1 -0
  133. package/dist/knowledge/contact-memory.js +235 -0
  134. package/dist/knowledge/contact-memory.js.map +1 -0
  135. package/dist/knowledge/contextual-enricher.d.ts +16 -0
  136. package/dist/knowledge/contextual-enricher.d.ts.map +1 -0
  137. package/dist/knowledge/contextual-enricher.js +82 -0
  138. package/dist/knowledge/contextual-enricher.js.map +1 -0
  139. package/dist/knowledge/index.d.ts +16 -0
  140. package/dist/knowledge/index.d.ts.map +1 -1
  141. package/dist/knowledge/index.js +13 -0
  142. package/dist/knowledge/index.js.map +1 -1
  143. package/dist/knowledge/infrastructure/cohere-reranker.d.ts +13 -0
  144. package/dist/knowledge/infrastructure/cohere-reranker.d.ts.map +1 -0
  145. package/dist/knowledge/infrastructure/cohere-reranker.js +61 -0
  146. package/dist/knowledge/infrastructure/cohere-reranker.js.map +1 -0
  147. package/dist/knowledge/infrastructure/composite-extractor.d.ts +8 -0
  148. package/dist/knowledge/infrastructure/composite-extractor.d.ts.map +1 -0
  149. package/dist/knowledge/infrastructure/composite-extractor.js +26 -0
  150. package/dist/knowledge/infrastructure/composite-extractor.js.map +1 -0
  151. package/dist/knowledge/infrastructure/file-extractor.d.ts +6 -0
  152. package/dist/knowledge/infrastructure/file-extractor.d.ts.map +1 -0
  153. package/dist/knowledge/infrastructure/file-extractor.js +19 -0
  154. package/dist/knowledge/infrastructure/file-extractor.js.map +1 -0
  155. package/dist/knowledge/infrastructure/json-source-store.d.ts +14 -0
  156. package/dist/knowledge/infrastructure/json-source-store.d.ts.map +1 -0
  157. package/dist/knowledge/infrastructure/json-source-store.js +56 -0
  158. package/dist/knowledge/infrastructure/json-source-store.js.map +1 -0
  159. package/dist/knowledge/infrastructure/memory-source-store.d.ts +10 -0
  160. package/dist/knowledge/infrastructure/memory-source-store.d.ts.map +1 -0
  161. package/dist/knowledge/infrastructure/memory-source-store.js +26 -0
  162. package/dist/knowledge/infrastructure/memory-source-store.js.map +1 -0
  163. package/dist/knowledge/infrastructure/memory-vector-store.d.ts +1 -0
  164. package/dist/knowledge/infrastructure/memory-vector-store.d.ts.map +1 -1
  165. package/dist/knowledge/infrastructure/memory-vector-store.js +10 -0
  166. package/dist/knowledge/infrastructure/memory-vector-store.js.map +1 -1
  167. package/dist/knowledge/infrastructure/pdf-extractor.d.ts +6 -0
  168. package/dist/knowledge/infrastructure/pdf-extractor.d.ts.map +1 -0
  169. package/dist/knowledge/infrastructure/pdf-extractor.js +46 -0
  170. package/dist/knowledge/infrastructure/pdf-extractor.js.map +1 -0
  171. package/dist/knowledge/infrastructure/pgvector-store.d.ts +29 -0
  172. package/dist/knowledge/infrastructure/pgvector-store.d.ts.map +1 -0
  173. package/dist/knowledge/infrastructure/pgvector-store.js +141 -0
  174. package/dist/knowledge/infrastructure/pgvector-store.js.map +1 -0
  175. package/dist/knowledge/infrastructure/url-extractor.d.ts +6 -0
  176. package/dist/knowledge/infrastructure/url-extractor.d.ts.map +1 -0
  177. package/dist/knowledge/infrastructure/url-extractor.js +71 -0
  178. package/dist/knowledge/infrastructure/url-extractor.js.map +1 -0
  179. package/dist/knowledge/retrieval-pipeline.d.ts +8 -1
  180. package/dist/knowledge/retrieval-pipeline.d.ts.map +1 -1
  181. package/dist/knowledge/retrieval-pipeline.js +28 -2
  182. package/dist/knowledge/retrieval-pipeline.js.map +1 -1
  183. package/dist/knowledge/source-manager.d.ts +29 -0
  184. package/dist/knowledge/source-manager.d.ts.map +1 -0
  185. package/dist/knowledge/source-manager.js +124 -0
  186. package/dist/knowledge/source-manager.js.map +1 -0
  187. package/dist/observability/span-mapper.d.ts.map +1 -1
  188. package/dist/observability/span-mapper.js +104 -0
  189. package/dist/observability/span-mapper.js.map +1 -1
  190. package/dist/safety/index.d.ts +2 -0
  191. package/dist/safety/index.d.ts.map +1 -1
  192. package/dist/safety/index.js +2 -0
  193. package/dist/safety/index.js.map +1 -1
  194. package/dist/safety/pii-scanner.d.ts.map +1 -1
  195. package/dist/safety/pii-scanner.js +18 -0
  196. package/dist/safety/pii-scanner.js.map +1 -1
  197. package/dist/safety/tool-result-sanitizer.d.ts +21 -0
  198. package/dist/safety/tool-result-sanitizer.d.ts.map +1 -0
  199. package/dist/safety/tool-result-sanitizer.js +68 -0
  200. package/dist/safety/tool-result-sanitizer.js.map +1 -0
  201. package/dist/security/annotation-authorizer.d.ts +13 -0
  202. package/dist/security/annotation-authorizer.d.ts.map +1 -0
  203. package/dist/security/annotation-authorizer.js +37 -0
  204. package/dist/security/annotation-authorizer.js.map +1 -0
  205. package/dist/security/index.d.ts +2 -0
  206. package/dist/security/index.d.ts.map +1 -1
  207. package/dist/security/index.js +1 -0
  208. package/dist/security/index.js.map +1 -1
  209. package/dist/security/types.d.ts +2 -2
  210. package/dist/security/types.d.ts.map +1 -1
  211. package/package.json +10 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-router.d.ts","sourceRoot":"","sources":["../../src/agents/rules-router.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAClH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwD;IACtF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;gBAGjD,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,aAAa,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EACpE,QAAQ,EAAE,uBAAuB;IAOnC,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe;IAgC/C,OAAO,CAAC,iBAAiB;CAkB1B"}
@@ -0,0 +1,59 @@
1
+ // Rules-based model router: evaluates conditions in priority order, returns first match
2
+ // Validates target model capabilities before selecting
3
+ export class RulesRouter {
4
+ rules;
5
+ defaultTarget;
6
+ registry;
7
+ constructor(rules, defaultTarget, registry) {
8
+ this.rules = [...rules].sort((a, b) => a.priority - b.priority);
9
+ this.defaultTarget = defaultTarget;
10
+ this.registry = registry;
11
+ }
12
+ route(request) {
13
+ for (const rule of this.rules) {
14
+ if (this.evaluateCondition(rule.condition, request)) {
15
+ // Validate target model has required capabilities
16
+ const profile = this.registry.get(rule.target.model);
17
+ if (profile &&
18
+ (!request.hasTools || profile.supportsTools) &&
19
+ (!request.requiresStreaming || profile.supportsStreaming)) {
20
+ return {
21
+ provider: rule.target.provider,
22
+ model: rule.target.model,
23
+ reasoning: `Rule "${rule.name}" matched`,
24
+ confidence: 1.0,
25
+ routingTier: "rule",
26
+ estimatedCostUsd: undefined,
27
+ };
28
+ }
29
+ // Skip rule if target model doesn't support required capabilities
30
+ }
31
+ }
32
+ return {
33
+ provider: this.defaultTarget.provider,
34
+ model: this.defaultTarget.model,
35
+ reasoning: "No rules matched, using default",
36
+ confidence: 1.0,
37
+ routingTier: "default",
38
+ };
39
+ }
40
+ evaluateCondition(condition, request) {
41
+ switch (condition.type) {
42
+ case "has_tools":
43
+ return request.hasTools;
44
+ case "complexity_above":
45
+ return request.complexity.score > condition.threshold;
46
+ case "complexity_below":
47
+ return request.complexity.score < condition.threshold;
48
+ case "budget_below_cents":
49
+ return request.budgetRemainingCents !== undefined && request.budgetRemainingCents < condition.cents;
50
+ case "agent_tier":
51
+ return request.agentTier === condition.tier;
52
+ case "agent_id":
53
+ return request.agentId === condition.agentId;
54
+ case "always":
55
+ return true;
56
+ }
57
+ }
58
+ }
59
+ //# sourceMappingURL=rules-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-router.js","sourceRoot":"","sources":["../../src/agents/rules-router.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,uDAAuD;AAKvD,MAAM,OAAO,WAAW;IACL,KAAK,CAAyB;IAC9B,aAAa,CAAwD;IACrE,QAAQ,CAA0B;IAEnD,YACE,KAA6B,EAC7B,aAAoE,EACpE,QAAiC;QAEjC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAuB;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;gBACpD,kDAAkD;gBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrD,IACE,OAAO;oBACP,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;oBAC5C,CAAC,CAAC,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,EACzD,CAAC;oBACD,OAAO;wBACL,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;wBAC9B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;wBACxB,SAAS,EAAE,SAAS,IAAI,CAAC,IAAI,WAAW;wBACxC,UAAU,EAAE,GAAG;wBACf,WAAW,EAAE,MAAM;wBACnB,gBAAgB,EAAE,SAAS;qBAC5B,CAAC;gBACJ,CAAC;gBACD,kEAAkE;YACpE,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ;YACrC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;YAC/B,SAAS,EAAE,iCAAiC;YAC5C,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,SAAS;SACvB,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,SAAmC,EAAE,OAAuB;QACpF,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,WAAW;gBACd,OAAO,OAAO,CAAC,QAAQ,CAAC;YAC1B,KAAK,kBAAkB;gBACrB,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC;YACxD,KAAK,kBAAkB;gBACrB,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC;YACxD,KAAK,oBAAoB;gBACvB,OAAO,OAAO,CAAC,oBAAoB,KAAK,SAAS,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,KAAK,CAAC;YACtG,KAAK,YAAY;gBACf,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,CAAC;YAC9C,KAAK,UAAU;gBACb,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,CAAC;YAC/C,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { RateLimiter, RateLimitConfig, RateLimitResult } from "../engine/domain/rate-limiter.js";
2
+ export declare class SlidingWindowRateLimiter implements RateLimiter {
3
+ private readonly windows;
4
+ private readonly config;
5
+ constructor(config: RateLimitConfig);
6
+ check(tenantId: string, toolName: string): RateLimitResult;
7
+ record(tenantId: string, toolName: string): void;
8
+ reset(tenantId: string): void;
9
+ private prune;
10
+ }
11
+ //# sourceMappingURL=sliding-window-rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sliding-window-rate-limiter.d.ts","sourceRoot":"","sources":["../../src/agents/sliding-window-rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAItG,qBAAa,wBAAyB,YAAW,WAAW;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,eAAe;IAInC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe;IAqB1D,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUhD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS7B,OAAO,CAAC,KAAK;CAYd"}
@@ -0,0 +1,56 @@
1
+ const WINDOW_MS = 60_000;
2
+ export class SlidingWindowRateLimiter {
3
+ windows = new Map();
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ check(tenantId, toolName) {
9
+ const key = `${tenantId}:${toolName}`;
10
+ const now = Date.now();
11
+ const cutoff = now - WINDOW_MS;
12
+ const timestamps = this.prune(key, cutoff);
13
+ const limit = this.config.perTool?.[toolName] ?? this.config.defaultPerMinute;
14
+ const count = timestamps.length;
15
+ if (count >= limit) {
16
+ const oldest = timestamps[0];
17
+ return {
18
+ allowed: false,
19
+ remaining: 0,
20
+ retryAfterMs: oldest + WINDOW_MS - now,
21
+ };
22
+ }
23
+ return { allowed: true, remaining: limit - count };
24
+ }
25
+ record(tenantId, toolName) {
26
+ const key = `${tenantId}:${toolName}`;
27
+ let timestamps = this.windows.get(key);
28
+ if (!timestamps) {
29
+ timestamps = [];
30
+ this.windows.set(key, timestamps);
31
+ }
32
+ timestamps.push(Date.now());
33
+ }
34
+ reset(tenantId) {
35
+ const prefix = `${tenantId}:`;
36
+ for (const key of this.windows.keys()) {
37
+ if (key.startsWith(prefix)) {
38
+ this.windows.delete(key);
39
+ }
40
+ }
41
+ }
42
+ prune(key, cutoff) {
43
+ const timestamps = this.windows.get(key);
44
+ if (!timestamps)
45
+ return [];
46
+ const pruned = timestamps.filter((t) => t > cutoff);
47
+ if (pruned.length === 0) {
48
+ this.windows.delete(key);
49
+ }
50
+ else {
51
+ this.windows.set(key, pruned);
52
+ }
53
+ return pruned;
54
+ }
55
+ }
56
+ //# sourceMappingURL=sliding-window-rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sliding-window-rate-limiter.js","sourceRoot":"","sources":["../../src/agents/sliding-window-rate-limiter.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,MAAM,OAAO,wBAAwB;IAClB,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IACtC,MAAM,CAAkB;IAEzC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,QAAgB;QACtC,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC;QAE/B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC9E,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;QAEhC,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG;aACvC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,QAAgB,EAAE,QAAgB;QACvC,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;QACtC,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACpC,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,MAAM,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,GAAW,EAAE,MAAc;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { ToolErrorType } from "../engine/domain/tool-execution.js";
2
+ /** Classify a tool execution error as validation, transient, or fatal */
3
+ export declare function classifyToolError(error: unknown): ToolErrorType;
4
+ //# sourceMappingURL=tool-error-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-error-classifier.d.ts","sourceRoot":"","sources":["../../src/agents/tool-error-classifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAExE,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAmC/D"}
@@ -0,0 +1,32 @@
1
+ // Tool error classifier: categorizes tool execution errors for retry decisions
2
+ /** Classify a tool execution error as validation, transient, or fatal */
3
+ export function classifyToolError(error) {
4
+ if (!(error instanceof Error))
5
+ return "fatal";
6
+ const message = error.message.toLowerCase();
7
+ // Check for HTTP status codes or known validation patterns
8
+ if (message.includes("400") ||
9
+ message.includes("422") ||
10
+ message.includes("validation") ||
11
+ message.includes("invalid") ||
12
+ message.includes("bad request") ||
13
+ message.includes("schema")) {
14
+ return "validation";
15
+ }
16
+ // Check for transient/retryable patterns
17
+ if (message.includes("429") ||
18
+ message.includes("502") ||
19
+ message.includes("503") ||
20
+ message.includes("504") ||
21
+ message.includes("timeout") ||
22
+ message.includes("rate limit") ||
23
+ message.includes("econnreset") ||
24
+ message.includes("econnrefused") ||
25
+ message.includes("service unavailable") ||
26
+ message.includes("gateway timeout") ||
27
+ message.includes("too many requests")) {
28
+ return "transient";
29
+ }
30
+ return "fatal";
31
+ }
32
+ //# sourceMappingURL=tool-error-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-error-classifier.js","sourceRoot":"","sources":["../../src/agents/tool-error-classifier.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAI/E,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAE9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAE5C,2DAA2D;IAC3D,IACE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC1B,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,yCAAyC;IACzC,IACE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAChC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACrC,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RetryConfig, ToolExecutionResult } from "../engine/domain/tool-execution.js";
2
+ export type ToolExecutor = (toolName: string, input: Record<string, unknown>) => Promise<unknown>;
3
+ export declare function executeWithRetry(toolName: string, input: Record<string, unknown>, executor: ToolExecutor, retryConfig?: RetryConfig, fallbackExecutor?: ToolExecutor): Promise<ToolExecutionResult>;
4
+ //# sourceMappingURL=tool-execution-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-execution-engine.d.ts","sourceRoot":"","sources":["../../src/agents/tool-execution-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAQ3F,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAElG,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,EAAE,YAAY,EACtB,WAAW,CAAC,EAAE,WAAW,EACzB,gBAAgB,CAAC,EAAE,YAAY,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA6E9B"}
@@ -0,0 +1,100 @@
1
+ // Tool execution engine: retry, timeout, fallback wrapper for tool calls
2
+ import { KilnError } from "../engine/errors.js";
3
+ import { classifyToolError } from "./tool-error-classifier.js";
4
+ const DEFAULT_MAX_ATTEMPTS = 3;
5
+ const DEFAULT_TIMEOUT_MS = 30_000;
6
+ const MAX_BACKOFF_MS = 10_000;
7
+ export async function executeWithRetry(toolName, input, executor, retryConfig, fallbackExecutor) {
8
+ const maxAttempts = retryConfig?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
9
+ const timeoutMs = retryConfig?.timeout ? retryConfig.timeout * 1000 : DEFAULT_TIMEOUT_MS;
10
+ const startMs = Date.now();
11
+ let lastError;
12
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
13
+ try {
14
+ const result = await executeWithTimeout(executor, toolName, input, timeoutMs);
15
+ return {
16
+ result,
17
+ attempts: attempt,
18
+ durationMs: Date.now() - startMs,
19
+ fallbackUsed: false,
20
+ };
21
+ }
22
+ catch (err) {
23
+ lastError = err;
24
+ // Timeout errors: propagate directly (don't classify as transient for retry)
25
+ if (err instanceof KilnError && err.code === "TOOL_EXECUTION_TIMEOUT") {
26
+ break;
27
+ }
28
+ const errorType = classifyToolError(err);
29
+ // mutate_params strategy: re-throw immediately to let LLM correct input
30
+ if (errorType === "validation" && retryConfig?.onValidationError === "mutate_params") {
31
+ throw err;
32
+ }
33
+ // Fatal errors: no retry
34
+ if (errorType === "fatal")
35
+ break;
36
+ // Last attempt: break to try fallback
37
+ if (attempt === maxAttempts)
38
+ break;
39
+ // Determine if we should retry based on error type and config
40
+ const strategy = errorType === "validation"
41
+ ? retryConfig?.onValidationError
42
+ : retryConfig?.onTransientError;
43
+ if (!strategy || strategy === "mutate_params") {
44
+ // mutate_params for transient doesn't make sense, re-throw
45
+ throw err;
46
+ }
47
+ // Exponential backoff
48
+ const backoffMs = Math.min(1000 * Math.pow(2, attempt - 1), MAX_BACKOFF_MS);
49
+ await sleep(backoffMs);
50
+ }
51
+ }
52
+ // Propagate timeout errors directly
53
+ if (lastError instanceof KilnError && lastError.code === "TOOL_EXECUTION_TIMEOUT") {
54
+ throw lastError;
55
+ }
56
+ // All retries exhausted -- try fallback if configured
57
+ if (retryConfig?.fallback && fallbackExecutor) {
58
+ try {
59
+ const result = await executeWithTimeout(fallbackExecutor, retryConfig.fallback, input, timeoutMs);
60
+ return {
61
+ result,
62
+ attempts: maxAttempts,
63
+ durationMs: Date.now() - startMs,
64
+ fallbackUsed: true,
65
+ };
66
+ }
67
+ catch {
68
+ // Fallback also failed
69
+ }
70
+ }
71
+ throw new KilnError("TOOL_RETRY_EXHAUSTED", `Tool "${toolName}" failed after ${maxAttempts} attempts`, {
72
+ context: { toolName, attempts: maxAttempts },
73
+ retryable: false,
74
+ });
75
+ }
76
+ async function executeWithTimeout(executor, toolName, input, timeoutMs) {
77
+ const controller = new AbortController();
78
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
79
+ try {
80
+ const result = await Promise.race([
81
+ executor(toolName, input),
82
+ new Promise((_, reject) => {
83
+ controller.signal.addEventListener("abort", () => {
84
+ reject(new KilnError("TOOL_EXECUTION_TIMEOUT", `Tool "${toolName}" timed out after ${timeoutMs}ms`, {
85
+ context: { toolName, timeoutMs },
86
+ retryable: true,
87
+ }));
88
+ });
89
+ }),
90
+ ]);
91
+ return result;
92
+ }
93
+ finally {
94
+ clearTimeout(timer);
95
+ }
96
+ }
97
+ function sleep(ms) {
98
+ return new Promise((resolve) => setTimeout(resolve, ms));
99
+ }
100
+ //# sourceMappingURL=tool-execution-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-execution-engine.js","sourceRoot":"","sources":["../../src/agents/tool-execution-engine.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,11 @@
1
1
  import type { AgentRole } from "../agents/index.js";
2
- import type { ModelPricing, CostSummary } from "./index.js";
2
+ import type { ModelPricing, CostSummary, SttPricing, EmbeddingPricing } from "./index.js";
3
3
  /** Unified pricing derived from MODEL_CATALOG (single source of truth) */
4
4
  export declare const MODEL_PRICING: ReadonlyMap<string, ModelPricing>;
5
+ /** STT pricing: rate per minute of audio */
6
+ export declare const STT_PRICING: ReadonlyMap<string, SttPricing>;
7
+ /** Embedding pricing: rate per million tokens */
8
+ export declare const EMBEDDING_PRICING: ReadonlyMap<string, EmbeddingPricing>;
5
9
  interface TokenUsage {
6
10
  readonly inputTokens: number;
7
11
  readonly outputTokens: number;
@@ -13,9 +17,15 @@ interface TokenUsage {
13
17
  * Subscribes to EventBus cost_update events for automatic tracking.
14
18
  */
15
19
  export declare class CostTracker {
16
- private readonly usageByRole;
20
+ private readonly usageByRoleModel;
21
+ private embeddingCostUsd;
22
+ private sttCostUsd;
17
23
  /** Record token usage for a specific role and model */
18
24
  record(role: AgentRole, model: string, usage: TokenUsage): void;
25
+ /** Record embedding cost for a specific model */
26
+ recordEmbedding(model: string, tokens: number): void;
27
+ /** Record STT cost for a specific model */
28
+ recordStt(model: string, durationSeconds: number): void;
19
29
  /** Compute USD cost for a specific role */
20
30
  costForRole(role: AgentRole): number;
21
31
  /** Get full cost summary with totals and per-role breakdown */
@@ -1 +1 @@
1
- {"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAa,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOvE,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAS3D,CAAC;AAEF,UAAU,UAAU;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAaD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAEtE,uDAAuD;IACvD,MAAM,CACJ,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,GAChB,IAAI;IAsBP,2CAA2C;IAC3C,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAMpC,+DAA+D;IAC/D,IAAI,OAAO,IAAI,WAAW,CAuCzB;IAED,kCAAkC;IAClC,KAAK,IAAI,IAAI;CAGd"}
1
+ {"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAa,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOrG,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAS3D,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAGtD,CAAC;AAEH,iDAAiD;AACjD,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAGlE,CAAC;AAEH,UAAU,UAAU;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAaD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuC;IACxE,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,UAAU,CAAK;IAEvB,uDAAuD;IACvD,MAAM,CACJ,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,UAAU,GAChB,IAAI;IAsBP,iDAAiD;IACjD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMpD,2CAA2C;IAC3C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAMvD,2CAA2C;IAC3C,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAUpC,+DAA+D;IAC/D,IAAI,OAAO,IAAI,WAAW,CAqEzB;IAED,kCAAkC;IAClC,KAAK,IAAI,IAAI;CAKd"}
@@ -11,15 +11,28 @@ export const MODEL_PRICING = new Map(MODEL_CATALOG.map((entry) => [
11
11
  ...(entry.provider === "anthropic" ? ANTHROPIC_CACHE : NO_CACHE),
12
12
  },
13
13
  ]));
14
+ /** STT pricing: rate per minute of audio */
15
+ export const STT_PRICING = new Map([
16
+ ["gpt-4o-transcribe", { ratePerMinute: 0.006 }],
17
+ ["nova-3", { ratePerMinute: 0.0043 }],
18
+ ]);
19
+ /** Embedding pricing: rate per million tokens */
20
+ export const EMBEDDING_PRICING = new Map([
21
+ ["text-embedding-3-small", { ratePerMToken: 0.02 }],
22
+ ["text-embedding-3-large", { ratePerMToken: 0.13 }],
23
+ ]);
14
24
  /**
15
25
  * Tracks token usage and computes costs per role with cache-aware pricing.
16
26
  * Subscribes to EventBus cost_update events for automatic tracking.
17
27
  */
18
28
  export class CostTracker {
19
- usageByRole = new Map();
29
+ usageByRoleModel = new Map();
30
+ embeddingCostUsd = 0;
31
+ sttCostUsd = 0;
20
32
  /** Record token usage for a specific role and model */
21
33
  record(role, model, usage) {
22
- let entry = this.usageByRole.get(role);
34
+ const key = `${role}:${model}`;
35
+ let entry = this.usageByRoleModel.get(key);
23
36
  if (!entry) {
24
37
  entry = {
25
38
  role,
@@ -30,21 +43,37 @@ export class CostTracker {
30
43
  cacheWriteTokens: 0,
31
44
  calls: 0,
32
45
  };
33
- this.usageByRole.set(role, entry);
46
+ this.usageByRoleModel.set(key, entry);
34
47
  }
35
- entry.model = model;
36
48
  entry.inputTokens += usage.inputTokens;
37
49
  entry.outputTokens += usage.outputTokens;
38
50
  entry.cacheReadTokens += usage.cacheReadTokens;
39
51
  entry.cacheWriteTokens += usage.cacheWriteTokens;
40
52
  entry.calls += 1;
41
53
  }
54
+ /** Record embedding cost for a specific model */
55
+ recordEmbedding(model, tokens) {
56
+ const pricing = EMBEDDING_PRICING.get(model);
57
+ if (!pricing)
58
+ return;
59
+ this.embeddingCostUsd += (tokens * pricing.ratePerMToken) / 1_000_000;
60
+ }
61
+ /** Record STT cost for a specific model */
62
+ recordStt(model, durationSeconds) {
63
+ const pricing = STT_PRICING.get(model);
64
+ if (!pricing)
65
+ return;
66
+ this.sttCostUsd += (durationSeconds / 60) * pricing.ratePerMinute;
67
+ }
42
68
  /** Compute USD cost for a specific role */
43
69
  costForRole(role) {
44
- const entry = this.usageByRole.get(role);
45
- if (!entry)
46
- return 0;
47
- return computeCost(entry);
70
+ let total = 0;
71
+ for (const [key, entry] of this.usageByRoleModel) {
72
+ if (key.startsWith(`${role}:`)) {
73
+ total += computeCost(entry);
74
+ }
75
+ }
76
+ return total;
48
77
  }
49
78
  /** Get full cost summary with totals and per-role breakdown */
50
79
  get summary() {
@@ -55,15 +84,17 @@ export class CostTracker {
55
84
  let totalToolCalls = 0;
56
85
  let totalCostUsd = 0;
57
86
  const byRole = {};
58
- for (const [role, entry] of this.usageByRole) {
87
+ const byRoleModel = {};
88
+ for (const [key, entry] of this.usageByRoleModel) {
59
89
  totalInputTokens += entry.inputTokens;
60
90
  totalOutputTokens += entry.outputTokens;
61
91
  totalCacheReadTokens += entry.cacheReadTokens;
62
92
  totalCacheWriteTokens += entry.cacheWriteTokens;
63
93
  totalToolCalls += entry.calls;
64
- const roleCost = computeCost(entry);
65
- totalCostUsd += roleCost;
66
- byRole[role] = {
94
+ const entryCost = computeCost(entry);
95
+ totalCostUsd += entryCost;
96
+ // byRoleModel: keyed by "role:model"
97
+ byRoleModel[key] = {
67
98
  role: entry.role,
68
99
  model: entry.model,
69
100
  inputTokens: entry.inputTokens,
@@ -72,7 +103,33 @@ export class CostTracker {
72
103
  cacheWriteTokens: entry.cacheWriteTokens,
73
104
  calls: entry.calls,
74
105
  };
106
+ // byRole: aggregate across all models for this role (backward compat)
107
+ const existing = byRole[entry.role];
108
+ if (existing) {
109
+ byRole[entry.role] = {
110
+ role: entry.role,
111
+ model: entry.model, // last seen model
112
+ inputTokens: existing.inputTokens + entry.inputTokens,
113
+ outputTokens: existing.outputTokens + entry.outputTokens,
114
+ cacheReadTokens: existing.cacheReadTokens + entry.cacheReadTokens,
115
+ cacheWriteTokens: existing.cacheWriteTokens + entry.cacheWriteTokens,
116
+ calls: existing.calls + entry.calls,
117
+ };
118
+ }
119
+ else {
120
+ byRole[entry.role] = {
121
+ role: entry.role,
122
+ model: entry.model,
123
+ inputTokens: entry.inputTokens,
124
+ outputTokens: entry.outputTokens,
125
+ cacheReadTokens: entry.cacheReadTokens,
126
+ cacheWriteTokens: entry.cacheWriteTokens,
127
+ calls: entry.calls,
128
+ };
129
+ }
75
130
  }
131
+ // Include embedding and STT costs in total
132
+ totalCostUsd += this.embeddingCostUsd + this.sttCostUsd;
76
133
  return {
77
134
  totalInputTokens,
78
135
  totalOutputTokens,
@@ -81,11 +138,14 @@ export class CostTracker {
81
138
  totalToolCalls,
82
139
  totalCostUsd,
83
140
  byRole,
141
+ byRoleModel,
84
142
  };
85
143
  }
86
144
  /** Clear all accumulated usage */
87
145
  reset() {
88
- this.usageByRole.clear();
146
+ this.usageByRoleModel.clear();
147
+ this.embeddingCostUsd = 0;
148
+ this.sttCostUsd = 0;
89
149
  }
90
150
  }
91
151
  /** Compute USD cost for a usage entry using MODEL_PRICING */
@@ -1 +1 @@
1
- {"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,14 @@ export interface ModelPricing {
16
16
  readonly cacheReadMultiplier: number;
17
17
  readonly cacheWriteMultiplier: number;
18
18
  }
19
+ /** STT pricing (per minute of audio) */
20
+ export interface SttPricing {
21
+ readonly ratePerMinute: number;
22
+ }
23
+ /** Embedding pricing (per million tokens) */
24
+ export interface EmbeddingPricing {
25
+ readonly ratePerMToken: number;
26
+ }
19
27
  /** Cost tracking summary */
20
28
  export interface CostSummary {
21
29
  readonly totalInputTokens: number;
@@ -25,6 +33,8 @@ export interface CostSummary {
25
33
  readonly totalToolCalls: number;
26
34
  readonly totalCostUsd: number;
27
35
  readonly byRole: Record<string, RoleUsage>;
36
+ /** Per role:model tuple breakdown */
37
+ readonly byRoleModel: Record<string, RoleUsage>;
28
38
  }
29
- export { CostTracker, MODEL_PRICING } from "./cost-tracker.js";
39
+ export { CostTracker, MODEL_PRICING, STT_PRICING, EMBEDDING_PRICING } from "./cost-tracker.js";
30
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cost/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAC5C;AAED,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cost/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3C,qCAAqC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACjD;AAED,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,2 +1,2 @@
1
- export { CostTracker, MODEL_PRICING } from "./cost-tracker.js";
1
+ export { CostTracker, MODEL_PRICING, STT_PRICING, EMBEDDING_PRICING } from "./cost-tracker.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cost/index.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cost/index.ts"],"names":[],"mappings":"AA4CA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { TenantAgentConfig, TenantRoutingConfig } from "../engine/gateway/tenant-config.js";
2
+ export interface RoutingTemplate {
3
+ readonly id: string;
4
+ readonly name: string;
5
+ readonly description: string;
6
+ readonly category: "service" | "ecommerce" | "support" | "hospitality";
7
+ readonly agents: readonly TenantAgentConfig[];
8
+ readonly routing: TenantRoutingConfig;
9
+ }
10
+ export declare function getRoutingTemplate(id: string): RoutingTemplate | undefined;
11
+ export declare function listRoutingTemplates(): readonly RoutingTemplate[];
12
+ //# sourceMappingURL=routing-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-templates.d.ts","sourceRoot":"","sources":["../../src/domains/routing-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEjG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IACvE,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC;AAyGD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE1E;AAED,wBAAgB,oBAAoB,IAAI,SAAS,eAAe,EAAE,CAEjE"}