@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.
Files changed (142) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/dist/assets/api-BCDb13Uv.js +8 -0
  3. package/dist/assets/app-presenter-provider-C-QMjK7m.js +3 -0
  4. package/dist/assets/arrow-left-rIXFA2Zy.js +1 -0
  5. package/dist/assets/channels-list-page-DnqwsKGe.js +8 -0
  6. package/dist/assets/chat-page-CsQx20xL.js +105 -0
  7. package/dist/assets/config-split-page-BwhGqmUS.js +1 -0
  8. package/dist/assets/confirm-dialog-DBkKcQ1q.js +5 -0
  9. package/dist/assets/desktop-update-config-BE9KjiXi.js +1 -0
  10. package/dist/assets/{dist-CpwDZDtv.js → dist-BI0bX8jv.js} +1 -1
  11. package/dist/assets/dist-C8JRt-tf.js +1 -0
  12. package/dist/assets/doc-browser-context-VHUOIUXL.js +1 -0
  13. package/dist/assets/doc-browser-eqdNEerh.js +1 -0
  14. package/dist/assets/doc-browser-lpF_pyx4.js +1 -0
  15. package/dist/assets/ellipsis-C9VB2CxT.js +1 -0
  16. package/dist/assets/es2015-BCw3Q7nY.js +41 -0
  17. package/dist/assets/external-link-Bp7_4s9t.js +1 -0
  18. package/dist/assets/index-BCq7kbC8.css +1 -0
  19. package/dist/assets/index-DTdPDqto.js +101 -0
  20. package/dist/assets/key-round-Ccy6oND3.js +1 -0
  21. package/dist/assets/loader-circle-OpH4EErP.js +1 -0
  22. package/dist/assets/{mcp-marketplace-page-Dvi8mCBd.js → mcp-marketplace-page-B-GxKOqS.js} +2 -2
  23. package/dist/assets/mcp-marketplace-page-Dm-0-w51.js +1 -0
  24. package/dist/assets/model-config-BXPnV_7n.js +1 -0
  25. package/dist/assets/notice-card-Dsbkl7u7.js +1 -0
  26. package/dist/assets/play-CvgYhNbo.js +1 -0
  27. package/dist/assets/plus-DHcP-K1U.js +1 -0
  28. package/dist/assets/popover-BTLZE5Iz.js +1 -0
  29. package/dist/assets/provider-models-C_yOh6DE.js +1 -0
  30. package/dist/assets/provider-scoped-model-input-DKI9KN7N.js +1 -0
  31. package/dist/assets/providers-list-Bko6B7dE.js +1 -0
  32. package/dist/assets/react-BqS8oMyM.js +8 -0
  33. package/dist/assets/refresh-cw-BIaj7txb.js +1 -0
  34. package/dist/assets/remote-DHn_b8QU.js +1 -0
  35. package/dist/assets/rotate-cw-DMqSkRJQ.js +1 -0
  36. package/dist/assets/runtime-config-page-DX_wSK1J.js +1 -0
  37. package/dist/assets/save-BEoORten.js +1 -0
  38. package/dist/assets/search-COFh_SFI.js +1 -0
  39. package/dist/assets/{search-config-G2O1fcRb.js → search-config-DA5By-tE.js} +1 -1
  40. package/dist/assets/{secrets-config-TenzxYbE.js → secrets-config-eDxG7iN4.js} +2 -2
  41. package/dist/assets/{status-dot-BSMG7ZaC.js → status-dot-oWBjTovo.js} +1 -1
  42. package/dist/assets/{tabs-D1CjpWNX.js → tabs-CGaY0BVO.js} +1 -1
  43. package/dist/assets/{tabs-custom-CRSN1ekg.js → tabs-custom-D2fPYb4G.js} +1 -1
  44. package/dist/assets/{tag-chip-DEashiw6.js → tag-chip-TVkgofS1.js} +1 -1
  45. package/dist/assets/tooltip-BwHPKBv9.js +1 -0
  46. package/dist/assets/trash-2-D3psAGrz.js +1 -0
  47. package/dist/assets/x-CHAxzyp2.js +1 -0
  48. package/dist/index.html +25 -23
  49. package/dist/logos/mimo.svg +9 -0
  50. package/package.json +8 -8
  51. package/public/logos/mimo.svg +9 -0
  52. package/src/app/components/layout/app-layout.tsx +10 -2
  53. package/src/features/agents/components/agents-page.tsx +6 -4
  54. package/src/features/chat/components/chat-welcome.test.tsx +15 -0
  55. package/src/features/chat/components/chat-welcome.tsx +4 -7
  56. package/src/features/chat/hooks/use-ncp-chat-page-data.ts +17 -10
  57. package/src/features/marketplace/components/marketplace-list-card.tsx +22 -1
  58. package/src/features/marketplace/components/marketplace-page.tsx +3 -1
  59. package/src/features/marketplace/hooks/use-marketplace.ts +3 -1
  60. package/src/features/marketplace/utils/marketplace-installed-cache.utils.ts +8 -0
  61. package/src/features/right-panel-resources/configs/right-panel-resource-routes.config.ts +70 -6
  62. package/src/features/right-panel-resources/utils/right-panel-resource-route-resolver.utils.test.ts +25 -1
  63. package/src/features/right-panel-resources/utils/right-panel-resource-route-resolver.utils.ts +1 -1
  64. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.test.ts +42 -0
  65. package/src/features/right-panel-resources/utils/right-panel-resource-uri.utils.ts +22 -0
  66. package/src/features/service-apps/components/service-apps-panel.test.tsx +88 -0
  67. package/src/features/service-apps/components/service-apps-panel.tsx +246 -56
  68. package/src/features/service-apps/hooks/use-service-apps.ts +14 -0
  69. package/src/features/side-dock/components/side-dock.test.tsx +58 -3
  70. package/src/features/side-dock/components/side-dock.tsx +77 -24
  71. package/src/features/side-dock/configs/side-dock-built-in-items.config.ts +37 -34
  72. package/src/features/side-dock/index.ts +2 -0
  73. package/src/features/side-dock/managers/side-dock.manager.test.ts +84 -3
  74. package/src/features/side-dock/managers/side-dock.manager.ts +135 -12
  75. package/src/features/side-dock/types/side-dock.types.ts +11 -4
  76. package/src/features/side-dock/utils/side-dock-item.utils.test.ts +8 -8
  77. package/src/features/side-dock/utils/side-dock-item.utils.ts +13 -5
  78. package/src/platforms/desktop/components/desktop-app-shell.tsx +5 -2
  79. package/src/platforms/mobile/components/mobile-app-shell.tsx +4 -1
  80. package/src/shared/components/config/provider-form-support.test.ts +21 -0
  81. package/src/shared/components/config/provider-form-support.ts +38 -78
  82. package/src/shared/components/config/provider-form.tsx +54 -67
  83. package/src/shared/components/config/providers-list.tsx +211 -73
  84. package/src/shared/components/doc-browser/doc-browser-context.test.tsx +73 -0
  85. package/src/shared/components/doc-browser/doc-browser-context.tsx +3 -0
  86. package/src/shared/components/doc-browser/doc-browser-tab-strip.tsx +184 -98
  87. package/src/shared/components/doc-browser/doc-browser.test.tsx +168 -43
  88. package/src/shared/components/doc-browser/doc-browser.tsx +38 -7
  89. package/src/shared/components/doc-browser/index.ts +1 -0
  90. package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +30 -6
  91. package/src/shared/components/doc-browser/stores/doc-browser.store.ts +29 -0
  92. package/src/shared/components/doc-browser/types/doc-browser.types.ts +23 -0
  93. package/src/shared/components/doc-browser/utils/doc-browser-state.utils.ts +7 -0
  94. package/src/shared/components/model-config.tsx +5 -4
  95. package/src/shared/components/provider-auth-section.tsx +2 -2
  96. package/src/shared/components/ui/switch.tsx +5 -2
  97. package/src/shared/hooks/use-config.ts +27 -6
  98. package/src/shared/lib/api/marketplace.types.ts +193 -0
  99. package/src/shared/lib/api/types.ts +23 -200
  100. package/src/shared/lib/api/utils/config.utils.ts +17 -7
  101. package/src/shared/lib/i18n/index.ts +10 -12
  102. package/src/shared/lib/i18n/{marketplace.ts → marketplace-labels.utils.ts} +3 -0
  103. package/src/shared/lib/i18n/runtime/doc-browser-labels.utils.ts +46 -2
  104. package/src/shared/lib/provider-models/index.test.ts +93 -15
  105. package/src/shared/lib/provider-models/index.ts +35 -20
  106. package/src/shared/lib/transport/request-raw-api-response.utils.ts +1 -1
  107. package/dist/assets/api-DruAcori.js +0 -15
  108. package/dist/assets/app-presenter-provider-DIcnNB9s.js +0 -3
  109. package/dist/assets/book-open-CRotBOF2.js +0 -1
  110. package/dist/assets/boxes-BvA-I63l.js +0 -1
  111. package/dist/assets/channels-list-page-wK3l7p5R.js +0 -8
  112. package/dist/assets/chat-page-DgehvdJT.js +0 -105
  113. package/dist/assets/config-split-page-BnTO1mAM.js +0 -1
  114. package/dist/assets/confirm-dialog-CGrKHbAW.js +0 -5
  115. package/dist/assets/createLucideIcon-Br1EFMEr.js +0 -1
  116. package/dist/assets/desktop-update-config-CehWxSSg.js +0 -1
  117. package/dist/assets/dist-rzakR_bu.js +0 -41
  118. package/dist/assets/doc-browser-BgxmVsTx.js +0 -1
  119. package/dist/assets/doc-browser-CZn5-Qbu.js +0 -1
  120. package/dist/assets/doc-browser-context-B8gk7HMr.js +0 -1
  121. package/dist/assets/external-link-DHjFdCpy.js +0 -1
  122. package/dist/assets/index-DORmh0Cy.css +0 -1
  123. package/dist/assets/index-DcFpvnge.js +0 -101
  124. package/dist/assets/key-round-D41Oe35x.js +0 -1
  125. package/dist/assets/mcp-marketplace-page-DBLhJWOJ.js +0 -1
  126. package/dist/assets/model-config-B-EJXGtO.js +0 -1
  127. package/dist/assets/play-C-0vo7hi.js +0 -1
  128. package/dist/assets/plus-Cr_akLp2.js +0 -1
  129. package/dist/assets/popover-YieElO8c.js +0 -1
  130. package/dist/assets/provider-scoped-model-input-BPRNGqYn.js +0 -1
  131. package/dist/assets/providers-list-CtBpL1ZY.js +0 -1
  132. package/dist/assets/react-B2X_ph0a.js +0 -1
  133. package/dist/assets/remote-BGHbHoHf.js +0 -1
  134. package/dist/assets/rotate-cw-jueVCNJQ.js +0 -1
  135. package/dist/assets/runtime-config-page-C1Hv7mad.js +0 -1
  136. package/dist/assets/save-aYdSdK97.js +0 -1
  137. package/dist/assets/search-CdhgFNwf.js +0 -1
  138. package/dist/assets/setting-row-BNu0qhOM.js +0 -1
  139. package/dist/assets/trash-2-DSWTsARW.js +0 -1
  140. package/dist/assets/x-D1v_vb54.js +0 -1
  141. package/src/shared/components/provider-enabled-field.tsx +0 -23
  142. /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 ProviderConfigView = {
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 = { name: string; provider: ProviderConfigView };
96
- export type ProviderDeleteResult = { deleted: boolean; provider: string };
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 ProviderSpecView = {
545
- name: string;
554
+ export type ProviderTemplateView = {
555
+ id: string;
556
+ providerType: string;
546
557
  displayName?: string;
547
- isCustom?: boolean;
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 MarketplaceItemType = 'skill' | 'mcp';
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.config.updateProvider(provider, data);
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.config.createProvider(data);
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.config.deleteProvider(provider);
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.config.testProviderConnection(provider, data);
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.config.startProviderAuth(provider, data);
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.config.pollProviderAuth(provider, data);
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.config.importProviderAuthFromCli(provider);
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: '确认删除这个自定义提供商吗?删除后不可恢复。', en: 'Delete this custom provider? This action cannot be undone.' },
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: '发现运行时动作', en: 'Discover runtime actions' },
46
- serviceAppsRestart: { zh: '重启服务应用', en: 'Restart service app' },
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' },