turbollm 1.12.5 → 1.12.6

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 +5 -0
  2. package/dist/{chunk-6GI5HUKN.js → chunk-4D7DDGNU.js} +161 -6
  3. package/dist/cli.js +535 -105
  4. package/dist/code-routes.js +1 -1
  5. package/dist/code-run-manager.js +1 -1
  6. package/dist/webdist/assets/{AgentEditPage-C4VY0moS.js → AgentEditPage-83hUJ_yq.js} +1 -1
  7. package/dist/webdist/assets/{ChatScreen-DMl17RGg.js → ChatScreen-B1QzE7QZ.js} +3 -3
  8. package/dist/webdist/assets/CodeComposer-C7I5ykvn.js +1 -0
  9. package/dist/webdist/assets/CodeHomeScreen-ZKpbgn7S.js +1 -0
  10. package/dist/webdist/assets/{CodeSessionScreen-D-JVlqpE.js → CodeSessionScreen-Ot25EuHL.js} +2 -2
  11. package/dist/webdist/assets/CustomizeScreen-COme_lV-.js +4 -0
  12. package/dist/webdist/assets/EnginesScreen-BGT8oVOe.js +10 -0
  13. package/dist/webdist/assets/HardwareSection-BQ1HHDGX.js +1 -0
  14. package/dist/webdist/assets/ModelDetailDialog-9b2F83QQ.js +1 -0
  15. package/dist/webdist/assets/ModelLoadMenu-B1925839.js +1 -0
  16. package/dist/webdist/assets/{ModelsScreen-CNcbFWD5.js → ModelsScreen-Bhna_QQc.js} +2 -2
  17. package/dist/webdist/assets/OnboardingScreen-DA-e7mgD.js +1 -0
  18. package/dist/webdist/assets/RoutineEditPage-CiRYzGIb.js +1 -0
  19. package/dist/webdist/assets/RoutinesPanel-D0CXz1fD.js +1 -0
  20. package/dist/webdist/assets/SettingsScreen-V1RyXQTQ.js +2 -0
  21. package/dist/webdist/assets/{SidebarResizeHandle-Zs-1qltv.js → SidebarResizeHandle-D01qRHL1.js} +2 -2
  22. package/dist/webdist/assets/{SkillEditPage-ggZet3Hq.js → SkillEditPage-CBPJBxDt.js} +1 -1
  23. package/dist/webdist/assets/{ToolApprovalBar-OQucQFQf.js → ToolApprovalBar-HX3wUiyv.js} +3 -3
  24. package/dist/webdist/assets/WorkspaceScreen-BNtXiOWM.js +1 -0
  25. package/dist/webdist/assets/{abnfDiagram-N423BO3Z-SHwyKkJQ.js → abnfDiagram-N423BO3Z-DmDyVjOZ.js} +1 -1
  26. package/dist/webdist/assets/{agent-api-CFwqFCzt.js → agent-api-Dv4kFt_M.js} +1 -1
  27. package/dist/webdist/assets/{alert-dialog-CVqoWRWc.js → alert-dialog-CeVkt2LM.js} +1 -1
  28. package/dist/webdist/assets/arc-CGS2bj3o.js +1 -0
  29. package/dist/webdist/assets/{architectureDiagram-T3A2C74G-D7FxJSd4.js → architectureDiagram-T3A2C74G-3UBZe_2N.js} +1 -1
  30. package/dist/webdist/assets/{blockDiagram-VBNYF7ZC-DUxFHegq.js → blockDiagram-VBNYF7ZC-BGZHOIDA.js} +1 -1
  31. package/dist/webdist/assets/{c4Diagram-5PPSVZJV-BNivJaYT.js → c4Diagram-5PPSVZJV-CVr3SBA9.js} +1 -1
  32. package/dist/webdist/assets/channel-ycP7LIsi.js +1 -0
  33. package/dist/webdist/assets/{chat-api-DlO-w34y.js → chat-api-CfcKVstJ.js} +1 -1
  34. package/dist/webdist/assets/{chat-queries-LKWLAeuG.js → chat-queries-Bs6QY5PQ.js} +1 -1
  35. package/dist/webdist/assets/{chevron-down-zbOJaXec.js → chevron-down-CEa7raRZ.js} +1 -1
  36. package/dist/webdist/assets/{chevron-left-DwWh7ZHr.js → chevron-left-0LNFGtRG.js} +1 -1
  37. package/dist/webdist/assets/{chevron-right-BdDJxnyQ.js → chevron-right-DuO7WTV_.js} +1 -1
  38. package/dist/webdist/assets/{chunk-2GRJ4B5K-aQaE3vvo.js → chunk-2GRJ4B5K-BYI-LerK.js} +1 -1
  39. package/dist/webdist/assets/{chunk-2Q5K7J3B-Bjz5EQqP.js → chunk-2Q5K7J3B-Dkj_wKAt.js} +1 -1
  40. package/dist/webdist/assets/{chunk-5RXB4S5H-BH5ljOIu.js → chunk-5RXB4S5H-D51WXISK.js} +1 -1
  41. package/dist/webdist/assets/{chunk-5VM5RSS4-CsIYJ0Jp.js → chunk-5VM5RSS4-DMPfjebF.js} +1 -1
  42. package/dist/webdist/assets/{chunk-6Q2QTUOP-DMRqg9RQ.js → chunk-6Q2QTUOP-CBL9afjp.js} +1 -1
  43. package/dist/webdist/assets/{chunk-GF5L2VYU-DkpR5VII.js → chunk-GF5L2VYU-DrjMJ7im.js} +1 -1
  44. package/dist/webdist/assets/{chunk-JWPE2WC7-BD1-fEKP.js → chunk-JWPE2WC7-D8uoAsSs.js} +1 -1
  45. package/dist/webdist/assets/{chunk-KBJHAD2P-DbesCmhG.js → chunk-KBJHAD2P-DXy_zXRD.js} +1 -1
  46. package/dist/webdist/assets/{chunk-RYQCIY6F-BlX7uhQc.js → chunk-RYQCIY6F-BFfWYngV.js} +1 -1
  47. package/dist/webdist/assets/{chunk-XXDRQBXY-B5SFnzz3.js → chunk-XXDRQBXY-LSo4Wwng.js} +1 -1
  48. package/dist/webdist/assets/{circle-check-BPE-i-tc.js → circle-check-CbP2NbCv.js} +1 -1
  49. package/dist/webdist/assets/{circle-x-xsk30GP6.js → circle-x-CORyJhPm.js} +1 -1
  50. package/dist/webdist/assets/classDiagram-JCYQIIEL-D83VGEBW.js +1 -0
  51. package/dist/webdist/assets/classDiagram-v2-OCEON4UE-D83VGEBW.js +1 -0
  52. package/dist/webdist/assets/collapsible-DZpLSmdU.js +1 -0
  53. package/dist/webdist/assets/{common-DKmzP8Iu.js → common-BCP_8FXi.js} +1 -1
  54. package/dist/webdist/assets/{cose-bilkent-JH36ORCC-CQqOUIWj.js → cose-bilkent-JH36ORCC-Bg5TawlK.js} +1 -1
  55. package/dist/webdist/assets/{cynefin-VYW2F7L2-D9iY9Afn.js → cynefin-VYW2F7L2-BC_4Qgc0.js} +1 -1
  56. package/dist/webdist/assets/{cynefinDiagram-MW4NZA55-BteySMfQ.js → cynefinDiagram-MW4NZA55-P7PoJnC2.js} +1 -1
  57. package/dist/webdist/assets/{dagre-VZM6K2ZE-CgfkgcDR.js → dagre-VZM6K2ZE-evM-NLk2.js} +1 -1
  58. package/dist/webdist/assets/{diagram-7IWD3JNH-egXofmHL.js → diagram-7IWD3JNH-PAxQ_wr0.js} +1 -1
  59. package/dist/webdist/assets/{diagram-B4RE2ZJO-CadYFhIH.js → diagram-B4RE2ZJO-Bu3fmLib.js} +1 -1
  60. package/dist/webdist/assets/{diagram-LBJQPF4R-SLVfTI-S.js → diagram-LBJQPF4R-Bs_VUWBn.js} +1 -1
  61. package/dist/webdist/assets/{diagram-Q27KOJAE-BWp4lrgb.js → diagram-Q27KOJAE-Cad84O0g.js} +1 -1
  62. package/dist/webdist/assets/{diagram-UB23O5K3-DnGLUoSC.js → diagram-UB23O5K3-D9XevR5W.js} +1 -1
  63. package/dist/webdist/assets/{dropdown-menu-CtEFJwSB.js → dropdown-menu-B3NbEIpW.js} +1 -1
  64. package/dist/webdist/assets/{ebnfDiagram-BXEA7PRR-bM2FJmRT.js → ebnfDiagram-BXEA7PRR-CeyZABmQ.js} +1 -1
  65. package/dist/webdist/assets/{erDiagram-JOGREHBK-j1DtaL1m.js → erDiagram-JOGREHBK-BWj7r7f_.js} +1 -1
  66. package/dist/webdist/assets/{external-link-DF5_PKjr.js → external-link-C-heG_eP.js} +1 -1
  67. package/dist/webdist/assets/{file-text-B0wPbdZg.js → file-text-BviBPHS7.js} +1 -1
  68. package/dist/webdist/assets/{flowDiagram-UKHOOZJN-D5MLDKXv.js → flowDiagram-UKHOOZJN-dIRrnOHF.js} +5 -5
  69. package/dist/webdist/assets/{folder-input-BvyBtyaL.js → folder-input-CDnz-CpO.js} +1 -1
  70. package/dist/webdist/assets/{folder-plus-DIX0-FRl.js → folder-plus-BvULhXve.js} +1 -1
  71. package/dist/webdist/assets/{ganttDiagram-PKOTCBZU-BU1NVhpe.js → ganttDiagram-PKOTCBZU-P2ujOmDN.js} +1 -1
  72. package/dist/webdist/assets/{git-branch-CZ9MmZFb.js → git-branch-BMQV1Eoo.js} +1 -1
  73. package/dist/webdist/assets/{gitGraphDiagram-DS77QQ5N-CcL-ug-a.js → gitGraphDiagram-DS77QQ5N-9ZuOYAew.js} +1 -1
  74. package/dist/webdist/assets/{index-BgulNYpG.js → index-DRZzRh8I.js} +10 -10
  75. package/dist/webdist/assets/{index-Cx7COERb.js → index-jODMYltd.js} +1 -1
  76. package/dist/webdist/assets/index-jjD6-DKX.css +1 -0
  77. package/dist/webdist/assets/{infoDiagram-6WML65LV-BC-1EBgz.js → infoDiagram-6WML65LV-B0oOAcZ5.js} +1 -1
  78. package/dist/webdist/assets/{ishikawaDiagram-WSZJBQD7-GhjTdjOb.js → ishikawaDiagram-WSZJBQD7-C1z7dwL9.js} +4 -4
  79. package/dist/webdist/assets/{journeyDiagram-NVQOT4AX-B2vSQHW_.js → journeyDiagram-NVQOT4AX-DX2iwVzj.js} +1 -1
  80. package/dist/webdist/assets/{kanban-definition-27J2QSJJ-BnIqm05v.js → kanban-definition-27J2QSJJ-MS_XBVwt.js} +8 -8
  81. package/dist/webdist/assets/{linear-are_XCSp.js → linear-9EuaFWzG.js} +1 -1
  82. package/dist/webdist/assets/{lock-DOK52bNq.js → lock-CwFkt95D.js} +1 -1
  83. package/dist/webdist/assets/{mermaid.core-CR7ptkEZ.js → mermaid.core-DsEshkc5.js} +5 -5
  84. package/dist/webdist/assets/{mindmap-definition-FAOFIHXS-BHxebqeh.js → mindmap-definition-FAOFIHXS-BrK5pDF4.js} +1 -1
  85. package/dist/webdist/assets/{monitor-Dt5Ru2xZ.js → monitor-DcNUwU1K.js} +1 -1
  86. package/dist/webdist/assets/{pegDiagram-VL7TDLO6-BQ5Ca2hG.js → pegDiagram-VL7TDLO6-CDLleNta.js} +1 -1
  87. package/dist/webdist/assets/{pencil-CH8Hr8E3.js → pencil-C4iQOpgc.js} +1 -1
  88. package/dist/webdist/assets/personas-3m0q0AiZ.js +109 -0
  89. package/dist/webdist/assets/pieDiagram-7S7Q4E2Y-BJlv6KM2.js +39 -0
  90. package/dist/webdist/assets/{quadrantDiagram-CIZ2JOQS-BMcM-HmJ.js → quadrantDiagram-CIZ2JOQS-C1gwpXVO.js} +1 -1
  91. package/dist/webdist/assets/{radix-Dr6k323W.js → radix-BhMTW0nu.js} +1 -1
  92. package/dist/webdist/assets/{railroadDiagram-AXF67PYL-CScIXm39.js → railroadDiagram-AXF67PYL-nngwWCQp.js} +1 -1
  93. package/dist/webdist/assets/{refresh-cw-B7Jn8FQQ.js → refresh-cw-Bn2nBksC.js} +1 -1
  94. package/dist/webdist/assets/{remote-failure-D02-Qz17.js → remote-failure-jYHkUgHs.js} +1 -1
  95. package/dist/webdist/assets/{requirementDiagram-LRYGKXZP-BOWjiS08.js → requirementDiagram-LRYGKXZP-Y-PeM7-r.js} +1 -1
  96. package/dist/webdist/assets/{rocket-bz4PERJI.js → rocket-DGrWcprG.js} +1 -1
  97. package/dist/webdist/assets/{rotate-ccw-BQSKwfxQ.js → rotate-ccw-D4vhApcg.js} +1 -1
  98. package/dist/webdist/assets/{sankeyDiagram-W5VNT64P-C1fy2KmI.js → sankeyDiagram-W5VNT64P-B8nJ4yLi.js} +1 -1
  99. package/dist/webdist/assets/{sequenceDiagram-SI44F4Z6-CUce2Nmx.js → sequenceDiagram-SI44F4Z6-DBAJ-1WL.js} +1 -1
  100. package/dist/webdist/assets/sheet-DUfI5KUY.js +1 -0
  101. package/dist/webdist/assets/{sizeCapture-X5ZJPWSS-Do8gYr4s.js → sizeCapture-X5ZJPWSS-NPaGO72S.js} +1 -1
  102. package/dist/webdist/assets/skeleton-BscnHwe0.js +1 -0
  103. package/dist/webdist/assets/{sliders-horizontal-B65_miAJ.js → sliders-horizontal-Ad_TM776.js} +1 -1
  104. package/dist/webdist/assets/{sparkles-D5BySk1L.js → sparkles-BmmyzYKJ.js} +1 -1
  105. package/dist/webdist/assets/{star-gDhncBNW.js → star-DuwMnlui.js} +1 -1
  106. package/dist/webdist/assets/stateDiagram-OKZ733FA-B4r14qk_.js +1 -0
  107. package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-UJd0HPyU.js +1 -0
  108. package/dist/webdist/assets/{swimlanes-SLNWSIFB-DUQC8WqG.js → swimlanes-SLNWSIFB-Y0bnACb6.js} +2 -2
  109. package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-bjFfMuvz.js +8 -0
  110. package/dist/webdist/assets/{switch-Cj1Na-eN.js → switch-Dq0BXsMd.js} +1 -1
  111. package/dist/webdist/assets/{terminal-pWu2qk8h.js → terminal-CQ80Bs_v.js} +1 -1
  112. package/dist/webdist/assets/{timeline-definition-Z64GVDOM-y2fizDmT.js → timeline-definition-Z64GVDOM-ikXMcDZb.js} +1 -1
  113. package/dist/webdist/assets/{trash-2-BczQb4TK.js → trash-2-DlCrDcbC.js} +1 -1
  114. package/dist/webdist/assets/{triangle-alert-B4-Qf1AC.js → triangle-alert-BKR5vNTt.js} +1 -1
  115. package/dist/webdist/assets/{vennDiagram-T6HMQDX7-Dmx8Uh-S.js → vennDiagram-T6HMQDX7-BtVjPxY-.js} +1 -1
  116. package/dist/webdist/assets/{wardleyDiagram-T6FBY63Y-C9Fob2YW.js → wardleyDiagram-T6FBY63Y-D9Hl5cAG.js} +1 -1
  117. package/dist/webdist/assets/wrench-C3cJ5YjD.js +1 -0
  118. package/dist/webdist/assets/{xychartDiagram-ELKLHX3M-TsEHKCX0.js → xychartDiagram-ELKLHX3M-BAGx-qub.js} +1 -1
  119. package/dist/webdist/index.html +3 -3
  120. package/package.json +1 -1
  121. package/dist/webdist/assets/CodeComposer-NwJXV-sS.js +0 -1
  122. package/dist/webdist/assets/CodeHomeScreen-DxYMMclP.js +0 -1
  123. package/dist/webdist/assets/CustomizeScreen-BMrb1z3q.js +0 -4
  124. package/dist/webdist/assets/DeveloperScreen-pWGlvGUQ.js +0 -1
  125. package/dist/webdist/assets/EnginesScreen-CUF3ct2C.js +0 -8
  126. package/dist/webdist/assets/HardwareSection-CFYmYeI_.js +0 -1
  127. package/dist/webdist/assets/ModelDetailDialog-CX9Nwgko.js +0 -1
  128. package/dist/webdist/assets/ModelLoadMenu-CpTSQyrz.js +0 -1
  129. package/dist/webdist/assets/MonitorScreen-CcWi0WA5.js +0 -2
  130. package/dist/webdist/assets/OnboardingScreen-BJsWdk3r.js +0 -1
  131. package/dist/webdist/assets/RoutineEditPage-BlNJkZLy.js +0 -1
  132. package/dist/webdist/assets/RoutinesPanel-dMiytZym.js +0 -1
  133. package/dist/webdist/assets/SettingsScreen-4-vbStcH.js +0 -2
  134. package/dist/webdist/assets/TokensScreen-DUgZza1M.js +0 -1
  135. package/dist/webdist/assets/WorkspaceScreen-DFgY3aJv.js +0 -1
  136. package/dist/webdist/assets/arc-DqmuRpYc.js +0 -1
  137. package/dist/webdist/assets/arrow-left-BkV1B6ug.js +0 -1
  138. package/dist/webdist/assets/badge-4b8OsMEX.js +0 -1
  139. package/dist/webdist/assets/bot-BK-6NRqy.js +0 -1
  140. package/dist/webdist/assets/channel-CY9E1Kb4.js +0 -1
  141. package/dist/webdist/assets/classDiagram-JCYQIIEL-P_ZoCHhi.js +0 -1
  142. package/dist/webdist/assets/classDiagram-v2-OCEON4UE-P_ZoCHhi.js +0 -1
  143. package/dist/webdist/assets/collapsible-CNfR4Moz.js +0 -1
  144. package/dist/webdist/assets/index-CCx71xgV.css +0 -1
  145. package/dist/webdist/assets/link-queries-CHljIqX5.js +0 -1
  146. package/dist/webdist/assets/personas-D9neeRkw.js +0 -109
  147. package/dist/webdist/assets/pieDiagram-7S7Q4E2Y-CHfF2sPP.js +0 -39
  148. package/dist/webdist/assets/plus-D_ggg7WE.js +0 -1
  149. package/dist/webdist/assets/search-Je8bpSwy.js +0 -1
  150. package/dist/webdist/assets/skeleton-B8GrdksY.js +0 -1
  151. package/dist/webdist/assets/stateDiagram-OKZ733FA-O2JTTQeQ.js +0 -1
  152. package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-DgY0HcET.js +0 -1
  153. package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-CI9ngVuS.js +0 -8
  154. package/dist/webdist/assets/use-engine-log-kaqJp0Mi.js +0 -1
  155. package/dist/webdist/assets/wrench-84EHyYx6.js +0 -1
