@jingyi0605/codingns4dsh 0.2.1-rc.8 → 0.2.2-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/README.en.md +5 -5
  2. package/README.md +6 -6
  3. package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
  4. package/data/build/dist/bootstrap/index.d.ts +1 -1
  5. package/data/build/dist/client/bundle.js +2115 -2530
  6. package/data/build/dist/client/bundle.js.map +1 -1
  7. package/data/build/dist/client/cli-slots.d.ts.map +1 -1
  8. package/data/build/dist/client/cli-slots.js +24 -13
  9. package/data/build/dist/client/cli-slots.js.map +1 -1
  10. package/data/build/dist/client/client.command-token.js +1 -2
  11. package/data/build/dist/client/client.delegate-command.js +4 -8
  12. package/data/build/dist/client/client.delegate-command.js.map +1 -1
  13. package/data/build/dist/client/client.editor-engine.js +266 -198
  14. package/data/build/dist/client/client.editor-engine.js.map +1 -1
  15. package/data/build/dist/client/client.magpie-model-tag.js +29 -50
  16. package/data/build/dist/client/client.magpie-model-tag.js.map +1 -1
  17. package/data/build/dist/client/client.rolldown-runtime.js +2 -3
  18. package/data/build/dist/client/client.xterm-engine.js +3 -6
  19. package/data/build/dist/client/client.xterm-engine.js.map +1 -1
  20. package/data/build/dist/client/features/file-management.d.ts.map +1 -1
  21. package/data/build/dist/client/features/file-management.js +23 -2
  22. package/data/build/dist/client/features/file-management.js.map +1 -1
  23. package/data/build/dist/client/features/magpie-management-page.d.ts +17 -4
  24. package/data/build/dist/client/features/magpie-management-page.d.ts.map +1 -1
  25. package/data/build/dist/client/features/magpie-management-page.js +52 -16
  26. package/data/build/dist/client/features/magpie-management-page.js.map +1 -1
  27. package/data/build/dist/client/features/mobile-access-panel.d.ts.map +1 -1
  28. package/data/build/dist/client/features/mobile-access-panel.js +1 -11
  29. package/data/build/dist/client/features/mobile-access-panel.js.map +1 -1
  30. package/data/build/dist/client/features/mobile-access.d.ts +3 -6
  31. package/data/build/dist/client/features/mobile-access.d.ts.map +1 -1
  32. package/data/build/dist/client/features/mobile-access.js +18 -47
  33. package/data/build/dist/client/features/mobile-access.js.map +1 -1
  34. package/data/build/dist/client/features/plugin-update.d.ts.map +1 -1
  35. package/data/build/dist/client/features/plugin-update.js +6 -0
  36. package/data/build/dist/client/features/plugin-update.js.map +1 -1
  37. package/data/build/dist/client/features/session-translation.d.ts.map +1 -1
  38. package/data/build/dist/client/features/session-translation.js +6 -0
  39. package/data/build/dist/client/features/session-translation.js.map +1 -1
  40. package/data/build/dist/client/features/terminal-enhancement.d.ts.map +1 -1
  41. package/data/build/dist/client/features/terminal-enhancement.js +6 -0
  42. package/data/build/dist/client/features/terminal-enhancement.js.map +1 -1
  43. package/data/build/dist/client/features/types.d.ts +3 -0
  44. package/data/build/dist/client/features/types.d.ts.map +1 -1
  45. package/data/build/dist/client/features/workspace-session-enhancement.d.ts.map +1 -1
  46. package/data/build/dist/client/features/workspace-session-enhancement.js +8 -0
  47. package/data/build/dist/client/features/workspace-session-enhancement.js.map +1 -1
  48. package/data/build/dist/client/file-management-context-menu.d.ts +10 -0
  49. package/data/build/dist/client/file-management-context-menu.d.ts.map +1 -0
  50. package/data/build/dist/client/file-management-context-menu.js +182 -0
  51. package/data/build/dist/client/file-management-context-menu.js.map +1 -0
  52. package/data/build/dist/client/file-management-dom.d.ts +2 -0
  53. package/data/build/dist/client/file-management-dom.d.ts.map +1 -1
  54. package/data/build/dist/client/file-management-dom.js +10 -6
  55. package/data/build/dist/client/file-management-dom.js.map +1 -1
  56. package/data/build/dist/client/git-management.d.ts.map +1 -1
  57. package/data/build/dist/client/git-management.js +6 -0
  58. package/data/build/dist/client/git-management.js.map +1 -1
  59. package/data/build/dist/client/index.d.ts.map +1 -1
  60. package/data/build/dist/client/index.js +3 -0
  61. package/data/build/dist/client/index.js.map +1 -1
  62. package/data/build/dist/client/locale.d.ts.map +1 -1
  63. package/data/build/dist/client/locale.js +2 -0
  64. package/data/build/dist/client/locale.js.map +1 -1
  65. package/data/build/dist/client/locales/magpie.d.ts.map +1 -1
  66. package/data/build/dist/client/locales/magpie.js +2 -0
  67. package/data/build/dist/client/locales/magpie.js.map +1 -1
  68. package/data/build/dist/client/workspace-session-visibility-dom.d.ts +3 -0
  69. package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
  70. package/data/build/dist/client/workspace-session-visibility-dom.js +29 -11
  71. package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
  72. package/data/build/dist/dsh-capabilities/client/context-menu-adapter.d.ts +22 -0
  73. package/data/build/dist/dsh-capabilities/client/context-menu-adapter.d.ts.map +1 -0
  74. package/data/build/dist/dsh-capabilities/client/context-menu-adapter.js +33 -0
  75. package/data/build/dist/dsh-capabilities/client/context-menu-adapter.js.map +1 -0
  76. package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts +3 -1
  77. package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
  78. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts.map +1 -1
  79. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js +10 -1
  80. package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js.map +1 -1
  81. package/data/build/dist/dsh-capabilities/host/llm-text-adapter.d.ts.map +1 -1
  82. package/data/build/dist/dsh-capabilities/host/llm-text-adapter.js +1 -0
  83. package/data/build/dist/dsh-capabilities/host/llm-text-adapter.js.map +1 -1
  84. package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.d.ts +1 -0
  85. package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.d.ts.map +1 -1
  86. package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.js +15 -7
  87. package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.js.map +1 -1
  88. package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.d.ts.map +1 -1
  89. package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js +10 -1
  90. package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js.map +1 -1
  91. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts +1 -1
  92. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts.map +1 -1
  93. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js +10 -1
  94. package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js.map +1 -1
  95. package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.d.ts +1 -1
  96. package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.d.ts.map +1 -1
  97. package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.js +36 -4
  98. package/data/build/dist/dsh-capabilities/host/session-prompt-adapter.js.map +1 -1
  99. package/data/build/dist/dsh-capabilities/matrix.js +5 -5
  100. package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
  101. package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
  102. package/data/build/dist/dsh-capabilities/routes.js +9 -13
  103. package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
  104. package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
  105. package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
  106. package/data/build/dist/dsh-capabilities/types.js.map +1 -1
  107. package/data/build/dist/features/index.d.ts +1 -1
  108. package/data/build/dist/features/index.d.ts.map +1 -1
  109. package/data/build/dist/features/registry.js +19 -0
  110. package/data/build/dist/features/registry.js.map +1 -1
  111. package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts +5 -0
  112. package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts.map +1 -1
  113. package/data/build/dist/host/cli-adapters/antigravity-driver.js +54 -2
  114. package/data/build/dist/host/cli-adapters/antigravity-driver.js.map +1 -1
  115. package/data/build/dist/host/cli-adapters/dsh-model-catalog.d.ts +11 -0
  116. package/data/build/dist/host/cli-adapters/dsh-model-catalog.d.ts.map +1 -0
  117. package/data/build/dist/host/cli-adapters/dsh-model-catalog.js +34 -0
  118. package/data/build/dist/host/cli-adapters/dsh-model-catalog.js.map +1 -0
  119. package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
  120. package/data/build/dist/host/cli-adapters/feature.js +73 -4
  121. package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
  122. package/data/build/dist/host/cli-adapters/magpie-usage.js +6 -2
  123. package/data/build/dist/host/cli-adapters/magpie-usage.js.map +1 -1
  124. package/data/build/dist/host/features/file-management.d.ts.map +1 -1
  125. package/data/build/dist/host/features/file-management.js +6 -0
  126. package/data/build/dist/host/features/file-management.js.map +1 -1
  127. package/data/build/dist/host/features/git-management.d.ts.map +1 -1
  128. package/data/build/dist/host/features/git-management.js +6 -0
  129. package/data/build/dist/host/features/git-management.js.map +1 -1
  130. package/data/build/dist/host/features/host-status.d.ts +8 -0
  131. package/data/build/dist/host/features/host-status.d.ts.map +1 -1
  132. package/data/build/dist/host/features/host-status.js +14 -0
  133. package/data/build/dist/host/features/host-status.js.map +1 -1
  134. package/data/build/dist/host/features/plugin-update.d.ts.map +1 -1
  135. package/data/build/dist/host/features/plugin-update.js +6 -0
  136. package/data/build/dist/host/features/plugin-update.js.map +1 -1
  137. package/data/build/dist/host/features/session-prompt-translation.js +1 -1
  138. package/data/build/dist/host/features/session-prompt-translation.js.map +1 -1
  139. package/data/build/dist/host/features/session-title-optimization.d.ts.map +1 -1
  140. package/data/build/dist/host/features/session-title-optimization.js +6 -0
  141. package/data/build/dist/host/features/session-title-optimization.js.map +1 -1
  142. package/data/build/dist/host/features/session-translation-recovery.js +2 -2
  143. package/data/build/dist/host/features/session-translation-recovery.js.map +1 -1
  144. package/data/build/dist/host/features/session-translation-service.d.ts +2 -2
  145. package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -1
  146. package/data/build/dist/host/features/session-translation-service.js +11 -9
  147. package/data/build/dist/host/features/session-translation-service.js.map +1 -1
  148. package/data/build/dist/host/features/session-translation.d.ts.map +1 -1
  149. package/data/build/dist/host/features/session-translation.js +6 -0
  150. package/data/build/dist/host/features/session-translation.js.map +1 -1
  151. package/data/build/dist/host/features/types.d.ts +3 -0
  152. package/data/build/dist/host/features/types.d.ts.map +1 -1
  153. package/data/build/dist/host/index.d.ts.map +1 -1
  154. package/data/build/dist/host/index.js +14 -2
  155. package/data/build/dist/host/index.js.map +1 -1
  156. package/data/build/dist/host/session-handle-eviction.d.ts +2 -0
  157. package/data/build/dist/host/session-handle-eviction.d.ts.map +1 -1
  158. package/data/build/dist/host/session-handle-eviction.js +21 -6
  159. package/data/build/dist/host/session-handle-eviction.js.map +1 -1
  160. package/data/build/dist/host/settings.d.ts.map +1 -1
  161. package/data/build/dist/host/settings.js +5 -4
  162. package/data/build/dist/host/settings.js.map +1 -1
  163. package/data/build/dist/shared/contracts/config.d.ts +2 -2
  164. package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
  165. package/data/build/dist/shared/contracts/config.js +5 -10
  166. package/data/build/dist/shared/contracts/config.js.map +1 -1
  167. package/data/build/dist/shared/contracts/errors.d.ts +2 -2
  168. package/data/build/dist/shared/contracts/errors.d.ts.map +1 -1
  169. package/data/build/dist/shared/contracts/feature.d.ts +14 -0
  170. package/data/build/dist/shared/contracts/feature.d.ts.map +1 -1
  171. package/data/build/dist/shared/contracts/host-status.d.ts +18 -0
  172. package/data/build/dist/shared/contracts/host-status.d.ts.map +1 -1
  173. package/data/build/dist/shared/contracts/version.d.ts +4 -4
  174. package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
  175. package/data/build/dist/shared/contracts/version.js +3 -3
  176. package/data/build/dist/shared/contracts/version.js.map +1 -1
  177. package/package.json +37 -35
  178. package/profile/README.md +2 -2
  179. package/profile/package.json +3 -3
  180. package/profile/version.json +3 -3
  181. package/version.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"file-management.d.ts","sourceRoot":"","sources":["../../../../../src/client/features/file-management.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAY7D,mCAAmC;AACnC,eAAO,MAAM,qBAAqB,EAAE,2BAyDnC,CAAA"}
