@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
@@ -1,461 +0,0 @@
1
- import { A as require_react, O as useQueryClient, X as __toESM, a as SettingService, k as require_jsx_runtime, o as TokenService } from "./services.generated-CEbGjsI0.js";
2
- import { l as lucideRotateCcw } from "../entry-server.generated.js";
3
- import { t as useUpdateTokenMutation } from "./use-update-token-mutation-CfYmk_4_.js";
4
- import { t as lucidePlus } from "./plus-KZrECewT.js";
5
- //#region ~icons/lucide/eye.jsx
6
- var import_react = /* @__PURE__ */ __toESM(require_react());
7
- var import_jsx_runtime = require_jsx_runtime();
8
- var lucideEye = (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
9
- viewBox: "0 0 24 24",
10
- width: "1.2em",
11
- height: "1.2em",
12
- ...props,
13
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", {
14
- fill: "none",
15
- stroke: "currentColor",
16
- strokeLinecap: "round",
17
- strokeLinejoin: "round",
18
- strokeWidth: 2,
19
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
20
- cx: 12,
21
- cy: 12,
22
- r: 3
23
- })]
24
- })
25
- });
26
- //#endregion
27
- //#region ~icons/lucide/eye-off.jsx
28
- var lucideEyeOff = (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
29
- viewBox: "0 0 24 24",
30
- width: "1.2em",
31
- height: "1.2em",
32
- ...props,
33
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", {
34
- fill: "none",
35
- stroke: "currentColor",
36
- strokeLinecap: "round",
37
- strokeLinejoin: "round",
38
- strokeWidth: 2,
39
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20" })]
40
- })
41
- });
42
- //#endregion
43
- //#region ~icons/lucide/minus.jsx
44
- var lucideMinus = (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
45
- viewBox: "0 0 24 24",
46
- width: "1.2em",
47
- height: "1.2em",
48
- ...props,
49
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
50
- fill: "none",
51
- stroke: "currentColor",
52
- strokeLinecap: "round",
53
- strokeLinejoin: "round",
54
- strokeWidth: 2,
55
- d: "M5 12h14"
56
- })
57
- });
58
- //#endregion
59
- //#region src/components/qgrid/SettingsPanel.tsx
60
- var GROUP_LABELS = {
61
- qgrid: "Qgrid",
62
- slack: "Slack 알림",
63
- slackConnection: "Slack 연결"
64
- };
65
- function maskValue(value) {
66
- if (!value) return "";
67
- if (value.length <= 12) return "•".repeat(value.length);
68
- return `${value.slice(0, 8)}${"•".repeat(12)}${value.slice(-4)}`;
69
- }
70
- /** 정수·실수는 타이핑보다 증감이 빠르다. 범위도 버튼이 알아서 지킨다. */
71
- function Stepper({ value, min, max, step, disabled, onChange }) {
72
- const current = Number(value);
73
- const valid = Number.isFinite(current);
74
- const lower = min ?? Number.NEGATIVE_INFINITY;
75
- const upper = max ?? Number.POSITIVE_INFINITY;
76
- const adjust = (delta) => {
77
- const next = Math.min(Math.max((valid ? current : min ?? 0) + delta, lower), upper);
78
- onChange(String(Number(next.toFixed(2))));
79
- };
80
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
81
- className: "inline-flex items-center rounded-lg border border-sand-200/80 bg-white overflow-hidden",
82
- children: [
83
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
84
- type: "button",
85
- "aria-label": "감소",
86
- onClick: () => adjust(-step),
87
- disabled: disabled || valid && current <= lower,
88
- className: "size-7 grid place-items-center text-sand-500 hover:bg-sand-100 disabled:opacity-30 disabled:hover:bg-transparent transition-colors duration-150",
89
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(lucideMinus, { className: "size-3" })
90
- }),
91
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
92
- value,
93
- onChange: (e) => onChange(e.target.value),
94
- disabled,
95
- inputMode: "decimal",
96
- className: "w-12 text-center text-[12px] tabular-nums text-sand-800 bg-transparent border-x border-sand-200/80 py-1 focus:outline-none focus:bg-sand-50"
97
- }),
98
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
99
- type: "button",
100
- "aria-label": "증가",
101
- onClick: () => adjust(step),
102
- disabled: disabled || valid && current >= upper,
103
- className: "size-7 grid place-items-center text-sand-500 hover:bg-sand-100 disabled:opacity-30 disabled:hover:bg-transparent transition-colors duration-150",
104
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(lucidePlus, { className: "size-3" })
105
- })
106
- ]
107
- });
108
- }
109
- /** 고정 선택지. 자유 입력보다 고르는 편이 빠르고, 범위를 벗어난 값이 생기지 않는다. */
110
- function PresetGroup({ value, presets, disabled, onChange }) {
111
- const current = Number(value);
112
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
113
- className: "segmented-control inline-flex",
114
- children: presets.map((preset) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
115
- type: "button",
116
- disabled,
117
- "data-active": current === preset,
118
- onClick: () => onChange(String(preset)),
119
- className: "rounded-[6px] px-2.5 py-1 text-[11px] font-medium tabular-nums text-sand-500 transition-colors hover:text-sand-800 disabled:opacity-50 data-[active=true]:text-sand-900",
120
- children: preset >= 60 ? `${preset / 60}시간` : `${preset}분`
121
- }, preset))
122
- });
123
- }
124
- /** 값이 어디서 왔는지. 되돌림 버튼이 무엇을 지우는지 이 배지가 설명한다. */
125
- function SourceBadge({ source }) {
126
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
127
- className: `text-[10px] px-1.5 py-0.5 rounded ${source === "db" ? "bg-sienna-50 text-sienna-600" : "bg-sand-100 text-sand-500"}`,
128
- children: source === "db" ? "저장값" : source === "env" ? "환경변수" : "기본값"
129
- });
130
- }
131
- function Toggle({ on, disabled, onChange }) {
132
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
133
- type: "button",
134
- role: "switch",
135
- "aria-checked": on,
136
- disabled,
137
- onClick: () => onChange(!on),
138
- className: `relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors duration-200 disabled:opacity-50 ${on ? "bg-sage-400" : "bg-sand-300"}`,
139
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform duration-200 ${on ? "translate-x-4.5" : "translate-x-0.5"}` })
140
- });
141
- }
142
- function SettingRow({ item, disabled = false }) {
143
- const [draft, setDraft] = (0, import_react.useState)(null);
144
- const [revealed, setRevealed] = (0, import_react.useState)(false);
145
- const [error, setError] = (0, import_react.useState)(null);
146
- const queryClient = useQueryClient();
147
- const updateMutation = SettingService.useUpdateSettingMutation();
148
- const resetMutation = SettingService.useResetSettingMutation();
149
- const pending = disabled || updateMutation.isPending || resetMutation.isPending;
150
- const value = draft ?? item.value;
151
- const dirty = draft !== null && draft !== item.value;
152
- const invalidate = () => queryClient.invalidateQueries({ queryKey: SettingService.getSettingListQueryOptions().queryKey });
153
- const commit = async (next) => {
154
- setError(null);
155
- try {
156
- await updateMutation.mutateAsync({
157
- key: item.key,
158
- value: next
159
- });
160
- await invalidate();
161
- setDraft(null);
162
- } catch (e) {
163
- setError(e.message);
164
- }
165
- };
166
- const reset = async () => {
167
- setError(null);
168
- try {
169
- await resetMutation.mutateAsync({ key: item.key });
170
- await invalidate();
171
- setDraft(null);
172
- } catch (e) {
173
- setError(e.message);
174
- }
175
- };
176
- const isSecret = item.kind === "secret";
177
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
178
- className: "px-4 py-3 sm:px-5",
179
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
180
- className: "flex items-start gap-4",
181
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
182
- className: "min-w-0 flex-1",
183
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
184
- className: "flex items-center gap-2",
185
- children: [
186
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
187
- className: "text-[13px] text-sand-800",
188
- children: item.label
189
- }),
190
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SourceBadge, { source: item.source }),
191
- item.applies === "restart" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
192
- className: "text-[10px] text-caution-500",
193
- title: "저장해도 다음 재시작부터 반영됩니다",
194
- children: "재시작 필요"
195
- })
196
- ]
197
- }), item.help && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
198
- className: "mt-0.5 text-[11px] text-sand-500",
199
- children: item.help
200
- })]
201
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
202
- className: "flex items-center gap-1.5 shrink-0",
203
- children: [
204
- item.kind === "boolean" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Toggle, {
205
- on: value === "true",
206
- disabled: pending,
207
- onChange: (next) => void commit(String(next))
208
- }),
209
- item.kind === "preset" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PresetGroup, {
210
- value,
211
- presets: item.presets,
212
- disabled: pending,
213
- onChange: (next) => void commit(next)
214
- }),
215
- (item.kind === "integer" || item.kind === "number") && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Stepper, {
216
- value,
217
- min: item.min,
218
- max: item.max,
219
- step: item.kind === "integer" ? 1 : .5,
220
- disabled: pending,
221
- onChange: setDraft
222
- }),
223
- (item.kind === "string" || isSecret) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
224
- className: "relative",
225
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
226
- value: isSecret && !revealed ? maskValue(value) : value,
227
- onChange: (e) => setDraft(e.target.value),
228
- onFocus: () => isSecret && setRevealed(true),
229
- disabled: pending,
230
- className: `w-48 sm:w-64 rounded-lg border border-sand-200/80 bg-white py-1.5 pl-2.5 text-[12px] text-sand-800 focus:outline-none focus:border-sienna-300 ${isSecret ? "pr-8 font-mono" : "pr-2.5"}`
231
- }), isSecret && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
232
- type: "button",
233
- "aria-label": revealed ? "값 숨기기" : "값 보기",
234
- onClick: () => setRevealed((r) => !r),
235
- className: "absolute right-1.5 top-1/2 -translate-y-1/2 size-6 grid place-items-center text-sand-400 hover:text-sand-600 transition-colors duration-150",
236
- children: revealed ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(lucideEyeOff, { className: "size-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(lucideEye, { className: "size-3.5" })
237
- })]
238
- }),
239
- dirty && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
240
- type: "button",
241
- onClick: () => void commit(value),
242
- disabled: pending,
243
- className: "px-2.5 py-1.5 text-[11px] font-medium rounded-lg bg-sienna-400 text-white hover:bg-sienna-500 disabled:opacity-50 transition-colors duration-150",
244
- children: updateMutation.isPending ? "저장 중" : "저장"
245
- }),
246
- !dirty && item.source === "db" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
247
- type: "button",
248
- title: "저장값을 지웁니다 — 환경변수 또는 기본값으로 돌아갑니다",
249
- onClick: () => void reset(),
250
- disabled: pending,
251
- className: "size-7 grid place-items-center rounded-lg text-sand-400 hover:text-sand-600 hover:bg-sand-100 disabled:opacity-50 transition-colors duration-150",
252
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(lucideRotateCcw, { className: "size-3.5" })
253
- })
254
- ]
255
- })]
256
- }), error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
257
- className: "mt-1.5 text-[11px] text-red-500",
258
- children: error
259
- })]
260
- });
261
- }
262
- function KeepaliveTokenSettings({ runnerEnabled }) {
263
- const queryClient = useQueryClient();
264
- const [error, setError] = (0, import_react.useState)(null);
265
- const tokensQuery = TokenService.useTokens("A", {
266
- orderBy: "ord-asc",
267
- num: 100
268
- });
269
- const updateMutation = useUpdateTokenMutation();
270
- const anthropicTokens = (tokensQuery.data?.rows ?? []).filter((token) => token.provider === "anthropic");
271
- const toggle = async (id, keepaliveEnabled) => {
272
- setError(null);
273
- try {
274
- await updateMutation.mutateAsync({
275
- id,
276
- keepaliveEnabled
277
- });
278
- await queryClient.invalidateQueries({ queryKey: ["Token", "getTokens"] });
279
- } catch (cause) {
280
- setError(cause.message);
281
- }
282
- };
283
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
284
- className: "border-t border-sand-100/80 bg-sand-50/40 px-4 py-3 sm:px-5",
285
- children: [
286
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
287
- className: "mb-2 flex items-center justify-between gap-3",
288
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
289
- className: "text-[11px] font-medium text-sand-600",
290
- children: "토큰별 keepalive"
291
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
292
- className: "mt-0.5 text-[10px] text-sand-400",
293
- children: runnerEnabled ? "켜진 활성 Anthropic 토큰만 5시간 윈도우를 유지합니다" : "이 인스턴스는 keepalive runner로 지정되지 않았습니다"
294
- })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
295
- className: `shrink-0 rounded px-1.5 py-0.5 text-[10px] ${runnerEnabled ? "bg-sage-50 text-sage-600" : "bg-sand-100 text-sand-500"}`,
296
- children: runnerEnabled ? "runner" : "실행 안 함"
297
- })]
298
- }),
299
- tokensQuery.isLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
300
- className: "py-2 text-[11px] text-sand-400",
301
- children: "토큰을 불러오는 중…"
302
- }) : anthropicTokens.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
303
- className: "py-2 text-[11px] text-sand-400",
304
- children: "등록된 Anthropic 토큰이 없습니다"
305
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
306
- className: "overflow-hidden rounded-lg border border-sand-200/70 bg-white",
307
- children: anthropicTokens.map((token) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
308
- className: "flex items-center justify-between gap-4 border-b border-sand-100/80 px-3 py-2 last:border-b-0",
309
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
310
- className: "min-w-0",
311
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
312
- className: "block truncate text-[12px] text-sand-700",
313
- children: token.name
314
- }), !token.active && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
315
- className: "text-[10px] text-sand-400",
316
- children: "토큰 비활성"
317
- })]
318
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Toggle, {
319
- on: token.keepalive_enabled,
320
- disabled: !runnerEnabled || updateMutation.isPending,
321
- onChange: (next) => void toggle(token.id, next)
322
- })]
323
- }, token.id))
324
- }),
325
- error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
326
- className: "mt-2 text-[11px] text-red-500",
327
- children: error
328
- })
329
- ]
330
- });
331
- }
332
- /** 만료 알림을 주기를 기다리지 않고 지금 보낸다. 설정이 제대로 붙었는지 확인하는 용도. */
333
- function TriggerReminderButton() {
334
- const [result, setResult] = (0, import_react.useState)(null);
335
- const mutation = SettingService.useTriggerExpiryReminderMutation();
336
- const trigger = async () => {
337
- setResult(null);
338
- try {
339
- const { sent } = await mutation.mutateAsync();
340
- setResult(sent === 0 ? "재로그인이 필요한 토큰이 없습니다" : `${sent}건 발송`);
341
- } catch (e) {
342
- setResult(e.message);
343
- }
344
- };
345
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
346
- className: "flex items-center gap-2",
347
- children: [result && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
348
- className: "text-[11px] text-sand-500",
349
- children: result
350
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
351
- type: "button",
352
- onClick: () => void trigger(),
353
- disabled: mutation.isPending,
354
- className: "px-2 py-1 text-[11px] rounded-lg border border-sand-200/80 text-sand-600 hover:bg-sand-100 disabled:opacity-50 transition-colors duration-150",
355
- children: mutation.isPending ? "보내는 중" : "지금 보내기"
356
- })]
357
- });
358
- }
359
- function SettingsPanel() {
360
- const settingsQuery = SettingService.useSettingList();
361
- const { data, isLoading } = settingsQuery;
362
- if (isLoading) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
363
- className: "space-y-4",
364
- children: [0, 1].map((i) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
365
- className: "panel overflow-hidden",
366
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
367
- className: "panel-header px-4 py-2.5 sm:px-5",
368
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-3 w-24 rounded bg-sand-200 animate-pulse" })
369
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
370
- className: "divide-y divide-sand-100/80",
371
- children: [
372
- 0,
373
- 1,
374
- 2
375
- ].map((j) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
376
- className: "px-4 py-3 sm:px-5 flex items-center justify-between gap-4",
377
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-3 w-40 rounded bg-sand-100 animate-pulse" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-7 w-24 rounded-lg bg-sand-100 animate-pulse" })]
378
- }, j))
379
- })]
380
- }, i))
381
- });
382
- if (settingsQuery.isError && !data) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
383
- className: "panel px-5 py-6 text-center",
384
- children: [
385
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
386
- className: "text-[13px] font-medium text-sand-800",
387
- children: "설정을 불러오지 못했습니다"
388
- }),
389
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
390
- className: "mt-1 text-[11px] text-red-500",
391
- children: settingsQuery.error.message
392
- }),
393
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
394
- type: "button",
395
- onClick: () => void settingsQuery.refetch(),
396
- disabled: settingsQuery.isFetching,
397
- className: "mt-3 px-3 py-1.5 text-[12px] rounded-lg border border-sand-200 text-sand-600 hover:bg-sand-100 disabled:opacity-50",
398
- children: settingsQuery.isFetching ? "다시 불러오는 중" : "다시 시도"
399
- })
400
- ]
401
- });
402
- const settings = data?.settings ?? [];
403
- const runtime = data?.runtime ?? [];
404
- const groups = [...new Set(settings.map((s) => s.group))];
405
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
406
- className: "space-y-4",
407
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
408
- className: "panel overflow-hidden",
409
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
410
- className: "panel-header flex items-center justify-between px-4 py-2.5 sm:px-5",
411
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
412
- className: "text-[13px] font-medium text-sand-700",
413
- children: "환경"
414
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
415
- className: "text-[11px] text-sand-400",
416
- children: "기동 시점 값"
417
- })]
418
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dl", {
419
- className: "px-4 py-3 sm:px-5 grid grid-cols-1 sm:grid-cols-2 gap-x-8 gap-y-1.5",
420
- children: runtime.map((info) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
421
- className: "flex items-baseline justify-between gap-3 min-w-0",
422
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
423
- className: "text-[11px] text-sand-500 shrink-0",
424
- children: info.label
425
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
426
- className: "text-[12px] font-mono text-sand-700 truncate",
427
- children: info.value
428
- })]
429
- }, info.label))
430
- })]
431
- }), groups.map((group) => {
432
- const items = settings.filter((s) => s.group === group);
433
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
434
- className: "panel overflow-hidden",
435
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
436
- className: "panel-header flex items-center justify-between px-4 py-2.5 sm:px-5",
437
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
438
- className: "text-[13px] font-medium text-sand-700",
439
- children: GROUP_LABELS[group] ?? group
440
- }), group === "slack" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriggerReminderButton, {})]
441
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
442
- className: "divide-y divide-sand-100/80",
443
- children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(SettingRow, {
444
- item,
445
- disabled: item.key === "qgrid.tokenWindowKeepaliveEnabled" && !data?.keepaliveRunnerEnabled
446
- }), item.key === "qgrid.tokenWindowKeepaliveEnabled" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KeepaliveTokenSettings, { runnerEnabled: data?.keepaliveRunnerEnabled ?? false })] }, item.key))
447
- })]
448
- }, group);
449
- })]
450
- });
451
- }
452
- //#endregion
453
- //#region src/routes/settings.tsx?tsr-split=component
454
- function SettingsPage() {
455
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
456
- className: "max-w-4xl mx-auto",
457
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SettingsPanel, {})
458
- });
459
- }
460
- //#endregion
461
- export { SettingsPage as component };