@jingyi0605/codingns4dsh 0.2.1-beta.9 → 0.2.1-rc.3

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 (938) hide show
  1. package/README.en.md +10 -6
  2. package/README.md +12 -9
  3. package/assets/provider-icons/magpie.png +0 -0
  4. package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
  5. package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts.map +1 -1
  6. package/data/build/dist/bootstrap/index.d.ts +1 -1
  7. package/data/build/dist/bootstrap/index.d.ts.map +1 -1
  8. package/data/build/dist/client/account-bar.d.ts.map +1 -1
  9. package/data/build/dist/client/account-bar.js +24 -70
  10. package/data/build/dist/client/account-bar.js.map +1 -1
  11. package/data/build/dist/client/adapter-catalog-watch.d.ts +10 -2
  12. package/data/build/dist/client/adapter-catalog-watch.d.ts.map +1 -1
  13. package/data/build/dist/client/adapter-catalog-watch.js +16 -4
  14. package/data/build/dist/client/adapter-catalog-watch.js.map +1 -1
  15. package/data/build/dist/client/bundle.js +55627 -31591
  16. package/data/build/dist/client/bundle.js.map +1 -1
  17. package/data/build/dist/client/cli-management-dialog.d.ts +21 -0
  18. package/data/build/dist/client/cli-management-dialog.d.ts.map +1 -0
  19. package/data/build/dist/client/cli-management-dialog.js +215 -0
  20. package/data/build/dist/client/cli-management-dialog.js.map +1 -0
  21. package/data/build/dist/client/cli-management-terminal.d.ts +9 -0
  22. package/data/build/dist/client/cli-management-terminal.d.ts.map +1 -0
  23. package/data/build/dist/client/cli-management-terminal.js +30 -0
  24. package/data/build/dist/client/cli-management-terminal.js.map +1 -0
  25. package/data/build/dist/client/cli-settings-dialog.d.ts +9 -0
  26. package/data/build/dist/client/cli-settings-dialog.d.ts.map +1 -0
  27. package/data/build/dist/client/cli-settings-dialog.js +45 -0
  28. package/data/build/dist/client/cli-settings-dialog.js.map +1 -0
  29. package/data/build/dist/client/cli-settings-rpc.js +1 -1
  30. package/data/build/dist/client/cli-settings-rpc.js.map +1 -1
  31. package/data/build/dist/client/cli-slots.d.ts +17 -3
  32. package/data/build/dist/client/cli-slots.d.ts.map +1 -1
  33. package/data/build/dist/client/cli-slots.js +300 -41
  34. package/data/build/dist/client/cli-slots.js.map +1 -1
  35. package/data/build/dist/client/client.assistant-configuration-view.js +4 -3
  36. package/data/build/dist/client/client.assistant-configuration-view.js.map +1 -1
  37. package/data/build/dist/client/client.delegate-command.js +44 -26
  38. package/data/build/dist/client/client.delegate-command.js.map +1 -1
  39. package/data/build/dist/client/client.editor-engine.js +4 -1
  40. package/data/build/dist/client/client.editor-engine.js.map +1 -1
  41. package/data/build/dist/client/{client.model-catalog-cache.js → client.magpie-model-tag.js} +393 -14
  42. package/data/build/dist/client/client.magpie-model-tag.js.map +1 -0
  43. package/data/build/dist/client/client.moss-voice-output.js +415 -0
  44. package/data/build/dist/client/client.moss-voice-output.js.map +1 -0
  45. package/data/build/dist/client/client.native-workspace-store.js +91 -15
  46. package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
  47. package/data/build/dist/client/client.primitives-adapter.js +128 -0
  48. package/data/build/dist/client/client.primitives-adapter.js.map +1 -1
  49. package/data/build/dist/client/client.react-dom.js +0 -404
  50. package/data/build/dist/client/client.react-dom.js.map +1 -1
  51. package/data/build/dist/client/client.session-translation.js +121 -2
  52. package/data/build/dist/client/client.session-translation.js.map +1 -1
  53. package/data/build/dist/client/client.transport.js +1415 -57
  54. package/data/build/dist/client/client.transport.js.map +1 -1
  55. package/data/build/dist/client/conversation-translation-settings.d.ts +11 -0
  56. package/data/build/dist/client/conversation-translation-settings.d.ts.map +1 -0
  57. package/data/build/dist/client/conversation-translation-settings.js +54 -0
  58. package/data/build/dist/client/conversation-translation-settings.js.map +1 -0
  59. package/data/build/dist/client/delegate-command.d.ts.map +1 -1
  60. package/data/build/dist/client/delegate-command.js +36 -7
  61. package/data/build/dist/client/delegate-command.js.map +1 -1
  62. package/data/build/dist/client/desktop-assistant.js +1948 -494
  63. package/data/build/dist/client/editor-engine.d.ts +1 -1
  64. package/data/build/dist/client/editor-engine.d.ts.map +1 -1
  65. package/data/build/dist/client/editor-engine.js +4 -1
  66. package/data/build/dist/client/editor-engine.js.map +1 -1
  67. package/data/build/dist/client/feature-requirement.d.ts +43 -0
  68. package/data/build/dist/client/feature-requirement.d.ts.map +1 -0
  69. package/data/build/dist/client/feature-requirement.js +105 -0
  70. package/data/build/dist/client/feature-requirement.js.map +1 -0
  71. package/data/build/dist/client/features/cli-adapters.d.ts +3 -1
  72. package/data/build/dist/client/features/cli-adapters.d.ts.map +1 -1
  73. package/data/build/dist/client/features/cli-adapters.js +207 -112
  74. package/data/build/dist/client/features/cli-adapters.js.map +1 -1
  75. package/data/build/dist/client/features/file-management.d.ts.map +1 -1
  76. package/data/build/dist/client/features/file-management.js +18 -0
  77. package/data/build/dist/client/features/file-management.js.map +1 -1
  78. package/data/build/dist/client/features/index.d.ts +1 -0
  79. package/data/build/dist/client/features/index.d.ts.map +1 -1
  80. package/data/build/dist/client/features/index.js +5 -0
  81. package/data/build/dist/client/features/index.js.map +1 -1
  82. package/data/build/dist/client/features/lan-access-panel.d.ts.map +1 -1
  83. package/data/build/dist/client/features/lan-access-panel.js +1 -0
  84. package/data/build/dist/client/features/lan-access-panel.js.map +1 -1
  85. package/data/build/dist/client/features/magpie-management-controls.d.ts +46 -0
  86. package/data/build/dist/client/features/magpie-management-controls.d.ts.map +1 -0
  87. package/data/build/dist/client/features/magpie-management-controls.js +759 -0
  88. package/data/build/dist/client/features/magpie-management-controls.js.map +1 -0
  89. package/data/build/dist/client/features/magpie-management-page.d.ts +124 -0
  90. package/data/build/dist/client/features/magpie-management-page.d.ts.map +1 -0
  91. package/data/build/dist/client/features/magpie-management-page.js +1256 -0
  92. package/data/build/dist/client/features/magpie-management-page.js.map +1 -0
  93. package/data/build/dist/client/features/magpie-management.d.ts +7 -0
  94. package/data/build/dist/client/features/magpie-management.d.ts.map +1 -0
  95. package/data/build/dist/client/features/magpie-management.js +154 -0
  96. package/data/build/dist/client/features/magpie-management.js.map +1 -0
  97. package/data/build/dist/client/features/magpie-mark.d.ts +10 -0
  98. package/data/build/dist/client/features/magpie-mark.d.ts.map +1 -0
  99. package/data/build/dist/client/features/magpie-mark.js +21 -0
  100. package/data/build/dist/client/features/magpie-mark.js.map +1 -0
  101. package/data/build/dist/client/features/magpie-provider-logo.d.ts +11 -0
  102. package/data/build/dist/client/features/magpie-provider-logo.d.ts.map +1 -0
  103. package/data/build/dist/client/features/magpie-provider-logo.js +35 -0
  104. package/data/build/dist/client/features/magpie-provider-logo.js.map +1 -0
  105. package/data/build/dist/client/features/mobile-access.d.ts.map +1 -1
  106. package/data/build/dist/client/features/mobile-access.js +7 -0
  107. package/data/build/dist/client/features/mobile-access.js.map +1 -1
  108. package/data/build/dist/client/features/peer-host.d.ts.map +1 -1
  109. package/data/build/dist/client/features/peer-host.js +6 -0
  110. package/data/build/dist/client/features/peer-host.js.map +1 -1
  111. package/data/build/dist/client/features/quick-apps.d.ts +3 -0
  112. package/data/build/dist/client/features/quick-apps.d.ts.map +1 -0
  113. package/data/build/dist/client/features/quick-apps.js +14 -0
  114. package/data/build/dist/client/features/quick-apps.js.map +1 -0
  115. package/data/build/dist/client/features/session-translation.d.ts.map +1 -1
  116. package/data/build/dist/client/features/session-translation.js +50 -49
  117. package/data/build/dist/client/features/session-translation.js.map +1 -1
  118. package/data/build/dist/client/features/subscription-quota-groups.d.ts +193 -0
  119. package/data/build/dist/client/features/subscription-quota-groups.d.ts.map +1 -0
  120. package/data/build/dist/client/features/subscription-quota-groups.js +548 -0
  121. package/data/build/dist/client/features/subscription-quota-groups.js.map +1 -0
  122. package/data/build/dist/client/features/workspace-session-enhancement.d.ts.map +1 -1
  123. package/data/build/dist/client/features/workspace-session-enhancement.js +6 -0
  124. package/data/build/dist/client/features/workspace-session-enhancement.js.map +1 -1
  125. package/data/build/dist/client/file-management-dom.d.ts +20 -1
  126. package/data/build/dist/client/file-management-dom.d.ts.map +1 -1
  127. package/data/build/dist/client/file-management-dom.js +94 -18
  128. package/data/build/dist/client/file-management-dom.js.map +1 -1
  129. package/data/build/dist/client/file-viewer-copy-path-menu.d.ts +27 -0
  130. package/data/build/dist/client/file-viewer-copy-path-menu.d.ts.map +1 -0
  131. package/data/build/dist/client/file-viewer-copy-path-menu.js +101 -0
  132. package/data/build/dist/client/file-viewer-copy-path-menu.js.map +1 -0
  133. package/data/build/dist/client/git-management-settings.d.ts +4 -0
  134. package/data/build/dist/client/git-management-settings.d.ts.map +1 -0
  135. package/data/build/dist/client/git-management-settings.js +73 -0
  136. package/data/build/dist/client/git-management-settings.js.map +1 -0
  137. package/data/build/dist/client/git-management.d.ts +2 -1
  138. package/data/build/dist/client/git-management.d.ts.map +1 -1
  139. package/data/build/dist/client/git-management.js +64 -41
  140. package/data/build/dist/client/git-management.js.map +1 -1
  141. package/data/build/dist/client/git-panel-styles.d.ts +4 -0
  142. package/data/build/dist/client/git-panel-styles.d.ts.map +1 -1
  143. package/data/build/dist/client/git-panel-styles.js +15 -0
  144. package/data/build/dist/client/git-panel-styles.js.map +1 -1
  145. package/data/build/dist/client/html-workspace-files.d.ts +4 -0
  146. package/data/build/dist/client/html-workspace-files.d.ts.map +1 -0
  147. package/data/build/dist/client/html-workspace-files.js +114 -0
  148. package/data/build/dist/client/html-workspace-files.js.map +1 -0
  149. package/data/build/dist/client/index.d.ts +1 -1
  150. package/data/build/dist/client/index.d.ts.map +1 -1
  151. package/data/build/dist/client/index.js +1 -1
  152. package/data/build/dist/client/index.js.map +1 -1
  153. package/data/build/dist/client/locale.d.ts.map +1 -1
  154. package/data/build/dist/client/locale.js +29 -2
  155. package/data/build/dist/client/locale.js.map +1 -1
  156. package/data/build/dist/client/locales/cliManagement.d.ts +3 -0
  157. package/data/build/dist/client/locales/cliManagement.d.ts.map +1 -0
  158. package/data/build/dist/client/locales/cliManagement.js +155 -0
  159. package/data/build/dist/client/locales/cliManagement.js.map +1 -0
  160. package/data/build/dist/client/locales/fileWorkspace.d.ts.map +1 -1
  161. package/data/build/dist/client/locales/fileWorkspace.js +8 -0
  162. package/data/build/dist/client/locales/fileWorkspace.js.map +1 -1
  163. package/data/build/dist/client/locales/git.d.ts.map +1 -1
  164. package/data/build/dist/client/locales/git.js +30 -2
  165. package/data/build/dist/client/locales/git.js.map +1 -1
  166. package/data/build/dist/client/locales/magpie.d.ts +4 -0
  167. package/data/build/dist/client/locales/magpie.d.ts.map +1 -0
  168. package/data/build/dist/client/locales/magpie.js +622 -0
  169. package/data/build/dist/client/locales/magpie.js.map +1 -0
  170. package/data/build/dist/client/locales/panels.d.ts.map +1 -1
  171. package/data/build/dist/client/locales/panels.js +103 -11
  172. package/data/build/dist/client/locales/panels.js.map +1 -1
  173. package/data/build/dist/client/locales/peerHost.d.ts.map +1 -1
  174. package/data/build/dist/client/locales/peerHost.js +2 -0
  175. package/data/build/dist/client/locales/peerHost.js.map +1 -1
  176. package/data/build/dist/client/locales/quickApps.d.ts +136 -0
  177. package/data/build/dist/client/locales/quickApps.d.ts.map +1 -0
  178. package/data/build/dist/client/locales/quickApps.js +162 -0
  179. package/data/build/dist/client/locales/quickApps.js.map +1 -0
  180. package/data/build/dist/client/locales/usage.d.ts.map +1 -1
  181. package/data/build/dist/client/locales/usage.js +150 -0
  182. package/data/build/dist/client/locales/usage.js.map +1 -1
  183. package/data/build/dist/client/magpie-model-tag.d.ts +16 -0
  184. package/data/build/dist/client/magpie-model-tag.d.ts.map +1 -0
  185. package/data/build/dist/client/magpie-model-tag.js +62 -0
  186. package/data/build/dist/client/magpie-model-tag.js.map +1 -0
  187. package/data/build/dist/client/mobile-team-panel-dom.d.ts +14 -0
  188. package/data/build/dist/client/mobile-team-panel-dom.d.ts.map +1 -0
  189. package/data/build/dist/client/mobile-team-panel-dom.js +164 -0
  190. package/data/build/dist/client/mobile-team-panel-dom.js.map +1 -0
  191. package/data/build/dist/client/model-catalog-cache.d.ts.map +1 -1
  192. package/data/build/dist/client/model-catalog-cache.js +66 -12
  193. package/data/build/dist/client/model-catalog-cache.js.map +1 -1
  194. package/data/build/dist/client/model-priority-pool.d.ts +23 -0
  195. package/data/build/dist/client/model-priority-pool.d.ts.map +1 -0
  196. package/data/build/dist/client/model-priority-pool.js +245 -0
  197. package/data/build/dist/client/model-priority-pool.js.map +1 -0
  198. package/data/build/dist/client/native-model-translation-menu.d.ts +13 -0
  199. package/data/build/dist/client/native-model-translation-menu.d.ts.map +1 -0
  200. package/data/build/dist/client/native-model-translation-menu.js +159 -0
  201. package/data/build/dist/client/native-model-translation-menu.js.map +1 -0
  202. package/data/build/dist/client/native-translation-default.d.ts +6 -0
  203. package/data/build/dist/client/native-translation-default.d.ts.map +1 -0
  204. package/data/build/dist/client/native-translation-default.js +30 -0
  205. package/data/build/dist/client/native-translation-default.js.map +1 -0
  206. package/data/build/dist/client/provider-icons.d.ts +8 -0
  207. package/data/build/dist/client/provider-icons.d.ts.map +1 -1
  208. package/data/build/dist/client/provider-icons.js +125 -3
  209. package/data/build/dist/client/provider-icons.js.map +1 -1
  210. package/data/build/dist/client/quick-apps/browser-storage.d.ts +24 -0
  211. package/data/build/dist/client/quick-apps/browser-storage.d.ts.map +1 -0
  212. package/data/build/dist/client/quick-apps/browser-storage.js +114 -0
  213. package/data/build/dist/client/quick-apps/browser-storage.js.map +1 -0
  214. package/data/build/dist/client/quick-apps/client.d.ts +31 -0
  215. package/data/build/dist/client/quick-apps/client.d.ts.map +1 -0
  216. package/data/build/dist/client/quick-apps/client.js +68 -0
  217. package/data/build/dist/client/quick-apps/client.js.map +1 -0
  218. package/data/build/dist/client/quick-apps/document.d.ts +26 -0
  219. package/data/build/dist/client/quick-apps/document.d.ts.map +1 -0
  220. package/data/build/dist/client/quick-apps/document.js +110 -0
  221. package/data/build/dist/client/quick-apps/document.js.map +1 -0
  222. package/data/build/dist/client/quick-apps/file-picker.d.ts +14 -0
  223. package/data/build/dist/client/quick-apps/file-picker.d.ts.map +1 -0
  224. package/data/build/dist/client/quick-apps/file-picker.js +51 -0
  225. package/data/build/dist/client/quick-apps/file-picker.js.map +1 -0
  226. package/data/build/dist/client/quick-apps/launcher.d.ts +7 -0
  227. package/data/build/dist/client/quick-apps/launcher.d.ts.map +1 -0
  228. package/data/build/dist/client/quick-apps/launcher.js +267 -0
  229. package/data/build/dist/client/quick-apps/launcher.js.map +1 -0
  230. package/data/build/dist/client/quick-apps/presentation.d.ts +16 -0
  231. package/data/build/dist/client/quick-apps/presentation.d.ts.map +1 -0
  232. package/data/build/dist/client/quick-apps/presentation.js +47 -0
  233. package/data/build/dist/client/quick-apps/presentation.js.map +1 -0
  234. package/data/build/dist/client/quick-apps/rail-preference.d.ts +5 -0
  235. package/data/build/dist/client/quick-apps/rail-preference.d.ts.map +1 -0
  236. package/data/build/dist/client/quick-apps/rail-preference.js +19 -0
  237. package/data/build/dist/client/quick-apps/rail-preference.js.map +1 -0
  238. package/data/build/dist/client/quick-apps/reorder-animation.d.ts +6 -0
  239. package/data/build/dist/client/quick-apps/reorder-animation.d.ts.map +1 -0
  240. package/data/build/dist/client/quick-apps/reorder-animation.js +50 -0
  241. package/data/build/dist/client/quick-apps/reorder-animation.js.map +1 -0
  242. package/data/build/dist/client/quick-apps/reorder.d.ts +26 -0
  243. package/data/build/dist/client/quick-apps/reorder.d.ts.map +1 -0
  244. package/data/build/dist/client/quick-apps/reorder.js +128 -0
  245. package/data/build/dist/client/quick-apps/reorder.js.map +1 -0
  246. package/data/build/dist/client/quick-apps/styles.d.ts +3 -0
  247. package/data/build/dist/client/quick-apps/styles.d.ts.map +1 -0
  248. package/data/build/dist/client/quick-apps/styles.js +153 -0
  249. package/data/build/dist/client/quick-apps/styles.js.map +1 -0
  250. package/data/build/dist/client/quick-apps/ui.d.ts +20 -0
  251. package/data/build/dist/client/quick-apps/ui.d.ts.map +1 -0
  252. package/data/build/dist/client/quick-apps/ui.js +21 -0
  253. package/data/build/dist/client/quick-apps/ui.js.map +1 -0
  254. package/data/build/dist/client/quick-apps/viewer.d.ts +16 -0
  255. package/data/build/dist/client/quick-apps/viewer.d.ts.map +1 -0
  256. package/data/build/dist/client/quick-apps/viewer.js +165 -0
  257. package/data/build/dist/client/quick-apps/viewer.js.map +1 -0
  258. package/data/build/dist/client/quick-apps/workspace-picker.d.ts +19 -0
  259. package/data/build/dist/client/quick-apps/workspace-picker.d.ts.map +1 -0
  260. package/data/build/dist/client/quick-apps/workspace-picker.js +30 -0
  261. package/data/build/dist/client/quick-apps/workspace-picker.js.map +1 -0
  262. package/data/build/dist/client/session-translation-chat.d.ts +68 -2
  263. package/data/build/dist/client/session-translation-chat.d.ts.map +1 -1
  264. package/data/build/dist/client/session-translation-chat.js +297 -109
  265. package/data/build/dist/client/session-translation-chat.js.map +1 -1
  266. package/data/build/dist/client/session-translation-interactions.d.ts +31 -0
  267. package/data/build/dist/client/session-translation-interactions.d.ts.map +1 -0
  268. package/data/build/dist/client/session-translation-interactions.js +158 -0
  269. package/data/build/dist/client/session-translation-interactions.js.map +1 -0
  270. package/data/build/dist/client/session-translation-pending-dom.d.ts +8 -0
  271. package/data/build/dist/client/session-translation-pending-dom.d.ts.map +1 -0
  272. package/data/build/dist/client/session-translation-pending-dom.js +58 -0
  273. package/data/build/dist/client/session-translation-pending-dom.js.map +1 -0
  274. package/data/build/dist/client/session-translation-retry.d.ts +16 -0
  275. package/data/build/dist/client/session-translation-retry.d.ts.map +1 -0
  276. package/data/build/dist/client/session-translation-retry.js +66 -0
  277. package/data/build/dist/client/session-translation-retry.js.map +1 -0
  278. package/data/build/dist/client/session-translation-rules.d.ts +13 -0
  279. package/data/build/dist/client/session-translation-rules.d.ts.map +1 -0
  280. package/data/build/dist/client/session-translation-rules.js +58 -0
  281. package/data/build/dist/client/session-translation-rules.js.map +1 -0
  282. package/data/build/dist/client/settings-bridge.d.ts +1 -0
  283. package/data/build/dist/client/settings-bridge.d.ts.map +1 -1
  284. package/data/build/dist/client/settings-bridge.js +29 -10
  285. package/data/build/dist/client/settings-bridge.js.map +1 -1
  286. package/data/build/dist/client/settings-section.d.ts.map +1 -1
  287. package/data/build/dist/client/settings-section.js +21 -3
  288. package/data/build/dist/client/settings-section.js.map +1 -1
  289. package/data/build/dist/client/sidebar-footer-style.d.ts +13 -0
  290. package/data/build/dist/client/sidebar-footer-style.d.ts.map +1 -0
  291. package/data/build/dist/client/sidebar-footer-style.js +54 -0
  292. package/data/build/dist/client/sidebar-footer-style.js.map +1 -0
  293. package/data/build/dist/client/style.css +279 -276
  294. package/data/build/dist/client/subscription-slot.d.ts +26 -2
  295. package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
  296. package/data/build/dist/client/subscription-slot.js +679 -24
  297. package/data/build/dist/client/subscription-slot.js.map +1 -1
  298. package/data/build/dist/client/terminal/model.d.ts.map +1 -1
  299. package/data/build/dist/client/terminal/model.js +2 -1
  300. package/data/build/dist/client/terminal/model.js.map +1 -1
  301. package/data/build/dist/client/workspace-session-archive-dom.d.ts +1 -0
  302. package/data/build/dist/client/workspace-session-archive-dom.d.ts.map +1 -1
  303. package/data/build/dist/client/workspace-session-archive-dom.js +68 -8
  304. package/data/build/dist/client/workspace-session-archive-dom.js.map +1 -1
  305. package/data/build/dist/client/workspace-session-rightbar-dom.d.ts.map +1 -1
  306. package/data/build/dist/client/workspace-session-rightbar-dom.js +12 -21
  307. package/data/build/dist/client/workspace-session-rightbar-dom.js.map +1 -1
  308. package/data/build/dist/client/workspace-session-visibility-dom.d.ts +3 -0
  309. package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
  310. package/data/build/dist/client/workspace-session-visibility-dom.js +43 -10
  311. package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
  312. package/data/build/dist/dsh-capabilities/client/composer-presentation-adapter.d.ts +8 -0
  313. package/data/build/dist/dsh-capabilities/client/composer-presentation-adapter.d.ts.map +1 -0
  314. package/data/build/dist/dsh-capabilities/client/composer-presentation-adapter.js +71 -0
  315. package/data/build/dist/dsh-capabilities/client/composer-presentation-adapter.js.map +1 -0
  316. package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.d.ts +4 -0
  317. package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.d.ts.map +1 -0
  318. package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.js +8 -0
  319. package/data/build/dist/dsh-capabilities/client/composer-slot-selectors.js.map +1 -0
  320. package/data/build/dist/dsh-capabilities/client/global-panel-adapter.d.ts +27 -0
  321. package/data/build/dist/dsh-capabilities/client/global-panel-adapter.d.ts.map +1 -0
  322. package/data/build/dist/dsh-capabilities/client/global-panel-adapter.js +109 -0
  323. package/data/build/dist/dsh-capabilities/client/global-panel-adapter.js.map +1 -0
  324. package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.d.ts +30 -0
  325. package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.d.ts.map +1 -0
  326. package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.js +93 -0
  327. package/data/build/dist/dsh-capabilities/client/interaction-presentation-adapter.js.map +1 -0
  328. package/data/build/dist/dsh-capabilities/client/interaction-text-dom.d.ts +12 -0
  329. package/data/build/dist/dsh-capabilities/client/interaction-text-dom.d.ts.map +1 -0
  330. package/data/build/dist/dsh-capabilities/client/interaction-text-dom.js +181 -0
  331. package/data/build/dist/dsh-capabilities/client/interaction-text-dom.js.map +1 -0
  332. package/data/build/dist/dsh-capabilities/client/message-presentation-adapter.d.ts +19 -0
  333. package/data/build/dist/dsh-capabilities/client/message-presentation-adapter.d.ts.map +1 -0
  334. package/data/build/dist/dsh-capabilities/client/message-presentation-adapter.js +39 -0
  335. package/data/build/dist/dsh-capabilities/client/message-presentation-adapter.js.map +1 -0
  336. package/data/build/dist/dsh-capabilities/client/peer-host-attachment-adapter.d.ts +3 -0
  337. package/data/build/dist/dsh-capabilities/client/peer-host-attachment-adapter.d.ts.map +1 -0
  338. package/data/build/dist/dsh-capabilities/client/peer-host-attachment-adapter.js +27 -0
  339. package/data/build/dist/dsh-capabilities/client/peer-host-attachment-adapter.js.map +1 -0
  340. package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts +36 -0
  341. package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
  342. package/data/build/dist/dsh-capabilities/client/primitives-adapter.js +88 -0
  343. package/data/build/dist/dsh-capabilities/client/primitives-adapter.js.map +1 -1
  344. package/data/build/dist/dsh-capabilities/client/question-history-adapter.d.ts +20 -0
  345. package/data/build/dist/dsh-capabilities/client/question-history-adapter.d.ts.map +1 -0
  346. package/data/build/dist/dsh-capabilities/client/question-history-adapter.js +65 -0
  347. package/data/build/dist/dsh-capabilities/client/question-history-adapter.js.map +1 -0
  348. package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.d.ts +18 -0
  349. package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.d.ts.map +1 -0
  350. package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.js +11 -0
  351. package/data/build/dist/dsh-capabilities/client/quick-app-footer-adapter.js.map +1 -0
  352. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts +9 -0
  353. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts.map +1 -0
  354. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js +75 -0
  355. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js.map +1 -0
  356. package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.d.ts +3 -0
  357. package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.d.ts.map +1 -0
  358. package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.js +22 -0
  359. package/data/build/dist/dsh-capabilities/client/sidebar-footer-icon-adapter.js.map +1 -0
  360. package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.d.ts +32 -0
  361. package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.d.ts.map +1 -0
  362. package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.js +90 -0
  363. package/data/build/dist/dsh-capabilities/client/slot-presentation-mirror.js.map +1 -0
  364. package/data/build/dist/dsh-capabilities/host/agent-team-adapter.d.ts +52 -0
  365. package/data/build/dist/dsh-capabilities/host/agent-team-adapter.d.ts.map +1 -0
  366. package/data/build/dist/dsh-capabilities/host/agent-team-adapter.js +109 -0
  367. package/data/build/dist/dsh-capabilities/host/agent-team-adapter.js.map +1 -0
  368. package/data/build/dist/dsh-capabilities/host/connection-peer-adapter.d.ts +10 -0
  369. package/data/build/dist/dsh-capabilities/host/connection-peer-adapter.d.ts.map +1 -0
  370. package/data/build/dist/dsh-capabilities/host/connection-peer-adapter.js +34 -0
  371. package/data/build/dist/dsh-capabilities/host/connection-peer-adapter.js.map +1 -0
  372. package/data/build/dist/dsh-capabilities/host/native-dispatch-adapter.d.ts +21 -0
  373. package/data/build/dist/dsh-capabilities/host/native-dispatch-adapter.d.ts.map +1 -0
  374. package/data/build/dist/dsh-capabilities/host/native-dispatch-adapter.js +11 -0
  375. package/data/build/dist/dsh-capabilities/host/native-dispatch-adapter.js.map +1 -0
  376. package/data/build/dist/dsh-capabilities/host/quick-app-credentials.d.ts +11 -0
  377. package/data/build/dist/dsh-capabilities/host/quick-app-credentials.d.ts.map +1 -0
  378. package/data/build/dist/dsh-capabilities/host/quick-app-credentials.js +97 -0
  379. package/data/build/dist/dsh-capabilities/host/quick-app-credentials.js.map +1 -0
  380. package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.d.ts +36 -0
  381. package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.d.ts.map +1 -0
  382. package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.js +164 -0
  383. package/data/build/dist/dsh-capabilities/host/quick-app-https-provider.js.map +1 -0
  384. package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.d.ts +44 -0
  385. package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.d.ts.map +1 -0
  386. package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.js +240 -0
  387. package/data/build/dist/dsh-capabilities/host/quick-app-lan-ports.js.map +1 -0
  388. package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.d.ts +37 -0
  389. package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.d.ts.map +1 -0
  390. package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.js +35 -0
  391. package/data/build/dist/dsh-capabilities/host/quick-app-origin-adapter.js.map +1 -0
  392. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.d.ts +13 -0
  393. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.d.ts.map +1 -0
  394. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.js +30 -0
  395. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-adapter.js.map +1 -0
  396. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.d.ts +21 -0
  397. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.d.ts.map +1 -0
  398. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.js +132 -0
  399. package/data/build/dist/dsh-capabilities/host/quick-app-proxy-provider.js.map +1 -0
  400. package/data/build/dist/dsh-capabilities/host/quick-app-transport.d.ts +10 -0
  401. package/data/build/dist/dsh-capabilities/host/quick-app-transport.d.ts.map +1 -0
  402. package/data/build/dist/dsh-capabilities/host/quick-app-transport.js +33 -0
  403. package/data/build/dist/dsh-capabilities/host/quick-app-transport.js.map +1 -0
  404. package/data/build/dist/dsh-capabilities/host/session-activation-adapter.d.ts +17 -0
  405. package/data/build/dist/dsh-capabilities/host/session-activation-adapter.d.ts.map +1 -0
  406. package/data/build/dist/dsh-capabilities/host/session-activation-adapter.js +37 -0
  407. package/data/build/dist/dsh-capabilities/host/session-activation-adapter.js.map +1 -0
  408. package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.d.ts +17 -0
  409. package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.d.ts.map +1 -0
  410. package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js +45 -0
  411. package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js.map +1 -0
  412. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts +7 -0
  413. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts.map +1 -0
  414. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js +18 -0
  415. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js.map +1 -0
  416. package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.d.ts +28 -0
  417. package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.d.ts.map +1 -0
  418. package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.js +31 -0
  419. package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.js.map +1 -0
  420. package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts +2 -1
  421. package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts.map +1 -1
  422. package/data/build/dist/dsh-capabilities/host/session-title-adapter.js +32 -2
  423. package/data/build/dist/dsh-capabilities/host/session-title-adapter.js.map +1 -1
  424. package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.d.ts +13 -0
  425. package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.d.ts.map +1 -0
  426. package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.js +24 -0
  427. package/data/build/dist/dsh-capabilities/host/workspace-directory-adapter.js.map +1 -0
  428. package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
  429. package/data/build/dist/dsh-capabilities/matrix.js +23 -5
  430. package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
  431. package/data/build/dist/dsh-capabilities/routes.d.ts +1 -0
  432. package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
  433. package/data/build/dist/dsh-capabilities/routes.js +50 -3
  434. package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
  435. package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
  436. package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
  437. package/data/build/dist/dsh-capabilities/types.js.map +1 -1
  438. package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts +27 -0
  439. package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts.map +1 -1
  440. package/data/build/dist/host/cli-adapters/acp-cli-driver.js +94 -16
  441. package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
  442. package/data/build/dist/host/cli-adapters/antigravity-driver.js +1 -1
  443. package/data/build/dist/host/cli-adapters/antigravity-driver.js.map +1 -1
  444. package/data/build/dist/host/cli-adapters/attachment-utils.d.ts +4 -3
  445. package/data/build/dist/host/cli-adapters/attachment-utils.d.ts.map +1 -1
  446. package/data/build/dist/host/cli-adapters/attachment-utils.js +9 -8
  447. package/data/build/dist/host/cli-adapters/attachment-utils.js.map +1 -1
  448. package/data/build/dist/host/cli-adapters/binary-detection.d.ts.map +1 -1
  449. package/data/build/dist/host/cli-adapters/binary-detection.js +7 -3
  450. package/data/build/dist/host/cli-adapters/binary-detection.js.map +1 -1
  451. package/data/build/dist/host/cli-adapters/claude-driver.d.ts +1 -0
  452. package/data/build/dist/host/cli-adapters/claude-driver.d.ts.map +1 -1
  453. package/data/build/dist/host/cli-adapters/claude-driver.js +184 -21
  454. package/data/build/dist/host/cli-adapters/claude-driver.js.map +1 -1
  455. package/data/build/dist/host/cli-adapters/codex-driver.d.ts +28 -0
  456. package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
  457. package/data/build/dist/host/cli-adapters/codex-driver.js +158 -22
  458. package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
  459. package/data/build/dist/host/cli-adapters/codex-performance-projection.d.ts +91 -0
  460. package/data/build/dist/host/cli-adapters/codex-performance-projection.d.ts.map +1 -0
  461. package/data/build/dist/host/cli-adapters/codex-performance-projection.js +8 -0
  462. package/data/build/dist/host/cli-adapters/codex-performance-projection.js.map +1 -0
  463. package/data/build/dist/host/cli-adapters/codex-performance.d.ts +16 -0
  464. package/data/build/dist/host/cli-adapters/codex-performance.d.ts.map +1 -0
  465. package/data/build/dist/host/cli-adapters/codex-performance.js +81 -0
  466. package/data/build/dist/host/cli-adapters/codex-performance.js.map +1 -0
  467. package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts +6 -2
  468. package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts.map +1 -1
  469. package/data/build/dist/host/cli-adapters/command-code-acp-loader.js +198 -26
  470. package/data/build/dist/host/cli-adapters/command-code-acp-loader.js.map +1 -1
  471. package/data/build/dist/host/cli-adapters/command-code-driver.d.ts.map +1 -1
  472. package/data/build/dist/host/cli-adapters/command-code-driver.js +33 -5
  473. package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
  474. package/data/build/dist/host/cli-adapters/desktop-app-runtime.d.ts +3 -1
  475. package/data/build/dist/host/cli-adapters/desktop-app-runtime.d.ts.map +1 -1
  476. package/data/build/dist/host/cli-adapters/desktop-app-runtime.js +41 -4
  477. package/data/build/dist/host/cli-adapters/desktop-app-runtime.js.map +1 -1
  478. package/data/build/dist/host/cli-adapters/driver.d.ts +2 -0
  479. package/data/build/dist/host/cli-adapters/driver.d.ts.map +1 -1
  480. package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts +5 -1
  481. package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
  482. package/data/build/dist/host/cli-adapters/dsh-message-projector.js +65 -17
  483. package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
  484. package/data/build/dist/host/cli-adapters/dsh-tool-history.js +3 -2
  485. package/data/build/dist/host/cli-adapters/dsh-tool-history.js.map +1 -1
  486. package/data/build/dist/host/cli-adapters/dsh-virtual-providers.d.ts.map +1 -1
  487. package/data/build/dist/host/cli-adapters/dsh-virtual-providers.js +3 -2
  488. package/data/build/dist/host/cli-adapters/dsh-virtual-providers.js.map +1 -1
  489. package/data/build/dist/host/cli-adapters/feature.d.ts +17 -0
  490. package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
  491. package/data/build/dist/host/cli-adapters/feature.js +972 -102
  492. package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
  493. package/data/build/dist/host/cli-adapters/gemini-driver.d.ts.map +1 -1
  494. package/data/build/dist/host/cli-adapters/gemini-driver.js +5 -3
  495. package/data/build/dist/host/cli-adapters/gemini-driver.js.map +1 -1
  496. package/data/build/dist/host/cli-adapters/grok-driver.d.ts +7 -0
  497. package/data/build/dist/host/cli-adapters/grok-driver.d.ts.map +1 -1
  498. package/data/build/dist/host/cli-adapters/grok-driver.js +463 -59
  499. package/data/build/dist/host/cli-adapters/grok-driver.js.map +1 -1
  500. package/data/build/dist/host/cli-adapters/grok-performance-projection.d.ts +123 -0
  501. package/data/build/dist/host/cli-adapters/grok-performance-projection.d.ts.map +1 -0
  502. package/data/build/dist/host/cli-adapters/grok-performance-projection.js +48 -0
  503. package/data/build/dist/host/cli-adapters/grok-performance-projection.js.map +1 -0
  504. package/data/build/dist/host/cli-adapters/grok-usage.d.ts +45 -0
  505. package/data/build/dist/host/cli-adapters/grok-usage.d.ts.map +1 -0
  506. package/data/build/dist/host/cli-adapters/grok-usage.js +197 -0
  507. package/data/build/dist/host/cli-adapters/grok-usage.js.map +1 -0
  508. package/data/build/dist/host/cli-adapters/kimi-driver.js +2 -2
  509. package/data/build/dist/host/cli-adapters/kimi-driver.js.map +1 -1
  510. package/data/build/dist/host/cli-adapters/legacy-session-adapter.d.ts.map +1 -1
  511. package/data/build/dist/host/cli-adapters/legacy-session-adapter.js +20 -3
  512. package/data/build/dist/host/cli-adapters/legacy-session-adapter.js.map +1 -1
  513. package/data/build/dist/host/cli-adapters/magpie-detection.d.ts +72 -0
  514. package/data/build/dist/host/cli-adapters/magpie-detection.d.ts.map +1 -0
  515. package/data/build/dist/host/cli-adapters/magpie-detection.js +298 -0
  516. package/data/build/dist/host/cli-adapters/magpie-detection.js.map +1 -0
  517. package/data/build/dist/host/cli-adapters/magpie-management.d.ts +50 -0
  518. package/data/build/dist/host/cli-adapters/magpie-management.d.ts.map +1 -0
  519. package/data/build/dist/host/cli-adapters/magpie-management.js +1268 -0
  520. package/data/build/dist/host/cli-adapters/magpie-management.js.map +1 -0
  521. package/data/build/dist/host/cli-adapters/magpie-session-routing.d.ts +9 -0
  522. package/data/build/dist/host/cli-adapters/magpie-session-routing.d.ts.map +1 -0
  523. package/data/build/dist/host/cli-adapters/magpie-session-routing.js +90 -0
  524. package/data/build/dist/host/cli-adapters/magpie-session-routing.js.map +1 -0
  525. package/data/build/dist/host/cli-adapters/magpie-update.d.ts +59 -0
  526. package/data/build/dist/host/cli-adapters/magpie-update.d.ts.map +1 -0
  527. package/data/build/dist/host/cli-adapters/magpie-update.js +249 -0
  528. package/data/build/dist/host/cli-adapters/magpie-update.js.map +1 -0
  529. package/data/build/dist/host/cli-adapters/magpie-usage.d.ts +148 -0
  530. package/data/build/dist/host/cli-adapters/magpie-usage.d.ts.map +1 -0
  531. package/data/build/dist/host/cli-adapters/magpie-usage.js +1710 -0
  532. package/data/build/dist/host/cli-adapters/magpie-usage.js.map +1 -0
  533. package/data/build/dist/host/cli-adapters/magpie-web.d.ts +54 -0
  534. package/data/build/dist/host/cli-adapters/magpie-web.d.ts.map +1 -0
  535. package/data/build/dist/host/cli-adapters/magpie-web.js +407 -0
  536. package/data/build/dist/host/cli-adapters/magpie-web.js.map +1 -0
  537. package/data/build/dist/host/cli-adapters/management-installation.d.ts +5 -0
  538. package/data/build/dist/host/cli-adapters/management-installation.d.ts.map +1 -0
  539. package/data/build/dist/host/cli-adapters/management-installation.js +131 -0
  540. package/data/build/dist/host/cli-adapters/management-installation.js.map +1 -0
  541. package/data/build/dist/host/cli-adapters/management-methods.d.ts +37 -0
  542. package/data/build/dist/host/cli-adapters/management-methods.d.ts.map +1 -0
  543. package/data/build/dist/host/cli-adapters/management-methods.js +144 -0
  544. package/data/build/dist/host/cli-adapters/management-methods.js.map +1 -0
  545. package/data/build/dist/host/cli-adapters/management-process.d.ts +7 -0
  546. package/data/build/dist/host/cli-adapters/management-process.d.ts.map +1 -0
  547. package/data/build/dist/host/cli-adapters/management-process.js +62 -0
  548. package/data/build/dist/host/cli-adapters/management-process.js.map +1 -0
  549. package/data/build/dist/host/cli-adapters/management.d.ts +32 -0
  550. package/data/build/dist/host/cli-adapters/management.d.ts.map +1 -0
  551. package/data/build/dist/host/cli-adapters/management.js +177 -0
  552. package/data/build/dist/host/cli-adapters/management.js.map +1 -0
  553. package/data/build/dist/host/cli-adapters/mcode-driver.d.ts.map +1 -1
  554. package/data/build/dist/host/cli-adapters/mcode-driver.js +12 -5
  555. package/data/build/dist/host/cli-adapters/mcode-driver.js.map +1 -1
  556. package/data/build/dist/host/cli-adapters/model-catalog.d.ts +1 -0
  557. package/data/build/dist/host/cli-adapters/model-catalog.d.ts.map +1 -1
  558. package/data/build/dist/host/cli-adapters/model-catalog.js +70 -7
  559. package/data/build/dist/host/cli-adapters/model-catalog.js.map +1 -1
  560. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts +1 -1
  561. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.d.ts.map +1 -1
  562. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js +13 -5
  563. package/data/build/dist/host/cli-adapters/native-subagent-dispatch.js.map +1 -1
  564. package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts +7 -1
  565. package/data/build/dist/host/cli-adapters/native-team-subagent.d.ts.map +1 -1
  566. package/data/build/dist/host/cli-adapters/native-team-subagent.js +6 -3
  567. package/data/build/dist/host/cli-adapters/native-team-subagent.js.map +1 -1
  568. package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +22 -0
  569. package/data/build/dist/host/cli-adapters/opencode-driver.d.ts.map +1 -1
  570. package/data/build/dist/host/cli-adapters/opencode-driver.js +105 -17
  571. package/data/build/dist/host/cli-adapters/opencode-driver.js.map +1 -1
  572. package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js +4 -1
  573. package/data/build/dist/host/cli-adapters/opencode-v2-protocol.js.map +1 -1
  574. package/data/build/dist/host/cli-adapters/pi-driver.d.ts.map +1 -1
  575. package/data/build/dist/host/cli-adapters/pi-driver.js +45 -11
  576. package/data/build/dist/host/cli-adapters/pi-driver.js.map +1 -1
  577. package/data/build/dist/host/cli-adapters/process-utils.d.ts +4 -0
  578. package/data/build/dist/host/cli-adapters/process-utils.d.ts.map +1 -1
  579. package/data/build/dist/host/cli-adapters/process-utils.js +20 -11
  580. package/data/build/dist/host/cli-adapters/process-utils.js.map +1 -1
  581. package/data/build/dist/host/cli-adapters/registry.d.ts +7 -1
  582. package/data/build/dist/host/cli-adapters/registry.d.ts.map +1 -1
  583. package/data/build/dist/host/cli-adapters/registry.js +141 -51
  584. package/data/build/dist/host/cli-adapters/registry.js.map +1 -1
  585. package/data/build/dist/host/cli-adapters/session-performance-projection.d.ts +74 -0
  586. package/data/build/dist/host/cli-adapters/session-performance-projection.d.ts.map +1 -0
  587. package/data/build/dist/host/cli-adapters/session-performance-projection.js +83 -0
  588. package/data/build/dist/host/cli-adapters/session-performance-projection.js.map +1 -0
  589. package/data/build/dist/host/cli-adapters/standard-stream-driver.d.ts.map +1 -1
  590. package/data/build/dist/host/cli-adapters/standard-stream-driver.js +4 -0
  591. package/data/build/dist/host/cli-adapters/standard-stream-driver.js.map +1 -1
  592. package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts +3 -1
  593. package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts.map +1 -1
  594. package/data/build/dist/host/cli-adapters/stream-normalizer.js +2 -0
  595. package/data/build/dist/host/cli-adapters/stream-normalizer.js.map +1 -1
  596. package/data/build/dist/host/cli-adapters/subagent-tool-descriptions.d.ts +26 -0
  597. package/data/build/dist/host/cli-adapters/subagent-tool-descriptions.d.ts.map +1 -0
  598. package/data/build/dist/host/cli-adapters/subagent-tool-descriptions.js +30 -0
  599. package/data/build/dist/host/cli-adapters/subagent-tool-descriptions.js.map +1 -0
  600. package/data/build/dist/host/cli-adapters/subagent-tool.d.ts.map +1 -1
  601. package/data/build/dist/host/cli-adapters/subagent-tool.js +7 -6
  602. package/data/build/dist/host/cli-adapters/subagent-tool.js.map +1 -1
  603. package/data/build/dist/host/cli-adapters/team-input.d.ts +17 -0
  604. package/data/build/dist/host/cli-adapters/team-input.d.ts.map +1 -0
  605. package/data/build/dist/host/cli-adapters/team-input.js +67 -0
  606. package/data/build/dist/host/cli-adapters/team-input.js.map +1 -0
  607. package/data/build/dist/host/cli-adapters/update-check.d.ts +34 -0
  608. package/data/build/dist/host/cli-adapters/update-check.d.ts.map +1 -0
  609. package/data/build/dist/host/cli-adapters/update-check.js +263 -0
  610. package/data/build/dist/host/cli-adapters/update-check.js.map +1 -0
  611. package/data/build/dist/host/cli-adapters/zcode-driver.d.ts.map +1 -1
  612. package/data/build/dist/host/cli-adapters/zcode-driver.js +7 -2
  613. package/data/build/dist/host/cli-adapters/zcode-driver.js.map +1 -1
  614. package/data/build/dist/host/cli-adapters/zcode-update.d.ts +8 -0
  615. package/data/build/dist/host/cli-adapters/zcode-update.d.ts.map +1 -0
  616. package/data/build/dist/host/cli-adapters/zcode-update.js +149 -0
  617. package/data/build/dist/host/cli-adapters/zcode-update.js.map +1 -0
  618. package/data/build/dist/host/cli-bridge/bridge-holder.d.ts +14 -0
  619. package/data/build/dist/host/cli-bridge/bridge-holder.d.ts.map +1 -1
  620. package/data/build/dist/host/cli-bridge/bridge-holder.js +53 -6
  621. package/data/build/dist/host/cli-bridge/bridge-holder.js.map +1 -1
  622. package/data/build/dist/host/cli-bridge/bridge-server.d.ts +8 -0
  623. package/data/build/dist/host/cli-bridge/bridge-server.d.ts.map +1 -1
  624. package/data/build/dist/host/cli-bridge/bridge-server.js +63 -6
  625. package/data/build/dist/host/cli-bridge/bridge-server.js.map +1 -1
  626. package/data/build/dist/host/cli-bridge/command-code-mod.d.ts.map +1 -1
  627. package/data/build/dist/host/cli-bridge/command-code-mod.js +128 -0
  628. package/data/build/dist/host/cli-bridge/command-code-mod.js.map +1 -1
  629. package/data/build/dist/host/cli-bridge/dispatch.js +1 -1
  630. package/data/build/dist/host/cli-bridge/dispatch.js.map +1 -1
  631. package/data/build/dist/host/cli-bridge/fetch-dispatch.d.ts +23 -0
  632. package/data/build/dist/host/cli-bridge/fetch-dispatch.d.ts.map +1 -0
  633. package/data/build/dist/host/cli-bridge/fetch-dispatch.js +73 -0
  634. package/data/build/dist/host/cli-bridge/fetch-dispatch.js.map +1 -0
  635. package/data/build/dist/host/cli-bridge/injections.d.ts +14 -0
  636. package/data/build/dist/host/cli-bridge/injections.d.ts.map +1 -1
  637. package/data/build/dist/host/cli-bridge/injections.js +69 -7
  638. package/data/build/dist/host/cli-bridge/injections.js.map +1 -1
  639. package/data/build/dist/host/cli-bridge/mcp-stdio-entry.d.ts +1 -1
  640. package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js +102 -7
  641. package/data/build/dist/host/cli-bridge/mcp-stdio-entry.js.map +1 -1
  642. package/data/build/dist/host/cli-bridge/pi-extension-entry.d.ts +3 -0
  643. package/data/build/dist/host/cli-bridge/pi-extension-entry.d.ts.map +1 -0
  644. package/data/build/dist/host/cli-bridge/pi-extension-entry.js +9 -0
  645. package/data/build/dist/host/cli-bridge/pi-extension-entry.js.map +1 -0
  646. package/data/build/dist/host/cli-bridge/pi-extension.d.ts +52 -0
  647. package/data/build/dist/host/cli-bridge/pi-extension.d.ts.map +1 -0
  648. package/data/build/dist/host/cli-bridge/pi-extension.js +311 -0
  649. package/data/build/dist/host/cli-bridge/pi-extension.js.map +1 -0
  650. package/data/build/dist/host/cli-bridge/search-dispatch.d.ts +20 -0
  651. package/data/build/dist/host/cli-bridge/search-dispatch.d.ts.map +1 -0
  652. package/data/build/dist/host/cli-bridge/search-dispatch.js +61 -0
  653. package/data/build/dist/host/cli-bridge/search-dispatch.js.map +1 -0
  654. package/data/build/dist/host/cli-bridge/team-adapters.d.ts +11 -0
  655. package/data/build/dist/host/cli-bridge/team-adapters.d.ts.map +1 -0
  656. package/data/build/dist/host/cli-bridge/team-adapters.js +23 -0
  657. package/data/build/dist/host/cli-bridge/team-adapters.js.map +1 -0
  658. package/data/build/dist/host/cli-bridge/team-dispatch.d.ts +28 -0
  659. package/data/build/dist/host/cli-bridge/team-dispatch.d.ts.map +1 -0
  660. package/data/build/dist/host/cli-bridge/team-dispatch.js +208 -0
  661. package/data/build/dist/host/cli-bridge/team-dispatch.js.map +1 -0
  662. package/data/build/dist/host/cli-bridge/team-tool.d.ts +3 -0
  663. package/data/build/dist/host/cli-bridge/team-tool.d.ts.map +1 -0
  664. package/data/build/dist/host/cli-bridge/team-tool.js +18 -0
  665. package/data/build/dist/host/cli-bridge/team-tool.js.map +1 -0
  666. package/data/build/dist/host/dsh-gateway-feature.d.ts.map +1 -1
  667. package/data/build/dist/host/dsh-gateway-feature.js +26 -3
  668. package/data/build/dist/host/dsh-gateway-feature.js.map +1 -1
  669. package/data/build/dist/host/features/file-management.d.ts.map +1 -1
  670. package/data/build/dist/host/features/file-management.js +10 -1
  671. package/data/build/dist/host/features/file-management.js.map +1 -1
  672. package/data/build/dist/host/features/git-commit-message.d.ts +5 -0
  673. package/data/build/dist/host/features/git-commit-message.d.ts.map +1 -0
  674. package/data/build/dist/host/features/git-commit-message.js +66 -0
  675. package/data/build/dist/host/features/git-commit-message.js.map +1 -0
  676. package/data/build/dist/host/features/git-management.d.ts +11 -2
  677. package/data/build/dist/host/features/git-management.d.ts.map +1 -1
  678. package/data/build/dist/host/features/git-management.js +61 -7
  679. package/data/build/dist/host/features/git-management.js.map +1 -1
  680. package/data/build/dist/host/features/global-voice-rpc.d.ts.map +1 -1
  681. package/data/build/dist/host/features/global-voice-rpc.js +2 -3
  682. package/data/build/dist/host/features/global-voice-rpc.js.map +1 -1
  683. package/data/build/dist/host/features/host-status.d.ts +25 -0
  684. package/data/build/dist/host/features/host-status.d.ts.map +1 -1
  685. package/data/build/dist/host/features/host-status.js +60 -6
  686. package/data/build/dist/host/features/host-status.js.map +1 -1
  687. package/data/build/dist/host/features/index.d.ts.map +1 -1
  688. package/data/build/dist/host/features/index.js +2 -0
  689. package/data/build/dist/host/features/index.js.map +1 -1
  690. package/data/build/dist/host/features/interaction-translation.d.ts +10 -0
  691. package/data/build/dist/host/features/interaction-translation.d.ts.map +1 -0
  692. package/data/build/dist/host/features/interaction-translation.js +219 -0
  693. package/data/build/dist/host/features/interaction-translation.js.map +1 -0
  694. package/data/build/dist/host/features/lan-access-dsh.d.ts.map +1 -1
  695. package/data/build/dist/host/features/lan-access-dsh.js +64 -13
  696. package/data/build/dist/host/features/lan-access-dsh.js.map +1 -1
  697. package/data/build/dist/host/features/peer-host.d.ts.map +1 -1
  698. package/data/build/dist/host/features/peer-host.js +13 -6
  699. package/data/build/dist/host/features/peer-host.js.map +1 -1
  700. package/data/build/dist/host/features/quick-apps.d.ts +4 -0
  701. package/data/build/dist/host/features/quick-apps.d.ts.map +1 -0
  702. package/data/build/dist/host/features/quick-apps.js +158 -0
  703. package/data/build/dist/host/features/quick-apps.js.map +1 -0
  704. package/data/build/dist/host/features/session-prompt-translation.d.ts +10 -0
  705. package/data/build/dist/host/features/session-prompt-translation.d.ts.map +1 -0
  706. package/data/build/dist/host/features/session-prompt-translation.js +227 -0
  707. package/data/build/dist/host/features/session-prompt-translation.js.map +1 -0
  708. package/data/build/dist/host/features/session-translation-protection.d.ts +22 -0
  709. package/data/build/dist/host/features/session-translation-protection.d.ts.map +1 -0
  710. package/data/build/dist/host/features/session-translation-protection.js +205 -0
  711. package/data/build/dist/host/features/session-translation-protection.js.map +1 -0
  712. package/data/build/dist/host/features/session-translation-recovery.d.ts +21 -0
  713. package/data/build/dist/host/features/session-translation-recovery.d.ts.map +1 -0
  714. package/data/build/dist/host/features/session-translation-recovery.js +125 -0
  715. package/data/build/dist/host/features/session-translation-recovery.js.map +1 -0
  716. package/data/build/dist/host/features/session-translation-runtime.d.ts +16 -0
  717. package/data/build/dist/host/features/session-translation-runtime.d.ts.map +1 -0
  718. package/data/build/dist/host/features/session-translation-runtime.js +85 -0
  719. package/data/build/dist/host/features/session-translation-runtime.js.map +1 -0
  720. package/data/build/dist/host/features/session-translation-service.d.ts +19 -4
  721. package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -1
  722. package/data/build/dist/host/features/session-translation-service.js +249 -210
  723. package/data/build/dist/host/features/session-translation-service.js.map +1 -1
  724. package/data/build/dist/host/features/session-translation.d.ts.map +1 -1
  725. package/data/build/dist/host/features/session-translation.js +6 -3
  726. package/data/build/dist/host/features/session-translation.js.map +1 -1
  727. package/data/build/dist/host/features/types.d.ts +10 -0
  728. package/data/build/dist/host/features/types.d.ts.map +1 -1
  729. package/data/build/dist/host/html-workspace-files.d.ts +3 -0
  730. package/data/build/dist/host/html-workspace-files.d.ts.map +1 -0
  731. package/data/build/dist/host/html-workspace-files.js +135 -0
  732. package/data/build/dist/host/html-workspace-files.js.map +1 -0
  733. package/data/build/dist/host/index.d.ts.map +1 -1
  734. package/data/build/dist/host/index.js +32 -39
  735. package/data/build/dist/host/index.js.map +1 -1
  736. package/data/build/dist/host/lan-access-dsh.d.ts +14 -2
  737. package/data/build/dist/host/lan-access-dsh.d.ts.map +1 -1
  738. package/data/build/dist/host/lan-access-dsh.js +87 -15
  739. package/data/build/dist/host/lan-access-dsh.js.map +1 -1
  740. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts +2 -2
  741. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.d.ts.map +1 -1
  742. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js +10 -9
  743. package/data/build/dist/host/modules/peer-host/peer-host-native-dispatch.js.map +1 -1
  744. package/data/build/dist/host/modules/peer-host/peer-host-native-streams.d.ts +3 -3
  745. package/data/build/dist/host/modules/peer-host/peer-host-native-streams.d.ts.map +1 -1
  746. package/data/build/dist/host/modules/peer-host/peer-host-native-streams.js +26 -14
  747. package/data/build/dist/host/modules/peer-host/peer-host-native-streams.js.map +1 -1
  748. package/data/build/dist/host/modules/peer-host/quick-app-gateway.d.ts +5 -0
  749. package/data/build/dist/host/modules/peer-host/quick-app-gateway.d.ts.map +1 -0
  750. package/data/build/dist/host/modules/peer-host/quick-app-gateway.js +27 -0
  751. package/data/build/dist/host/modules/peer-host/quick-app-gateway.js.map +1 -0
  752. package/data/build/dist/host/modules/pwa/pwa-session-notifications.js +2 -1
  753. package/data/build/dist/host/modules/pwa/pwa-session-notifications.js.map +1 -1
  754. package/data/build/dist/host/modules/quick-apps/browse.d.ts +5 -0
  755. package/data/build/dist/host/modules/quick-apps/browse.d.ts.map +1 -0
  756. package/data/build/dist/host/modules/quick-apps/browse.js +37 -0
  757. package/data/build/dist/host/modules/quick-apps/browse.js.map +1 -0
  758. package/data/build/dist/host/modules/quick-apps/code-revision.d.ts +4 -0
  759. package/data/build/dist/host/modules/quick-apps/code-revision.d.ts.map +1 -0
  760. package/data/build/dist/host/modules/quick-apps/code-revision.js +39 -0
  761. package/data/build/dist/host/modules/quick-apps/code-revision.js.map +1 -0
  762. package/data/build/dist/host/modules/quick-apps/documents.d.ts +14 -0
  763. package/data/build/dist/host/modules/quick-apps/documents.d.ts.map +1 -0
  764. package/data/build/dist/host/modules/quick-apps/documents.js +87 -0
  765. package/data/build/dist/host/modules/quick-apps/documents.js.map +1 -0
  766. package/data/build/dist/host/modules/quick-apps/egress.d.ts +35 -0
  767. package/data/build/dist/host/modules/quick-apps/egress.d.ts.map +1 -0
  768. package/data/build/dist/host/modules/quick-apps/egress.js +244 -0
  769. package/data/build/dist/host/modules/quick-apps/egress.js.map +1 -0
  770. package/data/build/dist/host/modules/quick-apps/errors.d.ts +8 -0
  771. package/data/build/dist/host/modules/quick-apps/errors.d.ts.map +1 -0
  772. package/data/build/dist/host/modules/quick-apps/errors.js +15 -0
  773. package/data/build/dist/host/modules/quick-apps/errors.js.map +1 -0
  774. package/data/build/dist/host/modules/quick-apps/file-api.d.ts +30 -0
  775. package/data/build/dist/host/modules/quick-apps/file-api.d.ts.map +1 -0
  776. package/data/build/dist/host/modules/quick-apps/file-api.js +149 -0
  777. package/data/build/dist/host/modules/quick-apps/file-api.js.map +1 -0
  778. package/data/build/dist/host/modules/quick-apps/launches.d.ts +35 -0
  779. package/data/build/dist/host/modules/quick-apps/launches.d.ts.map +1 -0
  780. package/data/build/dist/host/modules/quick-apps/launches.js +80 -0
  781. package/data/build/dist/host/modules/quick-apps/launches.js.map +1 -0
  782. package/data/build/dist/host/modules/quick-apps/paths.d.ts +14 -0
  783. package/data/build/dist/host/modules/quick-apps/paths.d.ts.map +1 -0
  784. package/data/build/dist/host/modules/quick-apps/paths.js +72 -0
  785. package/data/build/dist/host/modules/quick-apps/paths.js.map +1 -0
  786. package/data/build/dist/host/modules/quick-apps/registry.d.ts +30 -0
  787. package/data/build/dist/host/modules/quick-apps/registry.d.ts.map +1 -0
  788. package/data/build/dist/host/modules/quick-apps/registry.js +195 -0
  789. package/data/build/dist/host/modules/quick-apps/registry.js.map +1 -0
  790. package/data/build/dist/host/modules/quick-apps/remote.d.ts +38 -0
  791. package/data/build/dist/host/modules/quick-apps/remote.d.ts.map +1 -0
  792. package/data/build/dist/host/modules/quick-apps/remote.js +238 -0
  793. package/data/build/dist/host/modules/quick-apps/remote.js.map +1 -0
  794. package/data/build/dist/host/modules/quick-apps/service.d.ts +27 -0
  795. package/data/build/dist/host/modules/quick-apps/service.d.ts.map +1 -0
  796. package/data/build/dist/host/modules/quick-apps/service.js +174 -0
  797. package/data/build/dist/host/modules/quick-apps/service.js.map +1 -0
  798. package/data/build/dist/host/modules/quick-apps/static-handler.d.ts +8 -0
  799. package/data/build/dist/host/modules/quick-apps/static-handler.d.ts.map +1 -0
  800. package/data/build/dist/host/modules/quick-apps/static-handler.js +213 -0
  801. package/data/build/dist/host/modules/quick-apps/static-handler.js.map +1 -0
  802. package/data/build/dist/host/native-session-bridge.d.ts +7 -1
  803. package/data/build/dist/host/native-session-bridge.d.ts.map +1 -1
  804. package/data/build/dist/host/native-session-bridge.js +10 -15
  805. package/data/build/dist/host/native-session-bridge.js.map +1 -1
  806. package/data/build/dist/host/rpc.d.ts +15 -2
  807. package/data/build/dist/host/rpc.d.ts.map +1 -1
  808. package/data/build/dist/host/rpc.js +67 -15
  809. package/data/build/dist/host/rpc.js.map +1 -1
  810. package/data/build/dist/host/session-changes.d.ts.map +1 -1
  811. package/data/build/dist/host/session-changes.js +6 -2
  812. package/data/build/dist/host/session-changes.js.map +1 -1
  813. package/data/build/dist/host/session-migration-repair.js +48 -35
  814. package/data/build/dist/host/session-migration-repair.js.map +1 -1
  815. package/data/build/dist/host/settings.d.ts.map +1 -1
  816. package/data/build/dist/host/settings.js +36 -2
  817. package/data/build/dist/host/settings.js.map +1 -1
  818. package/data/build/dist/host/workspace-file-mutations.d.ts +2 -0
  819. package/data/build/dist/host/workspace-file-mutations.d.ts.map +1 -0
  820. package/data/build/dist/host/workspace-file-mutations.js +15 -0
  821. package/data/build/dist/host/workspace-file-mutations.js.map +1 -0
  822. package/data/build/dist/host/workspace-root.d.ts +14 -0
  823. package/data/build/dist/host/workspace-root.d.ts.map +1 -0
  824. package/data/build/dist/host/workspace-root.js +99 -0
  825. package/data/build/dist/host/workspace-root.js.map +1 -0
  826. package/data/build/dist/shared/attachment-prompts.d.ts +11 -0
  827. package/data/build/dist/shared/attachment-prompts.d.ts.map +1 -0
  828. package/data/build/dist/shared/attachment-prompts.js +17 -0
  829. package/data/build/dist/shared/attachment-prompts.js.map +1 -0
  830. package/data/build/dist/shared/cli-provider-route.d.ts +7 -0
  831. package/data/build/dist/shared/cli-provider-route.d.ts.map +1 -0
  832. package/data/build/dist/shared/cli-provider-route.js +13 -0
  833. package/data/build/dist/shared/cli-provider-route.js.map +1 -0
  834. package/data/build/dist/shared/codex-performance.d.ts +3 -0
  835. package/data/build/dist/shared/codex-performance.d.ts.map +1 -0
  836. package/data/build/dist/shared/codex-performance.js +2 -0
  837. package/data/build/dist/shared/codex-performance.js.map +1 -0
  838. package/data/build/dist/shared/contracts/agent-team.d.ts +14 -0
  839. package/data/build/dist/shared/contracts/agent-team.d.ts.map +1 -0
  840. package/data/build/dist/shared/contracts/agent-team.js +48 -0
  841. package/data/build/dist/shared/contracts/agent-team.js.map +1 -0
  842. package/data/build/dist/shared/contracts/cli-adapter.d.ts +62 -1
  843. package/data/build/dist/shared/contracts/cli-adapter.d.ts.map +1 -1
  844. package/data/build/dist/shared/contracts/cli-management.d.ts +29 -0
  845. package/data/build/dist/shared/contracts/cli-management.d.ts.map +1 -0
  846. package/data/build/dist/shared/contracts/cli-management.js +2 -0
  847. package/data/build/dist/shared/contracts/cli-management.js.map +1 -0
  848. package/data/build/dist/shared/contracts/config.d.ts +25 -1
  849. package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
  850. package/data/build/dist/shared/contracts/config.js +11 -0
  851. package/data/build/dist/shared/contracts/config.js.map +1 -1
  852. package/data/build/dist/shared/contracts/errors.d.ts +2 -2
  853. package/data/build/dist/shared/contracts/errors.d.ts.map +1 -1
  854. package/data/build/dist/shared/contracts/feature.d.ts +7 -0
  855. package/data/build/dist/shared/contracts/feature.d.ts.map +1 -1
  856. package/data/build/dist/shared/contracts/git.d.ts +17 -0
  857. package/data/build/dist/shared/contracts/git.d.ts.map +1 -1
  858. package/data/build/dist/shared/contracts/git.js +27 -1
  859. package/data/build/dist/shared/contracts/git.js.map +1 -1
  860. package/data/build/dist/shared/contracts/interaction-presentation.d.ts +32 -0
  861. package/data/build/dist/shared/contracts/interaction-presentation.d.ts.map +1 -0
  862. package/data/build/dist/shared/contracts/interaction-presentation.js +2 -0
  863. package/data/build/dist/shared/contracts/interaction-presentation.js.map +1 -0
  864. package/data/build/dist/shared/contracts/interaction-translation.d.ts +53 -0
  865. package/data/build/dist/shared/contracts/interaction-translation.d.ts.map +1 -0
  866. package/data/build/dist/shared/contracts/interaction-translation.js +44 -0
  867. package/data/build/dist/shared/contracts/interaction-translation.js.map +1 -0
  868. package/data/build/dist/shared/contracts/magpie-management.d.ts +395 -0
  869. package/data/build/dist/shared/contracts/magpie-management.d.ts.map +1 -0
  870. package/data/build/dist/shared/contracts/magpie-management.js +2 -0
  871. package/data/build/dist/shared/contracts/magpie-management.js.map +1 -0
  872. package/data/build/dist/shared/contracts/quick-apps.d.ts +70 -0
  873. package/data/build/dist/shared/contracts/quick-apps.d.ts.map +1 -0
  874. package/data/build/dist/shared/contracts/quick-apps.js +4 -0
  875. package/data/build/dist/shared/contracts/quick-apps.js.map +1 -0
  876. package/data/build/dist/shared/contracts/session-translation.d.ts +82 -9
  877. package/data/build/dist/shared/contracts/session-translation.d.ts.map +1 -1
  878. package/data/build/dist/shared/contracts/session-translation.js +146 -2
  879. package/data/build/dist/shared/contracts/session-translation.js.map +1 -1
  880. package/data/build/dist/shared/contracts/subscription.d.ts +161 -0
  881. package/data/build/dist/shared/contracts/subscription.d.ts.map +1 -1
  882. package/data/build/dist/shared/contracts/subscription.js.map +1 -1
  883. package/data/build/dist/shared/contracts/version.d.ts +9 -15
  884. package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
  885. package/data/build/dist/shared/contracts/version.js +8 -14
  886. package/data/build/dist/shared/contracts/version.js.map +1 -1
  887. package/data/build/dist/shared/index.d.ts +4 -2
  888. package/data/build/dist/shared/index.d.ts.map +1 -1
  889. package/data/build/dist/shared/index.js +3 -2
  890. package/data/build/dist/shared/index.js.map +1 -1
  891. package/data/build/dist/shared/peer-host-http-routes.d.ts +4 -0
  892. package/data/build/dist/shared/peer-host-http-routes.d.ts.map +1 -1
  893. package/data/build/dist/shared/peer-host-http-routes.js +4 -0
  894. package/data/build/dist/shared/peer-host-http-routes.js.map +1 -1
  895. package/data/build/dist/shared/provider-icon-resources.d.ts.map +1 -1
  896. package/data/build/dist/shared/provider-icon-resources.js +1 -0
  897. package/data/build/dist/shared/provider-icon-resources.js.map +1 -1
  898. package/data/build/dist/shared/quick-app-browser-storage.d.ts +33 -0
  899. package/data/build/dist/shared/quick-app-browser-storage.d.ts.map +1 -0
  900. package/data/build/dist/shared/quick-app-browser-storage.js +33 -0
  901. package/data/build/dist/shared/quick-app-browser-storage.js.map +1 -0
  902. package/data/build/dist/shared/quick-app-network-allow.d.ts +8 -0
  903. package/data/build/dist/shared/quick-app-network-allow.d.ts.map +1 -0
  904. package/data/build/dist/shared/quick-app-network-allow.js +192 -0
  905. package/data/build/dist/shared/quick-app-network-allow.js.map +1 -0
  906. package/data/build/dist/shared/quick-app-network-bootstrap.d.ts +9 -0
  907. package/data/build/dist/shared/quick-app-network-bootstrap.d.ts.map +1 -0
  908. package/data/build/dist/shared/quick-app-network-bootstrap.js +134 -0
  909. package/data/build/dist/shared/quick-app-network-bootstrap.js.map +1 -0
  910. package/data/build/dist/shared/quick-app-proxy-path.d.ts +6 -0
  911. package/data/build/dist/shared/quick-app-proxy-path.d.ts.map +1 -0
  912. package/data/build/dist/shared/quick-app-proxy-path.js +18 -0
  913. package/data/build/dist/shared/quick-app-proxy-path.js.map +1 -0
  914. package/data/build/dist/shared/quick-app-storage-bootstrap.d.ts +9 -0
  915. package/data/build/dist/shared/quick-app-storage-bootstrap.d.ts.map +1 -0
  916. package/data/build/dist/shared/quick-app-storage-bootstrap.js +189 -0
  917. package/data/build/dist/shared/quick-app-storage-bootstrap.js.map +1 -0
  918. package/data/build/dist/shared/quick-apps-bootstrap-locale.d.ts +7 -0
  919. package/data/build/dist/shared/quick-apps-bootstrap-locale.d.ts.map +1 -0
  920. package/data/build/dist/shared/quick-apps-bootstrap-locale.js +10 -0
  921. package/data/build/dist/shared/quick-apps-bootstrap-locale.js.map +1 -0
  922. package/data/build/dist/shared/request-performance.d.ts +15 -0
  923. package/data/build/dist/shared/request-performance.d.ts.map +1 -0
  924. package/data/build/dist/shared/request-performance.js +3 -0
  925. package/data/build/dist/shared/request-performance.js.map +1 -0
  926. package/data/build/dist/shared/session-title.d.ts.map +1 -1
  927. package/data/build/dist/shared/session-title.js +10 -4
  928. package/data/build/dist/shared/session-title.js.map +1 -1
  929. package/data/build/dist/shared/translation-indicator.d.ts +26 -0
  930. package/data/build/dist/shared/translation-indicator.d.ts.map +1 -0
  931. package/data/build/dist/shared/translation-indicator.js +29 -0
  932. package/data/build/dist/shared/translation-indicator.js.map +1 -0
  933. package/package.json +35 -34
  934. package/profile/README.md +2 -2
  935. package/profile/package.json +3 -3
  936. package/profile/version.json +3 -3
  937. package/version.json +3 -3
  938. package/data/build/dist/client/client.model-catalog-cache.js.map +0 -1