1
+ {"version":3,"file":"file-management.d.ts","sourceRoot":"","sources":["../../../../../src/client/features/file-management.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAa7D,mCAAmC;AACnC,eAAO,MAAM,qBAAqB,EAAE,2BA6EnC,CAAA"}
@@ -5,6 +5,7 @@ import { registerSessionChangedFilesView } from '../session-changed-files-view.j
5
5
  import { registerFileViewerCopyPathMenu } from '../file-viewer-copy-path-menu.js';
6
6
  import { resolveCodingNsTranslator } from '../locale.js';
7
7
  import { startHtmlWorkspaceFiles } from '../html-workspace-files.js';
8
+ import { registerFileManagementContextMenus } from '../file-management-context-menu.js';
8
9
  /** descriptor 的 label/description 只是词典缺失时的兜底,取内置中文词典。 */
9
10
  const fallbackT = resolveCodingNsTranslator();
10
11
  /** 文件管理增强:只在模块启用期间挂载右键菜单和文本编辑器。 */
@@ -15,6 +16,13 @@ export const fileManagementFeature = {
15
16
  enabledByDefault: false,
16
17
  dependencies: [],
17
18
  runtime: 'client',
19
+ requires: [{ capability: 'ui.context-menu', required: false, fallback: 'degrade' }],
20
+ nativeReplacement: {
21
+ dshFeature: 'DSH native file delivery, image upload, and drag-and-drop',
22
+ since: '0.2.2-alpha.2',
23
+ coverage: 'partial',
24
+ note: 'Native delivery replaces the file-transfer subset; the plugin still owns its editor, HTML workspace, and change-management surfaces.',
25
+ },
18
26
  ui: {
19
27
  label: fallbackT('feature.fileManagement.label'),
20
28
  description: fallbackT('feature.fileManagement.description'),
@@ -27,9 +35,15 @@ export const fileManagementFeature = {
27
35
  start(context) {
28
36
  const readOptions = () => {
29
37
  const value = { ...DEFAULT_FILE_MANAGEMENT_SETTINGS, ...context.services.settings.getSnapshot().value?.fileManagement };
30
- return { menuEnhancement: value.menuEnhancement, fileEditor: value.fileEditor, locale: context.services.locale };
38
+ return {
39
+ menuEnhancement: value.menuEnhancement,
40
+ fileEditor: value.fileEditor,
41
+ locale: context.services.locale,
42
+ nativeContextMenus: context.services.contextMenus !== undefined,
43
+ };
31
44
  };
32
45
  const dom = startFileManagementDom(context.services.rpc, readOptions());
46
+ const contextMenu = registerFileManagementContextMenus(context.services.rpc, context.services.contextMenus, context.services.locale);
33
47
  context.resources.add(startHtmlWorkspaceFiles(context.services.rpc, context.services.locale));
34
48
  let disposeSessionView;
35
49
  let disposeCopyPathMenu;
@@ -46,7 +60,7 @@ export const fileManagementFeature = {
46
60
  };
47
61
  const syncCopyPathMenu = () => {
48
62
  const value = { ...DEFAULT_FILE_MANAGEMENT_SETTINGS, ...context.services.settings.getSnapshot().value?.fileManagement };
49
- if (value.menuEnhancement && disposeCopyPathMenu === undefined) {
63
+ if (value.menuEnhancement && context.services.contextMenus === undefined && disposeCopyPathMenu === undefined) {
50
64
  disposeCopyPathMenu = registerFileViewerCopyPathMenu(slots, context.services.locale);
51
65
  }
52
66
  else if (!value.menuEnhancement && disposeCopyPathMenu !== undefined) {
@@ -54,17 +68,24 @@ export const fileManagementFeature = {
54
68
  disposeCopyPathMenu = undefined;
55
69
  }
56
70
  };
71
+ const syncContextMenu = () => {
72
+ const value = { ...DEFAULT_FILE_MANAGEMENT_SETTINGS, ...context.services.settings.getSnapshot().value?.fileManagement };
73
+ contextMenu.setEnabled(value.menuEnhancement);
74
+ };
57
75
  syncSessionView();
58
76
  syncCopyPathMenu();
77
+ syncContextMenu();
59
78
  const unsubscribe = context.services.settings.subscribe(() => {
60
79
  dom.setOptions(readOptions());
61
80
  syncSessionView();
62
81
  syncCopyPathMenu();
82
+ syncContextMenu();
63
83
  });
64
84
  context.resources.add(unsubscribe);
65
85
  context.resources.add(dom.dispose);
66
86
  context.resources.add(() => disposeSessionView?.());
67
87
  context.resources.add(() => disposeCopyPathMenu?.());
88
+ context.resources.add(contextMenu.dispose);
68
89
  },
69
90
  settingsPanel: FileManagementPanel,
70
91
  };
@@ -1 +1 @@
1
- {"version":3,"file":"file-management.js","sourceRoot":"","sources":["../../../../../src/client/features/file-management.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-management.js","sourceRoot":"","sources":["../../../../../src/client/features/file-management.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { ReactElement } from 'react';
2
- import type { MagpieDashboardAvailabilityIssue, MagpieDashboardQuota, MagpieManagementAvailabilityIssue, MagpieUsageDashboard, MagpieUsageGroup, MagpieUsageRequestPage, MagpieUsageSession, MagpieUpdateAvailabilityIssue } from '../../shared/contracts/magpie-management.js';
2
+ import type { MagpieDashboardAvailabilityIssue, MagpieDashboardQuota, MagpieManagementAvailabilityIssue, MagpieUsageDashboard, MagpieUsageGroup, MagpieUsageMetrics, MagpieUsageRequestPage, MagpieUsageSession, MagpieUpdateAvailabilityIssue } from '../../shared/contracts/magpie-management.js';
3
3
  import { type SubscriptionQuotaView, type SubscriptionReportSettings } from '../../shared/contracts/config.js';
4
4
  import type { CodingNsSettingsStore } from '../../dsh-capabilities/settings-store.js';
5
5
  import type { CodingNsLocale } from '../locale.js';
@@ -8,6 +8,7 @@ import type { CodingNsRpcClient } from './types.js';
8
8
  type PageTab = 'overview' | 'providers' | 'groups' | 'usage';
9
9
  type UsageTab = 'quotas' | 'sessions' | 'requests';
10
10
  type ChartMetric = 'calls' | 'tokens' | 'cost';
11
+ export type UsageSortMetric = 'cost' | 'tokens';
11
12
  export type ModelBreakdownMode = 'aggregate' | 'account';
12
13
  type MagpiePageProps = {
13
14
  readonly rpc: CodingNsRpcClient;
@@ -50,26 +51,30 @@ export declare function useQuotaView(settings: MagpiePageProps['settings']): {
50
51
  readonly saveFailed: boolean;
51
52
  };
52
53
  export declare function MagpieManagementPage({ rpc, locale, initialPageTab, initialUsageTab, settings }: MagpiePageProps): ReactElement;
53
- export declare function OverviewPage({ dashboard, loading, error, chartMetric, onChartMetricChange, t, onOpenSession }: {
54
+ export declare function OverviewPage({ dashboard, loading, error, chartMetric, onChartMetricChange, usageSortMetric, onUsageSortMetricChange, t, onOpenSession }: {
54
55
  readonly dashboard: MagpieUsageDashboard | null;
55
56
  readonly loading: boolean;
56
57
  readonly error: boolean;
57
58
  readonly chartMetric: ChartMetric;
58
59
  readonly onChartMetricChange: (value: ChartMetric) => void;
60
+ readonly usageSortMetric?: UsageSortMetric;
61
+ readonly onUsageSortMetricChange?: (value: UsageSortMetric) => void;
59
62
  readonly t: (key: string, params?: Record<string, string | number>) => string;
60
63
  readonly onOpenSession: (session: MagpieUsageSession) => void;
61
64
  }): ReactElement;
62
- export declare function ModelProgressSection({ rows, mode, onModeChange, t }: {
65
+ export declare function ModelProgressSection({ rows, mode, onModeChange, metric, t }: {
63
66
  readonly rows: readonly MagpieUsageGroup[];
64
67
  readonly mode: ModelBreakdownMode;
65
68
  readonly onModeChange: (mode: ModelBreakdownMode) => void;
69
+ readonly metric?: UsageSortMetric;
66
70
  readonly t: (key: string, params?: Record<string, string | number>) => string;
67
71
  }): ReactElement;
68
- export declare function SessionsPage({ dashboard, sessions, search, onSearch, onOpenSession, t }: {
72
+ export declare function SessionsPage({ dashboard, sessions, search, onSearch, usageSortMetric, onOpenSession, t }: {
69
73
  readonly dashboard: MagpieUsageDashboard | null;
70
74
  readonly sessions: readonly MagpieUsageSession[];
71
75
  readonly search: string;
72
76
  readonly onSearch: (value: string) => void;
77
+ readonly usageSortMetric?: UsageSortMetric;
73
78
  readonly onOpenSession: (session: MagpieUsageSession) => void;
74
79
  readonly t: (key: string, params?: Record<string, string | number>) => string;
75
80
  }): ReactElement;
@@ -103,6 +108,11 @@ export declare function QuotaViewSwitch({ value, disabled, failed, onChange, t }
103
108
  readonly onChange: (next: SubscriptionQuotaView) => void;
104
109
  readonly t: (key: string, params?: Record<string, string | number>) => string;
105
110
  }): ReactElement;
111
+ export declare function UsageMetricSwitch({ value, onChange, t }: {
112
+ readonly value: UsageSortMetric;
113
+ readonly onChange: (next: UsageSortMetric) => void;
114
+ readonly t: (key: string, params?: Record<string, string | number>) => string;
115
+ }): ReactElement;
106
116
  export declare function QuotasPage({ dashboard, loading, quotaView, t, policyPending, policyFailed, onPolicyChange, onResetRequest }: {
107
117
  readonly dashboard: MagpieUsageDashboard | null;
108
118
  readonly loading: boolean;
@@ -114,6 +124,9 @@ export declare function QuotasPage({ dashboard, loading, quotaView, t, policyPen
114
124
  readonly onPolicyChange?: (user: string, policy: 'week' | 'expiring' | 'credits', enabled: boolean) => void;
115
125
  readonly onResetRequest?: (quota: MagpieDashboardQuota) => void;
116
126
  }): ReactElement;
127
+ type UsageSortableRow = Pick<MagpieUsageMetrics, 'calls' | 'cost' | 'inputTokens' | 'outputTokens'>;
128
+ export declare function usageMetricValue(row: UsageSortableRow, metric: UsageSortMetric): number | null;
129
+ export declare function sortUsageRows<T extends UsageSortableRow>(rows: readonly T[], metric: UsageSortMetric): T[];
117
130
  export declare function callMagpieRpc<T>(rpc: CodingNsRpcClient, action: 'usage/dashboard' | 'usage/requests' | 'usage/account/update' | 'usage/reset' | 'management/snapshot' | 'management/provider/update' | 'management/group/update' | 'management/account/update' | 'update/status' | 'update/notes' | 'update/check' | 'update/install', payload: unknown, signal?: AbortSignal): Promise<T>;
118
131
  export declare function magpieUpdateIssueForRpcError(error: unknown): MagpieUpdateAvailabilityIssue;
119
132
  export declare function magpieDashboardIssueForRpcError(error: unknown): MagpieDashboardAvailabilityIssue;
@@ -1 +1 @@
1
- {"version":3,"file":"magpie-management-page.d.ts","sourceRoot":"","sources":["../../../../../src/client/features/magpie-management-page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"magpie-management-page.d.ts","sourceRoot":"","sources":["../../../../../src/client/features/magpie-management-page.ts"],"names":[],"mappings":"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"}
@@ -99,6 +99,7 @@ export function MagpieManagementPage({ rpc, locale, initialPageTab = 'overview',
99
99
  const [quotaResetResult, setQuotaResetResult] = useState(null);
100
100
  const [quotaResetFailed, setQuotaResetFailed] = useState(false);
101
101
  const [chartMetric, setChartMetric] = useState('calls');
102
+ const [usageSortMetric, setUsageSortMetric] = useState('cost');
102
103
  const [sessionSearch, setSessionSearch] = useState('');
103
104
  const [selectedSession, setSelectedSession] = useState(null);
104
105
  const [requestPage, setRequestPage] = useState(null);
@@ -470,16 +471,20 @@ export function MagpieManagementPage({ rpc, locale, initialPageTab = 'overview',
470
471
  className: `codingns-magpie-usage-tab${usageTab === entry.id ? ' is-active' : ''}`,
471
472
  'aria-pressed': usageTab === entry.id,
472
473
  onClick: () => selectUsageTab(entry.id),
473
- }, t(entry.label))))),
474
+ }, t(entry.label))))), ((section === 'quotas' || section === 'sessions') && createElement('div', { className: 'codingns-magpie-toolbar-right' },
474
475
  // 口径切换只作用于「订阅」页的额度卡;其他用量报表没有"剩余"这个概念。
475
- section === 'quotas' && createElement('div', { className: 'codingns-magpie-toolbar-right' }, createElement(QuotaViewSwitch, {
476
+ section === 'quotas' && createElement(QuotaViewSwitch, {
476
477
  value: quotaView,
477
478
  // 没有设置存储(测试/静态预览)时控件只展示、不写回,因此不禁用。
478
479
  disabled: settings === undefined ? false : !quotaViewWritable,
479
480
  failed: quotaViewSaveFailed,
480
481
  onChange: selectQuotaView,
481
482
  t,
482
- }))), createElement('main', { className: 'codingns-magpie-main' }, section === 'providers' || section === 'groups'
483
+ }), section === 'sessions' && createElement(UsageMetricSwitch, {
484
+ value: usageSortMetric,
485
+ onChange: setUsageSortMetric,
486
+ t,
487
+ })))), createElement('main', { className: 'codingns-magpie-main' }, section === 'providers' || section === 'groups'
483
488
  ? managementIssue !== null && management === null
484
489
  ? createElement(EmptyState, { message: t(managementIssueLocaleKey(managementIssue)) })
485
490
  : managementLoading && management === null
@@ -497,10 +502,10 @@ export function MagpieManagementPage({ rpc, locale, initialPageTab = 'overview',
497
502
  ? createElement(EmptyState, { message: t('magpie.unavailable') })
498
503
  : section === 'overview'
499
504
  ? createElement(OverviewPage, {
500
- dashboard, loading: dashboardLoading, error: dashboardError, chartMetric, onChartMetricChange: setChartMetric, t, onOpenSession: openSession,
505
+ dashboard, loading: dashboardLoading, error: dashboardError, chartMetric, onChartMetricChange: setChartMetric, usageSortMetric, onUsageSortMetricChange: setUsageSortMetric, t, onOpenSession: openSession,
501
506
  })
502
507
  : section === 'sessions'
503
- ? createElement(SessionsPage, { dashboard, sessions: filteredSessions, search: sessionSearch, onSearch: setSessionSearch, onOpenSession: openSession, t })
508
+ ? createElement(SessionsPage, { dashboard, sessions: filteredSessions, search: sessionSearch, onSearch: setSessionSearch, usageSortMetric, onOpenSession: openSession, t })
504
509
  : section === 'requests'
505
510
  ? createElement(RequestsPage, { page: requestPage, loading: requestLoading, error: requestError, selectedSession, offset: requestOffset, onOffsetChange: setRequestOffset, onClearSession: clearSession, t })
506
511
  : createElement(QuotasPage, {
@@ -526,7 +531,7 @@ export function MagpieManagementPage({ rpc, locale, initialPageTab = 'overview',
526
531
  onClose: closeQuotaReset,
527
532
  }));
528
533
  }
529
- export function OverviewPage({ dashboard, loading, error, chartMetric, onChartMetricChange, t, onOpenSession }) {
534
+ export function OverviewPage({ dashboard, loading, error, chartMetric, onChartMetricChange, usageSortMetric = 'cost', onUsageSortMetricChange = () => undefined, t, onOpenSession }) {
530
535
  const [modelBreakdownMode, setModelBreakdownMode] = useState('aggregate');
531
536
  const metrics = dashboard?.aggregate;
532
537
  if (dashboard === null || dashboard.usageStatus === 'unavailable' || metrics == null) {
@@ -545,8 +550,9 @@ export function OverviewPage({ dashboard, loading, error, chartMetric, onChartMe
545
550
  'aria-pressed': chartMetric === metric,
546
551
  className: chartMetric === metric ? 'is-active' : '',
547
552
  onClick: () => onChartMetricChange(metric),
548
- }, 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, {
553
+ }, 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('div', { className: 'codingns-magpie-usage-sortbar' }, createElement(UsageMetricSwitch, { value: usageSortMetric, onChange: onUsageSortMetricChange, t })), createElement(ProgressSection, { title: t('magpie.byAgent'), rows: dashboard.agents, metric: usageSortMetric, t }), createElement(ModelProgressSection, { rows: dashboard.models, mode: modelBreakdownMode, onModeChange: setModelBreakdownMode, metric: usageSortMetric, t }), dashboard.sessions.length > 0 && createElement(ProgressSection, {
549
554
  title: t('magpie.topSessions'),
555
+ metric: usageSortMetric,
550
556
  rows: dashboard.sessions.map((session) => ({
551
557
  ...session,
552
558
  id: `${session.agent}:${session.id}`,
@@ -625,7 +631,8 @@ function MagpieUpdatePanel({ status, notes, loading, error, confirming, notice,
625
631
  onClick: () => onConfirmingChange(true),
626
632
  }, 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')))));
627
633
  }
628
- export function ModelProgressSection({ rows, mode, onModeChange, t }) {
634
+ export function ModelProgressSection({ rows, mode, onModeChange, metric, t }) {
635
+ const sortMetric = metric ?? 'cost';
629
636
  const controls = createElement('div', { className: 'codingns-magpie-chart-switch', role: 'group', 'aria-label': t('magpie.modelBreakdown') }, ...['aggregate', 'account'].map((value) => createElement('button', {
630
637
  key: value,
631
638
  type: 'button',
@@ -640,15 +647,17 @@ export function ModelProgressSection({ rows, mode, onModeChange, t }) {
640
647
  key: `model-breakdown-${mode}`,
641
648
  title: t('magpie.byModel'),
642
649
  rows: displayRows,
650
+ metric: sortMetric,
643
651
  t,
644
652
  header: controls,
645
653
  ...(mode === 'aggregate' ? { limit: 8 } : {}),
646
654
  });
647
655
  }
648
- export function SessionsPage({ dashboard, sessions, search, onSearch, onOpenSession, t }) {
656
+ export function SessionsPage({ dashboard, sessions, search, onSearch, usageSortMetric = 'cost', onOpenSession, t }) {
649
657
  const [agentFilter, setAgentFilter] = useState('');
650
658
  const agentNames = useMemo(() => [...new Set(sessions.map((session) => session.agent))].sort(), [sessions]);
651
659
  const visible = agentFilter === '' ? sessions : sessions.filter((session) => session.agent === agentFilter);
660
+ const sortedVisible = useMemo(() => sortUsageRows(visible, usageSortMetric), [usageSortMetric, visible]);
652
661
  const aggregate = sumSessions(visible);
653
662
  const metrics = dashboard?.aggregate;
654
663
  const stats = [
@@ -660,7 +669,7 @@ export function SessionsPage({ dashboard, sessions, search, onSearch, onOpenSess
660
669
  ];
661
670
  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
662
671
  ? createElement(EmptyState, { message: t(search === '' && agentFilter === '' ? 'magpie.noSessions' : 'magpie.noRequests') })
663
- : 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', {
672
+ : createElement('section', { className: 'codingns-magpie-panel codingns-magpie-toplist-panel' }, createElement('div', { className: 'codingns-magpie-panel-head' }, createElement('h2', undefined, t('magpie.topSessions'))), ...sortedVisible.slice(0, 40).map((session) => createElement('button', {
664
673
  key: `${session.agent}:${session.id}`,
665
674
  type: 'button',
666
675
  className: 'codingns-magpie-toprow',
@@ -818,6 +827,15 @@ export function QuotaViewSwitch({ value, disabled, failed, onChange, t }) {
818
827
  },
819
828
  }, t(entry.label)))));
820
829
  }
830
+ export function UsageMetricSwitch({ value, onChange, t }) {
831
+ return createElement('div', { className: 'codingns-magpie-usage-metric', role: 'group', 'aria-label': t('magpie.sortMetric') }, createElement('span', { className: 'codingns-magpie-usage-metric-label' }, t('magpie.sortMetric')), createElement('div', { className: 'codingns-magpie-chart-switch' }, ...['cost', 'tokens'].map((metric) => createElement('button', {
832
+ key: metric,
833
+ type: 'button',
834
+ className: value === metric ? 'is-active' : '',
835
+ 'aria-pressed': value === metric,
836
+ onClick: () => onChange(metric),
837
+ }, metric === 'cost' ? t('magpie.metricCost') : t('magpie.tokens')))));
838
+ }
821
839
  /** 口径控件左侧的圆形图标:半实心圆表示"部分已用",与进度条的语义一致。 */
822
840
  function QuotaViewIcon() {
823
841
  return createElement('svg', {
@@ -863,17 +881,33 @@ function BarChart({ points, metric, label }) {
863
881
  ? [createElement('span', { key: `${point.time ?? index}`, className: 'codingns-magpie-barchart-tick' }, point.label ?? '')]
864
882
  : [])), createElement('div', { className: 'codingns-magpie-barchart-peak' }, formatValue(Math.max(...known))));
865
883
  }
866
- function ProgressSection({ title, rows, t, onOpen, header, limit = 8 }) {
867
- const sorted = [...rows].sort((left, right) => (right.cost ?? -1) - (left.cost ?? -1) || (right.calls ?? -1) - (left.calls ?? -1));
884
+ export function usageMetricValue(row, metric) {
885
+ return metric === 'cost' ? row.cost : sumNullable(row.inputTokens, row.outputTokens);
886
+ }
887
+ export function sortUsageRows(rows, metric) {
888
+ return [...rows].sort((left, right) => (compareNullableDescending(usageMetricValue(left, metric), usageMetricValue(right, metric))
889
+ || compareNullableDescending(left.calls, right.calls)));
890
+ }
891
+ function compareNullableDescending(left, right) {
892
+ if (left === null && right === null)
893
+ return 0;
894
+ if (left === null)
895
+ return 1;
896
+ if (right === null)
897
+ return -1;
898
+ return right - left;
899
+ }
900
+ function ProgressSection({ title, rows, metric, t, onOpen, header, limit = 8 }) {
901
+ const sorted = sortUsageRows(rows, metric);
868
902
  const display = limit === undefined ? sorted : sorted.slice(0, limit);
869
- const hasCost = display.some((row) => row.cost !== null);
870
- const max = Math.max(1, ...display.map((row) => hasCost ? row.cost ?? 0 : sumNullable(row.inputTokens, row.outputTokens) ?? 0));
903
+ const displayMetric = metric === 'cost' && display.some((row) => row.cost !== null) ? 'cost' : 'tokens';
904
+ const max = Math.max(1, ...display.map((row) => usageMetricValue(row, displayMetric) ?? 0));
871
905
  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
872
906
  ? createElement('div', { className: 'codingns-magpie-inline-empty' }, '—')
873
907
  : createElement('div', { className: 'codingns-magpie-progress-list' }, ...display.map((row) => {
874
908
  const label = row.label ?? row.name ?? row.model ?? row.account ?? row.provider ?? row.agent ?? row.id;
875
- const weight = Math.max(0, (hasCost ? row.cost ?? 0 : sumNullable(row.inputTokens, row.outputTokens) ?? 0));
876
- 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)}`));
909
+ const weight = Math.max(0, usageMetricValue(row, displayMetric) ?? 0);
910
+ 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' }, displayMetric === 'cost' ? 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)}`));
877
911
  return onOpen === undefined
878
912
  ? createElement('div', { key: row.id, className: 'codingns-magpie-progress-item' }, body)
879
913
  : createElement('button', { key: row.id, type: 'button', className: 'codingns-magpie-progress-item is-button', onClick: () => onOpen(row) }, body);
@@ -1299,6 +1333,8 @@ const MAGPIE_PAGE_CSS = `
1299
1333
  /* Pin the usage-view switch to the toolbar's right edge so the icon and the
1300
1334
  segmented control stay together instead of wrapping with the left tabs. */
1301
1335
  .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}
1336
+ .codingns-magpie-usage-metric{display:flex;align-items:center;gap:8px;flex:0 0 auto;min-width:0;color:var(--mp-muted);font-size:${uiFontSize(13)}}
1337
+ .codingns-magpie-usage-sortbar{display:flex;justify-content:flex-end;margin:14px 0 12px}
1302
1338
  .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)}}
1303
1339
  .codingns-magpie-quota-view-icon{display:grid;place-items:center;flex:0 0 auto;width:22px;height:22px;color:var(--mp-muted)}
1304
1340
  .codingns-magpie-quota-view-icon-svg{display:block}