package/README.md CHANGED
@@ -439,6 +439,11 @@ connected); **Remove** undoes it.
439
439
  and percentages — pulled from `nvidia-smi`, WDDM counters, `rocm-smi`, AMD sysfs, `ioreg`,
440
440
  or `/proc` on Linux. Clicking the bar opens detailed gauges and sparklines in Settings → System.
441
441
  Toggle it off entirely from Settings → General.
442
+ - **Engines → Monitor** puts the live engine log and those same hardware gauges on one
443
+ always-visible split screen, plus a second, LM Studio-style **developer request log**: every
444
+ completion the daemon serves — external API clients, Code sessions, in-app Chat — with
445
+ sampling params, timings, token counts, and (opt-in, off by default) full prompt/response
446
+ text. In-memory only; never written to disk or sent anywhere.
442
447
 
443
448
  </details>
444
449
 
@@ -252,6 +252,98 @@ async function proxyStream(remote, path, init, signal, fetchImpl = fetch) {
252
252
  return fetchImpl(buildUpstream(remote, path), { ...init, signal });
253
253
  }
254
254
 
255
+ // src/observability/request-log.ts
256
+ import { randomUUID as randomUUID2 } from "crypto";
257
+ function requestLogConfig(d) {
258
+ return d.store.snapshot().requestLog ?? { enabled: false, captureBodies: false, maxEntries: 500 };
259
+ }
260
+ var PARAM_KEYS = [
261
+ "temperature",
262
+ "top_p",
263
+ "top_k",
264
+ "min_p",
265
+ "max_tokens",
266
+ "max_completion_tokens",
267
+ "presence_penalty",
268
+ "frequency_penalty",
269
+ "repeat_penalty",
270
+ "seed",
271
+ "stop",
272
+ "reasoning_effort",
273
+ "response_format",
274
+ "tool_choice",
275
+ "n",
276
+ "logprobs"
277
+ ];
278
+ function extractParams(body) {
279
+ const out = {};
280
+ if (!body) return out;
281
+ for (const key of PARAM_KEYS) {
282
+ if (body[key] !== void 0) out[key] = body[key];
283
+ }
284
+ return out;
285
+ }
286
+ function summarizeRequest(body) {
287
+ const messages = Array.isArray(body?.messages) ? body.messages : [];
288
+ const tools = Array.isArray(body?.tools) ? body.tools : [];
289
+ let systemChars = 0;
290
+ for (const m of messages) {
291
+ const msg = m;
292
+ if (msg?.role === "system" && typeof msg.content === "string") systemChars += msg.content.length;
293
+ }
294
+ return { messages: messages.length, tools: tools.length, systemChars };
295
+ }
296
+ var DEFAULT_MAX_BYTES = 32 * 1024 * 1024;
297
+ async function drainOpenAiSseForLog(body, opts = { captureBody: false }) {
298
+ const reader = body.getReader();
299
+ const dec = new TextDecoder();
300
+ let buf = "";
301
+ let promptTokens = 0;
302
+ let completionTokens = 0;
303
+ let promptTps = null;
304
+ let genTps = null;
305
+ let ttftMs = null;
306
+ let finishReason = null;
307
+ let responseText = "";
308
+ for (; ; ) {
309
+ const { done, value } = await reader.read();
310
+ if (done) break;
311
+ buf += dec.decode(value, { stream: true });
312
+ const lines = buf.split("\n");
313
+ buf = lines.pop() ?? "";
314
+ for (const line of lines) {
315
+ if (!line.startsWith("data: ")) continue;
316
+ const raw = line.slice(6).trim();
317
+ if (raw === "[DONE]") continue;
318
+ let chunk;
319
+ try {
320
+ chunk = JSON.parse(raw);
321
+ } catch {
322
+ continue;
323
+ }
324
+ const usage = chunk.usage;
325
+ if (usage) {
326
+ if (usage.prompt_tokens) promptTokens = usage.prompt_tokens;
327
+ if (usage.completion_tokens) completionTokens = usage.completion_tokens;
328
+ }
329
+ const timings = chunk.timings;
330
+ if (timings) {
331
+ if (timings.prompt_per_second) promptTps = timings.prompt_per_second;
332
+ if (timings.predicted_per_second) genTps = timings.predicted_per_second;
333
+ }
334
+ const delta = chunk.choices?.[0]?.delta;
335
+ if (delta && (delta.content || delta.reasoning_content)) {
336
+ if (ttftMs === null && opts.startedAt !== void 0) ttftMs = Date.now() - opts.startedAt;
337
+ if (opts.captureBody && delta.content) responseText += delta.content;
338
+ }
339
+ const reason = chunk.choices?.[0]?.finish_reason;
340
+ if (reason) finishReason = reason;
341
+ opts.onChunk?.(chunk);
342
+ }
343
+ }
344
+ return { promptTokens, completionTokens, promptTps, genTps, ttftMs, finishReason, responseText };
345
+ }
346
+
255
347
  // src/chat/chat-upstream.ts
