@jingyi0605/codingns4dsh 0.2.2-beta.1 → 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.
- package/README.en.md +4 -4
- package/README.md +4 -4
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts.map +1 -1
- package/data/build/dist/bootstrap/index.d.ts +1 -1
- package/data/build/dist/bootstrap/index.d.ts.map +1 -1
- package/data/build/dist/client/bundle.js +1720 -1933
- package/data/build/dist/client/bundle.js.map +1 -1
- package/data/build/dist/client/cli-slots.d.ts.map +1 -1
- package/data/build/dist/client/cli-slots.js +24 -13
- package/data/build/dist/client/cli-slots.js.map +1 -1
- package/data/build/dist/client/client.magpie-model-tag.js +4 -0
- package/data/build/dist/client/client.magpie-model-tag.js.map +1 -1
- package/data/build/dist/client/features/file-management.d.ts.map +1 -1
- package/data/build/dist/client/features/file-management.js +17 -2
- package/data/build/dist/client/features/file-management.js.map +1 -1
- package/data/build/dist/client/features/magpie-management-page.d.ts +17 -4
- package/data/build/dist/client/features/magpie-management-page.d.ts.map +1 -1
- package/data/build/dist/client/features/magpie-management-page.js +52 -16
- package/data/build/dist/client/features/magpie-management-page.js.map +1 -1
- package/data/build/dist/client/features/mobile-access-panel.d.ts.map +1 -1
- package/data/build/dist/client/features/mobile-access-panel.js +1 -11
- package/data/build/dist/client/features/mobile-access-panel.js.map +1 -1
- package/data/build/dist/client/features/mobile-access.d.ts +3 -6
- package/data/build/dist/client/features/mobile-access.d.ts.map +1 -1
- package/data/build/dist/client/features/mobile-access.js +18 -47
- package/data/build/dist/client/features/mobile-access.js.map +1 -1
- package/data/build/dist/client/features/types.d.ts +3 -0
- package/data/build/dist/client/features/types.d.ts.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement.d.ts.map +1 -1
- package/data/build/dist/client/features/workspace-session-enhancement.js +2 -0
- package/data/build/dist/client/features/workspace-session-enhancement.js.map +1 -1
- package/data/build/dist/client/file-management-context-menu.d.ts +10 -0
- package/data/build/dist/client/file-management-context-menu.d.ts.map +1 -0
- package/data/build/dist/client/file-management-context-menu.js +182 -0
- package/data/build/dist/client/file-management-context-menu.js.map +1 -0
- package/data/build/dist/client/file-management-dom.d.ts +2 -0
- package/data/build/dist/client/file-management-dom.d.ts.map +1 -1
- package/data/build/dist/client/file-management-dom.js +10 -6
- package/data/build/dist/client/file-management-dom.js.map +1 -1
- package/data/build/dist/client/index.d.ts.map +1 -1
- package/data/build/dist/client/index.js +3 -0
- package/data/build/dist/client/index.js.map +1 -1
- package/data/build/dist/client/locale.d.ts.map +1 -1
- package/data/build/dist/client/locale.js +2 -0
- package/data/build/dist/client/locale.js.map +1 -1
- package/data/build/dist/client/locales/magpie.d.ts.map +1 -1
- package/data/build/dist/client/locales/magpie.js +2 -0
- package/data/build/dist/client/locales/magpie.js.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts +3 -0
- package/data/build/dist/client/workspace-session-visibility-dom.d.ts.map +1 -1
- package/data/build/dist/client/workspace-session-visibility-dom.js +29 -11
- package/data/build/dist/client/workspace-session-visibility-dom.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/context-menu-adapter.d.ts +22 -0
- package/data/build/dist/dsh-capabilities/client/context-menu-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/context-menu-adapter.js +33 -0
- package/data/build/dist/dsh-capabilities/client/context-menu-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js +10 -1
- package/data/build/dist/dsh-capabilities/client/session-performance-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/llm-text-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/llm-text-adapter.js +1 -0
- package/data/build/dist/dsh-capabilities/host/llm-text-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.d.ts +1 -0
- package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.js +15 -7
- package/data/build/dist/dsh-capabilities/host/plugin-update-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js +10 -1
- package/data/build/dist/dsh-capabilities/host/session-model-selection-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js +10 -1
- package/data/build/dist/dsh-capabilities/host/session-performance-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.js +1 -0
- package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.js +3 -0
- package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/types.js.map +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts +5 -0
- package/data/build/dist/host/cli-adapters/antigravity-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/antigravity-driver.js +54 -2
- package/data/build/dist/host/cli-adapters/antigravity-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.js +70 -3
- package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
- package/data/build/dist/host/cli-adapters/magpie-usage.js +6 -2
- package/data/build/dist/host/cli-adapters/magpie-usage.js.map +1 -1
- package/data/build/dist/host/features/session-translation-recovery.js +2 -2
- package/data/build/dist/host/features/session-translation-recovery.js.map +1 -1
- package/data/build/dist/host/features/session-translation-service.d.ts +2 -2
- package/data/build/dist/host/features/session-translation-service.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation-service.js +11 -9
- package/data/build/dist/host/features/session-translation-service.js.map +1 -1
- package/data/build/dist/host/index.d.ts.map +1 -1
- package/data/build/dist/host/index.js +4 -1
- package/data/build/dist/host/index.js.map +1 -1
- package/data/build/dist/host/settings.d.ts.map +1 -1
- package/data/build/dist/host/settings.js +5 -4
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/shared/contracts/config.d.ts +2 -2
- package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.js +5 -10
- package/data/build/dist/shared/contracts/config.js.map +1 -1
- package/data/build/dist/shared/contracts/errors.d.ts +1 -1
- package/data/build/dist/shared/contracts/errors.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.d.ts +3 -3
- package/data/build/dist/shared/contracts/version.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/version.js +2 -2
- package/data/build/dist/shared/contracts/version.js.map +1 -1
- package/package.json +34 -32
- package/profile/README.md +2 -2
- package/profile/package.json +2 -2
- package/profile/version.json +2 -2
- package/version.json +2 -2
|
@@ -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;
|
|
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,7 @@ export const fileManagementFeature = {
|
|
|
15
16
|
enabledByDefault: false,
|
|
16
17
|
dependencies: [],
|
|
17
18
|
runtime: 'client',
|
|
19
|
+
requires: [{ capability: 'ui.context-menu', required: false, fallback: 'degrade' }],
|
|
18
20
|
nativeReplacement: {
|
|
19
21
|
dshFeature: 'DSH native file delivery, image upload, and drag-and-drop',
|
|
20
22
|
since: '0.2.2-alpha.2',
|
|
@@ -33,9 +35,15 @@ export const fileManagementFeature = {
|
|
|
33
35
|
start(context) {
|
|
34
36
|
const readOptions = () => {
|
|
35
37
|
const value = { ...DEFAULT_FILE_MANAGEMENT_SETTINGS, ...context.services.settings.getSnapshot().value?.fileManagement };
|
|
36
|
-
return {
|
|
38
|
+
return {
|
|
39
|
+
menuEnhancement: value.menuEnhancement,
|
|
40
|
+
fileEditor: value.fileEditor,
|
|
41
|
+
locale: context.services.locale,
|
|
42
|
+
nativeContextMenus: context.services.contextMenus !== undefined,
|
|
43
|
+
};
|
|
37
44
|
};
|
|
38
45
|
const dom = startFileManagementDom(context.services.rpc, readOptions());
|
|
46
|
+
const contextMenu = registerFileManagementContextMenus(context.services.rpc, context.services.contextMenus, context.services.locale);
|
|
39
47
|
context.resources.add(startHtmlWorkspaceFiles(context.services.rpc, context.services.locale));
|
|
40
48
|
let disposeSessionView;
|
|
41
49
|
let disposeCopyPathMenu;
|
|
@@ -52,7 +60,7 @@ export const fileManagementFeature = {
|
|
|
52
60
|
};
|
|
53
61
|
const syncCopyPathMenu = () => {
|
|
54
62
|
const value = { ...DEFAULT_FILE_MANAGEMENT_SETTINGS, ...context.services.settings.getSnapshot().value?.fileManagement };
|
|
55
|
-
if (value.menuEnhancement && disposeCopyPathMenu === undefined) {
|
|
63
|
+
if (value.menuEnhancement && context.services.contextMenus === undefined && disposeCopyPathMenu === undefined) {
|
|
56
64
|
disposeCopyPathMenu = registerFileViewerCopyPathMenu(slots, context.services.locale);
|
|
57
65
|
}
|
|
58
66
|
else if (!value.menuEnhancement && disposeCopyPathMenu !== undefined) {
|
|
@@ -60,17 +68,24 @@ export const fileManagementFeature = {
|
|
|
60
68
|
disposeCopyPathMenu = undefined;
|
|
61
69
|
}
|
|
62
70
|
};
|
|
71
|
+
const syncContextMenu = () => {
|
|
72
|
+
const value = { ...DEFAULT_FILE_MANAGEMENT_SETTINGS, ...context.services.settings.getSnapshot().value?.fileManagement };
|
|
73
|
+
contextMenu.setEnabled(value.menuEnhancement);
|
|
74
|
+
};
|
|
63
75
|
syncSessionView();
|
|
64
76
|
syncCopyPathMenu();
|
|
77
|
+
syncContextMenu();
|
|
65
78
|
const unsubscribe = context.services.settings.subscribe(() => {
|
|
66
79
|
dom.setOptions(readOptions());
|
|
67
80
|
syncSessionView();
|
|
68
81
|
syncCopyPathMenu();
|
|
82
|
+
syncContextMenu();
|
|
69
83
|
});
|
|
70
84
|
context.resources.add(unsubscribe);
|
|
71
85
|
context.resources.add(dom.dispose);
|
|
72
86
|
context.resources.add(() => disposeSessionView?.());
|
|
73
87
|
context.resources.add(() => disposeCopyPathMenu?.());
|
|
88
|
+
context.resources.add(contextMenu.dispose);
|
|
74
89
|
},
|
|
75
90
|
settingsPanel: FileManagementPanel,
|
|
76
91
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-management.js","sourceRoot":"","sources":["../../../../../src/client/features/file-management.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gCAAgC,EAAE,MAAM,kCAAkC,CAAA;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAA;AAClF,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;
|
|
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":"AACA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAA;AACxD,OAAO,KAAK,EAEV,gCAAgC,EAChC,oBAAoB,EACpB,iCAAiC,EAMjC,oBAAoB,EACpB,gBAAgB,
|
|
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(
|
|
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
|
-
})
|
|
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'))), ...
|
|
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
|
|
867
|
-
|
|
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
|
|
870
|
-
const max = Math.max(1, ...display.map((row) =>
|
|
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, (
|
|
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' },
|
|
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}
|