@nextclaw/ui 0.13.4 → 0.13.6
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/CHANGELOG.md +128 -0
- package/dist/assets/api-BCDb13Uv.js +8 -0
- package/dist/assets/app-presenter-provider-C-QMjK7m.js +3 -0
- package/dist/assets/arrow-left-rIXFA2Zy.js +1 -0
- package/dist/assets/channels-list-page-DnqwsKGe.js +8 -0
- package/dist/assets/chat-page-CsQx20xL.js +105 -0
- package/dist/assets/config-split-page-BwhGqmUS.js +1 -0
- package/dist/assets/confirm-dialog-DBkKcQ1q.js +5 -0
- package/dist/assets/desktop-update-config-BE9KjiXi.js +1 -0
- package/dist/assets/{dist-CpwDZDtv.js → dist-BI0bX8jv.js} +1 -1
- package/dist/assets/dist-C8JRt-tf.js +1 -0
- package/dist/assets/doc-browser-context-VHUOIUXL.js +1 -0
- package/dist/assets/doc-browser-eqdNEerh.js +1 -0
- package/dist/assets/doc-browser-lpF_pyx4.js +1 -0
- package/dist/assets/ellipsis-C9VB2CxT.js +1 -0
- package/dist/assets/es2015-BCw3Q7nY.js +41 -0
- package/dist/assets/external-link-Bp7_4s9t.js +1 -0
- package/dist/assets/index-BCq7kbC8.css +1 -0
- package/dist/assets/index-DTdPDqto.js +101 -0
- package/dist/assets/key-round-Ccy6oND3.js +1 -0
- package/dist/assets/loader-circle-OpH4EErP.js +1 -0
- package/dist/assets/{mcp-marketplace-page-Dvi8mCBd.js → mcp-marketplace-page-B-GxKOqS.js} +2 -2
- package/dist/assets/mcp-marketplace-page-Dm-0-w51.js +1 -0
- package/dist/assets/model-config-BXPnV_7n.js +1 -0
- package/dist/assets/notice-card-Dsbkl7u7.js +1 -0
- package/dist/assets/play-CvgYhNbo.js +1 -0
- package/dist/assets/plus-DHcP-K1U.js +1 -0
- package/dist/assets/popover-BTLZE5Iz.js +1 -0
- package/dist/assets/provider-models-C_yOh6DE.js +1 -0
- package/dist/assets/provider-scoped-model-input-DKI9KN7N.js +1 -0
- package/dist/assets/providers-list-Bko6B7dE.js +1 -0
- package/dist/assets/react-BqS8oMyM.js +8 -0
- package/dist/assets/refresh-cw-BIaj7txb.js +1 -0
- package/dist/assets/remote-DHn_b8QU.js +1 -0
- package/dist/assets/rotate-cw-DMqSkRJQ.js +1 -0
- package/dist/assets/runtime-config-page-DX_wSK1J.js +1 -0
- package/dist/assets/save-BEoORten.js +1 -0
- package/dist/assets/search-COFh_SFI.js +1 -0
- package/dist/assets/{search-config-G2O1fcRb.js → search-config-DA5By-tE.js} +1 -1
- package/dist/assets/{secrets-config-TenzxYbE.js → secrets-config-eDxG7iN4.js} +2 -2
- package/dist/assets/{status-dot-BSMG7ZaC.js → status-dot-oWBjTovo.js} +1 -1
- package/dist/assets/{tabs-D1CjpWNX.js → tabs-CGaY0BVO.js} +1 -1
- package/dist/assets/{tabs-custom-CRSN1ekg.js → tabs-custom-D2fPYb4G.js} +1 -1
- package/dist/assets/{tag-chip-DEashiw6.js → tag-chip-TVkgofS1.js} +1 -1
- package/dist/assets/tooltip-BwHPKBv9.js +1 -0
- package/dist/assets/trash-2-D3psAGrz.js +1 -0
- package/dist/assets/x-CHAxzyp2.js +1 -0
- package/dist/index.html +25 -23
- package/dist/logos/mimo.svg +9 -0
- package/package.json +8 -8
- package/public/logos/mimo.svg +9 -0
- package/src/app/components/layout/app-layout.tsx +10 -2
- package/src/features/agents/components/agents-page.tsx +6 -4
- package/src/features/chat/components/chat-welcome.test.tsx +15 -0
- package/src/features/chat/components/chat-welcome.tsx +4 -7
- package/src/features/chat/hooks/use-ncp-chat-page-data.ts +17 -10
- package/src/features/marketplace/components/marketplace-list-card.tsx +22 -1
- package/src/features/marketplace/components/marketplace-page.tsx +3 -1
- package/src/features/marketplace/hooks/use-marketplace.ts +3 -1
- package/src/features/marketplace/utils/marketplace-installed-cache.utils.ts +8 -0
- package/src/features/right-panel-resources/configs/right-panel-resource-routes.config.ts +70 -6
- package/src/features/right-panel-resources/utils/right-panel-resource-route-resolver.utils.test.ts +25 -1
- package/src/features/right-panel-resources/utils/right-panel-resource-route-resolver.utils.ts +1 -1
- package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.test.ts +42 -0
- package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +22 -0
- package/src/features/service-apps/components/service-apps-panel.test.tsx +88 -0
- package/src/features/service-apps/components/service-apps-panel.tsx +246 -56
- package/src/features/service-apps/hooks/use-service-apps.ts +14 -0
- package/src/features/side-dock/components/side-dock.test.tsx +58 -3
- package/src/features/side-dock/components/side-dock.tsx +77 -24
- package/src/features/side-dock/configs/side-dock-built-in-items.config.ts +37 -34
- package/src/features/side-dock/index.ts +2 -0
- package/src/features/side-dock/managers/side-dock.manager.test.ts +84 -3
- package/src/features/side-dock/managers/side-dock.manager.ts +135 -12
- package/src/features/side-dock/types/side-dock.types.ts +11 -4
- package/src/features/side-dock/utils/side-dock-item.utils.test.ts +8 -8
- package/src/features/side-dock/utils/side-dock-item.utils.ts +13 -5
- package/src/platforms/desktop/components/desktop-app-shell.tsx +5 -2
- package/src/platforms/mobile/components/mobile-app-shell.tsx +4 -1
- package/src/shared/components/config/provider-form-support.test.ts +21 -0
- package/src/shared/components/config/provider-form-support.ts +38 -78
- package/src/shared/components/config/provider-form.tsx +54 -67
- package/src/shared/components/config/providers-list.tsx +211 -73
- package/src/shared/components/doc-browser/doc-browser-context.test.tsx +73 -0
- package/src/shared/components/doc-browser/doc-browser-context.tsx +3 -0
- package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +184 -98
- package/src/shared/components/doc-browser/doc-browser.test.tsx +168 -43
- package/src/shared/components/doc-browser/doc-browser.tsx +38 -7
- package/src/shared/components/doc-browser/index.ts +1 -0
- package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +30 -6
- package/src/shared/components/doc-browser/stores/doc-browser.store.ts +29 -0
- package/src/shared/components/doc-browser/types/doc-browser.types.ts +23 -0
- package/src/shared/components/doc-browser/utils/doc-browser-state.utils.ts +7 -0
- package/src/shared/components/model-config.tsx +5 -4
- package/src/shared/components/provider-auth-section.tsx +2 -2
- package/src/shared/components/ui/switch.tsx +5 -2
- package/src/shared/hooks/use-config.ts +27 -6
- package/src/shared/lib/api/marketplace.types.ts +193 -0
- package/src/shared/lib/api/types.ts +23 -200
- package/src/shared/lib/api/utils/config.utils.ts +17 -7
- package/src/shared/lib/i18n/index.ts +10 -12
- package/src/shared/lib/i18n/{marketplace.ts → marketplace-labels.utils.ts} +3 -0
- package/src/shared/lib/i18n/runtime/doc-browser-labels.utils.ts +46 -2
- package/src/shared/lib/provider-models/index.test.ts +93 -15
- package/src/shared/lib/provider-models/index.ts +35 -20
- package/src/shared/lib/transport/request-raw-api-response.utils.ts +1 -1
- package/dist/assets/api-DruAcori.js +0 -15
- package/dist/assets/app-presenter-provider-DIcnNB9s.js +0 -3
- package/dist/assets/book-open-CRotBOF2.js +0 -1
- package/dist/assets/boxes-BvA-I63l.js +0 -1
- package/dist/assets/channels-list-page-wK3l7p5R.js +0 -8
- package/dist/assets/chat-page-DgehvdJT.js +0 -105
- package/dist/assets/config-split-page-BnTO1mAM.js +0 -1
- package/dist/assets/confirm-dialog-CGrKHbAW.js +0 -5
- package/dist/assets/createLucideIcon-Br1EFMEr.js +0 -1
- package/dist/assets/desktop-update-config-CehWxSSg.js +0 -1
- package/dist/assets/dist-rzakR_bu.js +0 -41
- package/dist/assets/doc-browser-BgxmVsTx.js +0 -1
- package/dist/assets/doc-browser-CZn5-Qbu.js +0 -1
- package/dist/assets/doc-browser-context-B8gk7HMr.js +0 -1
- package/dist/assets/external-link-DHjFdCpy.js +0 -1
- package/dist/assets/index-DORmh0Cy.css +0 -1
- package/dist/assets/index-DcFpvnge.js +0 -101
- package/dist/assets/key-round-D41Oe35x.js +0 -1
- package/dist/assets/mcp-marketplace-page-DBLhJWOJ.js +0 -1
- package/dist/assets/model-config-B-EJXGtO.js +0 -1
- package/dist/assets/play-C-0vo7hi.js +0 -1
- package/dist/assets/plus-Cr_akLp2.js +0 -1
- package/dist/assets/popover-YieElO8c.js +0 -1
- package/dist/assets/provider-scoped-model-input-BPRNGqYn.js +0 -1
- package/dist/assets/providers-list-CtBpL1ZY.js +0 -1
- package/dist/assets/react-B2X_ph0a.js +0 -1
- package/dist/assets/remote-BGHbHoHf.js +0 -1
- package/dist/assets/rotate-cw-jueVCNJQ.js +0 -1
- package/dist/assets/runtime-config-page-C1Hv7mad.js +0 -1
- package/dist/assets/save-aYdSdK97.js +0 -1
- package/dist/assets/search-CdhgFNwf.js +0 -1
- package/dist/assets/setting-row-BNu0qhOM.js +0 -1
- package/dist/assets/trash-2-DSWTsARW.js +0 -1
- package/dist/assets/x-D1v_vb54.js +0 -1
- package/src/shared/components/provider-enabled-field.tsx +0 -23
- /package/dist/assets/{config-hints-A7G_jMTU.js → config-hints-Ceiol9x4.js} +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
export type MarketplaceItemType = 'skill' | 'mcp';
|
|
2
|
+
|
|
3
|
+
export type MarketplaceSort = 'relevance' | 'updated';
|
|
4
|
+
|
|
5
|
+
export type MarketplaceSkillInstallKind = 'builtin' | 'marketplace';
|
|
6
|
+
export type MarketplaceMcpInstallKind = 'template';
|
|
7
|
+
export type MarketplaceInstallKind = MarketplaceSkillInstallKind | MarketplaceMcpInstallKind;
|
|
8
|
+
|
|
9
|
+
export type MarketplaceInstallSpec = {
|
|
10
|
+
kind: MarketplaceInstallKind;
|
|
11
|
+
spec: string;
|
|
12
|
+
command: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type MarketplaceMcpTemplateInput = {
|
|
16
|
+
id: string;
|
|
17
|
+
label: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
required?: boolean;
|
|
20
|
+
secret?: boolean;
|
|
21
|
+
defaultValue?: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type MarketplaceMcpInstallSpec = MarketplaceInstallSpec & {
|
|
25
|
+
kind: 'template';
|
|
26
|
+
defaultName: string;
|
|
27
|
+
transportTypes: Array<'stdio' | 'http' | 'sse'>;
|
|
28
|
+
template: Record<string, unknown>;
|
|
29
|
+
inputs: MarketplaceMcpTemplateInput[];
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type MarketplaceLocalizedTextMap = Record<string, string>;
|
|
33
|
+
|
|
34
|
+
export type MarketplaceItemSummary = {
|
|
35
|
+
id: string;
|
|
36
|
+
slug: string;
|
|
37
|
+
type: MarketplaceItemType;
|
|
38
|
+
name: string;
|
|
39
|
+
summary: string;
|
|
40
|
+
summaryI18n: MarketplaceLocalizedTextMap;
|
|
41
|
+
tags: string[];
|
|
42
|
+
author: string;
|
|
43
|
+
install: MarketplaceInstallSpec;
|
|
44
|
+
updatedAt: string;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export type MarketplaceItemView = MarketplaceItemSummary & {
|
|
48
|
+
description?: string;
|
|
49
|
+
descriptionI18n?: MarketplaceLocalizedTextMap;
|
|
50
|
+
sourceRepo?: string;
|
|
51
|
+
homepage?: string;
|
|
52
|
+
publishedAt: string;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export type MarketplaceSkillContentView = {
|
|
56
|
+
type: 'skill';
|
|
57
|
+
slug: string;
|
|
58
|
+
name: string;
|
|
59
|
+
install: MarketplaceInstallSpec;
|
|
60
|
+
source: 'builtin' | 'marketplace' | 'remote';
|
|
61
|
+
raw: string;
|
|
62
|
+
metadataRaw?: string;
|
|
63
|
+
bodyRaw: string;
|
|
64
|
+
sourceUrl?: string;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export type MarketplaceMcpContentView = {
|
|
68
|
+
type: 'mcp';
|
|
69
|
+
slug: string;
|
|
70
|
+
name: string;
|
|
71
|
+
install: MarketplaceMcpInstallSpec;
|
|
72
|
+
source: 'marketplace' | 'remote';
|
|
73
|
+
raw: string;
|
|
74
|
+
metadataRaw?: string;
|
|
75
|
+
bodyRaw: string;
|
|
76
|
+
sourceUrl?: string;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export type MarketplaceListView = {
|
|
80
|
+
total: number;
|
|
81
|
+
page: number;
|
|
82
|
+
pageSize: number;
|
|
83
|
+
totalPages: number;
|
|
84
|
+
sort: MarketplaceSort;
|
|
85
|
+
query?: string;
|
|
86
|
+
items: MarketplaceItemSummary[];
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export type MarketplaceRecommendationView = {
|
|
90
|
+
type: MarketplaceItemType;
|
|
91
|
+
sceneId: string;
|
|
92
|
+
title: string;
|
|
93
|
+
description?: string;
|
|
94
|
+
total: number;
|
|
95
|
+
items: MarketplaceItemSummary[];
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export type MarketplaceSceneView = {
|
|
99
|
+
scene: string;
|
|
100
|
+
title: string;
|
|
101
|
+
description?: string;
|
|
102
|
+
count?: number;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export type MarketplaceScenesView = {
|
|
106
|
+
scenes: MarketplaceSceneView[];
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export type MarketplaceInstalledRecord = {
|
|
110
|
+
type: MarketplaceItemType;
|
|
111
|
+
id?: string;
|
|
112
|
+
spec: string;
|
|
113
|
+
label?: string;
|
|
114
|
+
description?: string;
|
|
115
|
+
descriptionZh?: string;
|
|
116
|
+
source?: string;
|
|
117
|
+
installedAt?: string;
|
|
118
|
+
enabled?: boolean;
|
|
119
|
+
runtimeStatus?: string;
|
|
120
|
+
origin?: string;
|
|
121
|
+
installPath?: string;
|
|
122
|
+
transport?: 'stdio' | 'http' | 'sse';
|
|
123
|
+
scope?: {
|
|
124
|
+
allAgents: boolean;
|
|
125
|
+
agents: string[];
|
|
126
|
+
};
|
|
127
|
+
catalogSlug?: string;
|
|
128
|
+
vendor?: string;
|
|
129
|
+
docsUrl?: string;
|
|
130
|
+
homepage?: string;
|
|
131
|
+
trustLevel?: 'official' | 'verified' | 'community';
|
|
132
|
+
toolCount?: number;
|
|
133
|
+
accessible?: boolean;
|
|
134
|
+
lastReadyAt?: string;
|
|
135
|
+
lastDoctorAt?: string;
|
|
136
|
+
lastError?: string;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export type MarketplaceInstalledView = {
|
|
140
|
+
type: MarketplaceItemType;
|
|
141
|
+
total: number;
|
|
142
|
+
specs: string[];
|
|
143
|
+
records: MarketplaceInstalledRecord[];
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
export type MarketplaceInstallRequest = {
|
|
147
|
+
type: MarketplaceItemType;
|
|
148
|
+
spec: string;
|
|
149
|
+
kind?: MarketplaceInstallKind;
|
|
150
|
+
skill?: string;
|
|
151
|
+
installPath?: string;
|
|
152
|
+
force?: boolean;
|
|
153
|
+
name?: string;
|
|
154
|
+
enabled?: boolean;
|
|
155
|
+
allAgents?: boolean;
|
|
156
|
+
agents?: string[];
|
|
157
|
+
inputs?: Record<string, string>;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export type MarketplaceInstallResult = {
|
|
161
|
+
type: MarketplaceItemType;
|
|
162
|
+
spec: string;
|
|
163
|
+
message: string;
|
|
164
|
+
output?: string;
|
|
165
|
+
name?: string;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export type MarketplaceManageAction = 'enable' | 'disable' | 'update' | 'uninstall' | 'remove';
|
|
169
|
+
|
|
170
|
+
export type MarketplaceManageRequest = {
|
|
171
|
+
type: MarketplaceItemType;
|
|
172
|
+
action: MarketplaceManageAction;
|
|
173
|
+
id?: string;
|
|
174
|
+
spec?: string;
|
|
175
|
+
force?: boolean;
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export type MarketplaceManageResult = {
|
|
179
|
+
type: MarketplaceItemType;
|
|
180
|
+
action: MarketplaceManageAction;
|
|
181
|
+
id: string;
|
|
182
|
+
message: string;
|
|
183
|
+
output?: string;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
export type MarketplaceMcpDoctorResult = {
|
|
187
|
+
name: string;
|
|
188
|
+
enabled: boolean;
|
|
189
|
+
transport: 'stdio' | 'http' | 'sse';
|
|
190
|
+
accessible: boolean;
|
|
191
|
+
toolCount: number;
|
|
192
|
+
error?: string;
|
|
193
|
+
};
|
|
@@ -57,7 +57,11 @@ export type BootstrapStatusView = {
|
|
|
57
57
|
|
|
58
58
|
export type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "adaptive" | "xhigh";
|
|
59
59
|
|
|
60
|
-
export type
|
|
60
|
+
export type ProviderInstanceView = {
|
|
61
|
+
providerId: string;
|
|
62
|
+
providerType: string | null;
|
|
63
|
+
isBuiltInType: boolean;
|
|
64
|
+
isCustom: boolean;
|
|
61
65
|
enabled: boolean;
|
|
62
66
|
displayName?: string;
|
|
63
67
|
apiKeySet: boolean;
|
|
@@ -72,8 +76,11 @@ export type ProviderConfigView = {
|
|
|
72
76
|
}>;
|
|
73
77
|
};
|
|
74
78
|
|
|
79
|
+
export type ProviderConfigView = ProviderInstanceView;
|
|
80
|
+
|
|
75
81
|
export type ProviderConfigUpdate = {
|
|
76
82
|
enabled?: boolean;
|
|
83
|
+
providerType?: string | null;
|
|
77
84
|
displayName?: string | null;
|
|
78
85
|
apiKey?: string | null;
|
|
79
86
|
apiBase?: string | null;
|
|
@@ -90,10 +97,13 @@ export type ProviderConnectionTestRequest = ProviderConfigUpdate & {
|
|
|
90
97
|
model?: string | null;
|
|
91
98
|
};
|
|
92
99
|
|
|
93
|
-
export type ProviderCreateRequest = ProviderConfigUpdate
|
|
100
|
+
export type ProviderCreateRequest = ProviderConfigUpdate & {
|
|
101
|
+
providerId?: string | null;
|
|
102
|
+
};
|
|
94
103
|
|
|
95
|
-
export type ProviderCreateResult = {
|
|
96
|
-
export type ProviderDeleteResult = { deleted: boolean;
|
|
104
|
+
export type ProviderCreateResult = { providerId: string; provider: ProviderInstanceView };
|
|
105
|
+
export type ProviderDeleteResult = { deleted: boolean; providerId: string };
|
|
106
|
+
export type ProvidersView = { providers: Record<string, ProviderInstanceView> };
|
|
97
107
|
|
|
98
108
|
export type ProviderConnectionTestErrorCode =
|
|
99
109
|
| 'API_KEY_REQUIRED'
|
|
@@ -541,10 +551,11 @@ export type ConfigView = {
|
|
|
541
551
|
secrets?: SecretsView;
|
|
542
552
|
};
|
|
543
553
|
|
|
544
|
-
export type
|
|
545
|
-
|
|
554
|
+
export type ProviderTemplateView = {
|
|
555
|
+
id: string;
|
|
556
|
+
providerType: string;
|
|
546
557
|
displayName?: string;
|
|
547
|
-
|
|
558
|
+
apiProtocol?: "openai-compatible" | "anthropic-messages";
|
|
548
559
|
modelPrefix?: string;
|
|
549
560
|
keywords: string[];
|
|
550
561
|
envKey: string;
|
|
@@ -587,6 +598,10 @@ export type ProviderSpecView = {
|
|
|
587
598
|
defaultWireApi?: "auto" | "chat" | "responses";
|
|
588
599
|
};
|
|
589
600
|
|
|
601
|
+
export type ProviderTemplatesView = {
|
|
602
|
+
providerTemplates: ProviderTemplateView[];
|
|
603
|
+
};
|
|
604
|
+
|
|
590
605
|
export type ChannelSpecView = {
|
|
591
606
|
name: string;
|
|
592
607
|
displayName?: string;
|
|
@@ -609,7 +624,6 @@ export type SearchProviderSpecView = {
|
|
|
609
624
|
};
|
|
610
625
|
|
|
611
626
|
export type ConfigMetaView = {
|
|
612
|
-
providers: ProviderSpecView[];
|
|
613
627
|
search: SearchProviderSpecView[];
|
|
614
628
|
channels: ChannelSpecView[];
|
|
615
629
|
};
|
|
@@ -701,195 +715,4 @@ export type WsEvent =
|
|
|
701
715
|
| { type: 'connection.close'; payload?: Record<string, unknown> }
|
|
702
716
|
| { type: 'connection.error'; payload?: { message?: string } };
|
|
703
717
|
|
|
704
|
-
export type
|
|
705
|
-
|
|
706
|
-
export type MarketplaceSort = 'relevance' | 'updated';
|
|
707
|
-
|
|
708
|
-
export type MarketplaceSkillInstallKind = 'builtin' | 'marketplace';
|
|
709
|
-
export type MarketplaceMcpInstallKind = 'template';
|
|
710
|
-
export type MarketplaceInstallKind = MarketplaceSkillInstallKind | MarketplaceMcpInstallKind;
|
|
711
|
-
|
|
712
|
-
export type MarketplaceInstallSpec = {
|
|
713
|
-
kind: MarketplaceInstallKind;
|
|
714
|
-
spec: string;
|
|
715
|
-
command: string;
|
|
716
|
-
};
|
|
717
|
-
|
|
718
|
-
export type MarketplaceMcpTemplateInput = {
|
|
719
|
-
id: string;
|
|
720
|
-
label: string;
|
|
721
|
-
description?: string;
|
|
722
|
-
required?: boolean;
|
|
723
|
-
secret?: boolean;
|
|
724
|
-
defaultValue?: string;
|
|
725
|
-
};
|
|
726
|
-
|
|
727
|
-
export type MarketplaceMcpInstallSpec = MarketplaceInstallSpec & {
|
|
728
|
-
kind: 'template';
|
|
729
|
-
defaultName: string;
|
|
730
|
-
transportTypes: Array<'stdio' | 'http' | 'sse'>;
|
|
731
|
-
template: Record<string, unknown>;
|
|
732
|
-
inputs: MarketplaceMcpTemplateInput[];
|
|
733
|
-
};
|
|
734
|
-
|
|
735
|
-
export type MarketplaceLocalizedTextMap = Record<string, string>;
|
|
736
|
-
|
|
737
|
-
export type MarketplaceItemSummary = {
|
|
738
|
-
id: string;
|
|
739
|
-
slug: string;
|
|
740
|
-
type: MarketplaceItemType;
|
|
741
|
-
name: string;
|
|
742
|
-
summary: string;
|
|
743
|
-
summaryI18n: MarketplaceLocalizedTextMap;
|
|
744
|
-
tags: string[];
|
|
745
|
-
author: string;
|
|
746
|
-
install: MarketplaceInstallSpec;
|
|
747
|
-
updatedAt: string;
|
|
748
|
-
};
|
|
749
|
-
|
|
750
|
-
export type MarketplaceItemView = MarketplaceItemSummary & {
|
|
751
|
-
description?: string;
|
|
752
|
-
descriptionI18n?: MarketplaceLocalizedTextMap;
|
|
753
|
-
sourceRepo?: string;
|
|
754
|
-
homepage?: string;
|
|
755
|
-
publishedAt: string;
|
|
756
|
-
};
|
|
757
|
-
|
|
758
|
-
export type MarketplaceSkillContentView = {
|
|
759
|
-
type: 'skill';
|
|
760
|
-
slug: string;
|
|
761
|
-
name: string;
|
|
762
|
-
install: MarketplaceInstallSpec;
|
|
763
|
-
source: 'builtin' | 'marketplace' | 'remote';
|
|
764
|
-
raw: string;
|
|
765
|
-
metadataRaw?: string;
|
|
766
|
-
bodyRaw: string;
|
|
767
|
-
sourceUrl?: string;
|
|
768
|
-
};
|
|
769
|
-
|
|
770
|
-
export type MarketplaceMcpContentView = {
|
|
771
|
-
type: 'mcp';
|
|
772
|
-
slug: string;
|
|
773
|
-
name: string;
|
|
774
|
-
install: MarketplaceMcpInstallSpec;
|
|
775
|
-
source: 'marketplace' | 'remote';
|
|
776
|
-
raw: string;
|
|
777
|
-
metadataRaw?: string;
|
|
778
|
-
bodyRaw: string;
|
|
779
|
-
sourceUrl?: string;
|
|
780
|
-
};
|
|
781
|
-
|
|
782
|
-
export type MarketplaceListView = {
|
|
783
|
-
total: number;
|
|
784
|
-
page: number;
|
|
785
|
-
pageSize: number;
|
|
786
|
-
totalPages: number;
|
|
787
|
-
sort: MarketplaceSort;
|
|
788
|
-
query?: string;
|
|
789
|
-
items: MarketplaceItemSummary[];
|
|
790
|
-
};
|
|
791
|
-
|
|
792
|
-
export type MarketplaceRecommendationView = {
|
|
793
|
-
type: MarketplaceItemType;
|
|
794
|
-
sceneId: string;
|
|
795
|
-
title: string;
|
|
796
|
-
description?: string;
|
|
797
|
-
total: number;
|
|
798
|
-
items: MarketplaceItemSummary[];
|
|
799
|
-
};
|
|
800
|
-
|
|
801
|
-
export type MarketplaceSceneView = {
|
|
802
|
-
scene: string;
|
|
803
|
-
title: string;
|
|
804
|
-
description?: string;
|
|
805
|
-
count?: number;
|
|
806
|
-
};
|
|
807
|
-
|
|
808
|
-
export type MarketplaceScenesView = {
|
|
809
|
-
scenes: MarketplaceSceneView[];
|
|
810
|
-
};
|
|
811
|
-
|
|
812
|
-
export type MarketplaceInstalledRecord = {
|
|
813
|
-
type: MarketplaceItemType;
|
|
814
|
-
id?: string;
|
|
815
|
-
spec: string;
|
|
816
|
-
label?: string;
|
|
817
|
-
description?: string;
|
|
818
|
-
descriptionZh?: string;
|
|
819
|
-
source?: string;
|
|
820
|
-
installedAt?: string;
|
|
821
|
-
enabled?: boolean;
|
|
822
|
-
runtimeStatus?: string;
|
|
823
|
-
origin?: string;
|
|
824
|
-
installPath?: string;
|
|
825
|
-
transport?: 'stdio' | 'http' | 'sse';
|
|
826
|
-
scope?: {
|
|
827
|
-
allAgents: boolean;
|
|
828
|
-
agents: string[];
|
|
829
|
-
};
|
|
830
|
-
catalogSlug?: string;
|
|
831
|
-
vendor?: string;
|
|
832
|
-
docsUrl?: string;
|
|
833
|
-
homepage?: string;
|
|
834
|
-
trustLevel?: 'official' | 'verified' | 'community';
|
|
835
|
-
toolCount?: number;
|
|
836
|
-
accessible?: boolean;
|
|
837
|
-
lastReadyAt?: string;
|
|
838
|
-
lastDoctorAt?: string;
|
|
839
|
-
lastError?: string;
|
|
840
|
-
};
|
|
841
|
-
|
|
842
|
-
export type MarketplaceInstalledView = {
|
|
843
|
-
type: MarketplaceItemType;
|
|
844
|
-
total: number;
|
|
845
|
-
specs: string[];
|
|
846
|
-
records: MarketplaceInstalledRecord[];
|
|
847
|
-
};
|
|
848
|
-
|
|
849
|
-
export type MarketplaceInstallRequest = {
|
|
850
|
-
type: MarketplaceItemType;
|
|
851
|
-
spec: string;
|
|
852
|
-
kind?: MarketplaceInstallKind;
|
|
853
|
-
skill?: string;
|
|
854
|
-
installPath?: string;
|
|
855
|
-
force?: boolean;
|
|
856
|
-
name?: string;
|
|
857
|
-
enabled?: boolean;
|
|
858
|
-
allAgents?: boolean;
|
|
859
|
-
agents?: string[];
|
|
860
|
-
inputs?: Record<string, string>;
|
|
861
|
-
};
|
|
862
|
-
|
|
863
|
-
export type MarketplaceInstallResult = {
|
|
864
|
-
type: MarketplaceItemType;
|
|
865
|
-
spec: string;
|
|
866
|
-
message: string;
|
|
867
|
-
output?: string;
|
|
868
|
-
name?: string;
|
|
869
|
-
};
|
|
870
|
-
|
|
871
|
-
export type MarketplaceManageAction = 'enable' | 'disable' | 'uninstall' | 'remove';
|
|
872
|
-
|
|
873
|
-
export type MarketplaceManageRequest = {
|
|
874
|
-
type: MarketplaceItemType;
|
|
875
|
-
action: MarketplaceManageAction;
|
|
876
|
-
id?: string;
|
|
877
|
-
spec?: string;
|
|
878
|
-
};
|
|
879
|
-
|
|
880
|
-
export type MarketplaceManageResult = {
|
|
881
|
-
type: MarketplaceItemType;
|
|
882
|
-
action: MarketplaceManageAction;
|
|
883
|
-
id: string;
|
|
884
|
-
message: string;
|
|
885
|
-
output?: string;
|
|
886
|
-
};
|
|
887
|
-
|
|
888
|
-
export type MarketplaceMcpDoctorResult = {
|
|
889
|
-
name: string;
|
|
890
|
-
enabled: boolean;
|
|
891
|
-
transport: 'stdio' | 'http' | 'sse';
|
|
892
|
-
accessible: boolean;
|
|
893
|
-
toolCount: number;
|
|
894
|
-
error?: string;
|
|
895
|
-
};
|
|
718
|
+
export type * from './marketplace.types';
|
|
@@ -11,6 +11,8 @@ import type {
|
|
|
11
11
|
ConfigMetaView,
|
|
12
12
|
ConfigSchemaResponse,
|
|
13
13
|
ProviderConfigView,
|
|
14
|
+
ProvidersView,
|
|
15
|
+
ProviderTemplatesView,
|
|
14
16
|
ChannelConfigUpdate,
|
|
15
17
|
ProviderConfigUpdate,
|
|
16
18
|
ProviderConnectionTestRequest,
|
|
@@ -79,6 +81,14 @@ export async function fetchConfigMeta(): Promise<ConfigMetaView> {
|
|
|
79
81
|
return await nextclawClient.config.fetchMeta();
|
|
80
82
|
}
|
|
81
83
|
|
|
84
|
+
export async function fetchProviders(): Promise<ProvidersView> {
|
|
85
|
+
return await nextclawClient.providers.list();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export async function fetchProviderTemplates(): Promise<ProviderTemplatesView> {
|
|
89
|
+
return await nextclawClient.providers.listTemplates();
|
|
90
|
+
}
|
|
91
|
+
|
|
82
92
|
export async function fetchConfigSchema(): Promise<ConfigSchemaResponse> {
|
|
83
93
|
return await nextclawClient.config.fetchSchema();
|
|
84
94
|
}
|
|
@@ -92,40 +102,40 @@ export async function updateSearch(data: SearchConfigUpdate): Promise<SearchConf
|
|
|
92
102
|
}
|
|
93
103
|
|
|
94
104
|
export async function updateProvider(provider: string, data: ProviderConfigUpdate): Promise<ProviderConfigView> {
|
|
95
|
-
return await nextclawClient.
|
|
105
|
+
return await nextclawClient.providers.update(provider, data);
|
|
96
106
|
}
|
|
97
107
|
|
|
98
108
|
export async function createProvider(data: ProviderCreateRequest = {}): Promise<ProviderCreateResult> {
|
|
99
|
-
return await nextclawClient.
|
|
109
|
+
return await nextclawClient.providers.create(data);
|
|
100
110
|
}
|
|
101
111
|
|
|
102
112
|
export async function deleteProvider(provider: string): Promise<ProviderDeleteResult> {
|
|
103
|
-
return await nextclawClient.
|
|
113
|
+
return await nextclawClient.providers.delete(provider);
|
|
104
114
|
}
|
|
105
115
|
|
|
106
116
|
export async function testProviderConnection(
|
|
107
117
|
provider: string,
|
|
108
118
|
data: ProviderConnectionTestRequest
|
|
109
119
|
): Promise<ProviderConnectionTestResult> {
|
|
110
|
-
return await nextclawClient.
|
|
120
|
+
return await nextclawClient.providers.testConnection(provider, data);
|
|
111
121
|
}
|
|
112
122
|
|
|
113
123
|
export async function startProviderAuth(
|
|
114
124
|
provider: string,
|
|
115
125
|
data: ProviderAuthStartRequest = {}
|
|
116
126
|
): Promise<ProviderAuthStartResult> {
|
|
117
|
-
return await nextclawClient.
|
|
127
|
+
return await nextclawClient.providers.startAuth(provider, data);
|
|
118
128
|
}
|
|
119
129
|
|
|
120
130
|
export async function pollProviderAuth(
|
|
121
131
|
provider: string,
|
|
122
132
|
data: ProviderAuthPollRequest
|
|
123
133
|
): Promise<ProviderAuthPollResult> {
|
|
124
|
-
return await nextclawClient.
|
|
134
|
+
return await nextclawClient.providers.pollAuth(provider, data);
|
|
125
135
|
}
|
|
126
136
|
|
|
127
137
|
export async function importProviderAuthFromCli(provider: string): Promise<ProviderAuthImportResult> {
|
|
128
|
-
return await nextclawClient.
|
|
138
|
+
return await nextclawClient.providers.importAuthFromCli(provider);
|
|
129
139
|
}
|
|
130
140
|
|
|
131
141
|
export async function updateChannel(
|
|
@@ -2,19 +2,10 @@ import { AGENT_LABELS } from './agents';
|
|
|
2
2
|
import { CHANNEL_LABELS } from './channels';
|
|
3
3
|
import { CHANNEL_AUTH_LABELS } from './channel-auth.constants';
|
|
4
4
|
import { CHAT_LABELS } from './chat-labels.utils';
|
|
5
|
-
import {
|
|
6
|
-
getLanguage,
|
|
7
|
-
getLocale,
|
|
8
|
-
initializeI18n,
|
|
9
|
-
LANGUAGE_OPTIONS,
|
|
10
|
-
resolveInitialLanguage,
|
|
11
|
-
setLanguage,
|
|
12
|
-
subscribeLanguageChange,
|
|
13
|
-
type I18nLanguage
|
|
14
|
-
} from './runtime/i18n-language-owner';
|
|
5
|
+
import { getLanguage, getLocale, initializeI18n, LANGUAGE_OPTIONS, resolveInitialLanguage, setLanguage, subscribeLanguageChange, type I18nLanguage } from './runtime/i18n-language-owner';
|
|
15
6
|
import { DESKTOP_UPDATE_LABELS } from './desktop-update-labels.utils';
|
|
16
7
|
import { DOC_BROWSER_LABELS } from './runtime/doc-browser-labels.utils';
|
|
17
|
-
import { MARKETPLACE_LABELS } from './marketplace';
|
|
8
|
+
import { MARKETPLACE_LABELS } from './marketplace-labels.utils';
|
|
18
9
|
import { PATH_PICKER_LABELS } from './runtime/i18n.path-picker';
|
|
19
10
|
import { PWA_LABELS } from './pwa';
|
|
20
11
|
import { REMOTE_LABELS } from './remote';
|
|
@@ -87,6 +78,7 @@ export const LABELS: Record<string, { zh: string; en: string }> = {
|
|
|
87
78
|
unchanged: { zh: '未修改', en: 'Unchanged' },
|
|
88
79
|
saving: { zh: '保存中...', en: 'Saving...' },
|
|
89
80
|
remove: { zh: '移除', en: 'Remove' },
|
|
81
|
+
more: { zh: '更多', en: 'More' },
|
|
90
82
|
all: { zh: '全部', en: 'All' },
|
|
91
83
|
yes: { zh: '是', en: 'Yes' },
|
|
92
84
|
no: { zh: '否', en: 'No' },
|
|
@@ -127,9 +119,11 @@ export const LABELS: Record<string, { zh: string; en: string }> = {
|
|
|
127
119
|
providersTabAll: { zh: '全部提供商', en: 'All Providers' },
|
|
128
120
|
providersFilterPlaceholder: { zh: '搜索提供商', en: 'Search providers' },
|
|
129
121
|
providersNoMatch: { zh: '没有匹配的提供商', en: 'No matching providers' },
|
|
122
|
+
providerAdd: { zh: '新增提供商', en: 'Add Provider' },
|
|
130
123
|
providerAddCustom: { zh: '新增自定义提供商', en: 'Add Custom Provider' },
|
|
124
|
+
providerTemplatePickerTitle: { zh: '选择提供商模板', en: 'Choose a provider template' },
|
|
131
125
|
providerDelete: { zh: '删除该提供商', en: 'Delete Provider' },
|
|
132
|
-
providerDeleteConfirm: { zh: '
|
|
126
|
+
providerDeleteConfirm: { zh: '确认删除这个提供商吗?删除后不可恢复。', en: 'Delete this provider? This action cannot be undone.' },
|
|
133
127
|
providersSelectPlaceholder: { zh: '选择提供商', en: 'Select Provider' },
|
|
134
128
|
providersSelectTitle: { zh: '选择左侧提供商开始配置', en: 'Select a provider from the left to configure' },
|
|
135
129
|
providersSelectDescription: { zh: '你可以连续切换多个提供商并逐个保存配置。', en: 'Switch between providers continuously and save each configuration.' },
|
|
@@ -198,6 +192,10 @@ export const LABELS: Record<string, { zh: string; en: string }> = {
|
|
|
198
192
|
providerModelThinkingDefault: { zh: '默认思考档位', en: 'Default Thinking Level' },
|
|
199
193
|
providerModelThinkingDefaultNone: { zh: '无默认(回落 off)', en: 'No default (fallback off)' },
|
|
200
194
|
providerModelThinkingNoSupported: { zh: '请先至少选择一个支持档位。', en: 'Select at least one supported level first.' },
|
|
195
|
+
providerModelInvalidProviderPrefix: {
|
|
196
|
+
zh: '模型 ID 不能使用其他 provider 前缀。',
|
|
197
|
+
en: 'Model id cannot use another provider prefix.'
|
|
198
|
+
},
|
|
201
199
|
providerDisplayNameHelpShort: { zh: '便于区分多个自定义提供商', en: 'Helps distinguish multiple custom providers' },
|
|
202
200
|
providerApiBaseHelpShort: { zh: '一般只需填写域名,系统自动补全路径', en: 'Usually just the domain; path auto-appended' },
|
|
203
201
|
providerExtraHeadersHelpShort: { zh: '可选,用于自定义鉴权等场景', en: 'Optional, for custom auth etc.' },
|
|
@@ -25,6 +25,8 @@ export const MARKETPLACE_LABELS = {
|
|
|
25
25
|
marketplaceDisabling: { zh: '禁用中...', en: 'Disabling...' },
|
|
26
26
|
marketplaceUninstall: { zh: '卸载', en: 'Uninstall' },
|
|
27
27
|
marketplaceRemoving: { zh: '卸载中...', en: 'Removing...' },
|
|
28
|
+
marketplaceUpdate: { zh: '更新', en: 'Update' },
|
|
29
|
+
marketplaceUpdating: { zh: '更新中...', en: 'Updating...' },
|
|
28
30
|
marketplaceSectionSkills: { zh: '技能列表', en: 'Skill Catalog' },
|
|
29
31
|
marketplaceMcpSectionCatalog: { zh: 'MCP 列表', en: 'MCP Catalog' },
|
|
30
32
|
marketplaceMcpSectionInstalled: { zh: '已安装 MCP', en: 'Installed MCP' },
|
|
@@ -45,6 +47,7 @@ export const MARKETPLACE_LABELS = {
|
|
|
45
47
|
marketplaceEnableSuccess: { zh: '启用成功', en: 'Enabled successfully' },
|
|
46
48
|
marketplaceDisableSuccess: { zh: '禁用成功', en: 'Disabled successfully' },
|
|
47
49
|
marketplaceUninstallSuccess: { zh: '卸载成功', en: 'Uninstalled successfully' },
|
|
50
|
+
marketplaceUpdateSuccess: { zh: '更新成功', en: 'Updated successfully' },
|
|
48
51
|
marketplaceMcpManageSuccess: { zh: 'MCP 操作成功', en: 'MCP operation completed' },
|
|
49
52
|
marketplaceInstallFailed: { zh: '安装失败', en: 'Install failed' },
|
|
50
53
|
marketplaceOperationFailed: { zh: '操作失败', en: 'Operation failed' },
|
|
@@ -13,6 +13,10 @@ export const DOC_BROWSER_LABELS = {
|
|
|
13
13
|
docBrowserHomeTitle: { zh: '导航页', en: 'Start Page' },
|
|
14
14
|
docBrowserCloseTab: { zh: '关闭标签', en: 'Close Tab' },
|
|
15
15
|
docBrowserTabUntitled: { zh: '未命名', en: 'Untitled' },
|
|
16
|
+
sideDockPinCurrent: { zh: '固定到快捷栏', en: 'Pin to SideDock' },
|
|
17
|
+
sideDockUnpinCurrent: { zh: '从快捷栏移除', en: 'Remove from SideDock' },
|
|
18
|
+
sideDockBuiltInDocked: { zh: '内置快捷入口', en: 'Built-in shortcut' },
|
|
19
|
+
sideDockUnpinItem: { zh: '移除快捷入口', en: 'Remove shortcut' },
|
|
16
20
|
appsTitle: { zh: '应用', en: 'Apps' },
|
|
17
21
|
panelAppsTitle: { zh: '面板应用', en: 'Panel Apps' },
|
|
18
22
|
panelAppsLoading: { zh: '加载面板应用中...', en: 'Loading panel apps...' },
|
|
@@ -42,8 +46,48 @@ export const DOC_BROWSER_LABELS = {
|
|
|
42
46
|
serviceAppsLoadFailed: { zh: '服务应用加载失败', en: 'Failed to load service apps' },
|
|
43
47
|
serviceAppsEmpty: { zh: '暂无服务应用', en: 'No service apps yet' },
|
|
44
48
|
serviceAppsRefresh: { zh: '刷新服务应用', en: 'Refresh service apps' },
|
|
45
|
-
serviceAppsDiscoverActions: { zh: '
|
|
46
|
-
|
|
49
|
+
serviceAppsDiscoverActions: { zh: '连接并发现动作', en: 'Connect and discover actions' },
|
|
50
|
+
serviceAppsDiscoverActionsHint: {
|
|
51
|
+
zh: '连接服务应用运行时,并发现它当前可用的动作。',
|
|
52
|
+
en: 'Connect to the service app runtime and discover its available actions.',
|
|
53
|
+
},
|
|
54
|
+
serviceAppsDisconnectRuntime: { zh: '断开连接', en: 'Disconnect runtime' },
|
|
55
|
+
serviceAppsDisconnectRuntimeHint: {
|
|
56
|
+
zh: '断开当前运行时连接,并将服务应用恢复为未连接状态。',
|
|
57
|
+
en: 'Close the current runtime connection and return the service app to not connected.',
|
|
58
|
+
},
|
|
59
|
+
serviceAppsMoreActions: { zh: '更多操作', en: 'More actions' },
|
|
60
|
+
serviceAppsDelete: { zh: '删除服务应用', en: 'Delete service app' },
|
|
61
|
+
serviceAppsDeleteConfirmTitle: { zh: '删除服务应用?', en: 'Delete service app?' },
|
|
62
|
+
serviceAppsDeleteConfirmDescription: {
|
|
63
|
+
zh: '这会删除服务应用目录,且无法撤销。',
|
|
64
|
+
en: 'This will delete the service app directory and cannot be undone.',
|
|
65
|
+
},
|
|
66
|
+
serviceAppsStatus_idle: { zh: '未连接', en: 'Not connected' },
|
|
67
|
+
serviceAppsStatus_starting: { zh: '连接中', en: 'Connecting' },
|
|
68
|
+
serviceAppsStatus_running: { zh: '已连接', en: 'Connected' },
|
|
69
|
+
serviceAppsStatus_failed: { zh: '连接失败', en: 'Connection failed' },
|
|
70
|
+
serviceAppsStatus_stopped: { zh: '已停止', en: 'Stopped' },
|
|
71
|
+
serviceAppsStatusHint_idle: {
|
|
72
|
+
zh: '运行时尚未连接;执行连接并发现动作会启动连接。',
|
|
73
|
+
en: 'The runtime is not connected yet; connecting and discovering actions will start it.',
|
|
74
|
+
},
|
|
75
|
+
serviceAppsStatusHint_starting: {
|
|
76
|
+
zh: '正在连接服务应用运行时。',
|
|
77
|
+
en: 'Connecting to the service app runtime.',
|
|
78
|
+
},
|
|
79
|
+
serviceAppsStatusHint_running: {
|
|
80
|
+
zh: '服务应用运行时已连接,可用于发现或调用动作。',
|
|
81
|
+
en: 'The service app runtime is connected and ready for action discovery or invocation.',
|
|
82
|
+
},
|
|
83
|
+
serviceAppsStatusHint_failed: {
|
|
84
|
+
zh: '运行时连接失败,请查看错误信息或断开连接后重试。',
|
|
85
|
+
en: 'The runtime connection failed; check the error or disconnect and try again.',
|
|
86
|
+
},
|
|
87
|
+
serviceAppsStatusHint_stopped: {
|
|
88
|
+
zh: '服务应用已停止。',
|
|
89
|
+
en: 'The service app is stopped.',
|
|
90
|
+
},
|
|
47
91
|
serviceAppsGrantedTo: { zh: '已授权给', en: 'Granted to' },
|
|
48
92
|
serviceAppsRevokeGrant: { zh: '撤销授权', en: 'Revoke grant' },
|
|
49
93
|
serviceAppsRuntimeState_matched: { zh: '已匹配', en: 'Matched' },
|