@@ -0,0 +1,1256 @@
1
+ import { createElement, useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
2
+ import { CODINGNS_SUBSCRIPTION_REPORTS_FIELD, DEFAULT_SUBSCRIPTION_REPORT_SETTINGS, normalizeSubscriptionReportSettings, } from '../../shared/contracts/config.js';
3
+ import { useCodingNsTranslator } from '../locale.js';
4
+ import { callCodingNsRpcResult } from '../rpc-call.js';
5
+ import { uiFontSize } from '../font-scale.js';
6
+ import { MagpieProviderLogo } from './magpie-provider-logo.js';
7
+ import { MagpieGroupsPage, MagpieProvidersPage } from './magpie-management-controls.js';
8
+ import { groupQuotaRowsByProvider, resolveQuotaAccountBalance } from './subscription-quota-groups.js';
9
+ const PERIODS = [
10
+ { id: 'today', key: 'magpie.today' },
11
+ { id: 'week', key: 'magpie.week' },
12
+ { id: 'month', key: 'magpie.month' },
13
+ { id: 'all', key: 'magpie.all' },
14
+ ];
15
+ /**
16
+ * Top-level tab order mirrors native Magpie: Overview, Providers, Routing groups, Usage.
17
+ *
18
+ * The third tab edits the `group/<id>` entries Magpie draws under "Routing groups"; its label
19
+ * says so, because a provider editor on the Providers tab also edits that provider's routing.
20
+ */
21
+ const PAGE_TABS = [
22
+ { id: 'overview', label: 'magpie.overview', icon: '◫' },
23
+ { id: 'providers', label: 'magpie.management.providers', icon: '◈' },
24
+ { id: 'groups', label: 'magpie.management.groupsTab', icon: '⇄' },
25
+ { id: 'usage', label: 'magpie.usage', icon: '◷' },
26
+ ];
27
+ /** Native Magpie order inside Usage: Subscriptions, Sessions, Requests. */
28
+ const USAGE_TABS = [
29
+ { id: 'quotas', label: 'magpie.quotas', icon: '◉' },
30
+ { id: 'sessions', label: 'magpie.sessions', icon: '◷' },
31
+ { id: 'requests', label: 'magpie.requests', icon: '↗' },
32
+ ];
33
+ const PAGE_SIZE = 50;
34
+ /** 请求视图每页条数;底部弹层复用同一分页尺寸。 */
35
+ export const MAGPIE_REQUESTS_PAGE_SIZE = PAGE_SIZE;
36
+ /** 订阅卡显示口径的切换项;顺序与截图一致:先「已用」,再「剩余」。 */
37
+ const QUOTA_VIEWS = [
38
+ { id: 'used', label: 'magpie.quotaViewUsed' },
39
+ { id: 'remaining', label: 'magpie.quotaViewRemaining' },
40
+ ];
41
+ /**
42
+ * 读取 Host 保存的订阅卡显示口径,并返回一个写入函数。
43
+ *
44
+ * 设置只影响读法,所以读取失败或没有设置存储时静默回落到默认值:
45
+ * 页面照常显示额度,不会因为偏好读不到而变成空态。
46
+ */
47
+ export function useQuotaView(settings) {
48
+ const [saveFailed, setSaveFailed] = useState(false);
49
+ // `settings` 可能是 undefined;用稳定的空实现代替它交给 useSyncExternalStore。
50
+ const subscribe = useCallback((listener) => (settings === undefined ? () => undefined : settings.subscribe(listener)), [settings]);
51
+ const read = useCallback(() => settings === undefined
52
+ ? EMPTY_QUOTA_VIEW_SNAPSHOT
53
+ : settings.getSnapshot(), [settings]);
54
+ const snapshot = useSyncExternalStore(subscribe, read, read);
55
+ const quotaView = normalizeSubscriptionReportSettings(snapshot.value?.subscriptionReports).quotaView;
56
+ const writable = settings !== undefined && snapshot.status === 'ready' && snapshot.writable;
57
+ const selectQuotaView = useCallback((next) => {
58
+ if (settings === undefined)
59
+ return;
60
+ setSaveFailed(false);
61
+ void settings.mutate([{
62
+ op: 'set',
63
+ path: [CODINGNS_SUBSCRIPTION_REPORTS_FIELD, 'quotaView'],
64
+ value: next,
65
+ }]).then((accepted) => {
66
+ if (!accepted)
67
+ setSaveFailed(true);
68
+ }).catch(() => setSaveFailed(true));
69
+ }, [settings]);
70
+ return { quotaView, selectQuotaView, writable, saveFailed };
71
+ }
72
+ /** 没有设置存储时的稳定空快照;`useSyncExternalStore` 要求同一引用。 */
73
+ const EMPTY_QUOTA_VIEW_SNAPSHOT = {
74
+ value: undefined,
75
+ revision: undefined,
76
+ writable: false,
77
+ status: 'unavailable',
78
+ };
79
+ export function MagpieManagementPage({ rpc, locale, initialPageTab = 'overview', initialUsageTab = 'quotas', settings }) {
80
+ const t = useCodingNsTranslator(locale);
81
+ const { quotaView, selectQuotaView, writable: quotaViewWritable, saveFailed: quotaViewSaveFailed } = useQuotaView(settings);
82
+ const [pageTab, setPageTab] = useState(initialPageTab);
83
+ const [usageTab, setUsageTab] = useState(initialUsageTab);
84
+ const section = pageTab === 'usage' ? usageTab : pageTab;
85
+ const selectPageTab = (next) => setPageTab(next);
86
+ const selectUsageTab = (next) => {
87
+ setPageTab('usage');
88
+ setUsageTab(next);
89
+ };
90
+ const [period, setPeriod] = useState('today');
91
+ const [dashboard, setDashboard] = useState(null);
92
+ const [dashboardLoading, setDashboardLoading] = useState(true);
93
+ const [dashboardError, setDashboardError] = useState(false);
94
+ const [dashboardIssue, setDashboardIssue] = useState(null);
95
+ const [chartMetric, setChartMetric] = useState('calls');
96
+ const [sessionSearch, setSessionSearch] = useState('');
97
+ const [selectedSession, setSelectedSession] = useState(null);
98
+ const [requestPage, setRequestPage] = useState(null);
99
+ const [requestLoading, setRequestLoading] = useState(false);
100
+ const [requestError, setRequestError] = useState(false);
101
+ const [requestOffset, setRequestOffset] = useState(0);
102
+ const [management, setManagement] = useState(null);
103
+ const [managementLoading, setManagementLoading] = useState(true);
104
+ const [managementIssue, setManagementIssue] = useState(null);
105
+ const [managementWriting, setManagementWriting] = useState(false);
106
+ const [updateStatus, setUpdateStatus] = useState(null);
107
+ const [updateNotes, setUpdateNotes] = useState(null);
108
+ const [updateLoading, setUpdateLoading] = useState(true);
109
+ const [updateError, setUpdateError] = useState(null);
110
+ const [updateConfirming, setUpdateConfirming] = useState(false);
111
+ const [updateNotice, setUpdateNotice] = useState('');
112
+ const [updateOpen, setUpdateOpen] = useState(false);
113
+ const [refreshKey, setRefreshKey] = useState(0);
114
+ const dashboardSequence = useRef(0);
115
+ const requestSequence = useRef(0);
116
+ const managementSequence = useRef(0);
117
+ const loadDashboard = useCallback(async (signal) => {
118
+ const sequence = dashboardSequence.current + 1;
119
+ dashboardSequence.current = sequence;
120
+ setDashboardLoading(true);
121
+ setDashboardError(false);
122
+ setDashboardIssue(null);
123
+ try {
124
+ const next = await callMagpieRpc(rpc, 'usage/dashboard', { period }, signal);
125
+ if (signal.aborted || sequence !== dashboardSequence.current)
126
+ return;
127
+ setDashboard(next);
128
+ const issue = next?.availabilityIssue ?? (next === null ? 'host-rpc-outdated' : null);
129
+ setDashboardIssue(issue);
130
+ setDashboardError(issue !== null);
131
+ }
132
+ catch (error) {
133
+ if (signal.aborted || sequence !== dashboardSequence.current)
134
+ return;
135
+ const issue = magpieDashboardIssueForRpcError(error);
136
+ setDashboardIssue(issue);
137
+ setDashboardError(true);
138
+ }
139
+ finally {
140
+ if (!signal.aborted && sequence === dashboardSequence.current)
141
+ setDashboardLoading(false);
142
+ }
143
+ }, [period, rpc]);
144
+ useEffect(() => {
145
+ const controller = new AbortController();
146
+ void loadDashboard(controller.signal);
147
+ return () => controller.abort();
148
+ }, [loadDashboard, refreshKey]);
149
+ const loadManagement = useCallback(async (signal) => {
150
+ const sequence = managementSequence.current + 1;
151
+ managementSequence.current = sequence;
152
+ setManagementLoading(true);
153
+ setManagementIssue(null);
154
+ try {
155
+ const next = await callMagpieRpc(rpc, 'management/snapshot', {}, signal);
156
+ if (signal.aborted || sequence !== managementSequence.current)
157
+ return;
158
+ setManagement(next);
159
+ setManagementIssue(next?.availabilityIssue ?? (next === null ? 'host-rpc-outdated' : null));
160
+ }
161
+ catch (error) {
162
+ if (signal.aborted || sequence !== managementSequence.current)
163
+ return;
164
+ setManagementIssue(magpieManagementIssueForRpcError(error));
165
+ }
166
+ finally {
167
+ if (!signal.aborted && sequence === managementSequence.current)
168
+ setManagementLoading(false);
169
+ }
170
+ }, [rpc]);
171
+ useEffect(() => {
172
+ const controller = new AbortController();
173
+ void loadManagement(controller.signal);
174
+ return () => controller.abort();
175
+ }, [loadManagement, refreshKey]);
176
+ const loadUpdates = useCallback(async (signal) => {
177
+ setUpdateLoading(true);
178
+ setUpdateError(null);
179
+ try {
180
+ const [status, notes] = await Promise.all([
181
+ callMagpieRpc(rpc, 'update/status', {}, signal),
182
+ callMagpieRpc(rpc, 'update/notes', {}, signal),
183
+ ]);
184
+ if (signal.aborted)
185
+ return;
186
+ setUpdateStatus(status);
187
+ setUpdateNotes(notes);
188
+ }
189
+ catch (error) {
190
+ if (signal.aborted)
191
+ return;
192
+ setUpdateError(magpieUpdateIssueForRpcError(error));
193
+ }
194
+ finally {
195
+ if (!signal.aborted)
196
+ setUpdateLoading(false);
197
+ }
198
+ }, [rpc]);
199
+ useEffect(() => {
200
+ const controller = new AbortController();
201
+ void loadUpdates(controller.signal);
202
+ return () => controller.abort();
203
+ }, [loadUpdates, refreshKey]);
204
+ const checkForUpdate = useCallback(async () => {
205
+ setUpdateLoading(true);
206
+ setUpdateError(null);
207
+ setUpdateNotice('');
208
+ try {
209
+ const [status, notes] = await Promise.all([
210
+ callMagpieRpc(rpc, 'update/check', {}, undefined),
211
+ callMagpieRpc(rpc, 'update/notes', {}, undefined),
212
+ ]);
213
+ setUpdateStatus(status);
214
+ setUpdateNotes(notes);
215
+ }
216
+ catch (error) {
217
+ setUpdateError(magpieUpdateIssueForRpcError(error));
218
+ }
219
+ finally {
220
+ setUpdateLoading(false);
221
+ }
222
+ }, [rpc]);
223
+ const installUpdate = useCallback(async () => {
224
+ setUpdateLoading(true);
225
+ setUpdateError(null);
226
+ setUpdateNotice('');
227
+ try {
228
+ const result = await callMagpieRpc(rpc, 'update/install', { confirmed: true }, undefined);
229
+ if (result.status !== null)
230
+ setUpdateStatus(result.status);
231
+ setUpdateConfirming(false);
232
+ setUpdateNotice(result.restartExpected ? t('magpie.update.restartRequested') : t('magpie.update.requested'));
233
+ }
234
+ catch (error) {
235
+ setUpdateError(magpieUpdateIssueForRpcError(error));
236
+ }
237
+ finally {
238
+ setUpdateLoading(false);
239
+ }
240
+ }, [rpc, t]);
241
+ useEffect(() => {
242
+ if (!updateOpen)
243
+ return;
244
+ const closeOnEscape = (event) => {
245
+ if (event.key === 'Escape')
246
+ setUpdateOpen(false);
247
+ };
248
+ window.addEventListener('keydown', closeOnEscape);
249
+ return () => window.removeEventListener('keydown', closeOnEscape);
250
+ }, [updateOpen]);
251
+ const updateProvider = useCallback(async (update) => {
252
+ setManagementWriting(true);
253
+ try {
254
+ const result = await callMagpieRpc(rpc, 'management/provider/update', update);
255
+ setManagement(result.snapshot);
256
+ }
257
+ finally {
258
+ setManagementWriting(false);
259
+ }
260
+ }, [rpc]);
261
+ const updateGroup = useCallback(async (update) => {
262
+ setManagementWriting(true);
263
+ try {
264
+ const result = await callMagpieRpc(rpc, 'management/group/update', update);
265
+ setManagement(result.snapshot);
266
+ }
267
+ finally {
268
+ setManagementWriting(false);
269
+ }
270
+ }, [rpc]);
271
+ const updateAccount = useCallback(async (update) => {
272
+ setManagementWriting(true);
273
+ try {
274
+ const result = await callMagpieRpc(rpc, 'management/account/update', update);
275
+ setManagement(result.snapshot);
276
+ }
277
+ finally {
278
+ setManagementWriting(false);
279
+ }
280
+ }, [rpc]);
281
+ useEffect(() => {
282
+ if (section !== 'requests')
283
+ return;
284
+ const controller = new AbortController();
285
+ const sequence = requestSequence.current + 1;
286
+ requestSequence.current = sequence;
287
+ setRequestLoading(true);
288
+ setRequestError(false);
289
+ void callMagpieRpc(rpc, 'usage/requests', {
290
+ period,
291
+ offset: requestOffset,
292
+ limit: PAGE_SIZE,
293
+ ...(selectedSession === null ? {} : { sessionId: selectedSession.id, sessionAgent: selectedSession.agent }),
294
+ }, controller.signal).then((next) => {
295
+ if (controller.signal.aborted || sequence !== requestSequence.current)
296
+ return;
297
+ setRequestPage(next);
298
+ setRequestError(next === null);
299
+ }).catch(() => {
300
+ if (controller.signal.aborted || sequence !== requestSequence.current)
301
+ return;
302
+ setRequestError(true);
303
+ }).finally(() => {
304
+ if (!controller.signal.aborted && sequence === requestSequence.current)
305
+ setRequestLoading(false);
306
+ });
307
+ return () => controller.abort();
308
+ }, [period, requestOffset, rpc, section, selectedSession]);
309
+ const filteredSessions = useMemo(() => {
310
+ const query = sessionSearch.trim().toLocaleLowerCase();
311
+ const sessions = dashboard?.sessions ?? [];
312
+ if (query === '')
313
+ return sessions;
314
+ return sessions.filter((session) => session.agent.toLocaleLowerCase().includes(query) || session.id.toLocaleLowerCase().includes(query));
315
+ }, [dashboard?.sessions, sessionSearch]);
316
+ const openSession = (session) => {
317
+ setSelectedSession(session);
318
+ setRequestOffset(0);
319
+ setRequestPage(null);
320
+ selectUsageTab('requests');
321
+ };
322
+ const clearSession = () => {
323
+ setSelectedSession(null);
324
+ setRequestOffset(0);
325
+ setRequestPage(null);
326
+ };
327
+ const style = pageStyle;
328
+ const capturedAt = dashboard?.capturedAt ?? management?.capturedAt ?? null;
329
+ const usageReports = pageTab === 'usage';
330
+ /** Provider and routing-group settings are not period-scoped, so the period filter is hidden there. */
331
+ const periodScoped = pageTab === 'overview' || pageTab === 'usage';
332
+ return createElement('div', {
333
+ className: 'codingns-magpie-page',
334
+ role: 'region',
335
+ 'aria-label': t('magpie.pageTitle'),
336
+ style,
337
+ }, createElement('style', undefined, MAGPIE_PAGE_CSS), createElement('header', { className: 'codingns-magpie-topbar' }, createElement('div', { className: 'codingns-magpie-topbar-left' }, periodScoped && createElement('div', { className: 'codingns-magpie-periods', role: 'group', 'aria-label': t('magpie.periodLabel') }, ...PERIODS.map((entry) => createElement('button', {
338
+ key: entry.id,
339
+ type: 'button',
340
+ className: `codingns-magpie-period${period === entry.id ? ' is-active' : ''}`,
341
+ 'aria-pressed': period === entry.id,
342
+ onClick: () => {
343
+ setPeriod(entry.id);
344
+ setRequestOffset(0);
345
+ setRequestPage(null);
346
+ },
347
+ }, t(entry.key))))), createElement('nav', { className: 'codingns-magpie-tabs', 'aria-label': t('magpie.pageTitle') }, ...PAGE_TABS.map((entry) => createElement('button', {
348
+ key: entry.id,
349
+ type: 'button',
350
+ className: `codingns-magpie-tab${pageTab === entry.id ? ' is-active' : ''}`,
351
+ 'aria-current': pageTab === entry.id ? 'page' : undefined,
352
+ onClick: () => selectPageTab(entry.id),
353
+ }, createElement('span', { className: 'codingns-magpie-tab-icon', 'aria-hidden': true }, entry.icon), createElement('span', { className: 'codingns-magpie-tab-label' }, t(entry.label))))), createElement('div', { className: 'codingns-magpie-topbar-right' }, createElement('button', {
354
+ type: 'button',
355
+ className: 'codingns-magpie-version-button',
356
+ 'aria-haspopup': 'dialog',
357
+ 'aria-expanded': updateOpen,
358
+ onClick: () => setUpdateOpen(value => !value),
359
+ 'aria-label': t('magpie.update.open', { version: updateStatus?.current ?? '—' }),
360
+ title: t('magpie.update.open', { version: updateStatus?.current ?? '—' }),
361
+ }, updateStatus?.current ?? '—'), createElement('button', {
362
+ type: 'button',
363
+ className: 'codingns-magpie-icon-button',
364
+ disabled: dashboardLoading || managementLoading || managementWriting,
365
+ 'aria-busy': dashboardLoading || managementLoading,
366
+ onClick: () => setRefreshKey((value) => value + 1),
367
+ 'aria-label': t(dashboardLoading || managementLoading ? 'magpie.refreshing' : 'magpie.refresh'),
368
+ title: t(dashboardLoading || managementLoading ? 'magpie.refreshing' : 'magpie.refresh'),
369
+ }, createElement(RefreshIcon, { busy: dashboardLoading || managementLoading })))), updateOpen && createElement(MagpieUpdateDialog, {
370
+ status: updateStatus,
371
+ notes: updateNotes,
372
+ loading: updateLoading,
373
+ error: updateError,
374
+ confirming: updateConfirming,
375
+ notice: updateNotice,
376
+ t,
377
+ onCheck: checkForUpdate,
378
+ onConfirm: installUpdate,
379
+ onConfirmingChange: setUpdateConfirming,
380
+ onRefresh: () => {
381
+ const controller = new AbortController();
382
+ void loadUpdates(controller.signal);
383
+ },
384
+ onClose: () => setUpdateOpen(false),
385
+ }), usageReports && createElement('div', { className: 'codingns-magpie-toolbar has-tabs' }, createElement('div', { className: 'codingns-magpie-toolbar-left' }, createElement('div', { className: 'codingns-magpie-usage-tabs', role: 'group', 'aria-label': t('magpie.usage') }, ...USAGE_TABS.map((entry) => createElement('button', {
386
+ key: entry.id,
387
+ type: 'button',
388
+ className: `codingns-magpie-usage-tab${usageTab === entry.id ? ' is-active' : ''}`,
389
+ 'aria-pressed': usageTab === entry.id,
390
+ onClick: () => selectUsageTab(entry.id),
391
+ }, t(entry.label))))),
392
+ // 口径切换只作用于「订阅」页的额度卡;其他用量报表没有"剩余"这个概念。
393
+ section === 'quotas' && createElement('div', { className: 'codingns-magpie-toolbar-right' }, createElement(QuotaViewSwitch, {
394
+ value: quotaView,
395
+ // 没有设置存储(测试/静态预览)时控件只展示、不写回,因此不禁用。
396
+ disabled: settings === undefined ? false : !quotaViewWritable,
397
+ failed: quotaViewSaveFailed,
398
+ onChange: selectQuotaView,
399
+ t,
400
+ }))), createElement('main', { className: 'codingns-magpie-main' }, section === 'providers' || section === 'groups'
401
+ ? managementIssue !== null && management === null
402
+ ? createElement(EmptyState, { message: t(managementIssueLocaleKey(managementIssue)) })
403
+ : managementLoading && management === null
404
+ ? createElement(EmptyState, { message: t('magpie.management.loading'), loading: true })
405
+ : management?.availabilityIssue !== null && management?.availabilityIssue !== undefined
406
+ ? createElement(EmptyState, { message: t(managementIssueLocaleKey(management.availabilityIssue)) })
407
+ : section === 'providers'
408
+ ? createElement(MagpieProvidersPage, { snapshot: management, t, onUpdate: updateProvider, onAccountUpdate: updateAccount, writing: managementWriting })
409
+ : createElement(MagpieGroupsPage, { snapshot: management, t, onUpdate: updateGroup })
410
+ : dashboardIssue !== null
411
+ ? createElement(EmptyState, { message: t(dashboardIssueLocaleKey(dashboardIssue)) })
412
+ : dashboardLoading && dashboard === null
413
+ ? createElement(EmptyState, { message: t('magpie.loading'), loading: true })
414
+ : dashboardError && dashboard === null
415
+ ? createElement(EmptyState, { message: t('magpie.unavailable') })
416
+ : section === 'overview'
417
+ ? createElement(OverviewPage, {
418
+ dashboard, loading: dashboardLoading, error: dashboardError, chartMetric, onChartMetricChange: setChartMetric, t, onOpenSession: openSession,
419
+ })
420
+ : section === 'sessions'
421
+ ? createElement(SessionsPage, { dashboard, sessions: filteredSessions, search: sessionSearch, onSearch: setSessionSearch, onOpenSession: openSession, t })
422
+ : section === 'requests'
423
+ ? createElement(RequestsPage, { page: requestPage, loading: requestLoading, error: requestError, selectedSession, offset: requestOffset, onOffsetChange: setRequestOffset, onClearSession: clearSession, t })
424
+ : createElement(QuotasPage, { dashboard, loading: dashboardLoading, quotaView, t })));
425
+ }
426
+ export function OverviewPage({ dashboard, loading, error, chartMetric, onChartMetricChange, t, onOpenSession }) {
427
+ const [modelBreakdownMode, setModelBreakdownMode] = useState('aggregate');
428
+ const metrics = dashboard?.aggregate;
429
+ if (dashboard === null || dashboard.usageStatus === 'unavailable' || metrics == null) {
430
+ return createElement(EmptyState, { message: t(error ? 'magpie.usageUnavailable' : 'magpie.noUsage'), loading });
431
+ }
432
+ const ioTokens = sumNullable(metrics.inputTokens, metrics.outputTokens);
433
+ const stats = [
434
+ { label: t('magpie.statTokens'), value: formatCompact(ioTokens), detail: `${t('magpie.metricInput')} ${formatCompact(metrics.inputTokens)} · ${t('magpie.metricOutput')} ${formatCompact(metrics.outputTokens)}` },
435
+ { label: t('magpie.metricCacheRead'), value: formatCompact(metrics.cacheReadTokens), detail: `${t('magpie.metricCacheWrite')} ${formatCompact(metrics.cacheWriteTokens)}` },
436
+ { label: t('magpie.metricReasoning'), value: formatCompact(metrics.reasoningTokens), detail: `${t('magpie.statWriteDown')} ${formatCompact(metrics.outputTokens)}` },
437
+ { label: t('magpie.statCalls'), value: formatInteger(metrics.calls), detail: `${formatInteger(metrics.errors)} ${t('magpie.metricErrors')} · ${formatInteger(metrics.retried)} ${t('magpie.metricRetries')}` },
438
+ ];
439
+ return createElement('div', { className: 'codingns-magpie-view' }, error && createElement(InlineNotice, { message: t('magpie.usageUnavailable') }), createElement(StatStrip, { stats }), createElement('section', { className: 'codingns-magpie-panel codingns-magpie-barchart-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('div', { className: 'codingns-magpie-chart-switch', role: 'group', 'aria-label': t('magpie.timeline') }, ...['calls', 'tokens', 'cost'].map((metric) => createElement('button', {
440
+ key: metric,
441
+ type: 'button',
442
+ 'aria-pressed': chartMetric === metric,
443
+ className: chartMetric === metric ? 'is-active' : '',
444
+ onClick: () => onChartMetricChange(metric),
445
+ }, metric === 'calls' ? t('magpie.metricCalls') : metric === 'tokens' ? t('magpie.tokens') : t('magpie.metricCost'))))), createElement(BarChart, { points: dashboard.series, metric: chartMetric, label: t(`magpie.chart.${chartMetric}`) })), createElement(ProgressSection, { title: t('magpie.byAgent'), rows: dashboard.agents, t }), createElement(ModelProgressSection, { rows: dashboard.models, mode: modelBreakdownMode, onModeChange: setModelBreakdownMode, t }), dashboard.sessions.length > 0 && createElement(ProgressSection, {
446
+ title: t('magpie.topSessions'),
447
+ rows: dashboard.sessions.map((session) => ({
448
+ ...session,
449
+ id: `${session.agent}:${session.id}`,
450
+ name: session.dshSessionName ?? session.agent,
451
+ model: session.id,
452
+ provider: null,
453
+ account: null,
454
+ })),
455
+ t,
456
+ onOpen: (row) => {
457
+ const target = dashboard.sessions.find((item) => `${item.agent}:${item.id}` === row.id);
458
+ if (target !== undefined)
459
+ onOpenSession(target);
460
+ },
461
+ }));
462
+ }
463
+ function MagpieUpdateDialog({ status, notes, loading, error, confirming, notice, t, onCheck, onConfirm, onConfirmingChange, onRefresh, onClose }) {
464
+ return createElement('div', {
465
+ className: 'codingns-magpie-update-overlay',
466
+ role: 'presentation',
467
+ onMouseDown: (event) => {
468
+ if (event.target === event.currentTarget)
469
+ onClose();
470
+ },
471
+ }, createElement('div', {
472
+ className: 'codingns-magpie-update-dialog',
473
+ role: 'dialog',
474
+ 'aria-modal': true,
475
+ 'aria-label': t('magpie.update.title'),
476
+ onMouseDown: (event) => event.stopPropagation(),
477
+ }, createElement(MagpieUpdatePanel, {
478
+ status,
479
+ notes,
480
+ loading,
481
+ error,
482
+ confirming,
483
+ notice,
484
+ t,
485
+ onCheck,
486
+ onConfirm,
487
+ onConfirmingChange,
488
+ onRefresh,
489
+ onClose,
490
+ })));
491
+ }
492
+ function MagpieUpdatePanel({ status, notes, loading, error, confirming, notice, t, onCheck, onConfirm, onConfirmingChange, onRefresh, onClose }) {
493
+ const updateAvailable = status !== null && ['found', 'ready', 'available', 'error'].includes(status.state);
494
+ const release = notes?.releases.find(item => item.version === status?.latest) ?? notes?.releases[0];
495
+ const progress = status?.state === 'downloading' && status.total !== null && status.total > 0 && status.done !== null
496
+ ? Math.max(0, Math.min(100, Math.round(status.done / status.total * 100)))
497
+ : null;
498
+ return createElement('section', { className: 'codingns-magpie-panel codingns-magpie-update-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('div', undefined, createElement('h2', undefined, t('magpie.update.title')), createElement('p', undefined, t('magpie.update.description'))), createElement('div', { className: 'codingns-magpie-update-panel-actions' }, createElement('button', {
499
+ type: 'button',
500
+ className: 'codingns-magpie-text-button',
501
+ disabled: loading,
502
+ onClick: onRefresh,
503
+ }, t(loading ? 'magpie.refreshing' : 'magpie.refresh')), createElement('button', {
504
+ type: 'button',
505
+ className: 'codingns-magpie-update-close',
506
+ onClick: onClose,
507
+ 'aria-label': t('magpie.update.close'),
508
+ title: t('magpie.update.close'),
509
+ }, '×'))), error !== null
510
+ ? createElement(InlineNotice, { message: t(updateIssueLocaleKey(error)) })
511
+ : status === null
512
+ ? createElement(EmptyState, { message: t(loading ? 'magpie.loading' : 'magpie.update.unavailable'), loading })
513
+ : createElement('div', { className: 'codingns-magpie-update-body' }, createElement('div', { className: 'codingns-magpie-update-status' }, createElement('strong', undefined, updateStateLabel(status.state, t)), createElement('span', undefined, t('magpie.update.current', { version: status.current })), status.latest !== null && status.latest !== status.current && createElement('span', undefined, t('magpie.update.latest', { version: status.latest }))), status.error !== null && createElement('div', { className: 'codingns-magpie-management-message' }, status.error), progress !== null && createElement('div', { className: 'codingns-magpie-update-progress' }, createElement('span', { style: { width: `${progress}%` } }), createElement('small', undefined, `${progress}%`)), release !== undefined && release.notes.trim() !== '' && createElement('details', {
514
+ className: 'codingns-magpie-update-notes',
515
+ open: status.latest !== null && status.latest !== status.current,
516
+ }, createElement('summary', undefined, t('magpie.update.releaseNotes', { version: release.version })), createElement('div', undefined, release.notes)), confirming && updateAvailable
517
+ ? createElement('div', { className: 'codingns-magpie-confirm codingns-magpie-update-confirm' }, createElement('strong', undefined, t('magpie.update.confirmTitle')), createElement('span', undefined, t('magpie.update.confirmWarning')), createElement('div', { className: 'codingns-magpie-management-actions' }, createElement('button', { type: 'button', disabled: loading, onClick: () => onConfirmingChange(false) }, t('magpie.management.cancel')), createElement('button', { type: 'button', className: 'is-primary', disabled: loading, onClick: onConfirm }, loading ? t('magpie.refreshing') : t('magpie.update.confirm'))))
518
+ : createElement('div', { className: 'codingns-magpie-management-actions' }, updateAvailable && createElement('button', {
519
+ type: 'button',
520
+ className: 'is-primary',
521
+ disabled: loading,
522
+ onClick: () => onConfirmingChange(true),
523
+ }, t(status.state === 'error' && status.retry ? 'magpie.update.retry' : 'magpie.update.manual')), status.state === 'checking' && createElement('span', { className: 'codingns-magpie-management-message' }, t('magpie.update.checking')), status.state === 'downloading' && createElement('span', { className: 'codingns-magpie-management-message' }, t('magpie.update.downloading'))), notice !== '' && createElement('div', { className: 'codingns-magpie-management-message', role: 'status' }, notice), !confirming && createElement('div', { className: 'codingns-magpie-update-actions' }, createElement('button', { type: 'button', disabled: loading, onClick: onCheck }, loading ? t('magpie.refreshing') : t('magpie.update.check')))));
524
+ }
525
+ export function ModelProgressSection({ rows, mode, onModeChange, t }) {
526
+ const controls = createElement('div', { className: 'codingns-magpie-chart-switch', role: 'group', 'aria-label': t('magpie.modelBreakdown') }, ...['aggregate', 'account'].map((value) => createElement('button', {
527
+ key: value,
528
+ type: 'button',
529
+ className: mode === value ? 'is-active' : '',
530
+ 'aria-pressed': mode === value,
531
+ onClick: () => onModeChange(value),
532
+ }, value === 'aggregate' ? t('magpie.modelAggregate') : t('magpie.modelPerAccount'))));
533
+ const displayRows = modelBreakdownRows(rows, mode);
534
+ return createElement(ProgressSection, {
535
+ // The two modes have different row identity semantics; remount the list so React cannot
536
+ // retain an account row when returning to the aggregated view.
537
+ key: `model-breakdown-${mode}`,
538
+ title: t('magpie.byModel'),
539
+ rows: displayRows,
540
+ t,
541
+ header: controls,
542
+ ...(mode === 'aggregate' ? { limit: 8 } : {}),
543
+ });
544
+ }
545
+ export function SessionsPage({ dashboard, sessions, search, onSearch, onOpenSession, t }) {
546
+ const [agentFilter, setAgentFilter] = useState('');
547
+ const agentNames = useMemo(() => [...new Set(sessions.map((session) => session.agent))].sort(), [sessions]);
548
+ const visible = agentFilter === '' ? sessions : sessions.filter((session) => session.agent === agentFilter);
549
+ const aggregate = sumSessions(visible);
550
+ const metrics = dashboard?.aggregate;
551
+ const stats = [
552
+ { label: t('magpie.statSessions'), value: formatInteger(visible.length), detail: t('magpie.sessionsCount', { count: visible.length }) },
553
+ { label: t('magpie.statTokens'), value: formatCompact(sumNullable(aggregate.inputTokens, aggregate.outputTokens)), detail: `${t('magpie.metricInput')} ${formatCompact(aggregate.inputTokens)} · ${t('magpie.metricOutput')} ${formatCompact(aggregate.outputTokens)}` },
554
+ { label: t('magpie.metricCost'), value: formatValue(aggregate.cost), detail: `${formatInteger(aggregate.unpriced)} ${t('magpie.metricUnpriced')}` },
555
+ { label: t('magpie.metricCacheRead'), value: formatCompact(aggregate.cacheReadTokens), detail: `${t('magpie.metricCacheWrite')} ${formatCompact(aggregate.cacheWriteTokens)}` },
556
+ { label: t('magpie.statReasoning'), value: formatCompact(aggregate.reasoningTokens), detail: t('magpie.statReasoningNote') },
557
+ ];
558
+ return createElement('div', { className: 'codingns-magpie-view' }, createElement('div', { className: 'codingns-magpie-chiprow', role: 'group', 'aria-label': t('magpie.sessions') }, createElement('button', { type: 'button', className: `codingns-magpie-chip${agentFilter === '' ? ' is-active' : ''}`, onClick: () => setAgentFilter('') }, t('magpie.all')), ...agentNames.map((agent) => createElement('button', { key: agent, type: 'button', className: `codingns-magpie-chip${agentFilter === agent ? ' is-active' : ''}`, onClick: () => setAgentFilter(agent) }, createElement(MagpieProviderLogo, { identities: [agent], size: 18, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), agent))), createElement('div', { className: 'codingns-magpie-filterrow' }, createElement('label', { className: 'codingns-magpie-search codingns-magpie-grow' }, createElement(SearchIcon), createElement('input', { type: 'search', value: search, onChange: (event) => onSearch(event.currentTarget.value), placeholder: t('magpie.sessionSearch'), 'aria-label': t('magpie.sessionSearch') })), metrics != null && createElement('span', { className: 'codingns-magpie-filter-summary' }, t('magpie.sessionCountUnknown') === '' ? '' : t('magpie.sessionsCount', { count: dashboard?.sessionCount ?? visible.length }))), createElement(StatStrip, { stats }), dashboard !== null && dashboard.series.length > 1 && createElement('section', { className: 'codingns-magpie-panel codingns-magpie-barchart-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('div', undefined, createElement('h2', undefined, t('magpie.dailyTrend')))), createElement(BarChart, { points: dashboard.series, metric: 'tokens', label: t('magpie.chart.tokens') })), visible.length === 0
559
+ ? createElement(EmptyState, { message: t(search === '' && agentFilter === '' ? 'magpie.noSessions' : 'magpie.noRequests') })
560
+ : createElement('section', { className: 'codingns-magpie-panel codingns-magpie-toplist-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('h2', undefined, t('magpie.topSessions'))), ...visible.slice(0, 40).map((session) => createElement('button', {
561
+ key: `${session.agent}:${session.id}`,
562
+ type: 'button',
563
+ className: 'codingns-magpie-toprow',
564
+ onClick: () => onOpenSession(session),
565
+ }, createElement(MagpieProviderLogo, { identities: [session.agent], size: 28, className: 'codingns-magpie-provider-logo', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-toprow-main' }, createElement('strong', undefined, session.dshSessionName ?? session.agent), session.dshSessionName !== undefined && createElement('small', { title: session.agent }, session.agent), createElement('small', { title: session.id }, session.id)), createElement('span', { className: 'codingns-magpie-toprow-metrics' }, createElement('span', undefined, formatCompact(sumNullable(session.inputTokens, session.outputTokens))), createElement('span', undefined, formatInteger(session.calls)), createElement('span', undefined, formatValue(session.cost)))))));
566
+ }
567
+ function sumSessions(sessions) {
568
+ const total = { calls: 0, errors: 0, retried: 0, inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0, reasoningTokens: 0, cost: 0, unpriced: 0 };
569
+ let any = false;
570
+ for (const session of sessions) {
571
+ any = true;
572
+ total.calls += session.calls ?? 0;
573
+ total.errors += session.errors ?? 0;
574
+ total.retried += session.retried ?? 0;
575
+ total.inputTokens += session.inputTokens ?? 0;
576
+ total.outputTokens += session.outputTokens ?? 0;
577
+ total.cacheReadTokens += session.cacheReadTokens ?? 0;
578
+ total.cacheWriteTokens += session.cacheWriteTokens ?? 0;
579
+ total.reasoningTokens += session.reasoningTokens ?? 0;
580
+ total.cost += session.cost ?? 0;
581
+ total.unpriced += session.unpriced ?? 0;
582
+ }
583
+ return any ? total : { ...total };
584
+ }
585
+ export function RequestsPage({ page, loading, error, selectedSession, offset, onOffsetChange, onClearSession, t }) {
586
+ const items = page?.items ?? [];
587
+ const aggregate = sumRequests(items);
588
+ const stats = [
589
+ { label: t('magpie.statTokens'), value: formatCompact(sumNullable(aggregate.inputTokens, aggregate.outputTokens)), detail: `${t('magpie.metricInput')} ${formatCompact(aggregate.inputTokens)} · ${t('magpie.metricOutput')} ${formatCompact(aggregate.outputTokens)}` },
590
+ { label: t('magpie.statCalls'), value: formatInteger(page?.total ?? aggregate.calls), detail: `${formatInteger(aggregate.errors)} ${t('magpie.metricErrors')} · ${formatInteger(aggregate.retried)} ${t('magpie.metricRetries')}` },
591
+ { label: t('magpie.metricCost'), value: formatValue(aggregate.cost), detail: `${formatInteger(aggregate.unpriced)} ${t('magpie.metricUnpriced')}` },
592
+ { label: t('magpie.statSpeed'), value: aggregate.decodeTokens === null ? '—' : `${formatValue(aggregate.decodeTokens)} token/s`, detail: aggregate.decodeCount === null ? undefined : `${formatInteger(aggregate.decodeCount)} ${t('magpie.metricDecodeCount')}` },
593
+ { label: t('magpie.statLatency'), value: aggregate.ttftMs === null ? '—' : `${formatValue(aggregate.ttftMs)} ms`, detail: t('magpie.statLatencyNote') },
594
+ ];
595
+ return createElement('div', { className: 'codingns-magpie-view' }, selectedSession !== null && createElement('div', { className: 'codingns-magpie-selection' }, createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [selectedSession.agent], size: 20, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), selectedSession.dshSessionName ?? t('magpie.requestFor', { agent: selectedSession.agent, id: selectedSession.id })), onClearSession !== null && createElement('button', { type: 'button', className: 'codingns-magpie-text-button', onClick: onClearSession }, t('magpie.clearSession'))), error && createElement(InlineNotice, { message: t('magpie.usageUnavailable') }), loading && page === null
596
+ ? createElement(EmptyState, { message: t('magpie.loading'), loading: true })
597
+ : page === null || items.length === 0
598
+ ? createElement(EmptyState, { message: t('magpie.noRequests') })
599
+ : createElement('div', undefined, createElement(StatStrip, { stats }), createElement('section', { className: 'codingns-magpie-panel codingns-magpie-request-panel' }, createElement('div', { className: 'codingns-magpie-reqlist' }, ...items.map((request, index) => createElement(NativeRequestCard, { key: `${request.routeId ?? offset + index}:${request.time ?? ''}`, request, t }))), createElement('div', { className: 'codingns-magpie-table-scroll' }, createElement('table', { className: 'codingns-magpie-table codingns-magpie-native-table' }, createElement('thead', undefined, createElement('tr', undefined, createElement('th', undefined, t('magpie.ncolTime')), createElement('th', undefined, 'AGENT'), createElement('th', undefined, t('magpie.ncolRequested')), createElement('th', undefined, t('magpie.ncolProvider')), createElement('th', undefined, t('magpie.ncolServed')), createElement('th', undefined, t('magpie.ncolInput')), createElement('th', undefined, t('magpie.ncolOutput')), createElement('th', undefined, t('magpie.ncolCost')), createElement('th', undefined, t('magpie.ncolFirstText')), createElement('th', undefined, t('magpie.ncolDuration')), createElement('th', undefined, t('magpie.ncolSpeed')), createElement('th', undefined, t('magpie.ncolStatus')))), createElement('tbody', undefined, ...items.map((request, index) => createElement(NativeRequestRow, { key: `${request.routeId ?? offset + index}:${request.time ?? ''}`, request, t }))))), createElement('div', { className: 'codingns-magpie-pagination' }, createElement('span', undefined, page.total === null ? t('magpie.pageOf', { page: Math.floor(offset / PAGE_SIZE) + 1 }) : `${offset + 1}–${Math.min(offset + items.length, page.total)} / ${formatInteger(page.total)}`), createElement('div', undefined, createElement('button', { type: 'button', disabled: offset === 0 || loading, onClick: () => onOffsetChange(Math.max(0, offset - PAGE_SIZE)) }, t('magpie.previous')), createElement('button', { type: 'button', disabled: !page.hasMore || loading, onClick: () => onOffsetChange(offset + PAGE_SIZE) }, t('magpie.next')))))));
600
+ }
601
+ function sumRequests(items) {
602
+ const total = { calls: 0, errors: 0, retried: 0, inputTokens: 0, outputTokens: 0, cost: 0, unpriced: 0 };
603
+ let ttftSum = 0;
604
+ let ttftCount = 0;
605
+ let speedSum = 0;
606
+ let speedCount = 0;
607
+ for (const item of items) {
608
+ total.calls += item.status !== null && /^2/u.test(item.status) ? 1 : 1;
609
+ if (item.status !== null && !/^2/u.test(item.status))
610
+ total.errors += 1;
611
+ total.inputTokens += item.inputTokens ?? 0;
612
+ total.outputTokens += item.outputTokens ?? 0;
613
+ total.cost += item.cost ?? 0;
614
+ if (item.priced === false)
615
+ total.unpriced += 1;
616
+ if (item.firstTextMs !== null) {
617
+ ttftSum += item.firstTextMs;
618
+ ttftCount += 1;
619
+ }
620
+ if (item.durationMs !== null && item.outputTokens !== null && item.durationMs > 0) {
621
+ speedSum += item.outputTokens / (item.durationMs / 1000);
622
+ speedCount += 1;
623
+ }
624
+ }
625
+ return {
626
+ calls: total.calls,
627
+ errors: total.errors,
628
+ retried: 0,
629
+ inputTokens: total.inputTokens,
630
+ outputTokens: total.outputTokens,
631
+ cost: total.cost,
632
+ unpriced: total.unpriced,
633
+ ttftMs: ttftCount === 0 ? null : ttftSum / ttftCount,
634
+ decodeTokens: speedCount === 0 ? null : speedSum / speedCount,
635
+ decodeCount: speedCount === 0 ? null : speedCount,
636
+ };
637
+ }
638
+ function NativeRequestRow({ request, t }) {
639
+ const speed = request.durationMs !== null && request.outputTokens !== null && request.durationMs > 0
640
+ ? `${formatValue(request.outputTokens / (request.durationMs / 1000))} token/s`
641
+ : '—';
642
+ return createElement('tr', undefined, createElement('td', { className: 'codingns-magpie-time-cell' }, formatTimestamp(request.time)), createElement('td', undefined, createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [request.agent], size: 18, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-agent-tag' }, request.agent ?? '—'))), createElement('td', undefined, createElement('span', { className: 'codingns-magpie-route-model', title: request.requestedModel ?? '' }, request.requestedModel ?? '—')), createElement('td', undefined, createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [request.provider], size: 18, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-provider-name' }, request.provider ?? '—')), request.account !== null && createElement('small', { className: 'codingns-magpie-table-secondary' }, request.account)), createElement('td', undefined, createElement('span', { className: 'codingns-magpie-route-model' }, request.servedModel ?? '—')), createElement('td', undefined, formatCompact(request.inputTokens)), createElement('td', undefined, formatCompact(request.outputTokens)), createElement('td', { className: 'codingns-magpie-cost-cell' }, formatValue(request.cost)), createElement('td', undefined, request.firstTextMs === null ? '—' : `${formatValue(request.firstTextMs)} ms`), createElement('td', undefined, request.durationMs === null ? '—' : `${formatValue(request.durationMs / 1000)} s`), createElement('td', undefined, speed), createElement('td', undefined, createElement('span', { className: `codingns-magpie-status ${request.status !== null && /^2/u.test(request.status) ? 'is-ok' : 'is-warn'}` }, request.status ?? '—')));
643
+ }
644
+ /** Compact ledger card used below 650px: same fields as the native table, stacked for narrow screens. */
645
+ function NativeRequestCard({ request, t }) {
646
+ const speed = request.durationMs !== null && request.outputTokens !== null && request.durationMs > 0
647
+ ? `${formatValue(request.outputTokens / (request.durationMs / 1000))} token/s`
648
+ : '—';
649
+ const facts = [
650
+ `${t('magpie.ncolInput')} ${formatCompact(request.inputTokens)}`,
651
+ `${t('magpie.ncolOutput')} ${formatCompact(request.outputTokens)}`,
652
+ `${t('magpie.ncolCost')} ${formatValue(request.cost)}`,
653
+ request.firstTextMs === null ? null : `${t('magpie.ncolFirstText')} ${formatValue(request.firstTextMs)} ms`,
654
+ request.durationMs === null ? null : `${t('magpie.ncolDuration')} ${formatValue(request.durationMs / 1000)} s`,
655
+ `${t('magpie.ncolSpeed')} ${speed}`,
656
+ ].filter((item) => item !== null);
657
+ return createElement('article', { className: 'codingns-magpie-reqcard' }, createElement('div', { className: 'codingns-magpie-reqcard-top' }, createElement('span', { className: 'codingns-magpie-time-cell' }, formatTimestamp(request.time)), createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [request.agent], size: 16, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-agent-tag' }, request.agent ?? '—')), createElement('span', { className: `codingns-magpie-status ${request.status !== null && /^2/u.test(request.status) ? 'is-ok' : 'is-warn'}` }, request.status ?? '—')), createElement('div', { className: 'codingns-magpie-reqcard-route' }, createElement('span', { className: 'codingns-magpie-route-model', title: request.requestedModel ?? '' }, request.requestedModel ?? '—'), createElement('span', { className: 'codingns-magpie-reqcard-arrow', 'aria-hidden': true }, '→'), createElement('span', { className: 'codingns-magpie-route-model' }, request.servedModel ?? '—')), createElement('div', { className: 'codingns-magpie-reqcard-sub' }, createElement('span', { className: 'codingns-magpie-provider-name' }, request.provider ?? '—'), request.account !== null && createElement('span', { className: 'codingns-magpie-table-secondary' }, request.account)), createElement('div', { className: 'codingns-magpie-reqcard-facts' }, ...facts.map((fact) => createElement('span', { key: fact }, fact))));
658
+ }
659
+ /**
660
+ * 订阅卡显示口径的切换控件。
661
+ *
662
+ * 与原生 Magpie 一样是一个两段式分段控件,固定贴在工具栏最右侧;选中结果写回
663
+ * Host 设置,因此刷新页面或换设备后仍保持同一读法。设置不可写时按钮禁用而不隐藏,
664
+ * 避免控件在布局里消失导致工具栏跳动。
665
+ */
666
+ export function QuotaViewSwitch({ value, disabled, failed, onChange, t }) {
667
+ const label = t('magpie.quotaViewLabel');
668
+ return createElement('div', { className: 'codingns-magpie-quota-view', role: 'group', 'aria-label': label },
669
+ // 图标只提供视觉锚点;口径名称放在 aria-label 里,读屏仍能读出整个控件。
670
+ createElement('span', { className: 'codingns-magpie-quota-view-icon', 'aria-hidden': true, title: failed ? t('magpie.quotaViewFailed') : label }, createElement(QuotaViewIcon, {})), createElement('div', { className: 'codingns-magpie-quota-view-segment' }, ...QUOTA_VIEWS.map((entry) => createElement('button', {
671
+ key: entry.id,
672
+ type: 'button',
673
+ className: `codingns-magpie-quota-view-option${value === entry.id ? ' is-active' : ''}`,
674
+ 'aria-pressed': value === entry.id,
675
+ disabled,
676
+ onClick: () => {
677
+ if (value !== entry.id)
678
+ onChange(entry.id);
679
+ },
680
+ }, t(entry.label)))));
681
+ }
682
+ /** 口径控件左侧的圆形图标:半实心圆表示"部分已用",与进度条的语义一致。 */
683
+ function QuotaViewIcon() {
684
+ return createElement('svg', {
685
+ width: 15,
686
+ height: 15,
687
+ viewBox: '0 0 16 16',
688
+ fill: 'none',
689
+ 'aria-hidden': true,
690
+ className: 'codingns-magpie-quota-view-icon-svg',
691
+ }, createElement('circle', { cx: 8, cy: 8, r: 6.25, stroke: 'currentColor', strokeWidth: 1.5, opacity: 0.45 }), createElement('path', { d: 'M8 1.75a6.25 6.25 0 0 1 0 12.5z', fill: 'currentColor' }));
692
+ }
693
+ export function QuotasPage({ dashboard, loading, quotaView = DEFAULT_SUBSCRIPTION_REPORT_SETTINGS.quotaView, t }) {
694
+ const quotaUnavailable = dashboard?.quotaStatus !== 'available';
695
+ const quotas = dashboard?.quotas ?? [];
696
+ const quotaHistory = dashboard?.quotaHistory ?? [];
697
+ return createElement('div', { className: 'codingns-magpie-view' }, quotaUnavailable
698
+ ? createElement(EmptyState, { message: t(dashboard === null && loading ? 'magpie.loading' : 'magpie.quotaUnavailable'), loading: dashboard === null && loading })
699
+ : quotas.length === 0
700
+ ? createElement(EmptyState, { message: t('magpie.noQuotas') })
701
+ : createElement('div', { className: 'codingns-magpie-quota-grid' }, ...groupQuotaRowsByProvider(quotas).map((group) => createElement(QuotaGroupCard, { key: group.provider, group, quotaView, t }))), createElement('section', { className: 'codingns-magpie-panel codingns-magpie-history-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('div', undefined, createElement('h2', undefined, t('magpie.quotaHistory')), createElement('p', undefined, t('magpie.quotaHistoryNote')))), quotaHistory.length === 0
702
+ ? createElement('div', { className: 'codingns-magpie-inline-empty' }, t(dashboard === null && loading ? 'magpie.loading' : dashboard?.quotaHistoryStatus === 'available' ? 'magpie.noHistory' : 'magpie.historyUnavailable'))
703
+ : createElement('div', { className: 'codingns-magpie-history-grid' }, ...quotaHistory.map((history) => createElement(QuotaHistoryCard, { key: `${history.provider}:${history.user ?? ''}`, history })))));
704
+ }
705
+ function StatStrip({ stats }) {
706
+ return createElement('div', { className: 'codingns-magpie-statstrip' }, ...stats.map((stat) => createElement('div', { key: stat.label, className: 'codingns-magpie-statcell' }, createElement('span', { className: 'codingns-magpie-statcell-label' }, stat.label), createElement('strong', { className: 'codingns-magpie-statcell-value' }, stat.value), stat.detail !== undefined && stat.detail !== '' && createElement('small', { className: 'codingns-magpie-statcell-detail' }, stat.detail))));
707
+ }
708
+ function BarChart({ points, metric, label }) {
709
+ const values = points.map((point) => metric === 'calls'
710
+ ? point.calls
711
+ : metric === 'tokens' ? sumNullable(point.inputTokens, point.outputTokens) : point.cost);
712
+ const known = values.filter((value) => value !== null && Number.isFinite(value));
713
+ if (known.length === 0)
714
+ return createElement('div', { className: 'codingns-magpie-inline-empty' }, '—');
715
+ const max = Math.max(1, ...known);
716
+ const labelEvery = Math.max(1, Math.ceil(points.length / 12));
717
+ return createElement('div', { className: 'codingns-magpie-barchart' }, createElement('div', { className: 'codingns-magpie-barchart-plot', role: 'img', 'aria-label': label }, ...points.map((point, index) => {
718
+ const value = values[index] ?? null;
719
+ const height = value === null || !Number.isFinite(value) ? 0 : Math.max(2, (value / max) * 100);
720
+ return createElement('div', { key: `${point.time ?? point.label ?? index}`, className: 'codingns-magpie-bar-slot', title: `${point.label ?? point.time ?? ''} ${value === null ? '—' : formatValue(value)}` }, createElement('span', { className: 'codingns-magpie-bar', style: { height: `${height}%` } }, value !== null && createElement('span', { className: 'codingns-magpie-bar-cap' })));
721
+ })), createElement('div', { className: 'codingns-magpie-barchart-axis' }, ...points.flatMap((point, index) => index % labelEvery === 0
722
+ ? [createElement('span', { key: `${point.time ?? index}`, className: 'codingns-magpie-barchart-tick' }, point.label ?? '')]
723
+ : [])), createElement('div', { className: 'codingns-magpie-barchart-peak' }, formatValue(Math.max(...known))));
724
+ }
725
+ function ProgressSection({ title, rows, t, onOpen, header, limit = 8 }) {
726
+ const sorted = [...rows].sort((left, right) => (right.cost ?? -1) - (left.cost ?? -1) || (right.calls ?? -1) - (left.calls ?? -1));
727
+ const display = limit === undefined ? sorted : sorted.slice(0, limit);
728
+ const hasCost = display.some((row) => row.cost !== null);
729
+ const max = Math.max(1, ...display.map((row) => hasCost ? row.cost ?? 0 : sumNullable(row.inputTokens, row.outputTokens) ?? 0));
730
+ return createElement('section', { className: 'codingns-magpie-panel codingns-magpie-progress-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('h2', undefined, title), header), display.length === 0
731
+ ? createElement('div', { className: 'codingns-magpie-inline-empty' }, '—')
732
+ : createElement('div', { className: 'codingns-magpie-progress-list' }, ...display.map((row) => {
733
+ const label = row.label ?? row.name ?? row.model ?? row.account ?? row.provider ?? row.agent ?? row.id;
734
+ const weight = Math.max(0, (hasCost ? row.cost ?? 0 : sumNullable(row.inputTokens, row.outputTokens) ?? 0));
735
+ const body = createElement('div', { className: 'codingns-magpie-progress-row' }, createElement('div', { className: 'codingns-magpie-progress-head' }, createElement('span', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [row.agent, row.provider, row.model, row.id], size: 20, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('span', { className: 'codingns-magpie-progress-copy' }, createElement('span', { className: 'codingns-magpie-progress-name', title: label }, label), (row.account ?? row.provider) !== null && createElement('small', { className: 'codingns-magpie-progress-context', title: row.account ?? row.provider ?? '' }, row.account ?? row.provider))), createElement('strong', { className: 'codingns-magpie-progress-value' }, hasCost ? formatValue(row.cost) : formatCompact(sumNullable(row.inputTokens, row.outputTokens)))), createElement('div', { className: 'codingns-magpie-progress-track' }, createElement('span', { style: { width: `${Math.max(2, (weight / max) * 100)}%` } })), createElement('small', { className: 'codingns-magpie-progress-meta' }, `${formatInteger(row.calls)} ${t('magpie.metricCalls')} · ${formatCompact(sumNullable(row.inputTokens, row.outputTokens))} token · ${formatValue(row.cost)}`));
736
+ return onOpen === undefined
737
+ ? createElement('div', { key: row.id, className: 'codingns-magpie-progress-item' }, body)
738
+ : createElement('button', { key: row.id, type: 'button', className: 'codingns-magpie-progress-item is-button', onClick: () => onOpen(row) }, body);
739
+ })));
740
+ }
741
+ /**
742
+ * 一个厂商的订阅卡:卡头是厂商本身,卡内按账号分段列出额度。
743
+ *
744
+ * 同一厂商的多个账号(如 WorkBuddy 的 4 个)共用一张卡,避免每个账号各占一张卡导致
745
+ * 同类账号被拆散在网格各处;单账号厂商的读法与改造前一致。
746
+ */
747
+ function QuotaGroupCard({ group, quotaView = DEFAULT_SUBSCRIPTION_REPORT_SETTINGS.quotaView, t }) {
748
+ const first = group.accounts[0];
749
+ // 默认展开:只有用户主动收起后才是折叠态。
750
+ const [collapsed, setCollapsed] = useState(false);
751
+ const multi = group.accounts.length > 1;
752
+ const visible = multi && collapsed ? group.accounts.slice(0, 1) : group.accounts;
753
+ const hidden = group.accounts.length - visible.length;
754
+ return createElement('article', { className: 'codingns-magpie-panel codingns-magpie-quota-card' }, createElement('div', { className: 'codingns-magpie-quota-topline' }, createElement(MagpieProviderLogo, { identities: [group.provider, group.name], logoDataUrl: group.logoDataUrl, size: 52, className: 'codingns-magpie-quota-icon codingns-magpie-provider-logo' }), createElement('div', undefined, createElement('h2', undefined, group.name || group.provider), createElement('p', undefined, first.plan ?? first.kind ?? group.provider)), multi && createElement('button', {
755
+ type: 'button',
756
+ className: 'codingns-magpie-quota-count',
757
+ 'aria-expanded': !collapsed,
758
+ onClick: () => setCollapsed((value) => !value),
759
+ title: collapsed ? t('magpie.quotaShowAllAccounts') : t('magpie.quotaShowMainAccount'),
760
+ }, collapsed
761
+ ? `${t('magpie.quotaAccounts', { count: group.accounts.length })} · ${t('magpie.quotaRemainingAccounts', { count: hidden })}`
762
+ : t('magpie.quotaCollapseAccounts', { count: group.accounts.length }))), ...visible.map((quota, index) => createElement(QuotaAccountSection, {
763
+ key: `${group.provider}:${quota.user ?? index}`,
764
+ quota,
765
+ quotaView,
766
+ t,
767
+ // 单账号时不重复显示账号段头,保持与改造前一致的读法。
768
+ showHeading: multi,
769
+ })));
770
+ }
771
+ /**
772
+ * 卡内单个账号:账号行、余额、窗口进度条与每日用量。
773
+ *
774
+ * 有百分比的账号走进度条;没有百分比但有余额的账号(New-API 的 `$74.14`、
775
+ * Sub2api 的钱包余额、按积分计量的 WorkBuddy)单独显示余额行,与 Magpie 原生卡片
776
+ * 一致——过去这些账号只剩一条空进度条,余额被完全藏起来。
777
+ */
778
+ function QuotaAccountSection({ quota, quotaView = DEFAULT_SUBSCRIPTION_REPORT_SETTINGS.quotaView, t, showHeading }) {
779
+ // `daily` 现在带 `since`,按日点位于 `days` 里。
780
+ const dailyValues = quota.daily.days.map((point) => point.used).filter((value) => value !== null);
781
+ const balance = resolveQuotaAccountBalance(quota);
782
+ // 只有真正带百分比的窗口才画进度条;纯金额窗口在余额行里已经有完整读法。
783
+ const percentWindows = quota.windows.filter((window) => window.usedPercent !== null || window.remainingPercent !== null);
784
+ return createElement('div', { className: 'codingns-magpie-quota-account-block' }, showHeading && createElement('div', { className: 'codingns-magpie-quota-account-head' }, createElement('strong', undefined, quota.alias ?? quota.name), quota.user !== null && createElement('span', undefined, t('magpie.account', { account: quota.user })), quota.plan !== null && createElement('small', undefined, quota.plan)), !showHeading && quota.user !== null && createElement('div', { className: 'codingns-magpie-quota-account' }, t('magpie.account', { account: quota.user })), balance !== null && createElement('div', { className: 'codingns-magpie-quota-balance' }, createElement('span', { className: 'codingns-magpie-quota-balance-label' }, t('magpie.balance')), createElement('strong', { className: balance.money ? 'codingns-magpie-quota-balance-value is-money' : 'codingns-magpie-quota-balance-value', title: balance.raw }, balance.text)), quota.windows.length === 0
785
+ ? balance === null && createElement('div', { className: 'codingns-magpie-inline-empty' }, t('magpie.noLimit'))
786
+ : percentWindows.length > 0 && percentWindows.map((window) => {
787
+ const used = window.usedPercent ?? (window.remainingPercent === null ? null : 100 - window.remainingPercent);
788
+ const remaining = window.remainingPercent ?? (used === null ? null : 100 - used);
789
+ // 口径只改读法:同一组百分比既可以读成"已用多少",也可以读成"还剩多少",
790
+ // 进度条宽度随口径取对应值,顶部标签也换成对应的本地化文案。
791
+ const barPercent = quotaView === 'used' ? used : remaining;
792
+ const headline = quotaView === 'used'
793
+ ? (used === null ? window.display ?? '—' : t('magpie.used', { percent: Math.round(used) }))
794
+ : (remaining === null ? window.display ?? '—' : t('magpie.remaining', { percent: Math.round(remaining) }));
795
+ return createElement('div', { key: window.name, className: 'codingns-magpie-quota-window' }, createElement('div', { className: 'codingns-magpie-quota-window-head' }, createElement('strong', undefined, window.name), createElement('span', undefined, headline)), createElement('div', { className: 'codingns-magpie-track quota-track' }, used === null || remaining === null
796
+ ? null
797
+ : createElement('span', { style: { width: `${Math.max(0, Math.min(100, barPercent ?? 0))}%` } })), createElement('div', { className: 'codingns-magpie-quota-foot' }, createElement('span', undefined, window.amount !== null && window.limit !== null ? `${formatValue(window.amount)} / ${formatValue(window.limit)} ${window.unit ?? ''}` : window.display ?? ''), window.resetsAt !== null && createElement('span', undefined, t('magpie.resets', { time: formatTimestamp(window.resetsAt) }))));
798
+ }),
799
+ // 有余额但没有百分比的账号,把重置时间单独留在余额下面。
800
+ balance !== null && percentWindows.length === 0 && quota.windows.some((window) => window.resetsAt !== null) && createElement('div', { className: 'codingns-magpie-quota-foot' }, ...quota.windows.filter((window) => window.resetsAt !== null).map((window) => createElement('span', { key: window.name }, t('magpie.resets', { time: formatTimestamp(window.resetsAt) })))), quota.daily.days.length > 1 && createElement('div', { className: 'codingns-magpie-daily-chart' }, createElement(Sparkline, { values: dailyValues }), createElement('small', undefined, t('magpie.dailyUsage'))));
801
+ }
802
+ function QuotaHistoryCard({ history }) {
803
+ return createElement('div', { className: 'codingns-magpie-history-card' }, createElement('div', { className: 'codingns-magpie-provider-inline' }, createElement(MagpieProviderLogo, { identities: [history.provider], size: 22, className: 'codingns-magpie-provider-logo codingns-magpie-provider-logo-compact', fallback: 'none' }), createElement('strong', undefined, history.provider)), history.user !== null && createElement('small', undefined, history.user), ...history.lines.map((line) => createElement('div', { key: line.name, className: 'codingns-magpie-history-line' }, createElement('div', { className: 'codingns-magpie-history-line-head' }, createElement('span', undefined, line.name), createElement('span', undefined, line.points.at(-1)?.left === null || line.points.at(-1)?.left === undefined ? '—' : formatValue(line.points.at(-1).left))), createElement(Sparkline, { values: line.points.map((point) => point.left).filter((value) => value !== null) }))));
804
+ }
805
+ function Sparkline({ values }) {
806
+ const max = Math.max(1, ...values);
807
+ const points = values.map((value, index) => `${values.length <= 1 ? 50 : 2 + (index * 96) / (values.length - 1)},${32 - (Math.max(0, value) / max) * 28}`).join(' ');
808
+ return createElement('svg', { className: 'codingns-magpie-sparkline', viewBox: '0 0 100 36', preserveAspectRatio: 'none', 'aria-hidden': true }, createElement('polyline', { points, fill: 'none' }));
809
+ }
810
+ function EmptyState({ message, loading = false }) {
811
+ return createElement('div', { className: `codingns-magpie-empty${loading ? ' is-loading' : ''}`, role: loading ? 'status' : 'note' }, createElement('span', { className: 'codingns-magpie-empty-mark', 'aria-hidden': true }, loading ? createElement('span', { className: 'codingns-magpie-spinner' }) : '∅'), createElement('span', undefined, message));
812
+ }
813
+ function InlineNotice({ message }) {
814
+ return createElement('div', { className: 'codingns-magpie-notice', role: 'status' }, createElement('span', undefined, 'i'), message);
815
+ }
816
+ /** 刷新图标沿用 DSH 的 1.6 描边简约样式;加载时整体旋转,静默重绘状态下保持静止。 */
817
+ function RefreshIcon({ busy = false }) {
818
+ return createElement('svg', {
819
+ className: `codingns-magpie-refresh-icon${busy ? ' is-spinning' : ''}`,
820
+ width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.6,
821
+ strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': true,
822
+ }, createElement('path', { d: 'M20 11a8 8 0 1 0-2.3 5.6' }), createElement('path', { d: 'M20 4.5V11h-6.5' }));
823
+ }
824
+ function SearchIcon() {
825
+ return createElement('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', 'aria-hidden': true }, createElement('circle', { cx: 10.8, cy: 10.8, r: 6.8 }), createElement('path', { d: 'm16 16 4.4 4.4' }));
826
+ }
827
+ export async function callMagpieRpc(rpc, action, payload, signal) {
828
+ const result = await callCodingNsRpcResult(rpc, `magpie/${action}`, payload, signal);
829
+ if (!result.ok)
830
+ throw Object.assign(new Error(result.error.message), { code: result.error.code });
831
+ return result.value;
832
+ }
833
+ export function magpieUpdateIssueForRpcError(error) {
834
+ const record = error !== null && typeof error === 'object' ? error : undefined;
835
+ const code = typeof record?.code === 'string' ? record.code : '';
836
+ const message = typeof record?.message === 'string' ? record.message : '';
837
+ if (code === 'CODINGNS_MAGPIE_UPDATE_UNSUPPORTED')
838
+ return 'cli-version-unsupported';
839
+ if (code === 'CODINGNS_MAGPIE_UPDATE_INVALID')
840
+ return 'update-response-invalid';
841
+ if (code === 'CODINGNS_MAGPIE_UPDATE_CONFIRMATION_REQUIRED')
842
+ return 'host-request-failed';
843
+ if (code === 'CODINGNS_RPC_NOT_FOUND'
844
+ || (code === 'Error' && /^Unknown Magpie RPC: update\/(?:status|notes|check|install)$/u.test(message))) {
845
+ return 'host-rpc-outdated';
846
+ }
847
+ if (code === 'CODINGNS_MAGPIE_DISABLED')
848
+ return 'feature-disabled';
849
+ return 'host-request-failed';
850
+ }
851
+ export function magpieDashboardIssueForRpcError(error) {
852
+ const code = error !== null && typeof error === 'object' && 'code' in error && typeof error.code === 'string'
853
+ ? error.code
854
+ : '';
855
+ if (code === 'CODINGNS_RPC_NOT_FOUND')
856
+ return 'host-rpc-outdated';
857
+ if (code === 'CODINGNS_MAGPIE_DISABLED')
858
+ return 'feature-disabled';
859
+ return 'host-request-failed';
860
+ }
861
+ export function magpieManagementIssueForRpcError(error) {
862
+ const record = error !== null && typeof error === 'object' ? error : undefined;
863
+ const code = typeof record?.code === 'string' ? record.code : '';
864
+ const message = typeof record?.message === 'string' ? record.message : '';
865
+ if (code === 'CODINGNS_RPC_NOT_FOUND'
866
+ || (code === 'Error' && /^Unknown Magpie RPC: management\/(?:snapshot|provider\/update|group\/update|account\/update)$/u.test(message))) {
867
+ return 'host-rpc-outdated';
868
+ }
869
+ if (code === 'CODINGNS_MAGPIE_DISABLED')
870
+ return 'feature-disabled';
871
+ return 'host-request-failed';
872
+ }
873
+ function dashboardIssueLocaleKey(issue) {
874
+ switch (issue) {
875
+ case 'web-api-unavailable': return 'magpie.webApiUnavailable';
876
+ case 'cli-unavailable': return 'magpie.cliUnavailable';
877
+ case 'cli-version-unsupported': return 'magpie.cliVersionUnsupported';
878
+ case 'model-catalog-unavailable': return 'magpie.catalogUnavailable';
879
+ case 'host-rpc-outdated': return 'magpie.hostRpcOutdated';
880
+ case 'feature-disabled': return 'magpie.featureDisabled';
881
+ case 'host-request-failed': return 'magpie.hostRequestFailed';
882
+ }
883
+ }
884
+ function managementIssueLocaleKey(issue) {
885
+ switch (issue) {
886
+ case 'web-api-unavailable': return 'magpie.webApiUnavailable';
887
+ case 'cli-unavailable': return 'magpie.cliUnavailable';
888
+ case 'cli-version-unsupported': return 'magpie.management.cliVersionUnsupported';
889
+ case 'providers-unavailable': return 'magpie.management.providersUnavailable';
890
+ case 'groups-unavailable': return 'magpie.management.groupsUnavailable';
891
+ case 'accounts-unavailable': return 'magpie.management.accountsUnavailable';
892
+ case 'host-rpc-outdated': return 'magpie.hostRpcOutdated';
893
+ case 'feature-disabled': return 'magpie.featureDisabled';
894
+ case 'host-request-failed': return 'magpie.hostRequestFailed';
895
+ }
896
+ }
897
+ function updateIssueLocaleKey(issue) {
898
+ switch (issue) {
899
+ case 'web-api-unavailable': return 'magpie.webApiUnavailable';
900
+ case 'cli-unavailable': return 'magpie.cliUnavailable';
901
+ case 'cli-version-unsupported': return 'magpie.update.unsupported';
902
+ case 'update-response-invalid': return 'magpie.update.invalid';
903
+ case 'host-rpc-outdated': return 'magpie.hostRpcOutdated';
904
+ case 'feature-disabled': return 'magpie.featureDisabled';
905
+ case 'host-request-failed': return 'magpie.hostRequestFailed';
906
+ }
907
+ }
908
+ function updateStateLabel(state, t) {
909
+ return t(`magpie.update.state.${state}`);
910
+ }
911
+ function sumNullable(left, right) {
912
+ return left === null && right === null ? null : (left ?? 0) + (right ?? 0);
913
+ }
914
+ /** Collapse raw model rows while retaining an identity only when it is unambiguous. */
915
+ export function aggregateModelUsageRows(rows) {
916
+ const grouped = new Map();
917
+ const nameKeys = new Map();
918
+ for (const row of rows) {
919
+ const modelKey = modelUsageKey(row);
920
+ if (modelKey === '')
921
+ continue;
922
+ const nameKey = modelUsageNameKey(row);
923
+ // Some Magpie versions qualify the model ID differently for each account. When the
924
+ // account rows share a provider and display name, the display name is the stable model
925
+ // identity and must win over that account-specific ID.
926
+ const groupKey = nameKey === null ? modelKey : nameKeys.get(nameKey) ?? modelKey;
927
+ if (nameKey !== null)
928
+ nameKeys.set(nameKey, groupKey);
929
+ const current = grouped.get(groupKey);
930
+ if (current === undefined) {
931
+ grouped.set(groupKey, { ...row, id: `model:${groupKey}`, account: null });
932
+ continue;
933
+ }
934
+ grouped.set(groupKey, {
935
+ ...current,
936
+ name: current.name ?? row.name,
937
+ provider: mergeIdentity(current.provider, row.provider),
938
+ model: current.model ?? row.model,
939
+ agent: mergeIdentity(current.agent, row.agent),
940
+ calls: sumNullable(current.calls, row.calls),
941
+ errors: sumNullable(current.errors, row.errors),
942
+ retried: sumNullable(current.retried, row.retried),
943
+ inputTokens: sumNullable(current.inputTokens, row.inputTokens),
944
+ outputTokens: sumNullable(current.outputTokens, row.outputTokens),
945
+ cacheReadTokens: sumNullable(current.cacheReadTokens, row.cacheReadTokens),
946
+ cacheWriteTokens: sumNullable(current.cacheWriteTokens, row.cacheWriteTokens),
947
+ reasoningTokens: sumNullable(current.reasoningTokens, row.reasoningTokens),
948
+ cost: sumNullable(current.cost, row.cost),
949
+ unpriced: sumNullable(current.unpriced, row.unpriced),
950
+ credits: sumNullable(current.credits, row.credits),
951
+ credited: sumNullable(current.credited, row.credited),
952
+ timed: sumNullable(current.timed, row.timed),
953
+ ttftMs: sumNullable(current.ttftMs, row.ttftMs),
954
+ decodeMs: sumNullable(current.decodeMs, row.decodeMs),
955
+ decodeTokens: sumNullable(current.decodeTokens, row.decodeTokens),
956
+ decodeCount: sumNullable(current.decodeCount, row.decodeCount),
957
+ });
958
+ }
959
+ return [...grouped.values()];
960
+ }
961
+ /** Return rows with unique React identities so duplicate Magpie IDs cannot leak across modes. */
962
+ export function modelBreakdownRows(rows, mode) {
963
+ if (mode === 'aggregate')
964
+ return aggregateModelUsageRows(rows);
965
+ const seen = new Map();
966
+ return rows.map((row, index) => {
967
+ const baseId = row.id.trim() || `row-${index}`;
968
+ const occurrence = seen.get(baseId) ?? 0;
969
+ seen.set(baseId, occurrence + 1);
970
+ return occurrence === 0 ? row : { ...row, id: `${baseId}#${occurrence}` };
971
+ });
972
+ }
973
+ function modelUsageKey(row) {
974
+ return (row.model ?? row.name ?? row.id).trim().toLocaleLowerCase();
975
+ }
976
+ function modelUsageNameKey(row) {
977
+ if (row.account === null)
978
+ return null;
979
+ const name = row.name?.trim().toLocaleLowerCase() ?? '';
980
+ const provider = row.provider?.trim().toLocaleLowerCase() ?? '';
981
+ return name === '' ? null : `${provider}\u0000${name}`;
982
+ }
983
+ function mergeIdentity(left, right) {
984
+ if (left === null)
985
+ return right;
986
+ if (right === null || left === right)
987
+ return left;
988
+ return null;
989
+ }
990
+ function formatInteger(value) {
991
+ return value === null ? '—' : new Intl.NumberFormat(undefined, { maximumFractionDigits: 0 }).format(value);
992
+ }
993
+ function formatCompact(value) {
994
+ return value === null ? '—' : new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 }).format(value);
995
+ }
996
+ function formatValue(value) {
997
+ return value === null ? '—' : new Intl.NumberFormat(undefined, { maximumFractionDigits: value >= 100 ? 1 : 4 }).format(value);
998
+ }
999
+ function formatTimestamp(value) {
1000
+ if (value === null)
1001
+ return '—';
1002
+ const parsed = Date.parse(value);
1003
+ if (!Number.isFinite(parsed))
1004
+ return value;
1005
+ return new Intl.DateTimeFormat(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(parsed);
1006
+ }
1007
+ const pageStyle = {
1008
+ display: 'flex', flexDirection: 'column', width: '100%', height: '100%', minWidth: 0, minHeight: 0, boxSizing: 'border-box',
1009
+ paddingTop: 'var(--dsh-frame-top-clearance, 0px)',
1010
+ color: 'var(--dsw-alias-label-primary,CanvasText)', background: 'var(--mp-surface)',
1011
+ border: 0, borderRadius: 0, boxShadow: 'none', overflow: 'hidden',
1012
+ };
1013
+ const MAGPIE_PAGE_CSS = `
1014
+ .codingns-magpie-page{--mp-accent:var(--dsw-alias-state-business-primary,#4176e6);--mp-chart:var(--mp-accent);--mp-ink:var(--dsw-alias-label-primary,CanvasText);--mp-muted:var(--dsw-alias-label-tertiary,GrayText);--mp-caption:var(--dsw-alias-label-caption,GrayText);--mp-line:var(--dsw-alias-border-l2,rgba(0,0,0,.1));--mp-line-strong:var(--dsw-alias-border-l3,rgba(0,0,0,.12));--mp-card:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1,transparent));--mp-layer:var(--dsw-alias-bg-module-platform,var(--dsw-alias-bg-layer-2,rgba(127,127,127,.06)));--mp-hover:var(--dsw-alias-interactive-bg-hover,rgba(127,127,127,.1));--mp-surface:var(--dsw-alias-bg-base,Canvas);--mp-radius:var(--dsw-radius-lg,12px);position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-width:0;min-height:0;font:inherit;color:var(--mp-ink);background:var(--mp-surface)}
1015
+ .codingns-magpie-page *{box-sizing:border-box}
1016
+ .codingns-magpie-topbar{flex:0 0 auto;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:12px;min-height:56px;padding:var(--mp-topbar-pad-y) calc(var(--mp-topbar-pad-x) + var(--mp-leading-inset));border-bottom:.5px solid var(--mp-line-strong);background:var(--mp-surface)}
1017
+ .codingns-magpie-topbar-left{display:flex;align-items:center;justify-self:start;min-width:0;max-width:100%}
1018
+ .codingns-magpie-topbar-right{display:flex;align-items:center;justify-self:end;gap:8px;min-width:0}
1019
+ .codingns-magpie-version-button{display:inline-flex;align-items:center;min-height:30px;padding:0 9px;border:.5px solid var(--mp-line-strong);border-radius:999px;background:var(--mp-card);color:var(--mp-muted);font:inherit;font-size:${uiFontSize(12)};font-variant-numeric:tabular-nums;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.codingns-magpie-version-button:hover,.codingns-magpie-version-button[aria-expanded=true]{border-color:color-mix(in srgb,var(--mp-accent) 55%,var(--mp-line-strong));background:color-mix(in srgb,var(--mp-accent) 8%,var(--mp-card));color:var(--mp-ink)}.codingns-magpie-version-button:focus-visible{outline:2px solid color-mix(in srgb,var(--mp-accent) 55%,transparent);outline-offset:1px}
1020
+ .codingns-magpie-icon-button{display:grid;place-items:center;flex:0 0 auto;width:30px;height:30px;border:0;border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-muted);cursor:pointer;transition:background .15s,color .15s}
1021
+ .codingns-magpie-icon-button:hover{background:var(--mp-hover);color:var(--mp-ink)}
1022
+ .codingns-magpie-icon-button:active{background:var(--mp-layer)}
1023
+ .codingns-magpie-icon-button:focus-visible{outline:2px solid color-mix(in srgb,var(--mp-accent) 55%,transparent);outline-offset:1px}
1024
+ .codingns-magpie-icon-button:disabled{opacity:.5;cursor:default;background:transparent;color:var(--mp-muted)}
1025
+ .codingns-magpie-refresh-icon{display:block;flex:0 0 auto;transition:transform .2s}
1026
+ .codingns-magpie-refresh-icon.is-spinning{animation:magpie-spin .9s linear infinite}
1027
+ @media(prefers-reduced-motion:reduce){.codingns-magpie-refresh-icon.is-spinning{animation:none}}
1028
+ .codingns-magpie-tabs{display:flex;align-items:center;justify-content:center;gap:2px;justify-self:center;min-width:0;overflow-x:auto;scrollbar-width:none}
1029
+ .codingns-magpie-tabs::-webkit-scrollbar{display:none}
1030
+ .codingns-magpie-tab{position:relative;display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;min-height:42px;padding:0 12px;border:0;border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};white-space:nowrap;cursor:pointer;transition:color .16s,background .16s}
1031
+ .codingns-magpie-tab:hover{color:var(--mp-ink);background:var(--mp-hover)}
1032
+ .codingns-magpie-tab.is-active{background:transparent;color:var(--mp-ink);font-weight:600;box-shadow:none}
1033
+ .codingns-magpie-tab.is-active:after{content:'';position:absolute;left:10px;right:10px;bottom:0;height:2px;border-radius:2px;background:var(--mp-accent)}
1034
+ .codingns-magpie-tab-icon{display:grid;place-items:center;width:15px;font-size:${uiFontSize(13)};line-height:1;opacity:.85}
1035
+ .codingns-magpie-toolbar{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:14px;min-height:46px;padding:0 20px;border-bottom:.5px solid var(--mp-line);background:var(--mp-surface)}
1036
+ .codingns-magpie-toolbar-left{display:flex;align-items:center;gap:12px;min-width:0}
1037
+ .codingns-magpie-periods{flex-direction:row;overflow:auto;display:flex;align-items:center;gap:2px;min-width:0;padding:2px;border-radius:999px;background:var(--mp-layer);scrollbar-width:none}
1038
+ .codingns-magpie-periods::-webkit-scrollbar{display:none}
1039
+ .codingns-magpie-period{flex:0 0 auto;min-height:26px;padding:0 12px;border:0;border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}
1040
+ .codingns-magpie-period:hover{color:var(--mp-ink)}
1041
+ .codingns-magpie-period.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
1042
+ .codingns-magpie-live-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;background:var(--dsw-alias-state-success-primary,#3f9d6b);box-shadow:0 0 0 4px color-mix(in srgb,var(--dsw-alias-state-success-primary,#3f9d6b) 12%,transparent)}
1043
+ .codingns-magpie-main{flex:1 1 0;min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;background:var(--mp-surface)}
1044
+ .codingns-magpie-view{max-width:1320px;margin:0 auto;padding:18px clamp(16px,2.4vw,28px) 40px}
1045
+ .codingns-magpie-panel{min-width:0;border:.5px solid var(--mp-line);border-radius:var(--mp-radius);background:var(--mp-card)}
1046
+ .codingns-magpie-panel-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:13px}
1047
+ .codingns-magpie-panel-head h2{margin:0;font-size:${uiFontSize(14)};font-weight:600}.codingns-magpie-panel-head p{margin:4px 0 0;color:var(--mp-muted);font-size:${uiFontSize(13)};line-height:1.5}
1048
+ .codingns-magpie-chart-switch{display:flex;flex-wrap:wrap;gap:2px;padding:2px;border:0;border-radius:999px;background:var(--mp-layer)}
1049
+ .codingns-magpie-chart-switch button{border:0;border-radius:999px;padding:5px 10px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(12)};cursor:pointer}.codingns-magpie-chart-switch button.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
1050
+ .codingns-magpie-track{height:4px;margin:7px 0 5px;border-radius:99px;background:var(--mp-hover);overflow:hidden}.codingns-magpie-track span{display:block;height:100%;min-width:2px;border-radius:inherit;background:linear-gradient(90deg,var(--mp-accent),color-mix(in srgb,var(--mp-accent) 55%,transparent));transition:width .35s ease}
1051
+ .codingns-magpie-text-button{border:0;background:transparent;color:var(--dsw-alias-link,var(--mp-accent));font:inherit;font-size:${uiFontSize(13)};font-weight:600;cursor:pointer}.codingns-magpie-text-button:hover{text-decoration:underline}
1052
+ .codingns-magpie-search{display:flex;align-items:center;gap:9px;max-width:420px;margin:0 0 14px;padding:8px 12px;border:.5px solid var(--dsw-alias-border-l4,rgba(0,0,0,.16));border-radius:10px;color:var(--mp-muted);background:var(--mp-card)}.codingns-magpie-search input{width:100%;border:0;outline:0;background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(13)}}
1053
+ .codingns-magpie-request-panel{overflow:hidden}.codingns-magpie-table-scroll{overflow:auto;overscroll-behavior-inline:contain}.codingns-magpie-table{width:100%;min-width:880px;border-collapse:collapse}.codingns-magpie-table th{padding:9px 12px;border-bottom:.5px solid var(--mp-line);color:var(--mp-caption);font-size:${uiFontSize(13)};font-weight:600;text-align:left;white-space:nowrap}.codingns-magpie-table td{max-width:250px;padding:10px 12px;border-bottom:.5px solid var(--mp-line);font-size:${uiFontSize(13)};vertical-align:middle}.codingns-magpie-table tbody tr:last-child td{border-bottom:0}.codingns-magpie-table tbody tr:hover{background:var(--mp-card)}
1054
+ .codingns-magpie-time-cell{white-space:nowrap;color:var(--mp-muted)}.codingns-magpie-provider-name,.codingns-magpie-route-model{display:block;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:620}.codingns-magpie-table-secondary{display:block;max-width:220px;margin-top:3px;overflow:hidden;color:var(--mp-caption);font-size:${uiFontSize(12)};text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-cost-cell{font-variant-numeric:tabular-nums}
1055
+ .codingns-magpie-status{display:inline-block;padding:2px 7px;border-radius:6px;background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 12%,transparent);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary,#a06a2c));font-size:${uiFontSize(12)};font-variant-numeric:tabular-nums}.codingns-magpie-status.is-ok{background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#3f9d6b) 12%,transparent);color:var(--dsw-alias-state-success-primary,#3f9d6b)}
1056
+ .codingns-magpie-pagination{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-top:.5px solid var(--mp-line);color:var(--mp-muted);font-size:${uiFontSize(13)}}.codingns-magpie-pagination div{display:flex;gap:6px}.codingns-magpie-pagination button{min-height:28px;padding:0 10px;border:.5px solid var(--mp-line-strong);border-radius:var(--dsw-radius-sm,6px);background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(13)};cursor:pointer}.codingns-magpie-pagination button:disabled{opacity:.4;cursor:not-allowed}
1057
+ /* Lay the subscription cards out in a multi-column flow: a CSS Grid row is as
1058
+ tall as its tallest card, which leaves large gaps under short cards when a
1059
+ provider has several accounts but a single window. Each column fills top to
1060
+ bottom instead, matching Magpie's own layout. */
1061
+ .codingns-magpie-quota-grid{column-width:340px;column-gap:12px;margin-bottom:13px}
1062
+ /* Never split a card across two columns: its title and quota stay together. */
1063
+ .codingns-magpie-quota-card{display:inline-block;width:100%;margin:0 0 12px;vertical-align:top;padding:17px;break-inside:avoid;page-break-inside:avoid}.codingns-magpie-quota-topline{display:flex;align-items:center;gap:10px;margin-bottom:13px}.codingns-magpie-quota-icon{display:grid;place-items:center;width:34px;height:34px;border-radius:9px;background:var(--mp-layer);color:var(--mp-accent);font-weight:700}.codingns-magpie-quota-topline h2{margin:0;font-size:${uiFontSize(14)};font-weight:600}.codingns-magpie-quota-topline p{margin:3px 0 0;color:var(--mp-caption);font-size:${uiFontSize(13)}}.codingns-magpie-quota-account{margin:-5px 0 11px;color:var(--mp-muted);font-size:${uiFontSize(13)}}.codingns-magpie-quota-count{margin-left:auto;flex:none;min-height:26px;padding:0 9px;border:1px solid var(--mp-line);border-radius:999px;background:transparent;color:var(--mp-muted);font-size:${uiFontSize(12)};cursor:pointer;white-space:nowrap}.codingns-magpie-quota-count:hover{color:var(--mp-fg);border-color:var(--mp-accent)}.codingns-magpie-quota-count:focus-visible{outline:none;box-shadow:0 0 0 2px var(--mp-accent)}.codingns-magpie-quota-account-block + .codingns-magpie-quota-account-block{margin-top:12px;padding-top:11px;border-top:1px solid var(--mp-line)}.codingns-magpie-quota-account-head{display:flex;align-items:baseline;gap:8px;min-width:0;margin-bottom:9px;font-size:${uiFontSize(13)}}.codingns-magpie-quota-account-head strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-quota-account-head span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--mp-muted);font-size:${uiFontSize(12)}}.codingns-magpie-quota-account-head small{margin-left:auto;flex:none;color:var(--mp-caption);font-size:${uiFontSize(12)}}
1064
+ .codingns-magpie-quota-balance{display:flex;align-items:baseline;justify-content:space-between;gap:10px;min-width:0;margin:0 0 4px;padding:9px 0 2px}
1065
+ .codingns-magpie-quota-balance-label{flex:0 0 auto;color:var(--mp-muted);font-size:${uiFontSize(13)}}
1066
+ .codingns-magpie-quota-balance-value{min-width:0;overflow:hidden;color:var(--mp-ink);font-size:${uiFontSize(15)};font-weight:600;font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap}
1067
+ .codingns-magpie-quota-balance-value.is-money{font-size:${uiFontSize(17)};letter-spacing:-.01em}
1068
+ .codingns-magpie-quota-window{padding:11px 0;border-top:.5px solid var(--mp-line)}.codingns-magpie-quota-window-head,.codingns-magpie-quota-foot,.codingns-magpie-history-line-head{display:flex;align-items:center;justify-content:space-between;gap:9px}.codingns-magpie-quota-window-head{font-size:${uiFontSize(13)};font-weight:500}.codingns-magpie-quota-window-head span{color:var(--mp-muted);font-variant-numeric:tabular-nums}.quota-track{height:6px}.quota-track span{background:linear-gradient(90deg,var(--mp-accent),color-mix(in srgb,var(--mp-accent) 55%,transparent))}.codingns-magpie-quota-foot{color:var(--mp-caption);font-size:${uiFontSize(12)}}
1069
+ .codingns-magpie-daily-chart{display:grid;grid-template-columns:1fr auto;align-items:center;gap:9px;margin-top:4px;padding-top:10px;border-top:.5px solid var(--mp-line);color:var(--mp-muted);font-size:${uiFontSize(12)}}.codingns-magpie-sparkline{width:100%;height:30px;overflow:visible}.codingns-magpie-sparkline polyline{stroke:var(--mp-accent);stroke-width:2;vector-effect:non-scaling-stroke}
1070
+ .codingns-magpie-history-panel{padding:17px;margin-top:14px}.codingns-magpie-history-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}.codingns-magpie-history-card{padding:12px;border:1px solid var(--mp-line);border-radius:9px;background:var(--mp-card)}.codingns-magpie-history-card>strong,.codingns-magpie-history-card>small{display:block}.codingns-magpie-history-card>strong{font-size:${uiFontSize(13)};font-weight:600}.codingns-magpie-history-card>small{margin-top:3px;color:var(--mp-caption);font-size:${uiFontSize(12)}}.codingns-magpie-history-line{margin-top:10px}.codingns-magpie-history-line-head{font-size:${uiFontSize(12)}}.codingns-magpie-history-line-head span:last-child{font-variant-numeric:tabular-nums;font-weight:650}
1071
+ .codingns-magpie-update-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:flex-start;justify-content:center;overflow:auto;padding:calc(var(--dsh-frame-top-clearance,0px) + 68px) 18px 24px;background:color-mix(in srgb,var(--mp-surface) 72%,rgba(0,0,0,.28));backdrop-filter:blur(3px)}.codingns-magpie-update-dialog{width:min(720px,100%);max-height:100%;overflow:auto;border:.5px solid var(--mp-line-strong);border-radius:var(--mp-radius);background:var(--mp-surface);box-shadow:var(--dsw-elevation-prominent,0 18px 48px rgba(0,0,0,.22))}.codingns-magpie-update-panel{padding:16px 17px;margin-bottom:0;border:0}.codingns-magpie-update-panel .codingns-magpie-panel-head{align-items:flex-start}.codingns-magpie-update-panel-actions{display:flex;align-items:center;gap:10px;flex:0 0 auto}.codingns-magpie-update-close{display:grid;place-items:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-muted);font:inherit;font-size:20px;line-height:1;cursor:pointer}.codingns-magpie-update-close:hover{background:var(--mp-hover);color:var(--mp-ink)}.codingns-magpie-update-close:focus-visible{outline:2px solid color-mix(in srgb,var(--mp-accent) 55%,transparent);outline-offset:1px}.codingns-magpie-update-body{display:grid;gap:9px}.codingns-magpie-update-status{display:flex;align-items:center;flex-wrap:wrap;gap:8px;color:var(--mp-muted);font-size:${uiFontSize(12)}}.codingns-magpie-update-status strong{color:var(--mp-ink);font-size:${uiFontSize(14)}}.codingns-magpie-update-progress{position:relative;height:7px;overflow:hidden;border-radius:999px;background:var(--mp-layer)}.codingns-magpie-update-progress span{display:block;height:100%;border-radius:inherit;background:var(--mp-accent);transition:width .2s ease}.codingns-magpie-update-progress small{display:block;margin-top:4px;color:var(--mp-caption);font-size:${uiFontSize(11)}}.codingns-magpie-update-notes{padding:9px 10px;border:1px solid var(--mp-line);border-radius:8px;background:var(--mp-card);color:var(--mp-muted);font-size:${uiFontSize(12)};line-height:1.5}.codingns-magpie-update-notes summary{cursor:pointer;color:var(--mp-ink);font-weight:600}.codingns-magpie-update-notes div{white-space:pre-wrap;overflow-wrap:anywhere}.codingns-magpie-update-actions{display:flex;justify-content:flex-start}.codingns-magpie-update-actions button{min-height:30px;padding:0 11px;border:1px solid var(--mp-line-strong);border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(12)};cursor:pointer}.codingns-magpie-update-actions button:disabled{opacity:.45;cursor:not-allowed}
1072
+ .codingns-magpie-management-grid{display:grid;grid-template-columns:minmax(190px,260px) minmax(0,1fr);align-items:start;gap:12px}.codingns-magpie-management-list{max-height:calc(100vh - 190px);overflow:auto;padding:5px}.codingns-magpie-management-row{width:100%;display:flex;align-items:center;justify-content:space-between;gap:9px;min-height:48px;padding:8px 10px;border:0;border-bottom:.5px solid var(--mp-line);background:transparent;color:var(--mp-ink);font:inherit;text-align:left;cursor:pointer}.codingns-magpie-management-row:last-child{border-bottom:0}.codingns-magpie-management-row:hover,.codingns-magpie-management-row.is-active{background:var(--mp-hover)}.codingns-magpie-management-row.is-active{box-shadow:inset 2px 0 var(--mp-accent)}.codingns-magpie-management-row-main{display:flex;flex:1 1 auto;flex-direction:column;align-items:flex-start;gap:3px;min-width:0;text-align:left}.codingns-magpie-management-row-main strong,.codingns-magpie-management-row-main small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-management-row-main strong{max-width:100%;text-align:left;font-size:${uiFontSize(13)};font-weight:600}.codingns-magpie-management-row-main small{color:var(--mp-caption);font-size:${uiFontSize(12)}}.codingns-magpie-state{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto;padding:3px 7px;border-radius:999px;background:var(--mp-layer);color:var(--mp-muted);font-size:${uiFontSize(11)};font-weight:700}.codingns-magpie-state:before{content:'';width:6px;height:6px;border-radius:50%;background:currentColor}.codingns-magpie-state.is-on{background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#3f9d6b) 12%,transparent);color:var(--mp-accent)}.codingns-magpie-state.is-off{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 12%,transparent);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary,#a06a2c))}.codingns-magpie-management-editor{padding:17px}.codingns-magpie-management-statusline{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:-2px 0 13px;color:var(--mp-muted);font-size:${uiFontSize(13)}}.codingns-magpie-field{display:flex;flex:1 1 150px;flex-direction:column;gap:6px;min-width:0;margin:0 0 12px;color:var(--mp-muted);font-size:${uiFontSize(13)};font-weight:500}.codingns-magpie-field small{font-size:${uiFontSize(11)};font-weight:400;line-height:1.4}.codingns-magpie-field input,.codingns-magpie-field select,.codingns-magpie-field textarea{width:100%;min-width:0;box-sizing:border-box;padding:7px 10px;border:.5px solid var(--dsw-alias-border-l4,rgba(0,0,0,.16));border-radius:var(--dsw-radius-sm,8px);background:var(--mp-card);color:var(--mp-ink);font:inherit;font-size:${uiFontSize(13)};outline:none}.codingns-magpie-field textarea{resize:vertical;line-height:1.5;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.codingns-magpie-field-row{display:flex;gap:9px;align-items:stretch}.codingns-magpie-management-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:7px;margin-top:10px}.codingns-magpie-management-actions button{min-height:32px;padding:0 12px;border:.5px solid var(--mp-line-strong);border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(13)};cursor:pointer}.codingns-magpie-management-actions button.is-primary{border-color:transparent;background:var(--dsw-alias-button-primary-fill,var(--mp-accent));color:var(--dsw-alias-label-primary-foreground,#fff)}.codingns-magpie-management-actions button:disabled{opacity:.45;cursor:not-allowed}.codingns-magpie-confirm{display:grid;gap:7px;margin:12px 0;padding:11px;border:1px solid rgba(59,126,98,.24);border-radius:9px;background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#3f9d6b) 8%,transparent);font-size:${uiFontSize(11)}}.codingns-magpie-confirm>span{overflow-wrap:anywhere;color:var(--mp-muted);line-height:1.5}.codingns-magpie-management-message{margin-top:10px;color:var(--mp-accent);font-size:${uiFontSize(11)}}.codingns-magpie-management-account-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.codingns-magpie-management-account{padding:16px}.codingns-magpie-management-balance{margin:8px 0;color:var(--mp-ink);font-size:${uiFontSize(14)};font-weight:700}.codingns-magpie-management-window{padding:10px 0;border-top:1px solid var(--mp-line)}.codingns-magpie-management-window>small,.codingns-magpie-management-readat{display:block;margin-top:5px;color:var(--mp-muted);font-size:${uiFontSize(11)}}.codingns-magpie-management-members{display:flex;flex-wrap:wrap;gap:5px;margin:-2px 0 13px}.codingns-magpie-member-chip{max-width:100%;overflow:hidden;padding:4px 7px;border:1px solid var(--mp-line);border-radius:6px;background:var(--mp-card);color:var(--mp-ink);font-size:${uiFontSize(11)};text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-member-chip.is-muted{opacity:.55}.codingns-magpie-management-policy{flex:0 0 auto;color:var(--mp-muted);font-size:${uiFontSize(11)}}.codingns-magpie-checkbox{display:flex;align-items:center;gap:8px;margin:0;color:var(--mp-ink);font-size:${uiFontSize(13)}}.codingns-magpie-checkbox input{accent-color:var(--mp-accent)}
1073
+ .codingns-magpie-field-checkbox{margin:2px 0 12px}.codingns-magpie-management-hint{margin:0 0 14px;color:var(--mp-caption);font-size:${uiFontSize(11)};line-height:1.5}
1074
+ .codingns-magpie-checkbox-list{display:grid;gap:4px;padding:8px;border:1px solid var(--mp-line);border-radius:8px;background:var(--mp-card)}
1075
+ .codingns-magpie-checkbox-list .codingns-magpie-model-option{min-height:34px;padding:4px 7px}
1076
+ .codingns-magpie-checkbox-list .codingns-magpie-model-id{font-weight:600;color:var(--mp-ink)}
1077
+ .codingns-magpie-segmented{display:inline-flex;flex-wrap:wrap;gap:2px;align-self:flex-start;padding:2px;border-radius:999px;background:var(--mp-layer)}
1078
+ .codingns-magpie-segmented button{min-height:26px;padding:0 12px;border:0;border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(12)};white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}
1079
+ .codingns-magpie-segmented button:hover{color:var(--mp-ink)}
1080
+ .codingns-magpie-segmented button.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
1081
+ .codingns-magpie-levels{display:flex;flex-wrap:wrap;gap:5px}
1082
+ .codingns-magpie-level{min-height:28px;padding:0 11px;border:.5px solid var(--mp-line-strong);border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(12)};cursor:pointer;transition:background .14s,color .14s,border-color .14s}
1083
+ .codingns-magpie-level:hover{color:var(--mp-ink)}
1084
+ .codingns-magpie-level.is-on{border-color:transparent;background:color-mix(in srgb,var(--mp-accent) 14%,transparent);color:var(--mp-accent);font-weight:600}
1085
+ .codingns-magpie-context-input{width:120px!important;max-width:100%;font-variant-numeric:tabular-nums}
1086
+ .codingns-magpie-field-error{margin-top:-2px;color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary,#a06a2c));font-size:${uiFontSize(11)};line-height:1.4}.codingns-magpie-management-empty{display:flex;min-height:150px;align-items:center;justify-content:center;padding:24px;color:var(--mp-muted);font-size:${uiFontSize(13)};text-align:center}.codingns-magpie-model-editor{display:grid;gap:4px;padding:8px;border:1px solid var(--mp-line);border-radius:8px;background:var(--mp-card)}.codingns-magpie-model-actions{display:flex;gap:6px;flex-wrap:wrap}.codingns-magpie-model-actions button,.codingns-magpie-group-model-actions button{min-height:28px;padding:0 8px;border:1px solid var(--mp-line);border-radius:6px;background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(11)};cursor:pointer}.codingns-magpie-model-actions button:disabled,.codingns-magpie-group-model-actions button:disabled{opacity:.45;cursor:not-allowed}.codingns-magpie-model-option{display:flex;align-items:center;gap:9px;min-width:0;min-height:40px;padding:6px 9px;border:.5px solid transparent;border-radius:var(--dsw-radius-sm,6px);background:transparent;color:var(--mp-ink);font-weight:400}.codingns-magpie-model-option:hover{border-color:var(--mp-line-strong);background:var(--mp-hover)}.codingns-magpie-model-option input,.codingns-magpie-group-model-check input{flex:0 0 auto;width:16px;height:16px;margin:0;accent-color:var(--mp-accent)}.codingns-magpie-model-option-copy{display:flex;flex:1 1 auto;min-width:0;overflow:hidden;flex-direction:column;gap:3px}.codingns-magpie-model-name{display:block;min-width:0;overflow:hidden;color:var(--mp-ink);font-size:${uiFontSize(13)};font-weight:600;line-height:1.3;text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-model-meta{display:flex;align-items:center;min-width:0;gap:7px;color:var(--mp-caption);font-size:${uiFontSize(12)};line-height:1.25}.codingns-magpie-model-provider,.codingns-magpie-model-id{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.codingns-magpie-model-provider{font-weight:650}.codingns-magpie-model-id{font-family:var(--dsw-font-family-mono,ui-monospace,SFMono-Regular,Menlo,monospace);color:var(--mp-muted)}.codingns-magpie-group-model-editor{display:grid;gap:6px;padding:10px;border:1px solid var(--mp-line);border-radius:9px;background:var(--mp-card)}.codingns-magpie-group-model-option{display:flex;align-items:center;gap:8px;min-width:0;min-height:45px;padding:6px 8px;border:1px solid transparent;border-radius:7px;background:var(--mp-surface);color:var(--mp-ink);transition:border-color .15s,background .15s,box-shadow .15s}.codingns-magpie-group-model-option:hover{border-color:color-mix(in srgb,var(--mp-accent) 48%,transparent);background:color-mix(in srgb,var(--mp-accent) 5%,transparent)}.codingns-magpie-group-model-option.is-selected{cursor:grab;border-color:color-mix(in srgb,var(--mp-accent) 32%,transparent);background:color-mix(in srgb,var(--mp-accent) 5%,transparent);box-shadow:inset 2px 0 var(--mp-accent)}.codingns-magpie-group-model-option.is-dragging{opacity:.55;box-shadow:inset 2px 0 var(--mp-accent),0 5px 14px rgba(30,70,50,.12)}.codingns-magpie-group-model-check{display:flex;align-items:center;flex:1 1 auto;gap:8px;min-width:0;cursor:pointer}.codingns-magpie-group-model-actions{display:flex;align-items:center;flex:0 0 auto;gap:4px}.codingns-magpie-group-model-actions button{display:grid;place-items:center;width:26px;height:26px;min-height:26px;padding:0;border-radius:6px;font-size:${uiFontSize(13)};line-height:1}.codingns-magpie-group-model-order{display:grid;place-items:center;flex:0 0 20px;width:20px;height:20px;border-radius:5px;background:var(--mp-card);color:var(--mp-muted);font-size:${uiFontSize(11)};font-variant-numeric:tabular-nums}.codingns-magpie-group-model-add{display:flex;align-items:center;gap:8px;margin-top:3px;padding-top:8px;border-top:.5px solid var(--mp-line);color:var(--mp-muted)}.codingns-magpie-group-model-add-icon{display:grid;place-items:center;flex:0 0 20px;width:20px;height:20px;border:1px dashed var(--mp-line);border-radius:5px;color:var(--mp-accent);font-size:${uiFontSize(16)};line-height:1}.codingns-magpie-group-model-add select{flex:1 1 auto;min-width:0;min-height:32px;padding:5px 8px;border:1px solid var(--mp-line);border-radius:7px;background:var(--mp-surface);color:var(--mp-ink);font:inherit;font-size:${uiFontSize(11)}}.codingns-magpie-management-empty{display:flex;min-height:150px;align-items:center;justify-content:center;padding:24px;color:var(--mp-muted);font-size:${uiFontSize(13)};text-align:center}
1087
+ .codingns-magpie-empty{min-height:180px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:13px;padding:24px;color:var(--mp-muted);font-size:${uiFontSize(13)};text-align:center}.codingns-magpie-empty-mark{display:grid;place-items:center;width:38px;height:38px;border:.5px solid var(--mp-line);border-radius:12px;color:var(--mp-muted);font-size:${uiFontSize(18)}}.codingns-magpie-spinner{width:16px;height:16px;border:2px solid var(--mp-line);border-top-color:var(--mp-accent);border-radius:50%;animation:magpie-spin .8s linear infinite}.codingns-magpie-inline-empty{padding:18px;color:var(--mp-muted);font-size:${uiFontSize(12)}}.codingns-magpie-notice{display:flex;align-items:center;gap:8px;margin:-5px 0 12px;padding:9px 11px;border:.5px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 26%,transparent);border-radius:8px;background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 10%,transparent);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary,#a06a2c));font-size:${uiFontSize(13)}}.codingns-magpie-notice span{display:grid;place-items:center;width:17px;height:17px;border-radius:50%;background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#c08a3e) 15%,transparent);font-weight:700}
1088
+ .codingns-magpie-usage-tabs{display:flex;align-items:center;gap:2px;min-width:0;padding:2px;border-radius:999px;background:var(--mp-layer);overflow-x:auto;scrollbar-width:none}
1089
+ .codingns-magpie-usage-tabs::-webkit-scrollbar{display:none}
1090
+ .codingns-magpie-usage-tab{flex:0 0 auto;min-height:26px;padding:0 13px;border:0;border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}
1091
+ .codingns-magpie-usage-tab:hover{color:var(--mp-ink)}
1092
+ .codingns-magpie-usage-tab.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
1093
+ /* Pin the usage-view switch to the toolbar's right edge so the icon and the
1094
+ segmented control stay together instead of wrapping with the left tabs. */
1095
+ .codingns-magpie-toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex:0 0 auto;margin-left:auto;min-width:0}
1096
+ .codingns-magpie-quota-view{display:flex;align-items:center;gap:8px;flex:0 0 auto;min-width:0;color:var(--mp-muted);font-size:${uiFontSize(13)}}
1097
+ .codingns-magpie-quota-view-icon{display:grid;place-items:center;flex:0 0 auto;width:22px;height:22px;color:var(--mp-muted)}
1098
+ .codingns-magpie-quota-view-icon-svg{display:block}
1099
+ .codingns-magpie-quota-view-segment{display:flex;align-items:center;gap:2px;padding:2px;border-radius:999px;background:var(--mp-layer)}
1100
+ .codingns-magpie-quota-view-option{flex:0 0 auto;min-height:26px;padding:0 13px;border:0;border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}
1101
+ .codingns-magpie-quota-view-option:hover{color:var(--mp-ink)}
1102
+ .codingns-magpie-quota-view-option.is-active{background:var(--mp-surface);color:var(--mp-ink);font-weight:600;box-shadow:var(--dsw-elevation-soft,0 1px 2px rgba(0,0,0,.12))}
1103
+ .codingns-magpie-quota-view-option:focus-visible{outline:2px solid color-mix(in srgb,var(--mp-accent) 55%,transparent);outline-offset:1px}
1104
+ .codingns-magpie-quota-view-option:disabled{opacity:.5;cursor:not-allowed}
1105
+ .codingns-magpie-statstrip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));border:.5px solid var(--mp-line);border-radius:var(--mp-radius);background:var(--mp-card);margin-bottom:14px;overflow:hidden}
1106
+ .codingns-magpie-statcell{display:flex;flex-direction:column;gap:5px;min-width:0;padding:15px 18px;border-left:.5px solid var(--mp-line)}
1107
+ .codingns-magpie-statcell:first-child{border-left:0}
1108
+ .codingns-magpie-statcell-label{color:var(--mp-muted);font-size:${uiFontSize(13)}}
1109
+ .codingns-magpie-statcell-value{font-size:${uiFontSize(22)};line-height:1.1;font-weight:600;letter-spacing:-.01em;font-variant-numeric:tabular-nums;color:var(--mp-ink)}
1110
+ .codingns-magpie-statcell-detail{color:var(--mp-caption);font-size:${uiFontSize(13)};line-height:1.4}
1111
+ .codingns-magpie-barchart-panel{padding:16px 18px 14px;margin-bottom:14px}
1112
+ .codingns-magpie-barchart{position:relative;display:flex;flex-direction:column;gap:8px}
1113
+ .codingns-magpie-barchart-plot{display:flex;align-items:flex-end;gap:2px;height:170px;padding:8px 0 0;border-bottom:.5px solid var(--mp-line)}
1114
+ .codingns-magpie-bar-slot{flex:1 1 0;display:flex;align-items:flex-end;justify-content:center;height:100%;min-width:2px}
1115
+ .codingns-magpie-bar{display:block;width:100%;max-width:26px;min-height:2px;border-radius:2px 2px 0 0;background:color-mix(in srgb,var(--mp-accent) 32%,transparent);transition:height .3s ease}
1116
+ .codingns-magpie-bar-cap{display:block;width:100%;height:4px;border-radius:2px 2px 0 0;background:var(--mp-accent)}
1117
+ .codingns-magpie-barchart-axis{display:flex;justify-content:space-between;gap:4px;color:var(--mp-caption);font-size:${uiFontSize(12)}}
1118
+ .codingns-magpie-barchart-tick{flex:0 0 auto;white-space:nowrap}
1119
+ .codingns-magpie-barchart-peak{position:absolute;top:0;left:0;padding:0 4px;border-radius:4px;background:var(--mp-surface);color:var(--mp-caption);font-size:${uiFontSize(12)}}
1120
+ .codingns-magpie-progress-panel{padding:16px 18px 8px;margin-bottom:14px}
1121
+ .codingns-magpie-progress-list{display:flex;flex-direction:column}
1122
+ .codingns-magpie-progress-item{display:block;width:100%;padding:11px 0;border:0;border-top:.5px solid var(--mp-line);background:transparent;color:var(--mp-ink);font:inherit;text-align:left}
1123
+ .codingns-magpie-progress-item.is-button{cursor:pointer;border-radius:8px;padding-left:6px;padding-right:6px;transition:background .14s}
1124
+ .codingns-magpie-progress-item.is-button:hover{background:var(--mp-hover)}
1125
+ .codingns-magpie-progress-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px}
1126
+ .codingns-magpie-progress-copy{display:flex;flex:1 1 auto;min-width:0;overflow:hidden;flex-direction:column;gap:1px}.codingns-magpie-progress-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:${uiFontSize(13)}}
1127
+ .codingns-magpie-progress-context{min-width:0;overflow:hidden;color:var(--mp-caption);font-size:${uiFontSize(11)};text-overflow:ellipsis;white-space:nowrap}
1128
+ .codingns-magpie-progress-value{flex:0 0 auto;font-size:${uiFontSize(13)};font-weight:600;font-variant-numeric:tabular-nums}
1129
+ .codingns-magpie-progress-track{height:4px;border-radius:99px;background:var(--mp-hover);overflow:hidden}
1130
+ .codingns-magpie-progress-track span{display:block;height:100%;min-width:2px;border-radius:inherit;background:linear-gradient(90deg,var(--mp-chart,var(--mp-accent)),color-mix(in srgb,var(--mp-chart,var(--mp-accent)),transparent 45%))}
1131
+ .codingns-magpie-progress-meta{display:block;margin-top:5px;color:var(--mp-caption);font-size:${uiFontSize(12)}}
1132
+ .codingns-magpie-chiprow{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
1133
+ .codingns-magpie-chip{display:inline-flex;align-items:center;gap:6px;flex:0 0 auto;min-height:28px;padding:0 12px;border:.5px solid var(--mp-line-strong);border-radius:999px;background:transparent;color:var(--mp-muted);font:inherit;font-size:${uiFontSize(13)};cursor:pointer;transition:background .14s,color .14s,border-color .14s}
1134
+ .codingns-magpie-chip:hover{color:var(--mp-ink)}
1135
+ .codingns-magpie-chip.is-active{background:var(--dsw-alias-button-primary-fill,var(--mp-accent));border-color:transparent;color:var(--dsw-alias-label-primary-foreground,#fff);font-weight:600}
1136
+ .codingns-magpie-filterrow{display:flex;align-items:center;gap:10px;margin-bottom:12px}
1137
+ .codingns-magpie-grow{flex:1 1 auto;max-width:none;margin:0}
1138
+ .codingns-magpie-provider-logo{display:grid;flex:0 0 auto;place-items:center;box-sizing:border-box;object-fit:contain;padding:3px;border-radius:10px;background:var(--mp-layer);color:var(--mp-accent);font-size:${uiFontSize(12)};font-weight:750}
1139
+ .codingns-magpie-provider-logo-compact{border-radius:7px;padding:2px}
1140
+ .codingns-magpie-provider-logo[data-host-asset]{background:#fff;object-fit:contain}
1141
+ .codingns-magpie-provider-inline{display:inline-flex;align-items:center;gap:7px;min-width:0}
1142
+ .codingns-magpie-provider-heading{display:flex;align-items:center;gap:10px}
1143
+ .codingns-magpie-filter-summary{color:var(--mp-muted);font-size:${uiFontSize(12)};white-space:nowrap}
1144
+ .codingns-magpie-toplist-panel{padding:16px 18px 8px}
1145
+ .codingns-magpie-toprow{display:flex;align-items:center;gap:12px;width:100%;padding:10px 6px;border:0;border-top:.5px solid var(--mp-line);background:transparent;color:var(--mp-ink);font:inherit;text-align:left;cursor:pointer;border-radius:var(--dsw-radius-sm,8px);transition:background .14s}
1146
+ .codingns-magpie-toprow:hover{background:var(--mp-hover)}
1147
+ .codingns-magpie-toprow-main{display:flex;flex-direction:column;gap:3px;flex:1 1 auto;min-width:0}
1148
+ .codingns-magpie-toprow-main strong{font-size:${uiFontSize(13)}}
1149
+ .codingns-magpie-toprow-main small{overflow:hidden;color:var(--mp-caption);font-size:${uiFontSize(12)};text-overflow:ellipsis;white-space:nowrap}
1150
+ .codingns-magpie-toprow-metrics{display:flex;flex:0 0 auto;gap:16px;font-size:${uiFontSize(13)};font-variant-numeric:tabular-nums;color:var(--mp-muted)}
1151
+ .codingns-magpie-selection{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px;padding:9px 12px;border:.5px solid var(--mp-line);border-radius:10px;background:var(--mp-card);color:var(--mp-ink);font-size:${uiFontSize(13)}}
1152
+ .codingns-magpie-agent-tag{display:inline-block;max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:620}
1153
+ .codingns-magpie-native-table{min-width:1240px}
1154
+ .codingns-magpie-native-table th{font-size:${uiFontSize(13)};letter-spacing:.01em}
1155
+ .codingns-magpie-native-table td{max-width:none;font-size:${uiFontSize(13)};white-space:nowrap}
1156
+ @keyframes magpie-rise{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}@keyframes magpie-spin{to{transform:rotate(360deg)}}
1157
+ @media(max-width:900px){.codingns-magpie-topbar{--mp-topbar-pad-x:14px;--mp-topbar-pad-y:9px;grid-template-columns:minmax(0,1fr) auto;row-gap:8px;min-height:58px}.codingns-magpie-topbar-left{grid-column:1;grid-row:2;margin-left:calc(-1 * var(--mp-leading-inset))}.codingns-magpie-tabs{grid-column:1;grid-row:1;justify-self:start;flex-wrap:wrap;row-gap:2px;overflow:visible}.codingns-magpie-topbar-right{grid-column:2;grid-row:1}}
1158
+ @media(max-width:650px){.codingns-magpie-topbar{--mp-topbar-pad-x:12px;--mp-topbar-pad-y:8px;min-height:56px;gap:8px}.codingns-magpie-tab{min-height:32px;padding:0 9px;font-size:${uiFontSize(12)}}.codingns-magpie-tab-icon{display:none}.codingns-magpie-toolbar{min-height:44px;padding:0 12px;gap:8px}.codingns-magpie-periods{flex-direction:row;overflow:auto;max-width:100%}.codingns-magpie-period{min-height:28px;padding:0 9px}.codingns-magpie-barchart-panel,.codingns-magpie-progress-panel,.codingns-magpie-toplist-panel,.codingns-magpie-history-panel,.codingns-magpie-quota-card,.codingns-magpie-management-editor{padding:13px}.codingns-magpie-toprow-metrics{gap:10px}.codingns-magpie-chip{min-height:32px}.codingns-magpie-history-grid,.codingns-magpie-management-account-grid{grid-template-columns:1fr}.codingns-magpie-quota-grid{column-width:auto;column-count:1}.codingns-magpie-management-grid{grid-template-columns:minmax(0,1fr);gap:8px}.codingns-magpie-management-list{display:flex;max-height:none;gap:4px;overflow:auto;padding:4px}.codingns-magpie-management-row{flex:0 0 auto;width:auto;max-width:220px;min-height:42px;border:1px solid var(--mp-line);border-radius:8px}.codingns-magpie-management-row.is-active{box-shadow:inset 0 -2px var(--mp-accent)}.codingns-magpie-management-row-main{max-width:145px;text-align:left}.codingns-magpie-field-row{flex-wrap:wrap;gap:0}.codingns-magpie-chart-switch{align-self:flex-start}.codingns-magpie-page .codingns-magpie-table{min-width:900px}}
1159
+ @media(prefers-reduced-motion:reduce){.codingns-magpie-page *{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
1160
+ .codingns-magpie-group-model-add{position:relative;display:block;margin-top:3px;padding-top:8px;border-top:1px solid var(--mp-line);color:var(--mp-muted)}
1161
+ .codingns-magpie-group-model-add-button{display:inline-flex;align-items:center;gap:8px;min-height:30px;padding:4px 10px;border:.5px solid var(--mp-line-strong);border-radius:var(--dsw-radius-sm,6px);background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(12)};cursor:pointer}
1162
+ .codingns-magpie-group-model-add-button:hover{border-color:color-mix(in srgb,var(--mp-accent) 50%,transparent);background:color-mix(in srgb,var(--mp-accent) 6%,transparent)}
1163
+ .codingns-magpie-group-model-add-button[aria-expanded=true]{border-color:var(--mp-accent);color:var(--mp-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--mp-accent) 10%,transparent)}
1164
+ .codingns-magpie-group-model-add-icon{display:grid;place-items:center;flex:0 0 18px;width:18px;height:18px;border:1px dashed currentColor;border-radius:5px;color:var(--mp-accent);font-size:${uiFontSize(15)};line-height:1}
1165
+ .codingns-magpie-group-model-picker{position:absolute;z-index:5;top:calc(100% + 8px);left:0;width:min(520px,calc(100vw - 36px));max-width:100%;box-sizing:border-box;overflow:hidden;border:1px solid var(--mp-line);border-radius:10px;background:var(--mp-surface);box-shadow:var(--dsw-elevation-prominent,0 12px 28px rgba(0,0,0,.18))}
1166
+ .codingns-magpie-group-model-picker-search{display:flex;align-items:center;gap:8px;padding:9px 11px;border-bottom:1px solid var(--mp-line);color:var(--mp-muted);background:var(--mp-card)}
1167
+ .codingns-magpie-group-model-picker-search>span{font-size:${uiFontSize(15)};line-height:1}
1168
+ .codingns-magpie-group-model-picker-search input{width:100%;min-width:0;padding:4px 0;border:0;outline:0;background:transparent;color:var(--mp-ink);font:inherit;font-size:${uiFontSize(12)}}
1169
+ .codingns-magpie-group-model-picker-list{max-height:min(380px,50vh);overflow:auto;padding:4px 5px 7px}
1170
+ .codingns-magpie-group-model-picker-group{padding:0 0 5px}
1171
+ .codingns-magpie-group-model-picker-heading{margin:0;padding:8px 8px 5px;border-bottom:1px solid var(--mp-line);color:var(--mp-muted);font-size:${uiFontSize(11)};font-weight:750;letter-spacing:.06em;text-transform:uppercase}
1172
+ .codingns-magpie-group-model-picker-option{display:flex;align-items:center;gap:9px;width:100%;min-width:0;min-height:43px;margin-top:2px;padding:6px 8px;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--mp-ink);font:inherit;text-align:left;cursor:pointer}
1173
+ .codingns-magpie-group-model-picker-option:hover,.codingns-magpie-group-model-picker-option[aria-selected=true]{border-color:var(--mp-line-strong);background:var(--mp-hover)}
1174
+ .codingns-magpie-group-model-picker-option .codingns-magpie-model-option-copy{gap:2px}
1175
+ .codingns-magpie-group-model-picker-option .codingns-magpie-model-name{font-size:${uiFontSize(11)}}
1176
+ .codingns-magpie-group-model-picker-option .codingns-magpie-model-meta{font-size:${uiFontSize(11)}}
1177
+ .codingns-magpie-group-model-picker-mark{display:grid;place-items:center;flex:0 0 24px;width:24px;height:24px;border-radius:7px;background:color-mix(in srgb,var(--mp-accent) 10%,transparent);color:var(--mp-accent);font-size:${uiFontSize(11)};font-weight:750}
1178
+ /* -- Mobile layout --
1179
+ With the sidebar hidden DSH keeps only a floating logo button at the top-left, so the
1180
+ page stops indenting by the whole clearance width: the page fills the viewport, only the
1181
+ header's first row is pushed past the button, and the body, toolbar, and tables start at
1182
+ the left edge. This section must come after every default rule so it overrides the
1183
+ desktop paddings above. */
1184
+ .codingns-magpie-page{--mp-topbar-pad-x:16px;--mp-topbar-pad-y:0px;--mp-leading-inset:0px;padding-left:var(--dsh-frame-leading-clearance,0px)}
1185
+ .codingns-magpie-topbar{padding-right:var(--mp-topbar-pad-x);padding-left:calc(var(--mp-topbar-pad-x) + var(--mp-leading-inset))}
1186
+ html[data-codingns-mobile-sidebar="on"] .codingns-magpie-page{padding-left:0;--mp-leading-inset:max(0px,calc(var(--dsh-frame-leading-clearance,0px) - 20px))}
1187
+ @media(max-width:900px){.codingns-magpie-topbar{--mp-topbar-pad-x:14px;--mp-topbar-pad-y:9px}.codingns-magpie-topbar-left{margin-left:calc(-1 * var(--mp-leading-inset))}}
1188
+ @media(max-width:650px){.codingns-magpie-topbar{--mp-topbar-pad-x:12px;--mp-topbar-pad-y:8px}.codingns-magpie-icon-button{width:36px;height:36px}.codingns-magpie-toolbar:not(.has-tabs){display:none}.codingns-magpie-view{padding:14px 12px 30px}.codingns-magpie-statstrip{grid-template-columns:repeat(2,minmax(0,1fr))}.codingns-magpie-statcell{padding:13px;border-left:0}.codingns-magpie-statcell:nth-child(2n){border-left:.5px solid var(--mp-line)}.codingns-magpie-statcell:nth-child(n+3){border-top:.5px solid var(--mp-line)}.codingns-magpie-statcell:last-child:nth-child(odd){grid-column:1/-1}.codingns-magpie-statcell-value{font-size:${uiFontSize(22)}}.codingns-magpie-barchart-plot{height:132px}.codingns-magpie-barchart-axis{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:0;overflow:hidden;font-size:${uiFontSize(9)}}.codingns-magpie-barchart-tick{overflow:hidden;text-overflow:clip}}
1189
+ .codingns-magpie-reqlist{display:none}
1190
+ .codingns-magpie-reqcard{display:flex;flex-direction:column;gap:5px;padding:11px 14px;border-top:.5px solid var(--mp-line)}
1191
+ .codingns-magpie-reqcard:first-child{border-top:0}
1192
+ .codingns-magpie-reqcard-top{display:flex;align-items:center;gap:8px;min-width:0}
1193
+ .codingns-magpie-reqcard-top .codingns-magpie-time-cell{flex:0 0 auto;font-size:${uiFontSize(12)}}
1194
+ .codingns-magpie-reqcard-top .codingns-magpie-provider-inline{flex:1 1 auto;min-width:0}
1195
+ .codingns-magpie-reqcard-route{display:flex;align-items:center;gap:6px;min-width:0;font-size:${uiFontSize(12)}}
1196
+ .codingns-magpie-reqcard-arrow{flex:0 0 auto;color:var(--mp-caption)}
1197
+ .codingns-magpie-reqcard-route .codingns-magpie-route-model{flex:0 1 auto;max-width:47%}
1198
+ .codingns-magpie-reqcard-sub{display:flex;align-items:center;gap:6px;min-width:0;font-size:${uiFontSize(11)};color:var(--mp-caption)}
1199
+ .codingns-magpie-reqcard-sub .codingns-magpie-provider-name{max-width:62%;font-weight:500;color:var(--mp-muted)}
1200
+ .codingns-magpie-reqcard-sub .codingns-magpie-table-secondary{margin-top:0}
1201
+ .codingns-magpie-reqcard-facts{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:${uiFontSize(11)};color:var(--mp-muted);font-variant-numeric:tabular-nums}
1202
+
1203
+ @media(max-width:650px){
1204
+ .codingns-magpie-view{padding:12px 12px 26px}
1205
+ .codingns-magpie-tab{min-height:38px;padding:0 10px}
1206
+ .codingns-magpie-toolbar{min-height:40px}
1207
+ .codingns-magpie-statcell-label{font-size:${uiFontSize(11)}}
1208
+ .codingns-magpie-statcell-value{font-size:${uiFontSize(19)}}
1209
+ .codingns-magpie-statcell-detail{font-size:${uiFontSize(11)};white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
1210
+ .codingns-magpie-barchart-plot{height:118px}
1211
+ .codingns-magpie-barchart-panel,.codingns-magpie-progress-panel,.codingns-magpie-toplist-panel,.codingns-magpie-history-panel,.codingns-magpie-quota-card,.codingns-magpie-management-editor{padding:12px}
1212
+ .codingns-magpie-panel-head{margin-bottom:10px}
1213
+ .codingns-magpie-progress-item{padding:9px 0}
1214
+ .codingns-magpie-toprow{padding:8px 4px}
1215
+ .codingns-magpie-chip{min-height:28px;padding:0 10px}
1216
+ .codingns-magpie-quota-icon{width:28px;height:28px;border-radius:8px;font-size:${uiFontSize(12)}}
1217
+ .codingns-magpie-quota-topline{gap:8px;margin-bottom:9px}
1218
+ .codingns-magpie-quota-card{padding:11px 12px}
1219
+ .codingns-magpie-quota-topline h2{font-size:${uiFontSize(13)}}
1220
+ .codingns-magpie-quota-topline p{font-size:${uiFontSize(11)}}
1221
+ .codingns-magpie-quota-account{font-size:${uiFontSize(12)};margin:-3px 0 7px}
1222
+ .codingns-magpie-quota-window{padding:8px 0}
1223
+ .codingns-magpie-daily-chart{margin-top:2px;padding-top:6px}
1224
+ .codingns-magpie-pagination{padding:8px 10px}
1225
+ .codingns-magpie-selection{padding:8px 10px}
1226
+ }
1227
+
1228
+ @media(max-width:900px){
1229
+ .codingns-magpie-table-scroll{display:none}
1230
+ .codingns-magpie-reqlist{display:block}
1231
+ .codingns-magpie-statstrip{display:flex;flex-wrap:wrap;gap:.5px;background:var(--mp-line)}
1232
+ .codingns-magpie-statcell,.codingns-magpie-statcell:nth-child(2n),.codingns-magpie-statcell:nth-child(n+3){flex:1 1 calc(33.333% - .5px);border:0;background:var(--mp-card)}
1233
+ .codingns-magpie-statcell:last-child:nth-child(odd){grid-column:auto}
1234
+ }
1235
+
1236
+ `;
1237
+ /** 管理页样式的固定标识;重复注入时直接复用已有样式表。 */
1238
+ const MAGPIE_PAGE_STYLE_ID = 'codingns4dsh-magpie-page-style';
1239
+ /**
1240
+ * 把管理页样式注入 `document.head`(只注入一次)。
1241
+ *
1242
+ * 管理页自身在根节点里内联 `<style>`;底部弹层等嵌入式视图没有这个根节点,
1243
+ * 复用请求明细前必须先装上同一份样式表。
1244
+ */
1245
+ export function installMagpiePageStyles() {
1246
+ if (typeof document === 'undefined')
1247
+ return;
1248
+ if (document.querySelector(`style[data-plugin-css="${MAGPIE_PAGE_STYLE_ID}"]`) !== null)
1249
+ return;
1250
+ const style = document.createElement('style');
1251
+ style.dataset.plugin = 'codingns4dsh';
1252
+ style.dataset.pluginCss = MAGPIE_PAGE_STYLE_ID;
1253
+ style.textContent = MAGPIE_PAGE_CSS;
1254
+ document.head.appendChild(style);
1255
+ }
1256
+ //# sourceMappingURL=magpie-management-page.js.map