kiku-agent 1.3.0 → 1.3.2

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 (155) hide show
  1. package/README.md +7 -7
  2. package/package.json +4 -7
  3. package/server/agent/agentCore.js +2 -2
  4. package/server/agent/catalogEntityResolver.js +8 -0
  5. package/server/agent/cli.js +4 -0
  6. package/server/agent/eval/AGENTS.md +228 -0
  7. package/server/agent/eval/analyze.py +684 -0
  8. package/server/agent/eval/gates.json +15 -0
  9. package/server/agent/eval/modules/analysis/compare.js +198 -0
  10. package/server/agent/eval/modules/analysis/gates.js +72 -0
  11. package/server/agent/eval/modules/analysis/judge.js +70 -0
  12. package/server/agent/eval/modules/core/cli.js +453 -0
  13. package/server/agent/eval/modules/core/config.js +60 -0
  14. package/server/agent/eval/modules/core/store.js +236 -0
  15. package/server/agent/eval/modules/evaluation/cases.js +689 -0
  16. package/server/agent/eval/modules/evaluation/runner.js +298 -0
  17. package/server/agent/eval/modules/evaluation/scoring.js +351 -0
  18. package/server/agent/eval/modules/evaluation/worker.js +122 -0
  19. package/server/agent/eval/modules/reporting/benchmark.js +265 -0
  20. package/server/agent/eval/modules/reporting/benchmarkPng.js +487 -0
  21. package/server/agent/eval/modules/reporting/dashboard.js +1406 -0
  22. package/server/agent/eval/modules/server/evalApi.js +1099 -0
  23. package/server/agent/eval/modules/ui/evalUi.js +4796 -0
  24. package/server/agent/eval/modules/utils/smokes.js +119 -0
  25. package/server/agent/ink/App.jsx +348 -0
  26. package/server/agent/ink/Panel.jsx +54 -0
  27. package/server/agent/ink/PromptInput.jsx +321 -0
  28. package/server/agent/ink/TaskPlanPanel.jsx +88 -0
  29. package/server/agent/ink/ThinkingPanel.jsx +68 -0
  30. package/server/agent/ink/ToolResult.jsx +133 -0
  31. package/server/agent/ink/main.jsx +195 -0
  32. package/server/agent/ink/useEventBus.js +218 -0
  33. package/server/agent/memory/contextAllocator.js +214 -0
  34. package/server/agent/memory/hierarchicalStore.js +523 -0
  35. package/server/agent/memory/reflectionWorker.js +110 -0
  36. package/server/agent/prompts.js +1 -1
  37. package/server/agent/telemetry/hardwareTiers.js +332 -0
  38. package/server/agent/telemetry/runtimeWatchdog.js +66 -0
  39. package/server/agent/telemetry/techPowerUpClient.js +682 -0
  40. package/server/agent/telemetry/techpowerup-mcp.json +22 -0
  41. package/server/agent/tests/agentBubbleSystem.test.js +65 -0
  42. package/server/agent/tests/agentFollowUps.test.js +127 -0
  43. package/server/agent/tests/apiRouter.test.js +108 -0
  44. package/server/agent/tests/architectureFixes.test.js +81 -0
  45. package/server/agent/tests/architectureRefactoring.test.js +194 -0
  46. package/server/agent/tests/autoResearch.test.js +64 -0
  47. package/server/agent/tests/bilibiliEmbed.test.js +251 -0
  48. package/server/agent/tests/catalogSync.test.js +130 -0
  49. package/server/agent/tests/citations.test.js +180 -0
  50. package/server/agent/tests/clarificationAnalytics.test.js +219 -0
  51. package/server/agent/tests/clarifyingQuestions.test.js +594 -0
  52. package/server/agent/tests/cliAutomation.test.js +121 -0
  53. package/server/agent/tests/cloudProviders.test.js +234 -0
  54. package/server/agent/tests/commandInput.test.js +24 -0
  55. package/server/agent/tests/commands.test.js +417 -0
  56. package/server/agent/tests/contextIntelligence.test.js +162 -0
  57. package/server/agent/tests/conversationSafety.test.js +53 -0
  58. package/server/agent/tests/decisionAndSearchEnhancements.test.js +135 -0
  59. package/server/agent/tests/dramaAnswerQuality.test.js +73 -0
  60. package/server/agent/tests/dynamicCatalogIngestion.test.js +285 -0
  61. package/server/agent/tests/dynamicRoutingAndSearch.test.js +92 -0
  62. package/server/agent/tests/edgeCasesScenarios.test.js +49 -0
  63. package/server/agent/tests/entertainmentMetrics.test.js +126 -0
  64. package/server/agent/tests/envBootstrap.test.js +87 -0
  65. package/server/agent/tests/envCommand.test.js +215 -0
  66. package/server/agent/tests/errorHandling.test.js +80 -0
  67. package/server/agent/tests/errors.test.js +13 -0
  68. package/server/agent/tests/evalAnalyze.test.js +54 -0
  69. package/server/agent/tests/evalCommand.test.js +54 -0
  70. package/server/agent/tests/evalCorpus.test.js +126 -0
  71. package/server/agent/tests/evalHarness.test.js +62 -0
  72. package/server/agent/tests/evalJudgeContext.test.js +38 -0
  73. package/server/agent/tests/evalMetrics.test.js +312 -0
  74. package/server/agent/tests/evalStore.test.js +190 -0
  75. package/server/agent/tests/evalStudio.test.js +179 -0
  76. package/server/agent/tests/feedbackLearning.test.js +186 -0
  77. package/server/agent/tests/firstRun.test.js +44 -0
  78. package/server/agent/tests/gemma4eOptimization.test.js +95 -0
  79. package/server/agent/tests/hardwareTiers.test.js +206 -0
  80. package/server/agent/tests/hybridWebSearch.test.js +192 -0
  81. package/server/agent/tests/judgeService.test.js +251 -0
  82. package/server/agent/tests/lanDiscovery.test.js +319 -0
  83. package/server/agent/tests/mcpClient.test.js +201 -0
  84. package/server/agent/tests/modelManager.test.js +109 -0
  85. package/server/agent/tests/multilingualScenarios.test.js +69 -0
  86. package/server/agent/tests/newCommands.test.js +347 -0
  87. package/server/agent/tests/newCommandsTui.test.js +141 -0
  88. package/server/agent/tests/newTools.test.js +113 -0
  89. package/server/agent/tests/newsIntelligence.test.js +178 -0
  90. package/server/agent/tests/nextGenArchitecture.test.js +99 -0
  91. package/server/agent/tests/offlineInput.test.js +217 -0
  92. package/server/agent/tests/packagingGuard.test.js +57 -0
  93. package/server/agent/tests/presentation.test.js +61 -0
  94. package/server/agent/tests/providerPersistence.test.js +39 -0
  95. package/server/agent/tests/queryBenchmarks.test.js +83 -0
  96. package/server/agent/tests/queryDetails.test.js +126 -0
  97. package/server/agent/tests/realWorldValidation.test.js +391 -0
  98. package/server/agent/tests/resilienceAndConcurrency.test.js +117 -0
  99. package/server/agent/tests/runtimeWatchdog.test.js +32 -0
  100. package/server/agent/tests/sanitizer.test.js +37 -0
  101. package/server/agent/tests/scenariosData.js +378 -0
  102. package/server/agent/tests/schemaRouting.test.js +54 -0
  103. package/server/agent/tests/securityAuditRemediation.test.js +214 -0
  104. package/server/agent/tests/securityHardening.test.js +146 -0
  105. package/server/agent/tests/securitySanitizer.test.js +38 -0
  106. package/server/agent/tests/sessionAndCopy.test.js +232 -0
  107. package/server/agent/tests/sidebarControls.test.js +101 -0
  108. package/server/agent/tests/statefulMemory.test.js +270 -0
  109. package/server/agent/tests/subagent.test.js +216 -0
  110. package/server/agent/tests/subagentProgress.test.js +109 -0
  111. package/server/agent/tests/subagentTextFallback.test.js +115 -0
  112. package/server/agent/tests/suggestions.test.js +199 -0
  113. package/server/agent/tests/suggestionsTui.test.js +251 -0
  114. package/server/agent/tests/telemetryAndProfiles.test.js +179 -0
  115. package/server/agent/tests/terminalImage.test.js +80 -0
  116. package/server/agent/tests/terminalMarkdown.test.js +166 -0
  117. package/server/agent/tests/terminalText.test.js +133 -0
  118. package/server/agent/tests/textProtocolLoop.test.js +126 -0
  119. package/server/agent/tests/textToolParsing.test.js +139 -0
  120. package/server/agent/tests/theme.test.js +26 -0
  121. package/server/agent/tests/toolRegistryParity.test.js +53 -0
  122. package/server/agent/tests/toolRoutingRegressions.test.js +119 -0
  123. package/server/agent/tests/tools.test.js +259 -0
  124. package/server/agent/tests/unifiedEndpoints.test.js +152 -0
  125. package/server/agent/tests/v110Features.test.js +262 -0
  126. package/server/agent/tests/versionBump.test.js +69 -0
  127. package/server/agent/tests/vramEstimator.test.js +520 -0
  128. package/server/agent/tests/webChatInspection.test.js +300 -0
  129. package/server/agent/tests/webChatMemory.test.js +112 -0
  130. package/server/agent/tests/webChatSecurity.test.js +169 -0
  131. package/server/agent/tests/webExtract.test.js +261 -0
  132. package/server/agent/tests/webSources.test.js +247 -0
  133. package/server/agent/websearch/adapters/duckduckgo.js +97 -0
  134. package/server/agent/websearch/adapters/jina.js +77 -0
  135. package/server/agent/websearch/adapters/searxng.js +57 -0
  136. package/server/agent/websearch/core/canonical.js +89 -0
  137. package/server/agent/websearch/core/fusion.js +81 -0
  138. package/server/agent/websearch/core/types.js +29 -0
  139. package/server/agent/websearch/extract.js +605 -0
  140. package/server/agent/websearch/index.js +43 -0
  141. package/server/agent/websearch/orchestrator.js +266 -0
  142. package/server/agent/websearch/resilience/breaker.js +97 -0
  143. package/server/agent/websearch/resilience/cache.js +59 -0
  144. package/server/agent/websearch/resilience/limiter.js +93 -0
  145. package/server/agent/websearch/security/filter.js +36 -0
  146. package/server/agent/websearch/security/ssrf.js +289 -0
  147. package/server/agent/websearch/telemetry.js +71 -0
  148. package/server/apiRouter.js +7 -11
  149. package/server/eval/judgeRubrics.js +110 -0
  150. package/server/eval/judgeService.js +290 -0
  151. package/server/eval/runBenchmark.js +182 -0
  152. package/server/mcp/examples/librechat.example.yaml +16 -0
  153. package/server/mcp/tests/connection.test.js +156 -0
  154. package/server/routes/agent.js +55 -0
  155. package/server/supabase_schema.sql +63 -0