256
348
  var DEFAULT_CTX = 4096;
257
349
  function resolveChatUpstream(d, requestedModel) {
@@ -293,9 +385,9 @@ function resolveChatUpstream(d, requestedModel) {
293
385
  }
294
386
  };
295
387
  }
296
- function callChatUpstream(upstream, body, signal, fetchImpl = fetch) {
388
+ function callChatUpstream(upstream, body, signal, fetchImpl = fetch, d) {
297
389
  const payload = JSON.stringify(body);
298
- if (upstream.remote) {
390
+ const call = upstream.remote ? (() => {
299
391
  const headers = linkHeaders(upstream.remote);
300
392
  headers.set("content-type", "application/json");
301
393
  return proxyStream(
@@ -305,8 +397,7 @@ function callChatUpstream(upstream, body, signal, fetchImpl = fetch) {
305
397
  signal,
306
398
  fetchImpl
307
399
  );
308
- }
309
- return fetchImpl(`${upstream.target}/v1/chat/completions`, {
400
+ }) : () => fetchImpl(`${upstream.target}/v1/chat/completions`, {
310
401
  method: "POST",
311
402
  headers: { "Content-Type": "application/json" },
312
403
  body: payload,
@@ -315,10 +406,74 @@ function callChatUpstream(upstream, body, signal, fetchImpl = fetch) {
315
406
  // string body and preserved from the call sites this replaced.
316
407
  duplex: "half"
317
408
  });
409
+ if (!d?.requestLog || upstream.remote) return call();
410
+ const rlCfg = requestLogConfig(d);
411
+ if (!rlCfg.enabled) return call();
412
+ const reqBody = body;
413
+ const captureBody = !!rlCfg.captureBodies;
414
+ const logId = d.requestLog.start({
415
+ source: "chat",
416
+ harness: null,
417
+ codeSessionId: null,
418
+ modelKey: upstream.modelField || null,
419
+ remote: null,
420
+ stream: reqBody?.stream === true,
421
+ params: extractParams(reqBody),
422
+ counts: summarizeRequest(reqBody),
423
+ ...captureBody ? { requestBody: payload } : {}
424
+ });
425
+ const startedAt = Date.now();
426
+ return call().then(
427
+ (res) => {
428
+ if (!res.ok || !res.body) {
429
+ d.requestLog.finalize(logId, { status: res.status, error: { code: "engine_error", message: `Engine returned HTTP ${res.status}.` }, durationMs: Date.now() - startedAt });
430
+ return res;
431
+ }
432
+ const [a, b] = res.body.tee();
433
+ const drain = reqBody?.stream === true ? drainOpenAiSseForLog(b, { captureBody, startedAt }).then((r) => {
434
+ d.requestLog.finalize(logId, {
435
+ status: res.status,
436
+ promptTokens: r.promptTokens,
437
+ completionTokens: r.completionTokens,
438
+ promptTps: r.promptTps,
439
+ genTps: r.genTps,
440
+ ttftMs: r.ttftMs,
441
+ finishReason: r.finishReason,
442
+ durationMs: Date.now() - startedAt,
443
+ responseBody: captureBody ? JSON.stringify({ content: r.responseText }) : void 0
444
+ });
445
+ }) : new Response(b).text().then((text) => {
446
+ let usage;
447
+ let finishReason = null;
448
+ try {
449
+ const oai = JSON.parse(text);
450
+ usage = oai.usage;
451
+ finishReason = oai.choices?.[0]?.finish_reason ?? null;
452
+ } catch {
453
+ }
454
+ d.requestLog.finalize(logId, {
455
+ status: res.status,
456
+ promptTokens: usage?.prompt_tokens,
457
+ completionTokens: usage?.completion_tokens,
458
+ finishReason,
459
+ durationMs: Date.now() - startedAt,
460
+ responseBody: captureBody ? text : void 0
461
+ });
462
+ });
463
+ drain.catch(() => {
464
+ d.requestLog.finalize(logId, { status: res.status, error: { code: "drain_error", message: "Failed to read the response for the request log." }, durationMs: Date.now() - startedAt });
465
+ });
466
+ return new Response(a, { status: res.status, headers: res.headers });
467
+ },
468
+ (e) => {
469
+ d.requestLog.finalize(logId, { status: null, error: { code: "engine_unreachable", message: e?.message || "Engine unreachable." }, durationMs: Date.now() - startedAt });
470
+ throw e;
471
+ }
472
+ );
318
473
  }
319
474
 
320
475
  // src/auth.ts
321
- import { createHash, randomBytes, randomUUID as randomUUID2 } from "crypto";
476
+ import { createHash, randomBytes, randomUUID as randomUUID3 } from "crypto";
322
477
  import { getConnInfo } from "@hono/node-server/conninfo";
323
478
 
324
479
  // src/engines/download.ts
@@ -1392,7 +1547,7 @@ async function autoTitle(d, convId, prevMessages, assistantReply, upstream) {
1392
1547
  max_tokens: 32,
1393
1548
  thinking_budget_tokens: 0,
1394
1549
  chat_template_kwargs: { enable_thinking: false }
1395
- }, AbortSignal.timeout(2e4));
1550
+ }, AbortSignal.timeout(2e4), void 0, d);
1396
1551
  } finally {
1397
1552
  release?.();
1398
1553
  }