@cartanova/qgrid-cli 2.10.9 → 2.11.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 (318) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
  2. package/bundle/dist/application/monit/log-buffer.js +12 -6
  3. package/bundle/dist/application/monit/monit.frame.js +11 -3
  4. package/bundle/dist/application/monit/monit.types.js +1 -1
  5. package/bundle/dist/application/qgrid/conv-routing.js +9 -6
  6. package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
  7. package/bundle/dist/application/qgrid/oauth.js +31 -4
  8. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
  9. package/bundle/dist/application/qgrid/qgrid-response-format.js +22 -20
  10. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +43 -34
  11. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
  12. package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
  13. package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
  14. package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
  15. package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
  16. package/bundle/dist/application/qgrid/token-death.js +1 -1
  17. package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
  18. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
  19. package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
  20. package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
  21. package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
  22. package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
  23. package/bundle/dist/application/request-log/request-log.model.js +83 -69
  24. package/bundle/dist/application/request-log/request-log.types.js +8 -2
  25. package/bundle/dist/application/request-log/zod-code-format.js +1 -1
  26. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  27. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
  28. package/bundle/dist/application/setting/setting.constant.js +1 -1
  29. package/bundle/dist/application/setting/setting.model.js +2 -2
  30. package/bundle/dist/application/setting/setting.store.js +2 -2
  31. package/bundle/dist/application/setting/setting.types.js +1 -1
  32. package/bundle/dist/application/sonamu.generated.js +40 -16
  33. package/bundle/dist/application/sonamu.generated.sso.js +2 -1
  34. package/bundle/dist/application/token/token.model.js +26 -9
  35. package/bundle/dist/application/token/token.types.js +20 -3
  36. package/bundle/dist/i18n/en.js +15 -1
  37. package/bundle/dist/i18n/ko.js +15 -1
  38. package/bundle/dist/i18n/sd.generated.js +2 -1
  39. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
  40. package/bundle/dist/migrations/20261018215031_alter_request_logs_add1_alter1.js +15 -0
  41. package/bundle/dist/server-bootstrap.js +4 -2
  42. package/bundle/dist/server-error-handler.js +1 -1
  43. package/bundle/dist/sonamu.config.js +37 -8
  44. package/bundle/dist/startup-migrations.js +17 -7
  45. package/bundle/dist/testing/global.js +1 -1
  46. package/bundle/dist/testing/schema-bench.js +0 -0
  47. package/bundle/dist/testing/test-database-name.js +1 -1
  48. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  49. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
  50. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
  51. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  52. package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
  53. package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
  54. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
  55. package/bundle/dist/utils/providers/common/credentials.js +5 -1
  56. package/bundle/dist/utils/providers/common/effort.js +3 -3
  57. package/bundle/dist/utils/providers/common/model-cost.js +69 -14
  58. package/bundle/dist/utils/providers/common/provider-types.js +29 -1
  59. package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
  60. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
  61. package/bundle/dist/utils/providers/common/strictifier.js +62 -43
  62. package/bundle/dist/utils/providers/common/thinking.js +3 -2
  63. package/bundle/dist/utils/providers/common/ttft.js +1 -1
  64. package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
  65. package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
  66. package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
  67. package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
  68. package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
  69. package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
  70. package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
  71. package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
  72. package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
  73. package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
  74. package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
  75. package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
  76. package/bundle/dist/utils/providers/grok/index.js +11 -0
  77. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
  78. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
  79. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
  80. package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
  81. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
  82. package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
  83. package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
  84. package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
  85. package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
  86. package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
  87. package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
  88. package/bundle/dist/utils/quiet-hours.js +1 -1
  89. package/bundle/dist/utils/slack-notify.js +14 -8
  90. package/bundle/dist/utils/subset-loaders.js +4 -5
  91. package/bundle/src/application/monit/log-buffer.ts +23 -9
  92. package/bundle/src/application/monit/monit.frame.ts +22 -5
  93. package/bundle/src/application/monit/monit.types.ts +6 -0
  94. package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
  95. package/bundle/src/application/qgrid/conv-routing.ts +35 -9
  96. package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
  97. package/bundle/src/application/qgrid/oauth.ts +51 -15
  98. package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
  99. package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
  100. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +33 -0
  101. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +87 -40
  102. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
  103. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
  104. package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
  105. package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
  106. package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
  107. package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
  108. package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
  109. package/bundle/src/application/qgrid/token-death.ts +4 -0
  110. package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
  111. package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
  112. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
  113. package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
  114. package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
  115. package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
  116. package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
  117. package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
  118. package/bundle/src/application/request-log/request-log.entity.json +8 -0
  119. package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
  120. package/bundle/src/application/request-log/request-log.model.ts +279 -145
  121. package/bundle/src/application/request-log/request-log.types.ts +17 -0
  122. package/bundle/src/application/request-log/zod-code-format.ts +11 -0
  123. package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
  124. package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
  125. package/bundle/src/application/setting/setting.constant.ts +9 -0
  126. package/bundle/src/application/setting/setting.model.ts +12 -2
  127. package/bundle/src/application/setting/setting.store.ts +5 -1
  128. package/bundle/src/application/setting/setting.types.ts +8 -0
  129. package/bundle/src/application/sonamu.generated.http +135 -0
  130. package/bundle/src/application/sonamu.generated.sso.ts +3 -0
  131. package/bundle/src/application/sonamu.generated.ts +29 -0
  132. package/bundle/src/application/token/token.identity.test.ts +20 -0
  133. package/bundle/src/application/token/token.model.ts +66 -7
  134. package/bundle/src/application/token/token.types.ts +24 -1
  135. package/bundle/src/i18n/en.ts +19 -0
  136. package/bundle/src/i18n/ko.ts +21 -0
  137. package/bundle/src/i18n/sd.generated.ts +24 -2
  138. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
  139. package/bundle/src/migrations/20261018215031_alter_request_logs_add1_alter1.ts +15 -0
  140. package/bundle/src/server-bootstrap.ts +4 -2
  141. package/bundle/src/server-error-handler.ts +1 -0
  142. package/bundle/src/sonamu.config.ts +69 -7
  143. package/bundle/src/startup-migrations.ts +27 -9
  144. package/bundle/src/testing/global.ts +20 -0
  145. package/bundle/src/testing/schema-bench.ts +105 -30
  146. package/bundle/src/testing/test-database-name.ts +2 -0
  147. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
  148. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
  149. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
  150. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
  151. package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
  152. package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
  153. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
  154. package/bundle/src/utils/providers/common/credentials.ts +8 -0
  155. package/bundle/src/utils/providers/common/effort.ts +9 -2
  156. package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
  157. package/bundle/src/utils/providers/common/model-cost.ts +259 -158
  158. package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
  159. package/bundle/src/utils/providers/common/provider-types.ts +46 -3
  160. package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
  161. package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
  162. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
  163. package/bundle/src/utils/providers/common/strictifier.ts +185 -59
  164. package/bundle/src/utils/providers/common/thinking.ts +2 -2
  165. package/bundle/src/utils/providers/common/ttft.ts +4 -2
  166. package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
  167. package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
  168. package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
  169. package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
  170. package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
  171. package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
  172. package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
  173. package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
  174. package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
  175. package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
  176. package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
  177. package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
  178. package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
  179. package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
  180. package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
  181. package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
  182. package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
  183. package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
  184. package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
  185. package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
  186. package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
  187. package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
  188. package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
  189. package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
  190. package/bundle/src/utils/providers/grok/index.ts +20 -0
  191. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
  192. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
  193. package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
  194. package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
  195. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
  196. package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
  197. package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
  198. package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
  199. package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
  200. package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
  201. package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
  202. package/bundle/src/utils/quiet-hours.ts +12 -1
  203. package/bundle/src/utils/slack-notify.ts +44 -13
  204. package/bundle/src/utils/subset-loaders.ts +7 -7
  205. package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
  206. package/bundle/web-dist/client/assets/index-BA7uQ-6c.js +31 -0
  207. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  208. package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
  209. package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
  210. package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
  211. package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
  212. package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
  213. package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
  214. package/bundle/web-dist/client/assets/{services.generated-BsieU37H.js → services.generated-CefiDXEv.js} +5 -5
  215. package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
  216. package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
  217. package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
  218. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  219. package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
  220. package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
  221. package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
  222. package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
  223. package/bundle/web-dist/client/index.html +6 -6
  224. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  225. package/bundle/web-dist/server/assets/{lazyRouteComponent-Dtd0NR4r.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
  226. package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
  227. package/bundle/web-dist/server/assets/{monit-DvzribSE.js → monit-B2hqorPe.js} +385 -126
  228. package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
  229. package/bundle/web-dist/server/assets/{react-dom-B4a6-uuR.js → react-dom-BIYQzBqG.js} +2 -129
  230. package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
  231. package/bundle/web-dist/server/assets/{request-model-CbqfnQOJ.js → request-model-I6OdODSH.js} +15 -6
  232. package/bundle/web-dist/server/assets/{routes-BAPWTizT.js → routes-B95YlUv2.js} +760 -213
  233. package/bundle/web-dist/server/assets/{services.generated-CEbGjsI0.js → services.generated-DQATJ6qf.js} +12821 -12194
  234. package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
  235. package/bundle/web-dist/server/assets/{show-CxVZTAdv.js → show-Bxaj3rhH.js} +1355 -419
  236. package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
  237. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  238. package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
  239. package/bundle/web-dist/server/assets/{use-update-token-mutation-CfYmk_4_.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
  240. package/bundle/web-dist/server/entry-server.generated.js +4303 -22810
  241. package/dist/cli.js +9 -9
  242. package/package.json +4 -11
  243. package/postinstall.mjs +12 -0
  244. package/skills/qgrid/SKILL.md +1 -0
  245. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  246. package/skills/qgrid/references/decision-rationale.md +24 -1
  247. package/skills/qgrid/references/grok-runtime.md +89 -0
  248. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  249. package/skills/qgrid/references/repo-map.md +10 -0
  250. package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
  251. package/skills/qgrid/references/sonamu-api-web-flow.md +1 -1
  252. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  253. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  254. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  255. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  256. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  257. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  258. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  259. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  260. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  262. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  263. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  264. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  265. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  266. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  267. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  268. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  269. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  270. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  271. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  272. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  273. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  274. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  275. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  276. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  277. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  278. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  279. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  280. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  281. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  282. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
  283. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
  284. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
  285. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
  286. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
  287. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
  288. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
  289. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
  290. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
  291. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
  292. package/bundle/dist/testing/setup-mocks.js +0 -16
  293. package/bundle/src/testing/setup-mocks.ts +0 -44
  294. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  295. package/bundle/web-dist/client/assets/index-CrXKu_J8.js +0 -106
  296. package/bundle/web-dist/client/assets/logs-B2SmWJXA.js +0 -1
  297. package/bundle/web-dist/client/assets/monit-D-JwXXoA.js +0 -1
  298. package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
  299. package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
  300. package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
  301. package/bundle/web-dist/client/assets/routes-C5r4gTvY.js +0 -5
  302. package/bundle/web-dist/client/assets/settings-D3tDSAck.js +0 -1
  303. package/bundle/web-dist/client/assets/show-Cah_kUKC.js +0 -2
  304. package/bundle/web-dist/client/assets/tokens-DU2Iyxxd.js +0 -1
  305. package/bundle/web-dist/client/assets/use-oauth-login-flow-D0UaR9_e.js +0 -1
  306. package/bundle/web-dist/client/assets/use-update-token-mutation-DAq0F8p-.js +0 -1
  307. package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
  308. package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
  309. package/bundle/web-dist/server/assets/logs-l91avYif.js +0 -509
  310. package/bundle/web-dist/server/assets/plus-KZrECewT.js +0 -19
  311. package/bundle/web-dist/server/assets/refresh-cw-BND93JrF.js +0 -23
  312. package/bundle/web-dist/server/assets/settings-BZR5HSAL.js +0 -461
  313. package/bundle/web-dist/server/assets/tokens-D1hb4eKk.js +0 -448
  314. package/bundle/web-dist/server/assets/use-oauth-login-flow-Cvdy0zF8.js +0 -178
  315. package/dist/cli.d.ts +0 -10
  316. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  317. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  318. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -0,0 +1,825 @@
1
+ import { F as require_react, T as string, k as require_jsx_dev_runtime, n as QgridService, o as TokenService, r as RequestLogService, w as object } from "./services.generated-DQATJ6qf.js";
2
+ import { a as Link, o as useNavigate } from "./lazyRouteComponent-D8iTIHyn.js";
3
+ import { i as RequestLogOrderBy, n as Route, r as RequestLogBaseListParams } from "../entry-server.generated.js";
4
+ import { i as formatUsd, r as formatRequestCost, t as cacheHitRate } from "./cost-BC9yzyA9.js";
5
+ import { n as unpricedRequestTitle, t as unpricedRequestLabel } from "./total-cost-fTE9Xy82.js";
6
+ import { t as lucideRefreshCw } from "./refresh-cw-mMBkwOq0.js";
7
+ import { n as lucideZap, t as requestModelDisplay } from "./request-model-I6OdODSH.js";
8
+ require_react();
9
+ var import_jsx_dev_runtime = require_jsx_dev_runtime();
10
+ var _jsxFileName$3 = "~icons/lucide/chevron-left.jsx";
11
+ var lucideChevronLeft = (props) => /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("svg", {
12
+ viewBox: "0 0 24 24",
13
+ width: "1.2em",
14
+ height: "1.2em",
15
+ ...props,
16
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("path", {
17
+ fill: "none",
18
+ stroke: "currentColor",
19
+ strokeLinecap: "round",
20
+ strokeLinejoin: "round",
21
+ strokeWidth: 2,
22
+ d: "m15 18l-6-6l6-6"
23
+ }, void 0, false, {
24
+ fileName: _jsxFileName$3,
25
+ lineNumber: 2,
26
+ columnNumber: 101
27
+ }, void 0)
28
+ }, void 0, false, {
29
+ fileName: _jsxFileName$3,
30
+ lineNumber: 2,
31
+ columnNumber: 36
32
+ }, void 0);
33
+ //#endregion
34
+ //#region ~icons/lucide/chevron-right.jsx
35
+ var _jsxFileName$2 = "~icons/lucide/chevron-right.jsx";
36
+ var lucideChevronRight = (props) => /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("svg", {
37
+ viewBox: "0 0 24 24",
38
+ width: "1.2em",
39
+ height: "1.2em",
40
+ ...props,
41
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("path", {
42
+ fill: "none",
43
+ stroke: "currentColor",
44
+ strokeLinecap: "round",
45
+ strokeLinejoin: "round",
46
+ strokeWidth: 2,
47
+ d: "m9 18l6-6l-6-6"
48
+ }, void 0, false, {
49
+ fileName: _jsxFileName$2,
50
+ lineNumber: 2,
51
+ columnNumber: 102
52
+ }, void 0)
53
+ }, void 0, false, {
54
+ fileName: _jsxFileName$2,
55
+ lineNumber: 2,
56
+ columnNumber: 37
57
+ }, void 0);
58
+ //#endregion
59
+ //#region src/components/qgrid/RequestLogTable.tsx
60
+ var _jsxFileName$1 = "/home/runner/work/qgrid/qgrid/packages/web/src/components/qgrid/RequestLogTable.tsx";
61
+ var PAGE_SIZE = 50;
62
+ var UNASSIGNED = "__unassigned__";
63
+ function formatDateTime(value) {
64
+ const d = new Date(value);
65
+ return `${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")} ${String(d.getHours()).padStart(2, "0")}:${String(d.getMinutes()).padStart(2, "0")}`;
66
+ }
67
+ function formatNum(n) {
68
+ return n.toLocaleString();
69
+ }
70
+ function formatDuration(ms) {
71
+ const total = Math.round(ms / 1e3);
72
+ const m = Math.floor(total / 60);
73
+ const s = total % 60;
74
+ return m > 0 ? `${m}m ${s}s` : `${s}s`;
75
+ }
76
+ function RequestModel({ status, requestedModel, servedModel, imageCostMethod, fallbackCount }) {
77
+ if (status === "running") return /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
78
+ className: "text-[9px] px-1.5 py-0.5 rounded-full bg-blue-100 text-blue-600 font-medium whitespace-nowrap",
79
+ children: "실행 중"
80
+ }, void 0, false, {
81
+ fileName: _jsxFileName$1,
82
+ lineNumber: 56,
83
+ columnNumber: 7
84
+ }, this);
85
+ const modelDisplay = requestModelDisplay({
86
+ status,
87
+ requestedModel,
88
+ servedModel,
89
+ imageCostMethod
90
+ });
91
+ const hasRequestedOnly = requestedModel !== null && servedModel === null;
92
+ return /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)(import_jsx_dev_runtime.Fragment, { children: [
93
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
94
+ className: "text-xs text-sand-500",
95
+ children: modelDisplay.label
96
+ }, void 0, false, {
97
+ fileName: _jsxFileName$1,
98
+ lineNumber: 73,
99
+ columnNumber: 7
100
+ }, this),
101
+ hasRequestedOnly && /* @__PURE__ */ (void 0)("span", {
102
+ className: "ml-1 text-[9px] text-sand-400",
103
+ children: "요청"
104
+ }, void 0, false, {
105
+ fileName: _jsxFileName$1,
106
+ lineNumber: 74,
107
+ columnNumber: 28
108
+ }, this),
109
+ (fallbackCount ?? 0) > 0 && /* @__PURE__ */ (void 0)("span", {
110
+ className: "ml-1 text-[9px] text-caution-500",
111
+ children: ["×", fallbackCount]
112
+ }, void 0, true, {
113
+ fileName: _jsxFileName$1,
114
+ lineNumber: 76,
115
+ columnNumber: 9
116
+ }, this)
117
+ ] }, void 0, true);
118
+ }
119
+ function formatTtft(ms) {
120
+ if (ms <= 0) return "—";
121
+ return ms >= 1e3 ? `${(ms / 1e3).toFixed(1)}s` : `${ms}ms`;
122
+ }
123
+ var COLUMNS = [
124
+ {
125
+ label: "ID",
126
+ align: "left",
127
+ width: "w-12",
128
+ sortKey: "id"
129
+ },
130
+ {
131
+ label: "Date",
132
+ align: "left",
133
+ width: "w-20",
134
+ sortKey: "created_at"
135
+ },
136
+ {
137
+ label: "Project",
138
+ align: "left",
139
+ width: "w-20"
140
+ },
141
+ {
142
+ label: "Token",
143
+ align: "left",
144
+ width: "w-24"
145
+ },
146
+ {
147
+ label: "Model",
148
+ align: "left",
149
+ width: "w-20"
150
+ },
151
+ {
152
+ label: "Fmt",
153
+ align: "left",
154
+ width: "w-12"
155
+ },
156
+ {
157
+ label: "TTFT",
158
+ align: "right",
159
+ width: "w-16",
160
+ sortKey: "ttft_ms"
161
+ },
162
+ {
163
+ label: "Duration",
164
+ align: "right",
165
+ width: "w-20",
166
+ sortKey: "duration_ms"
167
+ },
168
+ {
169
+ label: "In",
170
+ align: "right",
171
+ width: "w-16",
172
+ sortKey: "input_tokens"
173
+ },
174
+ {
175
+ label: "Out",
176
+ align: "right",
177
+ width: "w-20",
178
+ sortKey: "output_tokens"
179
+ },
180
+ {
181
+ label: "C.Read",
182
+ align: "right",
183
+ width: "w-20",
184
+ sortKey: "cache_read_tokens"
185
+ },
186
+ {
187
+ label: "C.Write",
188
+ align: "right",
189
+ width: "w-20",
190
+ sortKey: "cache_creation_tokens"
191
+ },
192
+ {
193
+ label: "Hit",
194
+ align: "right",
195
+ width: "w-14"
196
+ },
197
+ {
198
+ label: "Tools",
199
+ align: "right",
200
+ width: "w-14"
201
+ },
202
+ {
203
+ label: "$",
204
+ align: "right",
205
+ width: "w-20",
206
+ sortKey: "cost_usd"
207
+ }
208
+ ];
209
+ function RequestLogTable({ search, onSearchChange }) {
210
+ const navigate = useNavigate();
211
+ const page = search.page ?? 1;
212
+ const tokenFilter = search.token ?? "";
213
+ const projectFilter = search.project ?? "";
214
+ const modelFilter = search.model ?? "";
215
+ const { data: tokensData } = TokenService.useTokens("A");
216
+ const tokenNames = (tokensData?.rows ?? []).map((t) => t.name).filter(Boolean);
217
+ const { data: projectData } = QgridService.useProjectNames();
218
+ const projectNames = projectData?.names ?? [];
219
+ const { data: modelData } = QgridService.useModelNames();
220
+ const modelNames = modelData?.names ?? [];
221
+ const projectFilterParam = (() => {
222
+ if (projectFilter === UNASSIGNED) return { project_name_is_null: true };
223
+ if (projectFilter) return { project_name: projectFilter };
224
+ return {};
225
+ })();
226
+ const listFilters = {};
227
+ if (tokenFilter) listFilters.token_name = tokenFilter;
228
+ Object.assign(listFilters, projectFilterParam);
229
+ if (modelFilter) listFilters.model_name = modelFilter;
230
+ const sort = search.sort ?? "id-desc";
231
+ const separator = sort.lastIndexOf("-");
232
+ const sortColumn = sort.slice(0, separator);
233
+ const sortDirection = sort.slice(separator + 1) === "asc" ? "asc" : "desc";
234
+ const { data, isLoading, isError, refresh, isRefreshing } = RequestLogService.useRequestLogs("P", {
235
+ num: PAGE_SIZE,
236
+ page,
237
+ orderBy: sort,
238
+ ...listFilters
239
+ });
240
+ const { data: costData, isError: isCostError, refresh: refreshCost } = QgridService.useTotalCost({
241
+ num: 0,
242
+ page: 1,
243
+ ...listFilters
244
+ });
245
+ const rows = data?.rows ?? [];
246
+ const total = data?.total ?? 0;
247
+ const totalPages = Math.ceil(total / PAGE_SIZE);
248
+ const updateFilter = (patch) => {
249
+ onSearchChange({
250
+ ...search,
251
+ ...patch,
252
+ page: 1
253
+ });
254
+ };
255
+ return /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", {
256
+ className: "panel overflow-hidden",
257
+ children: [/* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", {
258
+ className: "panel-header flex items-center gap-2 px-3 py-2.5 flex-wrap sm:gap-3 sm:px-5",
259
+ children: [
260
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("select", {
261
+ value: tokenFilter,
262
+ onChange: (e) => updateFilter({ token: e.target.value || void 0 }),
263
+ disabled: tokenNames.length === 0,
264
+ className: "border border-sand-200/80 rounded-lg px-2.5 py-1.5 text-[11px] text-sand-700 bg-sand-50/50 focus:outline-none focus:border-sienna-300 disabled:text-sand-300 disabled:cursor-not-allowed",
265
+ children: [/* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("option", {
266
+ value: "",
267
+ children: tokenNames.length > 0 ? "All Tokens" : "Tokens —"
268
+ }, void 0, false, {
269
+ fileName: _jsxFileName$1,
270
+ lineNumber: 199,
271
+ columnNumber: 11
272
+ }, this), tokenNames.map((name) => /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("option", {
273
+ value: name,
274
+ children: name
275
+ }, name, false, {
276
+ fileName: _jsxFileName$1,
277
+ lineNumber: 201,
278
+ columnNumber: 13
279
+ }, this))]
280
+ }, void 0, true, {
281
+ fileName: _jsxFileName$1,
282
+ lineNumber: 193,
283
+ columnNumber: 9
284
+ }, this),
285
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("select", {
286
+ value: projectFilter,
287
+ onChange: (e) => updateFilter({ project: e.target.value || void 0 }),
288
+ className: "border border-sand-200/80 rounded-lg px-2.5 py-1.5 text-[11px] text-sand-700 bg-sand-50/50 focus:outline-none focus:border-sienna-300",
289
+ children: [
290
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("option", {
291
+ value: "",
292
+ children: "All Projects"
293
+ }, void 0, false, {
294
+ fileName: _jsxFileName$1,
295
+ lineNumber: 211,
296
+ columnNumber: 11
297
+ }, this),
298
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("option", {
299
+ value: UNASSIGNED,
300
+ children: "(unassigned)"
301
+ }, void 0, false, {
302
+ fileName: _jsxFileName$1,
303
+ lineNumber: 212,
304
+ columnNumber: 11
305
+ }, this),
306
+ projectNames.map((name) => /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("option", {
307
+ value: name,
308
+ children: name
309
+ }, name, false, {
310
+ fileName: _jsxFileName$1,
311
+ lineNumber: 214,
312
+ columnNumber: 13
313
+ }, this))
314
+ ]
315
+ }, void 0, true, {
316
+ fileName: _jsxFileName$1,
317
+ lineNumber: 206,
318
+ columnNumber: 9
319
+ }, this),
320
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("select", {
321
+ value: modelFilter,
322
+ onChange: (e) => updateFilter({ model: e.target.value || void 0 }),
323
+ disabled: modelNames.length === 0,
324
+ className: "border border-sand-200/80 rounded-lg px-2.5 py-1.5 text-[11px] text-sand-700 bg-sand-50/50 focus:outline-none focus:border-sienna-300 disabled:text-sand-300 disabled:cursor-not-allowed",
325
+ children: [/* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("option", {
326
+ value: "",
327
+ children: modelNames.length > 0 ? "All Models" : "Models —"
328
+ }, void 0, false, {
329
+ fileName: _jsxFileName$1,
330
+ lineNumber: 225,
331
+ columnNumber: 11
332
+ }, this), modelNames.map((name) => /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("option", {
333
+ value: name,
334
+ children: name
335
+ }, name, false, {
336
+ fileName: _jsxFileName$1,
337
+ lineNumber: 227,
338
+ columnNumber: 13
339
+ }, this))]
340
+ }, void 0, true, {
341
+ fileName: _jsxFileName$1,
342
+ lineNumber: 219,
343
+ columnNumber: 9
344
+ }, this),
345
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("button", {
346
+ type: "button",
347
+ onClick: () => void Promise.all([refresh(), refreshCost()]),
348
+ disabled: isRefreshing,
349
+ "aria-label": "Reload",
350
+ title: "Reload",
351
+ className: "p-1 rounded text-sand-400 hover:text-sand-600 disabled:opacity-30 transition-colors",
352
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)(lucideRefreshCw, { className: isRefreshing ? "size-3.5 animate-spin" : "size-3.5" }, void 0, false, {
353
+ fileName: _jsxFileName$1,
354
+ lineNumber: 241,
355
+ columnNumber: 11
356
+ }, this)
357
+ }, void 0, false, {
358
+ fileName: _jsxFileName$1,
359
+ lineNumber: 233,
360
+ columnNumber: 9
361
+ }, this),
362
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", { className: "flex-1" }, void 0, false, {
363
+ fileName: _jsxFileName$1,
364
+ lineNumber: 243,
365
+ columnNumber: 9
366
+ }, this),
367
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
368
+ className: "text-[11px] text-sand-400",
369
+ children: [isError || !data ? "—" : total, " results"]
370
+ }, void 0, true, {
371
+ fileName: _jsxFileName$1,
372
+ lineNumber: 244,
373
+ columnNumber: 9
374
+ }, this),
375
+ isCostError ? /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
376
+ role: "alert",
377
+ className: "text-[11px] text-danger-500",
378
+ children: "Failed to load total cost."
379
+ }, void 0, false, {
380
+ fileName: _jsxFileName$1,
381
+ lineNumber: 246,
382
+ columnNumber: 11
383
+ }, this) : /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
384
+ className: "text-[11px] tabular-nums font-medium text-sienna-600",
385
+ children: [costData ? formatUsd(costData.usd) : "—", costData && unpricedRequestLabel(costData) ? /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
386
+ className: "ml-1 font-normal text-sand-400",
387
+ title: unpricedRequestTitle(costData) ?? void 0,
388
+ children: unpricedRequestLabel(costData)
389
+ }, void 0, false, {
390
+ fileName: _jsxFileName$1,
391
+ lineNumber: 253,
392
+ columnNumber: 15
393
+ }, this) : null]
394
+ }, void 0, true, {
395
+ fileName: _jsxFileName$1,
396
+ lineNumber: 250,
397
+ columnNumber: 11
398
+ }, this)
399
+ ]
400
+ }, void 0, true, {
401
+ fileName: _jsxFileName$1,
402
+ lineNumber: 190,
403
+ columnNumber: 7
404
+ }, this), isError ? /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", {
405
+ role: "alert",
406
+ className: "text-danger-500 text-center py-12 text-sm",
407
+ children: "Failed to load request logs."
408
+ }, void 0, false, {
409
+ fileName: _jsxFileName$1,
410
+ lineNumber: 265,
411
+ columnNumber: 9
412
+ }, this) : isLoading ? /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", {
413
+ className: "space-y-2",
414
+ children: Array.from({ length: 5 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", { className: "h-8 bg-sand-100 rounded animate-pulse" }, `skel-${i}`, false, {
415
+ fileName: _jsxFileName$1,
416
+ lineNumber: 271,
417
+ columnNumber: 13
418
+ }, this))
419
+ }, void 0, false, {
420
+ fileName: _jsxFileName$1,
421
+ lineNumber: 269,
422
+ columnNumber: 9
423
+ }, this) : rows.length === 0 ? /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", {
424
+ className: "text-sand-400 text-center py-12 text-sm",
425
+ children: "No requests yet."
426
+ }, void 0, false, {
427
+ fileName: _jsxFileName$1,
428
+ lineNumber: 275,
429
+ columnNumber: 9
430
+ }, this) : /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)(import_jsx_dev_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", {
431
+ className: "overflow-x-auto px-3 py-3 sm:px-5",
432
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("table", {
433
+ className: "w-full min-w-[900px] text-[13px]",
434
+ children: [/* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("thead", { children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("tr", {
435
+ className: "border-b border-sand-100/60",
436
+ children: [COLUMNS.map((col) => {
437
+ const padX = col.label === "Duration" ? "pl-5 pr-3" : col.width ? "px-4" : "px-3";
438
+ const active = col.sortKey === sortColumn;
439
+ return /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("th", {
440
+ className: `${col.align === "right" ? "text-right" : "text-left"} ${col.width ?? ""} ${col.width ? "whitespace-nowrap" : ""} ${padX} py-1.5 text-[10px] uppercase font-medium ${active ? "text-sienna-600" : "text-sand-400"}`,
441
+ children: col.sortKey ? /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("button", {
442
+ type: "button",
443
+ onClick: () => updateFilter({ sort: RequestLogOrderBy.parse(`${col.sortKey}-${active && sortDirection === "desc" ? "asc" : "desc"}`) }),
444
+ className: `inline-flex items-center gap-0.5 text-[10px] uppercase font-medium hover:text-sienna-500 transition-colors duration-150 ${col.align === "right" ? "justify-end w-full" : ""}`,
445
+ children: [col.label, /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
446
+ className: active ? "" : "text-sand-300",
447
+ children: active ? sortDirection === "desc" ? "↓" : "↑" : "↕"
448
+ }, void 0, false, {
449
+ fileName: _jsxFileName$1,
450
+ lineNumber: 316,
451
+ columnNumber: 29
452
+ }, this)]
453
+ }, void 0, true, {
454
+ fileName: _jsxFileName$1,
455
+ lineNumber: 298,
456
+ columnNumber: 27
457
+ }, this) : col.label
458
+ }, col.label, false, {
459
+ fileName: _jsxFileName$1,
460
+ lineNumber: 291,
461
+ columnNumber: 23
462
+ }, this);
463
+ }), /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("th", { className: "w-8" }, void 0, false, {
464
+ fileName: _jsxFileName$1,
465
+ lineNumber: 326,
466
+ columnNumber: 19
467
+ }, this)]
468
+ }, void 0, true, {
469
+ fileName: _jsxFileName$1,
470
+ lineNumber: 283,
471
+ columnNumber: 17
472
+ }, this) }, void 0, false, {
473
+ fileName: _jsxFileName$1,
474
+ lineNumber: 282,
475
+ columnNumber: 15
476
+ }, this), /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("tbody", {
477
+ className: "divide-y divide-sand-100/60",
478
+ children: rows.map((row) => /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("tr", {
479
+ className: "transition-colors duration-150 hover:bg-sand-100/60 cursor-pointer",
480
+ onClick: (e) => {
481
+ if (e.metaKey || e.ctrlKey) {
482
+ window.open(`/requests/show?id=${row.id}`, "_blank");
483
+ return;
484
+ }
485
+ navigate({
486
+ to: "/requests/show",
487
+ search: { id: row.id }
488
+ });
489
+ },
490
+ children: [
491
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
492
+ className: "px-4 py-1.5 whitespace-nowrap",
493
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)(Link, {
494
+ to: "/requests/show",
495
+ search: { id: row.id },
496
+ onClick: (e) => e.stopPropagation(),
497
+ className: "text-xs text-sand-500 tabular-nums hover:text-sienna-500",
498
+ children: row.id
499
+ }, void 0, false, {
500
+ fileName: _jsxFileName$1,
501
+ lineNumber: 345,
502
+ columnNumber: 23
503
+ }, this)
504
+ }, void 0, false, {
505
+ fileName: _jsxFileName$1,
506
+ lineNumber: 344,
507
+ columnNumber: 21
508
+ }, this),
509
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
510
+ className: "px-4 py-1.5 whitespace-nowrap",
511
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
512
+ className: "text-xs text-sand-400 tabular-nums",
513
+ children: formatDateTime(row.created_at)
514
+ }, void 0, false, {
515
+ fileName: _jsxFileName$1,
516
+ lineNumber: 355,
517
+ columnNumber: 23
518
+ }, this)
519
+ }, void 0, false, {
520
+ fileName: _jsxFileName$1,
521
+ lineNumber: 354,
522
+ columnNumber: 21
523
+ }, this),
524
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
525
+ className: "px-4 py-1.5 whitespace-nowrap",
526
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
527
+ className: "text-xs text-sand-600",
528
+ children: row.project_name ?? "—"
529
+ }, void 0, false, {
530
+ fileName: _jsxFileName$1,
531
+ lineNumber: 360,
532
+ columnNumber: 23
533
+ }, this)
534
+ }, void 0, false, {
535
+ fileName: _jsxFileName$1,
536
+ lineNumber: 359,
537
+ columnNumber: 21
538
+ }, this),
539
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
540
+ className: "px-4 py-1.5 whitespace-nowrap",
541
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
542
+ className: "text-xs text-sand-500",
543
+ children: row.token_name
544
+ }, void 0, false, {
545
+ fileName: _jsxFileName$1,
546
+ lineNumber: 363,
547
+ columnNumber: 23
548
+ }, this)
549
+ }, void 0, false, {
550
+ fileName: _jsxFileName$1,
551
+ lineNumber: 362,
552
+ columnNumber: 21
553
+ }, this),
554
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
555
+ className: "px-4 py-1.5 whitespace-nowrap",
556
+ children: [
557
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)(RequestModel, {
558
+ status: row.status,
559
+ requestedModel: row.requested_model_name,
560
+ servedModel: row.model_name,
561
+ imageCostMethod: row.image_cost_method,
562
+ fallbackCount: row.fallback_count
563
+ }, void 0, false, {
564
+ fileName: _jsxFileName$1,
565
+ lineNumber: 366,
566
+ columnNumber: 23
567
+ }, this),
568
+ row.service_tier === "fast" && /* @__PURE__ */ (void 0)("span", {
569
+ title: "Fast 모드",
570
+ className: "ml-1 inline-flex align-middle",
571
+ children: /* @__PURE__ */ (void 0)(lucideZap, {
572
+ "aria-label": "Fast 모드",
573
+ className: "size-3 text-[#1877F2] [&_path]:fill-current"
574
+ }, void 0, false, {
575
+ fileName: _jsxFileName$1,
576
+ lineNumber: 375,
577
+ columnNumber: 27
578
+ }, this)
579
+ }, void 0, false, {
580
+ fileName: _jsxFileName$1,
581
+ lineNumber: 374,
582
+ columnNumber: 25
583
+ }, this),
584
+ row.response_json_ok === false && /* @__PURE__ */ (void 0)("span", {
585
+ title: "structured 요청의 응답이 JSON 파싱에 실패했습니다",
586
+ className: "ml-1.5 rounded-full bg-caution-400/15 px-1.5 py-0.5 text-[9px] font-semibold text-caution-500",
587
+ children: "broken"
588
+ }, void 0, false, {
589
+ fileName: _jsxFileName$1,
590
+ lineNumber: 382,
591
+ columnNumber: 25
592
+ }, this)
593
+ ]
594
+ }, void 0, true, {
595
+ fileName: _jsxFileName$1,
596
+ lineNumber: 365,
597
+ columnNumber: 21
598
+ }, this),
599
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
600
+ className: "px-4 py-1.5 whitespace-nowrap",
601
+ children: row.is_image_generation ? /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
602
+ className: "rounded bg-sage-100 px-1.5 py-0.5 font-mono text-[10px] text-sage-700",
603
+ children: "img"
604
+ }, void 0, false, {
605
+ fileName: _jsxFileName$1,
606
+ lineNumber: 392,
607
+ columnNumber: 25
608
+ }, this) : row.is_structured ? /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
609
+ className: "rounded bg-sienna-100 px-1.5 py-0.5 font-mono text-[10px] text-sienna-700",
610
+ children: "json"
611
+ }, void 0, false, {
612
+ fileName: _jsxFileName$1,
613
+ lineNumber: 396,
614
+ columnNumber: 25
615
+ }, this) : /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("span", {
616
+ className: "font-mono text-[10px] text-sand-400",
617
+ children: "text"
618
+ }, void 0, false, {
619
+ fileName: _jsxFileName$1,
620
+ lineNumber: 400,
621
+ columnNumber: 25
622
+ }, this)
623
+ }, void 0, false, {
624
+ fileName: _jsxFileName$1,
625
+ lineNumber: 390,
626
+ columnNumber: 21
627
+ }, this),
628
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
629
+ className: "px-4 py-1.5 text-right tabular-nums text-sand-500 whitespace-nowrap",
630
+ children: formatTtft(row.ttft_ms)
631
+ }, void 0, false, {
632
+ fileName: _jsxFileName$1,
633
+ lineNumber: 403,
634
+ columnNumber: 21
635
+ }, this),
636
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
637
+ className: "pl-5 pr-3 py-1.5 text-right tabular-nums text-sand-500 whitespace-nowrap",
638
+ children: formatDuration(row.duration_ms)
639
+ }, void 0, false, {
640
+ fileName: _jsxFileName$1,
641
+ lineNumber: 406,
642
+ columnNumber: 21
643
+ }, this),
644
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
645
+ className: "px-3 py-1.5 text-right tabular-nums text-sand-700",
646
+ children: formatNum(row.input_tokens)
647
+ }, void 0, false, {
648
+ fileName: _jsxFileName$1,
649
+ lineNumber: 409,
650
+ columnNumber: 21
651
+ }, this),
652
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
653
+ className: "px-3 py-1.5 text-right tabular-nums text-sand-700",
654
+ children: formatNum(row.output_tokens)
655
+ }, void 0, false, {
656
+ fileName: _jsxFileName$1,
657
+ lineNumber: 412,
658
+ columnNumber: 21
659
+ }, this),
660
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
661
+ className: "px-3 py-1.5 text-right tabular-nums text-sand-700",
662
+ children: formatNum(row.cache_read_tokens)
663
+ }, void 0, false, {
664
+ fileName: _jsxFileName$1,
665
+ lineNumber: 415,
666
+ columnNumber: 21
667
+ }, this),
668
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
669
+ className: "px-3 py-1.5 text-right tabular-nums text-sand-700",
670
+ children: formatNum(row.cache_creation_tokens)
671
+ }, void 0, false, {
672
+ fileName: _jsxFileName$1,
673
+ lineNumber: 418,
674
+ columnNumber: 21
675
+ }, this),
676
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
677
+ className: "px-3 py-1.5 text-right tabular-nums text-sand-700",
678
+ children: cacheHitRate(row)
679
+ }, void 0, false, {
680
+ fileName: _jsxFileName$1,
681
+ lineNumber: 421,
682
+ columnNumber: 21
683
+ }, this),
684
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
685
+ className: "px-3 py-1.5 text-right tabular-nums text-sand-500",
686
+ children: row.tool_call_count > 0 ? row.tool_call_count : "—"
687
+ }, void 0, false, {
688
+ fileName: _jsxFileName$1,
689
+ lineNumber: 424,
690
+ columnNumber: 21
691
+ }, this),
692
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
693
+ className: "px-3 py-1.5 text-right tabular-nums text-sand-700 whitespace-nowrap",
694
+ children: formatRequestCost(row)
695
+ }, void 0, false, {
696
+ fileName: _jsxFileName$1,
697
+ lineNumber: 427,
698
+ columnNumber: 21
699
+ }, this),
700
+ /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("td", {
701
+ className: "px-2 py-1.5",
702
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)(lucideChevronRight, { className: "size-4 text-sand-400" }, void 0, false, {
703
+ fileName: _jsxFileName$1,
704
+ lineNumber: 431,
705
+ columnNumber: 23
706
+ }, this)
707
+ }, void 0, false, {
708
+ fileName: _jsxFileName$1,
709
+ lineNumber: 430,
710
+ columnNumber: 21
711
+ }, this)
712
+ ]
713
+ }, row.id, true, {
714
+ fileName: _jsxFileName$1,
715
+ lineNumber: 331,
716
+ columnNumber: 19
717
+ }, this))
718
+ }, void 0, false, {
719
+ fileName: _jsxFileName$1,
720
+ lineNumber: 329,
721
+ columnNumber: 15
722
+ }, this)]
723
+ }, void 0, true, {
724
+ fileName: _jsxFileName$1,
725
+ lineNumber: 281,
726
+ columnNumber: 13
727
+ }, this)
728
+ }, void 0, false, {
729
+ fileName: _jsxFileName$1,
730
+ lineNumber: 278,
731
+ columnNumber: 11
732
+ }, this), totalPages > 1 && /* @__PURE__ */ (void 0)("div", {
733
+ className: "flex items-center justify-center gap-3 px-5 py-2.5 border-t border-sand-100/60",
734
+ children: [
735
+ /* @__PURE__ */ (void 0)("button", {
736
+ type: "button",
737
+ className: "p-1 rounded text-sand-400 hover:text-sand-600 disabled:opacity-30 transition-colors",
738
+ disabled: page === 1,
739
+ onClick: () => onSearchChange({
740
+ ...search,
741
+ page: page - 1
742
+ }),
743
+ children: /* @__PURE__ */ (void 0)(lucideChevronLeft, { className: "size-4" }, void 0, false, {
744
+ fileName: _jsxFileName$1,
745
+ lineNumber: 447,
746
+ columnNumber: 17
747
+ }, this)
748
+ }, void 0, false, {
749
+ fileName: _jsxFileName$1,
750
+ lineNumber: 441,
751
+ columnNumber: 15
752
+ }, this),
753
+ /* @__PURE__ */ (void 0)("span", {
754
+ className: "text-[11px] text-sand-400 tabular-nums",
755
+ children: [
756
+ page,
757
+ " / ",
758
+ totalPages
759
+ ]
760
+ }, void 0, true, {
761
+ fileName: _jsxFileName$1,
762
+ lineNumber: 449,
763
+ columnNumber: 15
764
+ }, this),
765
+ /* @__PURE__ */ (void 0)("button", {
766
+ type: "button",
767
+ className: "p-1 rounded text-sand-400 hover:text-sand-600 disabled:opacity-30 transition-colors",
768
+ disabled: page === totalPages,
769
+ onClick: () => onSearchChange({
770
+ ...search,
771
+ page: page + 1
772
+ }),
773
+ children: /* @__PURE__ */ (void 0)(lucideChevronRight, { className: "size-4" }, void 0, false, {
774
+ fileName: _jsxFileName$1,
775
+ lineNumber: 458,
776
+ columnNumber: 17
777
+ }, this)
778
+ }, void 0, false, {
779
+ fileName: _jsxFileName$1,
780
+ lineNumber: 452,
781
+ columnNumber: 15
782
+ }, this)
783
+ ]
784
+ }, void 0, true, {
785
+ fileName: _jsxFileName$1,
786
+ lineNumber: 440,
787
+ columnNumber: 13
788
+ }, this)] }, void 0, true)]
789
+ }, void 0, true, {
790
+ fileName: _jsxFileName$1,
791
+ lineNumber: 189,
792
+ columnNumber: 5
793
+ }, this);
794
+ }
795
+ //#endregion
796
+ //#region src/routes/logs.tsx?tsr-split=component
797
+ var _jsxFileName = "/home/runner/work/qgrid/qgrid/packages/web/src/routes/logs.tsx?tsr-split=component";
798
+ object({
799
+ token: string().optional(),
800
+ project: string().optional(),
801
+ model: string().optional(),
802
+ sort: RequestLogOrderBy.optional(),
803
+ page: RequestLogBaseListParams.shape.page.default(1)
804
+ });
805
+ function LogsPage() {
806
+ const search = Route.useSearch();
807
+ const navigate = Route.useNavigate();
808
+ return /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)("div", {
809
+ className: "max-w-[100rem] mx-auto",
810
+ children: /* @__PURE__ */ (0, import_jsx_dev_runtime.jsxDEV)(RequestLogTable, {
811
+ search,
812
+ onSearchChange: (next) => navigate({ search: next })
813
+ }, void 0, false, {
814
+ fileName: _jsxFileName,
815
+ lineNumber: 19,
816
+ columnNumber: 7
817
+ }, this)
818
+ }, void 0, false, {
819
+ fileName: _jsxFileName,
820
+ lineNumber: 18,
821
+ columnNumber: 10
822
+ }, this);
823
+ }
824
+ //#endregion
825
+ export { LogsPage as component };