@@ -0,0 +1,332 @@
1
+ export const HARDWARE_TIERS = Object.freeze({
2
+ TIER_0: {
3
+ id: 0,
4
+ name: 'Tier 0: Constrained',
5
+ vramRange: '<= 4 GB (or iGPU)',
6
+ minVramGb: 0,
7
+ maxVramGb: 4.5,
8
+ contextLimit: 4096,
9
+ recommendedKvQuant: 'Q4_K_M',
10
+ schemaPolicy: 'single_tool_minimal',
11
+ multiTurnAllowed: false,
12
+ timeoutSeconds: 30,
13
+ nBatch: 1024,
14
+ description: 'Ultra-low VRAM or integrated GPU. Minimal context and strict single-tool dispatch. Q4_K_M KV cache for best quality within tight budget.'
15
+ },
16
+ TIER_1: {
17
+ id: 1,
18
+ name: 'Tier 1: Entry AI',
19
+ vramRange: '6 GB - 8 GB',
20
+ minVramGb: 4.51,
21
+ maxVramGb: 8.5,
22
+ contextLimit: 8192,
23
+ recommendedKvQuant: 'Q4_K_M',
24
+ schemaPolicy: 'dynamic_minimal',
25
+ schemaTokenBudget: 1500,
26
+ multiTurnAllowed: true,
27
+ timeoutSeconds: 45,
28
+ nBatch: 2048,
29
+ description: 'Entry AI GPUs (e.g. RTX 2060 6GB, RTX 3050, RTX 4060 8GB, RX 6600). Enforces 8K context and Q4_K_M KV to balance accuracy and PCIe Shared Memory spillover prevention.'
30
+ },
31
+ TIER_2: {
32
+ id: 2,
33
+ name: 'Tier 2: Mid-Range',
34
+ vramRange: '10 GB - 16 GB',
35
+ minVramGb: 8.51,
36
+ maxVramGb: 18.0,
37
+ contextLimit: 16384,
38
+ recommendedKvQuant: 'Q8_0',
39
+ schemaPolicy: 'domain_grouped',
40
+ schemaTokenBudget: 3000,
41
+ multiTurnAllowed: true,
42
+ timeoutSeconds: 90,
43
+ nBatch: 4096,
44
+ description: 'Mid-range cards (e.g. RTX 3060 12GB, RTX 4070 12GB, RTX 4080 16GB, RX 7800 XT). Full domain grouping and prefix caching enabled.'
45
+ },
46
+ TIER_3: {
47
+ id: 3,
48
+ name: 'Tier 3: Enthusiast',
49
+ vramRange: '20 GB - 24 GB',
50
+ minVramGb: 18.01,
51
+ maxVramGb: 28.0,
52
+ contextLimit: 32768,
53
+ recommendedKvQuant: 'FP16',
54
+ schemaPolicy: 'full_schema',
55
+ schemaTokenBudget: 8000,
56
+ multiTurnAllowed: true,
57
+ timeoutSeconds: 120,
58
+ nBatch: 4096,
59
+ description: 'Enthusiast GPUs (e.g. RTX 3090, RTX 4090 24GB, RX 7900 XTX, Apple M Pro/Max). Full schema access without prompt compaction.'
60
+ },
61
+ TIER_4: {
62
+ id: 4,
63
+ name: 'Tier 4: Ultra / Pro',
64
+ vramRange: '>= 32 GB',
65
+ minVramGb: 28.01,
66
+ maxVramGb: Infinity,
67
+ contextLimit: 65536,
68
+ recommendedKvQuant: 'FP8',
69
+ schemaPolicy: 'full_schema',
70
+ schemaTokenBudget: 16000,
71
+ multiTurnAllowed: true,
72
+ timeoutSeconds: 180,
73
+ nBatch: 8192,
74
+ description: 'Workstation & Flagship (e.g. RTX 5090 32GB, RTX 6000 Ada, Apple M Ultra). Multi-agent parallelism and expansive context.'
75
+ }
76
+ });
77
+
78
+
79
+ export function detectGpuArchitecture(name = '', vendor = '') {
80
+ const n = String(name || '').toLowerCase();
81
+ const v = String(vendor || '').toLowerCase();
82
+
83
+ if (v.includes('apple') || n.includes('apple') || n.includes('m1') || n.includes('m2') || n.includes('m3') || n.includes('m4')) {
84
+ return {
85
+ family: 'Apple Silicon',
86
+ generation: 'Metal Unified Memory',
87
+ supportsFp8: false,
88
+ supportsBf16: true,
89
+ requiresReservedHeadroom: true,
90
+ headroomPercent: 28,
91
+ };
92
+ }
93
+
94
+ if (n.includes('h100') || n.includes('h200') || n.includes('hopper')) {
95
+ return {
96
+ family: 'Hopper',
97
+ generation: 'H100/H200 Enterprise',
98
+ supportsFp8: true,
99
+ supportsBf16: true,
100
+ requiresReservedHeadroom: false,
101
+ recommendedKv: 'FP8',
102
+ };
103
+ }
104
+
105
+ if (n.includes('rtx 50') || n.includes('blackwell')) {
106
+ return {
107
+ family: 'Blackwell',
108
+ generation: 'RTX 5000 Series',
109
+ supportsFp4: true,
110
+ supportsFp8: true,
111
+ supportsBf16: true,
112
+ requiresReservedHeadroom: false,
113
+ recommendedKv: 'FP8',
114
+ };
115
+ }
116
+
117
+ if (n.includes('rtx 40') || n.includes('ada') || n.includes('rtx 6000 ada')) {
118
+ return {
119
+ family: 'Ada Lovelace',
120
+ generation: 'RTX 4000 Series',
121
+ supportsFp8: true,
122
+ supportsBf16: true,
123
+ requiresReservedHeadroom: false,
124
+ recommendedKv: 'FP8',
125
+ };
126
+ }
127
+
128
+ if (n.includes('rtx 30') || n.includes('ampere') || n.includes('a100') || n.includes('a10') || n.includes('a40') || n.includes('a2000') || n.includes('a4000') || n.includes('a5000') || n.includes('a6000')) {
129
+ return {
130
+ family: 'Ampere',
131
+ generation: 'RTX 3000 Series',
132
+ supportsFp8: false,
133
+ supportsBf16: true,
134
+ requiresReservedHeadroom: false,
135
+ recommendedKv: 'Q8_0',
136
+ };
137
+ }
138
+
139
+ if (n.includes('rtx 20') || n.includes('gtx 16') || n.includes('turing') || n.includes('titan rtx') || n.includes('t4')) {
140
+ return {
141
+ family: 'Turing',
142
+ generation: 'RTX 2000 / GTX 1600 Series',
143
+ supportsFp8: false,
144
+ supportsBf16: false,
145
+ requiresReservedHeadroom: false,
146
+ recommendedKv: 'Q4_K_M',
147
+ };
148
+ }
149
+
150
+ if (n.includes('v100') || n.includes('volta') || n.includes('titan v')) {
151
+ return {
152
+ family: 'Volta',
153
+ generation: 'Tesla V100 / Titan V',
154
+ supportsFp8: false,
155
+ supportsBf16: false,
156
+ requiresReservedHeadroom: false,
157
+ recommendedKv: 'Q8_0',
158
+ };
159
+ }
160
+
161
+ if (n.includes('gtx 10') || n.includes('pascal') || n.includes('p40') || n.includes('p100') || n.includes('titan x')) {
162
+ return {
163
+ family: 'Pascal',
164
+ generation: 'GTX 1000 / Tesla P Series',
165
+ supportsFp8: false,
166
+ supportsBf16: false,
167
+ requiresReservedHeadroom: false,
168
+ recommendedKv: 'Q4_0',
169
+ };
170
+ }
171
+
172
+ if (n.includes('mi300') || n.includes('mi250') || n.includes('mi210') || n.includes('mi60') || n.includes('cdna')) {
173
+ return {
174
+ family: 'CDNA',
175
+ generation: 'AMD Instinct Enterprise',
176
+ supportsFp8: true,
177
+ supportsBf16: true,
178
+ requiresReservedHeadroom: false,
179
+ recommendedKv: 'FP8',
180
+ };
181
+ }
182
+
183
+ if (n.includes('rx 7') || n.includes('rdna 3') || n.includes('rdna3') || n.includes('w7900')) {
184
+ return {
185
+ family: 'RDNA 3',
186
+ generation: 'Radeon RX 7000 Series',
187
+ supportsFp8: false,
188
+ supportsBf16: true,
189
+ requiresReservedHeadroom: false,
190
+ recommendedKv: 'Q8_0',
191
+ };
192
+ }
193
+
194
+ if (n.includes('rx 6') || n.includes('rdna 2') || n.includes('rdna2')) {
195
+ return {
196
+ family: 'RDNA 2',
197
+ generation: 'Radeon RX 6000 Series',
198
+ supportsFp8: false,
199
+ supportsBf16: false,
200
+ requiresReservedHeadroom: false,
201
+ recommendedKv: 'Q8_0',
202
+ };
203
+ }
204
+
205
+ if (n.includes('arc') || n.includes('alchemist') || n.includes('battlemage') || n.includes('b580') || n.includes('b570') || n.includes('a770') || n.includes('a750') || n.includes('140v')) {
206
+ return {
207
+ family: 'Intel Arc',
208
+ generation: 'Xe-HPG / Battlemage',
209
+ supportsFp8: false,
210
+ supportsBf16: true,
211
+ requiresReservedHeadroom: false,
212
+ recommendedKv: 'Q8_0',
213
+ };
214
+ }
215
+
216
+ if (n.includes('gaudi') || n.includes('ponte vecchio') || n.includes('gpu max')) {
217
+ return {
218
+ family: 'Intel Accelerator',
219
+ generation: 'Gaudi / Xe-HPC Enterprise',
220
+ supportsFp8: true,
221
+ supportsBf16: true,
222
+ requiresReservedHeadroom: false,
223
+ recommendedKv: 'FP8',
224
+ };
225
+ }
226
+
227
+ if (n.includes('strix') || n.includes('ryzen ai') || n.includes('780m') || n.includes('890m')) {
228
+ return {
229
+ family: 'AMD APU / RDNA 3.5',
230
+ generation: 'Ryzen AI Strix / Phoenix Unified',
231
+ supportsFp8: false,
232
+ supportsBf16: true,
233
+ requiresReservedHeadroom: true,
234
+ headroomPercent: 20,
235
+ recommendedKv: 'Q8_0',
236
+ };
237
+ }
238
+
239
+ return {
240
+ family: 'Generic',
241
+ generation: 'Unknown',
242
+ supportsFp8: false,
243
+ supportsBf16: false,
244
+ requiresReservedHeadroom: false,
245
+ recommendedKv: 'Q4_K_M',
246
+ };
247
+ }
248
+
249
+
250
+ export function classifyHardwareTier(hardware = {}) {
251
+ const totalMb = Number(hardware.totalMb) || (Number(hardware.totalGb) ? Number(hardware.totalGb) * 1024 : 0);
252
+ const totalGb = totalMb / 1024;
253
+ const name = String(hardware.name || '');
254
+ const vendor = String(hardware.vendor || '');
255
+ const arch = detectGpuArchitecture(name, vendor);
256
+
257
+ let selectedTier = HARDWARE_TIERS.TIER_1;
258
+ if (totalGb <= 0 || totalGb <= HARDWARE_TIERS.TIER_0.maxVramGb) {
259
+ selectedTier = HARDWARE_TIERS.TIER_0;
260
+ } else if (totalGb <= HARDWARE_TIERS.TIER_1.maxVramGb) {
261
+ selectedTier = HARDWARE_TIERS.TIER_1;
262
+ } else if (totalGb <= HARDWARE_TIERS.TIER_2.maxVramGb) {
263
+ selectedTier = HARDWARE_TIERS.TIER_2;
264
+ } else if (totalGb <= HARDWARE_TIERS.TIER_3.maxVramGb) {
265
+ selectedTier = HARDWARE_TIERS.TIER_3;
266
+ } else {
267
+ selectedTier = HARDWARE_TIERS.TIER_4;
268
+ }
269
+
270
+
271
+ // Tier recommendation is primary (driven by VRAM budget).
272
+ // For constrained tiers (0/1), cap to arch recommendedKv if it would push
273
+ // a tighter quant than the tier default — prevents Shared Memory spillover.
274
+ // For mid/high tiers the tier quant (Q8_0, FP16, FP8) always wins.
275
+ let effectiveKvQuant = selectedTier.recommendedKvQuant;
276
+ if (selectedTier.id <= 1 && arch.recommendedKv) {
277
+ effectiveKvQuant = arch.recommendedKv;
278
+ }
279
+
280
+ return {
281
+ ...selectedTier,
282
+ totalMb: Math.round(totalMb),
283
+ totalGb: Number(totalGb.toFixed(2)),
284
+ detectedName: name,
285
+ architecture: arch,
286
+ effectiveKvQuant,
287
+ isConstrained: selectedTier.id <= 1,
288
+ };
289
+ }
290
+
291
+
292
+ export function calculateDynamicVramBudget({
293
+ totalVramMb,
294
+ modelWeightsMb = 3900,
295
+ osSafetyMb = 700,
296
+ bytesPerToken = 0.055,
297
+ kvQuant = 'Q4_K_M',
298
+ } = {}) {
299
+ const total = Number(totalVramMb) || 6144;
300
+ const weights = Number(modelWeightsMb) || 3900;
301
+ const safety = Number(osSafetyMb) || 700;
302
+
303
+ const usable = total;
304
+ const kvBudgetMb = Math.max(0, usable - weights - safety);
305
+
306
+
307
+ let quantScale = 1.0;
308
+ if (kvQuant.toUpperCase() === 'Q4_0' || kvQuant.toUpperCase() === 'Q4') quantScale = 0.25;
309
+ else if (kvQuant.toUpperCase() === 'Q4_K_M' || kvQuant.toUpperCase() === 'Q4_K_S') quantScale = 0.28;
310
+ else if (kvQuant.toUpperCase() === 'Q6_K') quantScale = 0.38;
311
+ else if (kvQuant.toUpperCase() === 'Q8_0' || kvQuant.toUpperCase() === 'Q8') quantScale = 0.50;
312
+ else if (kvQuant.toUpperCase() === 'FP8') quantScale = 0.50;
313
+ else if (kvQuant.toUpperCase() === 'FP16') quantScale = 1.0;
314
+
315
+ const effectiveBytesPerTokenMb = (bytesPerToken || 0.055) * quantScale;
316
+ const maxTokens = Math.floor(kvBudgetMb / effectiveBytesPerTokenMb);
317
+
318
+
319
+ const contextLength = Math.max(2048, Math.min(131072, Math.floor(maxTokens / 1024) * 1024));
320
+
321
+ return {
322
+ totalVramMb: total,
323
+ modelWeightsMb: weights,
324
+ osSafetyMb: safety,
325
+ kvBudgetMb: Number(kvBudgetMb.toFixed(1)),
326
+ kvQuant,
327
+ quantScale,
328
+ calculatedMaxTokens: maxTokens,
329
+ recommendedContextLimit: contextLength,
330
+ isSafe: kvBudgetMb >= 256,
331
+ };
332
+ }
@@ -0,0 +1,66 @@
1
+ import { getSharedMemoryMetrics } from '../gpuMetrics.js';
2
+ import { Events, eventBus } from '../eventBus.js';
3
+
4
+ export class RuntimeWatchdog {
5
+ constructor(options = {}) {
6
+ this.minTpsThreshold = options.minTpsThreshold || 20.0;
7
+ this.spilloverThresholdMb = options.spilloverThresholdMb || 5.0;
8
+ this.checkIntervalMs = options.checkIntervalMs || 10000;
9
+ this.active = false;
10
+ this.metricsHistory = [];
11
+ }
12
+
13
+
14
+ async sampleTelemetry() {
15
+ const mem = await getSharedMemoryMetrics('lm');
16
+ const snapshot = {
17
+ timestamp: Date.now(),
18
+ sharedMemoryUsedMb: mem.sharedMemoryUsedMb || 0,
19
+ hasSpillover: mem.sharedMemoryUsedMb > this.spilloverThresholdMb,
20
+ };
21
+
22
+ this.metricsHistory.push(snapshot);
23
+ if (this.metricsHistory.length > 50) this.metricsHistory.shift();
24
+
25
+ if (snapshot.hasSpillover) {
26
+ eventBus.emit(Events.AGENT_QUERY_ERROR, {
27
+ type: 'vram_spillover_warning',
28
+ sharedMemoryUsedMb: snapshot.sharedMemoryUsedMb,
29
+ message: `Detected ${snapshot.sharedMemoryUsedMb} MB Shared GPU Memory allocation (PCIe spillover). Decoding speed will degrade.`
30
+ });
31
+ }
32
+
33
+ return snapshot;
34
+ }
35
+
36
+
37
+ selfHealContext(agent) {
38
+ if (!agent || !Array.isArray(agent.conversationHistory)) return 0;
39
+ const history = agent.conversationHistory;
40
+ const nonSystem = history.filter(m => m.role !== 'system');
41
+ if (nonSystem.length <= 2) return 0;
42
+
43
+ const cutCount = Math.floor(nonSystem.length / 2);
44
+
45
+ const recent = nonSystem.slice(cutCount);
46
+ const system = history.filter(m => m.role === 'system');
47
+
48
+ agent.conversationHistory = [
49
+ ...system,
50
+ {
51
+ role: 'system',
52
+ content: '[WATCHDOG SELF-HEALING: Evicted 50% of older context to restore GPU VRAM headroom and eliminate latency drops.]'
53
+ },
54
+ ...recent
55
+ ];
56
+
57
+ eventBus.emit(Events.AGENT_STATE_CHANGE, {
58
+ state: 'SELF_HEALING_EVICTION',
59
+ evictedMessages: cutCount
60
+ });
61
+
62
+ return cutCount;
63
+ }
64
+ }
65
+
66
+ export const runtimeWatchdog = new RuntimeWatchdog();