vue-agent-start 0.1.0

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 (169) hide show
  1. package/package.json +30 -0
  2. package/pnpm-workspace.yaml +3 -0
  3. package/src/agent-flow/adapter/backend.ts +99 -0
  4. package/src/agent-flow/components/ChatIframePanel.vue +773 -0
  5. package/src/agent-flow/components/DatasetItemCard.vue +313 -0
  6. package/src/agent-flow/components/MemoryWindow.vue +104 -0
  7. package/src/agent-flow/components/PromptEditor.vue +804 -0
  8. package/src/agent-flow/components/PromptEditorTagPanel.vue +460 -0
  9. package/src/agent-flow/components/SvgIcon.vue +32 -0
  10. package/src/agent-flow/components/ToolItemCard.vue +169 -0
  11. package/src/agent-flow/components/VariableCard.vue +161 -0
  12. package/src/agent-flow/components/VariableSelector.vue +162 -0
  13. package/src/agent-flow/components/chat-iframe-types.ts +35 -0
  14. package/src/agent-flow/components/stubs/DatasetChooser.vue +70 -0
  15. package/src/agent-flow/components/stubs/Embedding.vue +22 -0
  16. package/src/agent-flow/components/stubs/ModelSelect.vue +24 -0
  17. package/src/agent-flow/components/stubs/RestfulSelectCard.vue +24 -0
  18. package/src/agent-flow/components/stubs/ToolChooser.vue +96 -0
  19. package/src/agent-flow/components/stubs/TriggersItemCard.vue +126 -0
  20. package/src/agent-flow/components/stubs/VariableModal.vue +115 -0
  21. package/src/agent-flow/index.ts +73 -0
  22. package/src/agent-flow/stores/workflow.ts +72 -0
  23. package/src/agent-flow/utils/langUtils.ts +173 -0
  24. package/src/agent-flow/workflow/Ability.vue +65 -0
  25. package/src/agent-flow/workflow/AuthorizationItem.vue +101 -0
  26. package/src/agent-flow/workflow/ConversationVar.vue +42 -0
  27. package/src/agent-flow/workflow/CustomEdge.vue +94 -0
  28. package/src/agent-flow/workflow/EnvironmentVar.vue +40 -0
  29. package/src/agent-flow/workflow/FlowDesigner.vue +2802 -0
  30. package/src/agent-flow/workflow/Icon.vue +179 -0
  31. package/src/agent-flow/workflow/NodeConfig.vue +509 -0
  32. package/src/agent-flow/workflow/NodeConfigCard.vue +460 -0
  33. package/src/agent-flow/workflow/NodeHandle.vue +147 -0
  34. package/src/agent-flow/workflow/NodeHeaderToolbar.vue +77 -0
  35. package/src/agent-flow/workflow/NodeHoverToolbar.vue +176 -0
  36. package/src/agent-flow/workflow/OutputItemCard.vue +668 -0
  37. package/src/agent-flow/workflow/ParamTableItem.vue +200 -0
  38. package/src/agent-flow/workflow/StructTable.vue +202 -0
  39. package/src/agent-flow/workflow/VarInsertField.vue +517 -0
  40. package/src/agent-flow/workflow/VarSelectField.vue +223 -0
  41. package/src/agent-flow/workflow/VariableSelectorItem.vue +48 -0
  42. package/src/agent-flow/workflow/WfField.vue +206 -0
  43. package/src/agent-flow/workflow/_config-base.css +470 -0
  44. package/src/agent-flow/workflow/composables/useNode.js +55 -0
  45. package/src/agent-flow/workflow/index.vue +53 -0
  46. package/src/agent-flow/workflow/nodeCard/AgentNodeCard.vue +180 -0
  47. package/src/agent-flow/workflow/nodeCard/AnswerNodeCard.vue +65 -0
  48. package/src/agent-flow/workflow/nodeCard/ClassifierCard.vue +152 -0
  49. package/src/agent-flow/workflow/nodeCard/CodeNodeCard.vue +139 -0
  50. package/src/agent-flow/workflow/nodeCard/ConditionNodeCard.vue +323 -0
  51. package/src/agent-flow/workflow/nodeCard/DocumentExtractorCard.vue +83 -0
  52. package/src/agent-flow/workflow/nodeCard/EndNodeCard.vue +123 -0
  53. package/src/agent-flow/workflow/nodeCard/HttpNodeCard.vue +451 -0
  54. package/src/agent-flow/workflow/nodeCard/HumanInputCard.vue +152 -0
  55. package/src/agent-flow/workflow/nodeCard/IterationCard.vue +66 -0
  56. package/src/agent-flow/workflow/nodeCard/KnowledgeRetrievalCard.vue +48 -0
  57. package/src/agent-flow/workflow/nodeCard/LLMNodeCard.vue +206 -0
  58. package/src/agent-flow/workflow/nodeCard/ListOperatorCard.vue +188 -0
  59. package/src/agent-flow/workflow/nodeCard/ParameterExtractorCard.vue +352 -0
  60. package/src/agent-flow/workflow/nodeCard/ServiceApiNodeCard.vue +188 -0
  61. package/src/agent-flow/workflow/nodeCard/StartNodeCard.vue +216 -0
  62. package/src/agent-flow/workflow/nodeCard/VariableAssignerCard.vue +125 -0
  63. package/src/agent-flow/workflow/nodeCard/VariableNodeCard.vue +121 -0
  64. package/src/agent-flow/workflow/nodes/AgentNode.vue +122 -0
  65. package/src/agent-flow/workflow/nodes/AnswerNode.vue +99 -0
  66. package/src/agent-flow/workflow/nodes/ClassifierNode.vue +199 -0
  67. package/src/agent-flow/workflow/nodes/CodeNode.vue +152 -0
  68. package/src/agent-flow/workflow/nodes/ConditionNode.vue +232 -0
  69. package/src/agent-flow/workflow/nodes/DocumentExtractorNode.vue +96 -0
  70. package/src/agent-flow/workflow/nodes/EndNode.vue +119 -0
  71. package/src/agent-flow/workflow/nodes/FileUploadNode.vue +97 -0
  72. package/src/agent-flow/workflow/nodes/HttpNode.vue +204 -0
  73. package/src/agent-flow/workflow/nodes/HumanInputNode.vue +110 -0
  74. package/src/agent-flow/workflow/nodes/IterationNode.vue +98 -0
  75. package/src/agent-flow/workflow/nodes/KnowledgeRetrievalNode.vue +253 -0
  76. package/src/agent-flow/workflow/nodes/LLMNode.vue +134 -0
  77. package/src/agent-flow/workflow/nodes/ListOperatorNode.vue +111 -0
  78. package/src/agent-flow/workflow/nodes/LoopNode.vue +94 -0
  79. package/src/agent-flow/workflow/nodes/ParameterExtractorNode.vue +147 -0
  80. package/src/agent-flow/workflow/nodes/ServiceApiNode.vue +161 -0
  81. package/src/agent-flow/workflow/nodes/StartNode.vue +199 -0
  82. package/src/agent-flow/workflow/nodes/TemplateNode.vue +103 -0
  83. package/src/agent-flow/workflow/nodes/UserInputNode.vue +92 -0
  84. package/src/agent-flow/workflow/nodes/VariableAssignerNode.vue +145 -0
  85. package/src/agent-flow/workflow/nodes/VariableNode.vue +130 -0
  86. package/src/agent-flow/workflow/nodes/_node-base.css +338 -0
  87. package/src/agent-flow/workflow/utils/node_card_form.ts +335 -0
  88. package/src/agent-flow/workflow/utils/node_config.ts +63 -0
  89. package/src/agent-flow/workflow/utils/workflow_utils.ts +151 -0
  90. package/src/agent-studio/adapters/springAgentStart.ts +390 -0
  91. package/src/agent-studio/api/index.ts +1 -0
  92. package/src/agent-studio/api/types.ts +173 -0
  93. package/src/agent-studio/components/AgentApiDocs.vue +500 -0
  94. package/src/agent-studio/components/AgentAppsPage.vue +1601 -0
  95. package/src/agent-studio/components/AgentCardGrid.vue +259 -0
  96. package/src/agent-studio/components/AgentChatPage.vue +553 -0
  97. package/src/agent-studio/components/AgentDebugPanel.vue +350 -0
  98. package/src/agent-studio/components/AgentLogsPanel.vue +391 -0
  99. package/src/agent-studio/components/AgentMonitorPanel.vue +204 -0
  100. package/src/agent-studio/components/AgentOrchestrate.vue +505 -0
  101. package/src/agent-studio/components/AgentPromptEditor.vue +237 -0
  102. package/src/agent-studio/components/AgentStudioShell.vue +227 -0
  103. package/src/agent-studio/components/AgentToolsPanel.vue +394 -0
  104. package/src/agent-studio/components/AgentVariablesPanel.vue +205 -0
  105. package/src/agent-studio/components/ApiKeyManager.vue +251 -0
  106. package/src/agent-studio/components/AppDesignDrawer.vue +3391 -0
  107. package/src/agent-studio/components/CreateAppModal.vue +737 -0
  108. package/src/agent-studio/components/SparkChart.vue +200 -0
  109. package/src/agent-studio/components/VariableEditorModal.vue +499 -0
  110. package/src/agent-studio/composables/useAgentStudio.ts +347 -0
  111. package/src/agent-studio/index.ts +60 -0
  112. package/src/agent-studio/panels/DrawerFlowDesigner.vue +203 -0
  113. package/src/agent-studio/panels/LogAnnotationPanel.vue +490 -0
  114. package/src/agent-studio/panels/MonitorPanel.vue +535 -0
  115. package/src/agent-studio/types.ts +242 -0
  116. package/src/index.ts +155 -0
  117. package/src/knowledge-hub/adapters/springAgentStart.ts +472 -0
  118. package/src/knowledge-hub/components/AddDocumentsWizard.vue +1452 -0
  119. package/src/knowledge-hub/components/CreateDatasetWizard.vue +1723 -0
  120. package/src/knowledge-hub/components/DatasetCardGrid.vue +467 -0
  121. package/src/knowledge-hub/components/DatasetDetailDrawer.vue +888 -0
  122. package/src/knowledge-hub/components/DatasetPicker.vue +65 -0
  123. package/src/knowledge-hub/components/DatasetPickerModal.vue +526 -0
  124. package/src/knowledge-hub/components/DatasetSettingsPanel.vue +908 -0
  125. package/src/knowledge-hub/components/DatasetSidebar.vue +781 -0
  126. package/src/knowledge-hub/components/DocumentChunksView.vue +802 -0
  127. package/src/knowledge-hub/components/DocumentTable.vue +552 -0
  128. package/src/knowledge-hub/components/HitTestingPanel.vue +74 -0
  129. package/src/knowledge-hub/components/KnowledgeApp.vue +66 -0
  130. package/src/knowledge-hub/components/KnowledgeHubApp.vue +504 -0
  131. package/src/knowledge-hub/components/RecallTestingPanelV2.vue +515 -0
  132. package/src/knowledge-hub/components/RetrievalConfigPopover.vue +270 -0
  133. package/src/knowledge-hub/components/RetrievalMethodPicker.vue +547 -0
  134. package/src/knowledge-hub/components/RetrievedList.vue +24 -0
  135. package/src/knowledge-hub/components/internal/KhDialog.vue +195 -0
  136. package/src/knowledge-hub/composables/useKnowledge.ts +89 -0
  137. package/src/knowledge-hub/i18n/index.ts +2 -0
  138. package/src/knowledge-hub/i18n/messages.ts +422 -0
  139. package/src/knowledge-hub/i18n/useKhI18n.ts +107 -0
  140. package/src/knowledge-hub/index.ts +46 -0
  141. package/src/knowledge-hub/styles/index.css +4 -0
  142. package/src/knowledge-hub/styles/tokens.css +138 -0
  143. package/src/knowledge-hub/types/api.ts +213 -0
  144. package/src/knowledge-hub/types/dataset.ts +88 -0
  145. package/src/knowledge-hub/types/document.ts +45 -0
  146. package/src/knowledge-hub/types/index.ts +9 -0
  147. package/src/knowledge-hub/types/retrieval.ts +46 -0
  148. package/src/provider-hub/components/CredentialForm.vue +103 -0
  149. package/src/provider-hub/components/DefaultModelsPanel.vue +270 -0
  150. package/src/provider-hub/components/GroupedModelSelect.vue +445 -0
  151. package/src/provider-hub/components/ModelCardGrid.vue +332 -0
  152. package/src/provider-hub/components/ModelParameterDrawer.vue +739 -0
  153. package/src/provider-hub/components/ModelPickerPopover.vue +1282 -0
  154. package/src/provider-hub/components/ProviderApp.vue +159 -0
  155. package/src/provider-hub/components/ProviderCredentialModal.vue +321 -0
  156. package/src/provider-hub/components/ProviderGallery.vue +131 -0
  157. package/src/provider-hub/components/ProviderHubShell.vue +1992 -0
  158. package/src/provider-hub/components/ProviderIcon.vue +130 -0
  159. package/src/provider-hub/composables/useProviderHub.ts +358 -0
  160. package/src/provider-hub/index.ts +43 -0
  161. package/src/provider-hub/svg/MiniMax.svg +1 -0
  162. package/src/provider-hub/svg/Volcengine.svg +1 -0
  163. package/src/provider-hub/svg/Zhipu.svg +1 -0
  164. package/src/provider-hub/svg/deepseek.svg +1 -0
  165. package/src/provider-hub/svg/moonshot.svg +1 -0
  166. package/src/provider-hub/svg/openai.svg +1 -0
  167. package/src/provider-hub/svg/qwen.svg +1 -0
  168. package/src/provider-hub/svg/siliconflow.svg +1 -0
  169. package/src/provider-hub/types.ts +256 -0
@@ -0,0 +1,130 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * ProviderIcon — brand SVG for each model provider.
4
+ *
5
+ * Resolution order (first match wins):
6
+ * 1. {@code svg} — raw SVG markup, typically the {@code svg_icon} column
7
+ * the backend returns for user-defined providers.
8
+ * 2. {@code iconUrl} — direct URL, e.g. {@code /api/agent-start/providers/{name}/icon}
9
+ * or a CDN link.
10
+ * 3. Built-in file — a matching {@code ../svg/<name>.svg} discovered at
11
+ * build time via {@code import.meta.glob}.
12
+ * 4. Fallback tile — neutral gray rounded-square with the first letter.
13
+ *
14
+ * Raw SVG markup is emitted as a {@code data:image/svg+xml} URL and rendered
15
+ * through {@code <img>}. Browsers load SVGs referenced by {@code <img>} in
16
+ * "image mode", which disables scripts, external references, and event
17
+ * handlers — so DB-sourced markup cannot execute XSS.
18
+ */
19
+ import { computed } from 'vue';
20
+
21
+ interface Props {
22
+ /** Provider name — case-insensitive, matches ModelProvider.getName(). */
23
+ name: string;
24
+ /** Rendered pixel size (both width and height). */
25
+ size?: number | string;
26
+ /** Optional radius override. Defaults to 6. */
27
+ radius?: number;
28
+ /** Raw SVG markup, e.g. the backend {@code svg_icon} field. */
29
+ svg?: string;
30
+ /** Direct icon URL, e.g. {@code /api/agent-start/providers/{name}/icon}. */
31
+ iconUrl?: string;
32
+ }
33
+
34
+ const props = withDefaults(defineProps<Props>(), { size: 32 });
35
+
36
+ // Eagerly resolve every SVG under ../svg/ to a URL string. Vite returns a
37
+ // map like { "../svg/openai.svg": "/assets/openai.<hash>.svg", ... }; we
38
+ // re-key it by lowercased filename (no extension) for O(1) lookup.
39
+ const svgUrlModules = import.meta.glob('../svg/*.svg', {
40
+ eager: true,
41
+ query: '?url',
42
+ import: 'default',
43
+ }) as Record<string, string>;
44
+
45
+ const builtinIcons: Record<string, string> = {};
46
+ for (const [path, url] of Object.entries(svgUrlModules)) {
47
+ const file = path.split('/').pop() ?? '';
48
+ const stem = file.replace(/\.svg$/i, '').toLowerCase();
49
+ builtinIcons[stem] = url;
50
+ }
51
+
52
+ // Provider names in the DB may differ from filenames. Everything on the right
53
+ // must exist in builtinIcons (otherwise the alias silently falls back to the
54
+ // letter tile, which is still fine).
55
+ const aliases: Record<string, string> = {
56
+ claude: 'anthropic',
57
+ google: 'gemini',
58
+ 'azure-openai': 'azure',
59
+ 'amazon-bedrock': 'bedrock',
60
+ };
61
+
62
+ const key = computed(() => (props.name || '').toLowerCase());
63
+
64
+ const svgDataUrl = computed(() => {
65
+ const raw = props.svg?.trim();
66
+ if (!raw) return null;
67
+ // Strip XML prolog / doctype — they're valid in files but noisy inside a
68
+ // data URL and some browsers dislike doctype in <img> sources.
69
+ const cleaned = raw
70
+ .replace(/^<\?xml[^?]*\?>\s*/i, '')
71
+ .replace(/<!DOCTYPE[^>]*>\s*/i, '');
72
+ return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(cleaned)}`;
73
+ });
74
+
75
+ const resolvedUrl = computed(() => {
76
+ if (svgDataUrl.value) return svgDataUrl.value;
77
+ if (props.iconUrl) return props.iconUrl;
78
+ const k = key.value;
79
+ return builtinIcons[k] ?? builtinIcons[aliases[k] ?? ''] ?? null;
80
+ });
81
+
82
+ const radius = computed(() => props.radius ?? 6);
83
+ const fallbackChar = computed(() =>
84
+ props.name ? props.name[0]!.toUpperCase() : '?',
85
+ );
86
+ </script>
87
+
88
+ <template>
89
+ <img
90
+ v-if="resolvedUrl"
91
+ :src="resolvedUrl"
92
+ :width="size"
93
+ :height="size"
94
+ :alt="name"
95
+ class="provider-icon"
96
+ :style="{ borderRadius: `${radius}px` }"
97
+ loading="lazy"
98
+ decoding="async"
99
+ />
100
+
101
+ <svg
102
+ v-else
103
+ :width="size"
104
+ :height="size"
105
+ viewBox="0 0 32 32"
106
+ role="img"
107
+ :aria-label="name"
108
+ >
109
+ <rect width="32" height="32" :rx="radius" fill="#475569" />
110
+ <text
111
+ x="16"
112
+ y="21"
113
+ text-anchor="middle"
114
+ font-family="ui-sans-serif, system-ui, sans-serif"
115
+ font-size="15"
116
+ font-weight="700"
117
+ fill="#fff"
118
+ >
119
+ {{ fallbackChar }}
120
+ </text>
121
+ </svg>
122
+ </template>
123
+
124
+ <style scoped>
125
+ .provider-icon {
126
+ display: inline-block;
127
+ object-fit: contain;
128
+ vertical-align: middle;
129
+ }
130
+ </style>
@@ -0,0 +1,358 @@
1
+ /**
2
+ * Tiny fetch-based client — mirrors knowledge-hub. Doesn't take a hard dep on
3
+ * axios so the module can be pulled into any Vue 3 app.
4
+ */
5
+ import type {
6
+ CatalogRow,
7
+ GroupedProviderView,
8
+ ModelEntity,
9
+ ModelParameters,
10
+ ModelRegistration,
11
+ ModelTestResult,
12
+ ModelType,
13
+ ProviderCredentialInfo,
14
+ ProviderDefinition,
15
+ ProviderView,
16
+ RemoteModel,
17
+ } from '../types';
18
+
19
+ // `/agent-start` 是 spring-agent-web 给每个控制器加的固定命名空间前缀,属于
20
+ // 组件与后端约定的实现细节,宿主不用关心 —— 组件内部自己拼上就行。宿主
21
+ // 只需要告诉我们它转发到后端的代理前缀(默认 `/api`)。若代理不叫 /api,
22
+ // 传自定义 apiBase 或调 setProviderHubApiBase() 覆盖。
23
+ const AGENT_START_NAMESPACE = '/agent-start';
24
+ let apiBase = '/api';
25
+
26
+ /**
27
+ * 追加到每个请求的 header。传函数会在每次请求前重新求值,方便宿主接入
28
+ * pinia store 里的 access-token —— 登录/退出时不用重挂 composable。
29
+ */
30
+ export type HeadersLike =
31
+ | Record<string, string>
32
+ | (() => Promise<Record<string, string>> | Record<string, string>);
33
+
34
+ let headersProvider: () => Promise<Record<string, string>> | Record<string, string> = () => ({});
35
+
36
+ export function setProviderHubApiBase(base: string) {
37
+ apiBase = base.replace(/\/+$/, '');
38
+ }
39
+
40
+ /**
41
+ * 设置每次请求都会拼上的 header(如 Authorization)。示例:
42
+ * setProviderHubHeaders(() => ({
43
+ * Authorization: `Bearer ${useAccessStore().accessToken}`,
44
+ * }));
45
+ */
46
+ export function setProviderHubHeaders(headers: HeadersLike) {
47
+ headersProvider = typeof headers === 'function' ? headers : () => headers;
48
+ }
49
+
50
+ function buildUrl(path: string): string {
51
+ return `${apiBase}${AGENT_START_NAMESPACE}${path.startsWith('/') ? '' : '/'}${path}`;
52
+ }
53
+
54
+ async function resolveHeaders(): Promise<Record<string, string>> {
55
+ return (await headersProvider()) ?? {};
56
+ }
57
+
58
+ interface Envelope<T> {
59
+ code: string;
60
+ message?: string;
61
+ data: T;
62
+ }
63
+
64
+ async function call<T>(path: string, init: RequestInit = {}): Promise<T> {
65
+ const injected = await resolveHeaders();
66
+ const res = await fetch(buildUrl(path), {
67
+ headers: {
68
+ 'Content-Type': 'application/json',
69
+ ...injected,
70
+ ...(init.headers ?? {}),
71
+ },
72
+ ...init,
73
+ });
74
+ if (!res.ok) {
75
+ // Try to unwrap a JSON error body — the backend returns {code, message}
76
+ // even for 4xx/5xx via GlobalExceptionHandler, and the human-readable
77
+ // message is worth surfacing (e.g. "Invalid API key" from OpenAI itself).
78
+ let msg = `${res.status} ${res.statusText}`;
79
+ try {
80
+ const body = await res.json();
81
+ if (body?.message) msg = body.message;
82
+ } catch {
83
+ // ignore parse errors
84
+ }
85
+ throw new Error(msg);
86
+ }
87
+ const env = (await res.json()) as Envelope<T>;
88
+ if (env.code !== 'ok') {
89
+ throw new Error(env.message ?? env.code);
90
+ }
91
+ return env.data;
92
+ }
93
+
94
+ function qs(params: Record<string, string | undefined>): string {
95
+ const q = new URLSearchParams();
96
+ for (const [k, v] of Object.entries(params)) {
97
+ if (v !== undefined && v !== '') q.set(k, v);
98
+ }
99
+ const s = q.toString();
100
+ return s ? `?${s}` : '';
101
+ }
102
+
103
+ export function useProviderHub() {
104
+ return {
105
+ // ------- providers (tenant-aware — pass tenantId to get "configured" flags)
106
+ listProviders: (tenantId?: string) =>
107
+ call<ProviderView[]>(`/model-providers${qs({ tenantId })}`),
108
+ getProvider: (name: string, tenantId?: string) =>
109
+ call<ProviderView>(
110
+ `/model-providers/${encodeURIComponent(name)}${qs({ tenantId })}`,
111
+ ),
112
+
113
+ // ------- provider-level credential (Dify-parity "one key per provider")
114
+ getProviderCredential: (name: string, tenantId?: string) =>
115
+ call<ProviderCredentialInfo>(
116
+ `/model-providers/${encodeURIComponent(name)}/credential${qs({ tenantId })}`,
117
+ ),
118
+ saveProviderCredential: (
119
+ name: string,
120
+ credentials: Record<string, unknown>,
121
+ tenantId?: string,
122
+ ) =>
123
+ call<ProviderCredentialInfo>(
124
+ `/model-providers/${encodeURIComponent(name)}/credential`,
125
+ {
126
+ method: 'PUT',
127
+ body: JSON.stringify({ tenantId, credentials }),
128
+ },
129
+ ),
130
+ deleteProviderCredential: (name: string, tenantId?: string) =>
131
+ call<void>(
132
+ `/model-providers/${encodeURIComponent(name)}/credential${qs({ tenantId })}`,
133
+ { method: 'DELETE' },
134
+ ),
135
+
136
+ // ------- remote-model discovery (non-destructive peek at the vendor catalog)
137
+ listRemoteModels: (name: string, tenantId?: string) =>
138
+ call<RemoteModel[]>(
139
+ `/model-providers/${encodeURIComponent(name)}/remote-models${qs({ tenantId })}`,
140
+ ),
141
+
142
+ /**
143
+ * "重新拉取": ask the backend to re-hit the vendor and return the raw list —
144
+ * <em>transient</em>, no DB writes. The caller merges the returned entries
145
+ * with its cached catalog; only user-enabled models get persisted as
146
+ * settings. This matches the user's requested design:
147
+ * "读取到的模型太多了 我只想存启用的到 DB,全部就直接掉接口获取"
148
+ */
149
+ refreshCatalog: (name: string, tenantId?: string) =>
150
+ call<RemoteModel[]>(
151
+ `/model-providers/${encodeURIComponent(name)}/refresh-catalog${qs({ tenantId })}`,
152
+ { method: 'POST' },
153
+ ),
154
+
155
+ // ------- installed-model CRUD
156
+ listModels: (tenantId?: string, type?: ModelType) =>
157
+ call<ModelEntity[]>(`/models${qs({ tenantId, type })}`),
158
+ registerModel: (req: ModelRegistration) =>
159
+ call<ModelEntity>('/models', {
160
+ method: 'POST',
161
+ body: JSON.stringify(req),
162
+ }),
163
+ updateCredentials: (id: string, patch: Record<string, unknown>) =>
164
+ call<ModelEntity>(`/models/${id}/credentials`, {
165
+ method: 'PUT',
166
+ body: JSON.stringify(patch),
167
+ }),
168
+ setDefault: (id: string) =>
169
+ call<void>(`/models/${id}/default`, { method: 'PUT' }),
170
+ /** Flip the {@code enabled} switch on a single row. Off rows stay in the catalog. */
171
+ setModelEnabled: (id: string, enabled: boolean) =>
172
+ call<ModelEntity>(`/models/${id}/enabled`, {
173
+ method: 'PATCH',
174
+ body: JSON.stringify({ enabled }),
175
+ }),
176
+ deleteModel: (id: string) =>
177
+ call<void>(`/models/${id}`, { method: 'DELETE' }),
178
+ validateModel: (req: ModelRegistration) =>
179
+ call<void>('/models/validate', {
180
+ method: 'POST',
181
+ body: JSON.stringify(req),
182
+ }),
183
+ testModel: (id: string) =>
184
+ call<ModelTestResult>(`/models/${id}/test`, { method: 'POST' }),
185
+
186
+ // ------- per-model parameters (Dify-parity parameter drawer)
187
+ /** Read current parameter values + the rules the UI should render. */
188
+ getModelParameters: (id: string) =>
189
+ call<ModelParameters>(`/models/${id}/parameters`),
190
+ /**
191
+ * Save a partial parameter patch. `null` values remove the override so the
192
+ * provider falls back to its own default.
193
+ */
194
+ saveModelParameters: (
195
+ id: string,
196
+ parameters: Record<string, boolean | null | number | string>,
197
+ ) =>
198
+ call<ModelParameters>(`/models/${id}/parameters`, {
199
+ method: 'PUT',
200
+ body: JSON.stringify(parameters),
201
+ }),
202
+
203
+ /** Tenant's default model per {@link ModelType}. Feeds the "系统默认模型" panel. */
204
+ listDefaults: (tenantId?: string) =>
205
+ call<Record<string, ModelEntity>>(`/models/defaults${qs({ tenantId })}`),
206
+
207
+ /**
208
+ * Enabled models grouped by ModelType → Provider → modelList. Feeds the
209
+ * "系统默认模型" panel's per-type &lt;a-select&gt; with opt-groups. Only
210
+ * providers with a saved credential + enabled models appear.
211
+ */
212
+ listModelsGroupedByType: (tenantId?: string) =>
213
+ call<Record<string, GroupedProviderView[]>>(
214
+ `/models/grouped-by-type${qs({ tenantId })}`,
215
+ ),
216
+
217
+ // ------- Dify-parity DB-driven metadata (new endpoints)
218
+ /**
219
+ * Unified catalog view for a provider: predefined DB rows + custom rows,
220
+ * each annotated with the tenant's enable / default state pulled from the
221
+ * new settings tables.
222
+ */
223
+ getProviderCatalog: (name: string, tenantId?: string) =>
224
+ call<CatalogRow[]>(
225
+ `/model-providers/${encodeURIComponent(name)}/catalog${qs({ tenantId })}`,
226
+ ),
227
+
228
+ /**
229
+ * Toggle a predefined model's enabled state by (provider, model, type).
230
+ * Writes to agent_provider_model_setting; missing row = enabled (Dify
231
+ * convention), so we only persist "off" flips.
232
+ */
233
+ setModelEnabledByName: (
234
+ providerName: string,
235
+ modelName: string,
236
+ modelType: ModelType,
237
+ enabled: boolean,
238
+ tenantId?: string,
239
+ ) =>
240
+ call<boolean>(
241
+ `/model-providers/${encodeURIComponent(providerName)}/models/${encodeURIComponent(modelName)}/enabled${qs({ modelType, tenantId })}`,
242
+ { method: 'PUT', body: JSON.stringify({ enabled }) },
243
+ ),
244
+
245
+ /** Set the tenant default model per model type (Dify-parity path). */
246
+ setModelDefaultByName: (
247
+ providerName: string,
248
+ modelName: string,
249
+ modelType: ModelType,
250
+ tenantId?: string,
251
+ ) =>
252
+ call<void>(
253
+ `/model-providers/${encodeURIComponent(providerName)}/models/${encodeURIComponent(modelName)}/default${qs({ modelType, tenantId })}`,
254
+ { method: 'PUT' },
255
+ ),
256
+
257
+ // ------- provider definition CRUD (extend supported providers via DB)
258
+ /** Available Java implementation bean keys — the pool a definition can point at. */
259
+ listImplementationKeys: () =>
260
+ call<string[]>('/model-provider-impls'),
261
+
262
+ createProviderDefinition: (payload: ProviderDefinition) =>
263
+ call<ProviderDefinition>('/model-provider-definitions', {
264
+ method: 'POST',
265
+ body: JSON.stringify(payload),
266
+ }),
267
+
268
+ updateProviderDefinition: (id: string, patch: Partial<ProviderDefinition>) =>
269
+ call<void>(`/model-provider-definitions/${encodeURIComponent(id)}`, {
270
+ method: 'PUT',
271
+ body: JSON.stringify(patch),
272
+ }),
273
+
274
+ deleteProviderDefinition: (id: string) =>
275
+ call<void>(`/model-provider-definitions/${encodeURIComponent(id)}`, {
276
+ method: 'DELETE',
277
+ }),
278
+
279
+ /**
280
+ * Extend a provider's predefined catalog — POST adds one row, keyed
281
+ * uniquely by (provider, model, model_type). Idempotent upsert.
282
+ */
283
+ addPredefinedModel: (
284
+ providerName: string,
285
+ payload: {
286
+ model: string;
287
+ label?: string;
288
+ modelType: ModelType;
289
+ contextLength?: number;
290
+ dimensions?: number;
291
+ features?: string[];
292
+ parameterRules?: Array<Record<string, unknown>>;
293
+ sortOrder?: number;
294
+ },
295
+ ) =>
296
+ call<Record<string, unknown>>(
297
+ `/model-providers/${encodeURIComponent(providerName)}/predefined-models`,
298
+ { method: 'POST', body: JSON.stringify(payload) },
299
+ ),
300
+
301
+ deletePredefinedModel: (providerName: string, id: string) =>
302
+ call<void>(
303
+ `/model-providers/${encodeURIComponent(providerName)}/predefined-models/${encodeURIComponent(id)}`,
304
+ { method: 'DELETE' },
305
+ ),
306
+ };
307
+ }
308
+
309
+ // Visual helpers — provider iconography lifted straight from the Dify default set
310
+ // so cards look right at first glance.
311
+ const PROVIDER_ICONS: Record<string, string> = {
312
+ deepseek: '🐳',
313
+ moonshot: '🌘',
314
+ ollama: '🦙',
315
+ openai: '🅾',
316
+ qwen: '🐫',
317
+ siliconflow: '🧪',
318
+ volcengine: '🌋',
319
+ zhipu: '🧠',
320
+ };
321
+
322
+ const PROVIDER_BGS: Record<string, string> = {
323
+ deepseek: '#EFF6FF',
324
+ moonshot: '#F1F5F9',
325
+ ollama: '#F5F3FF',
326
+ openai: '#F0FDF4',
327
+ qwen: '#FEF3C7',
328
+ siliconflow: '#FEF2F2',
329
+ volcengine: '#FEF3C7',
330
+ zhipu: '#EEF2FF',
331
+ };
332
+
333
+ export function providerIcon(name: string): string {
334
+ return PROVIDER_ICONS[name.toLowerCase()] ?? '🤖';
335
+ }
336
+
337
+ export function providerBg(name: string): string {
338
+ return PROVIDER_BGS[name.toLowerCase()] ?? '#F1F5F9';
339
+ }
340
+
341
+ export function modelTypeLabel(t: ModelType | string): string {
342
+ if (t === 'LLM') return 'LLM';
343
+ if (t === 'TEXT_EMBEDDING') return 'TEXT EMBEDDING';
344
+ if (t === 'RERANK') return 'RERANK';
345
+ if (t === 'SPEECH2TEXT') return 'SPEECH2TEXT';
346
+ if (t === 'TTS') return 'TTS';
347
+ if (t === 'MODERATION') return 'MODERATION';
348
+ if (t === 'IMAGE') return 'IMAGE';
349
+ return String(t);
350
+ }
351
+
352
+ export function modelTypeColor(t: ModelType | string): string {
353
+ if (t === 'LLM') return 'blue';
354
+ if (t === 'TEXT_EMBEDDING') return 'green';
355
+ if (t === 'RERANK') return 'orange';
356
+ if (t === 'SPEECH2TEXT' || t === 'TTS') return 'purple';
357
+ return 'default';
358
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @agent-start/provider-hub
3
+ *
4
+ * Reusable component + composable kit over the spring-agent-start model-provider
5
+ * REST API (/api/agent-start/models, /api/agent-start/model-providers).
6
+ *
7
+ * The primary surface is {@link ProviderHubShell} — a Dify-parity three-section
8
+ * settings page (模型列表 / 待配置 / 安装模型供应商) that internally uses
9
+ * {@link ProviderCredentialModal} for the "填 key 自动拉取" flow: user saves a single
10
+ * API key, the backend hits the vendor's /v1/models endpoint, and the user picks
11
+ * which models to bulk-register.
12
+ *
13
+ * The lower-level building blocks are kept exported so consumers who want a
14
+ * different layout (e.g. the studio "picker" popover) can compose their own:
15
+ *
16
+ * ProviderHubShell — top-level three-section shell (recommended)
17
+ * ProviderCredentialModal — save-and-fetch modal, standalone
18
+ * ProviderGallery — provider catalog grid, no state
19
+ * ModelCardGrid — model cards, grouped by provider
20
+ * ModelPickerPopover — bubble picker (search + grouped/collapsible),
21
+ * for workflow LLM nodes & app-studio top-right
22
+ * CredentialForm — schema-driven credential form
23
+ *
24
+ * useProviderHub() — thin fetch client (providers, credentials, sync, CRUD)
25
+ * setProviderHubApiBase() — override the base URL when embedding elsewhere.
26
+ *
27
+ * Consumers alias it as `@agent-start/provider-hub` (see vite.config.mts).
28
+ */
29
+
30
+ export { default as CredentialForm } from './components/CredentialForm.vue';
31
+ export { default as DefaultModelsPanel } from './components/DefaultModelsPanel.vue';
32
+ export { default as GroupedModelSelect } from './components/GroupedModelSelect.vue';
33
+ export type { GroupedModelSelectOption } from './components/GroupedModelSelect.vue';
34
+ export { default as ModelCardGrid } from './components/ModelCardGrid.vue';
35
+ export { default as ModelParameterDrawer } from './components/ModelParameterDrawer.vue';
36
+ export { default as ModelPickerPopover } from './components/ModelPickerPopover.vue';
37
+ export { default as ProviderCredentialModal } from './components/ProviderCredentialModal.vue';
38
+ export { default as ProviderGallery } from './components/ProviderGallery.vue';
39
+ export { default as ProviderHubShell } from './components/ProviderHubShell.vue';
40
+ export { default as ProviderIcon } from './components/ProviderIcon.vue';
41
+
42
+ export * from './composables/useProviderHub';
43
+ export * from './types';
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783648646685" class="icon" viewBox="0 0 1169 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12774" xmlns:xlink="http://www.w3.org/1999/xlink" width="228.3203125" height="200"><path d="M474.173841 470.682521V847.403039c-25.441562 127.572805-194.68465 94.674371-195.416638 2.192962-0.802986-116.24 0-231.750012 0-347.113027V368.697276c0-16.740712-3.654937-29.973484-18.275685-40.428305-28.512509-21.346633-62.725921 3.728936-63.456908 34.507407-1.608972 41.305289-0.804986 81.733594-1.608973 122.453893 0 32.167446 0 63.384909 0.730988 95.478357C175.164986 722.025196 3.947932 698.5576 0 581.512614V483.5493c0-32.021449 62.725921-39.551319 59.655973 8.406855-2.046965 23.759591-0.731987 48.25117-1.535973 71.791765-0.729987 42.036277 63.530907 70.32879 78.663646 1.607972 0.730987-56.658025 0.730987-113.31605 0.730988-170.486067 0-71.644767 20.32365-129.984763 96.282343-135.39467 32.898434-2.92395 54.757058 10.819814 75.738697 34.579405 8.042862 8.407855 27.049535 35.092396 27.781522 64.115897 0 26.75754 0.729987 53.368082 0.729987 80.418616 0 53.367082-0.729987 107.028158-0.729987 160.39724 0 34.579405 0.729987 68.792816 0.729987 102.568235 0 42.841263 0 86.267516-0.729987 129.180778-0.730987 55.78104 67.111845 54.977054 78.005658-0.876985 0-65.796868 0.729987-130.78875 0.729987-196.585618 0-162.078211-0.729987-324.157422-0.729987-486.163634 0-16.814711-2.33996-63.456908 6.579886-80.417617C469.274925-48.744541 613.003452 1.625592 614.319429 97.176948c2.777952 195.781631 0 393.756225 0.730988 589.975848 0 68.062829-55.269049 53.44208-58.338996 26.830538 0-204.188487 0-409.180959 0.729987-613.07745-2.703953-51.175119-78.589648-44.229239-82.976572-7.529871-1.461975 42.109275-0.729987 84.950538-1.461975 126.987815v250.025698h0.730987l0.511992 0.292995z" fill="#D4367A" p-id="12775"></path><path d="M696.347018 467.684573v276.638239-652.848766c24.709575-128.44779 193.880664-95.038365 194.611651-2.484957 0.803986 115.437014 0 231.677014 0.803986 347.040028 0 44.303238 0 88.752473-0.730987 133.055711 0 17.545698 4.312926 29.900486 19.007673 41.159292 27.780522 20.835641 61.921935-3.654937 63.456908-34.945399 1.535974-40.501303 0.731987-81.002606 0.731987-122.527892v-94.893367c21.200635-141.315568 191.906698-117.847972 195.488637-0.803986V711.645375c0 32.166447-61.994933 39.769316-59.216981-8.334857 1.680971-24.490579 0-304.930753 0.876985-329.49433 1.461975-41.305289-63.602906-70.402789-78.663647-0.876985v169.609081c0 72.66875-20.396649 130.057762-97.013331 136.271656-72.228757 1.680971-101.253258-48.25117-103.593217-98.695302V237.250538c0-43.645249 0-86.266516 0.731987-129.107779 0.729987-55.78004-67.112845-55.78004-78.663646 0.804986v767.626792c0 16.667713 2.33996 63.383909-5.921898 80.417616-47.300186 115.363015-191.7607 64.918883-193.076678-30.559474v-90.871437c3.582938-61.190947 55.269049-46.643197 57.609009-20.762642V922.631744c2.777952 51.321117 78.663646 45.107224 82.245585 7.602869 1.534974-42.109275 1.534974-84.146552 1.534973-127.059813V467.757571h-0.219996v-0.072998z" fill="#ED6D48" p-id="12776"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783648549550" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7643" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M865.956367 472.574425l-137.898207 539.176869a9.386635 9.386635 0 0 0 0 4.479985 10.026633 10.026633 0 0 0 9.983967 7.679975h275.625748a9.983967 9.983967 0 0 0 10.026633-12.15996l-138.495539-539.176869a10.154633 10.154633 0 0 0-19.327935 0M107.13223 594.771351L0.252586 1011.708628c-1.450662 6.399979 3.541322 12.373292 10.111966 12.159959h212.777958a10.239966 10.239966 0 0 0 8.106639-3.583988 9.727968 9.727968 0 0 0 1.877327-4.05332 9.386635 9.386635 0 0 0 0-4.479985l-106.879643-417.065276a9.813301 9.813301 0 0 0-3.583988-5.119983 10.239966 10.239966 0 0 0-11.946627 0 9.813301 9.813301 0 0 0-3.583988 5.119983v0.085333z" fill="#00E5E5" p-id="7644"></path><path d="M295.376936 249.471168l-194.559352 762.365459c-0.682664 2.901324 0.042667 5.973313 1.919994 8.319972 1.877327 2.346659 4.693318 3.797321 7.679974 3.839988h389.246703a10.111966 10.111966 0 0 0 10.069299-12.117293L314.662205 249.428502a9.813301 9.813301 0 0 0-3.669322-5.119983 10.239966 10.239966 0 0 0-11.946626 0 9.813301 9.813301 0 0 0-3.669321 5.119983" fill="#006EFF" p-id="7645"></path><path d="M631.07715 7.039977a9.813301 9.813301 0 0 0-3.583988-5.119983 10.239966 10.239966 0 0 0-11.946627 0 9.813301 9.813301 0 0 0-3.669321 5.119983l-265.983114 1004.79665a9.983967 9.983967 0 0 0 10.026634 12.03196H887.502962a10.197299 10.197299 0 0 0 10.026633-7.637308 10.197299 10.197299 0 0 0 0-4.479985L631.07715 7.039977z" fill="#006EFF" p-id="7646"></path><path d="M435.664468 360.318799L266.96103 1011.751294a9.983967 9.983967 0 0 0 10.026634 12.245293h336.638877a10.239966 10.239966 0 0 0 8.10664-3.711988 10.111966 10.111966 0 0 0 2.005327-8.533305l-168.831438-651.517828a10.239966 10.239966 0 0 0-9.599968-6.99731 10.239966 10.239966 0 0 0-9.599968 7.039976" fill="#00E5E5" p-id="7647"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783648598254" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9783" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M511.613122 1002.792439a10.239942 10.239942 0 0 0-10.410608 10.581274 10.239942 10.239942 0 0 0 10.410608 10.62394 10.261276 10.261276 0 0 0 10.453275-10.62394 10.239942 10.239942 0 0 0-9.386614-10.538607l-1.066661-0.042667z m-98.98611-773.883647a72.404926 72.404926 0 0 1 46.890403 90.964822l-3.029316 7.338625-0.682663 1.706657-0.767996 2.303988c-2.98665 6.826628-4.437308 13.653257-4.437308 21.24788-1.493325 30.293163 20.053221 54.57036 50.602382 56.063685h15.615912c55.850353 2.261321 99.754106 50.047718 97.535452 107.647394-2.218654 56.83168-49.151724 101.546095-105.727406 99.284775h-7.423958c-30.506495 0.767996-54.357028 27.306513-52.863703 58.367672 0 5.290637 0.767996 9.813278 2.261321 14.378585a73.55692 73.55692 0 0 0 40.95977 34.133142c31.99982 9.813278 64.724969-5.333303 81.06621-33.365146l0.767996-1.493325c17.151904-27.306513 49.919719-40.95977 81.919539-30.335829 36.437128 12.117265 58.794336 52.309039 46.890403 92.458146a70.847601 70.847601 0 0 1-88.618168 47.018403 73.002256 73.002256 0 0 1-38.698449-30.33583l-0.725329-1.493325c-8.533285-13.781256-19.754556-24.746527-36.309129-30.335829l-2.38932-0.767996a70.228938 70.228938 0 0 0-83.370198 31.829155 70.826268 70.826268 0 0 1-45.439744 32.59715 71.551598 71.551598 0 0 1-84.863523-54.57036c-8.917283-38.655783 14.165254-78.079561 53.631698-87.16751 4.159977-0.917328 8.383953-1.407992 12.629263-1.493325h0.767995c29.01317-3.029316 49.109057-26.538517 47.615732-56.874347a55.743686 55.743686 0 0 0-9.685278-29.567833 107.327396 107.327396 0 0 1-15.615913-59.860997 101.97276 101.97276 0 0 1 15.615913-51.541043c5.9733-8.319953 8.95995-18.943893 9.685278-29.567834 0.767996-30.293163-21.589212-53.802364-50.602382-56.83168l-2.98665-0.767996a61.07699 61.07699 0 0 1-12.757261-2.98665l-2.133321-0.810662a72.532925 72.532925 0 0 1-44.671749-90.196826 71.679597 71.679597 0 0 1 89.343497-46.975736zM174.761684 660.266366a43.413089 43.413089 0 0 1 42.410428-11.519935c15.146581 4.095977 27.007848 16.170576 31.061158 31.573156a45.354412 45.354412 0 0 1-11.391936 43.22109c-17.151904 17.493235-44.927747 17.493235-62.07965 0a45.311745 45.311745 0 0 1 0-63.274311z m633.383104-12.543929a43.391756 43.391756 0 0 1 42.325095 12.671928c10.837272 11.690601 14.677251 28.373174 10.111943 43.733088a44.287751 44.287751 0 0 1-32.255819 30.634494c-23.509201 5.461303-46.933069-9.386614-52.479704-33.322479a44.799748 44.799748 0 0 1 32.298485-53.717031z m-2.730652-187.305614c13.397258 13.653257 20.906549 32.127819 20.906549 51.455711 0 19.285225-7.509291 37.802454-20.906549 51.455711-13.439924 13.653257-31.573156 21.333213-50.559715 21.333213-18.943893 0-37.119791-7.679957-50.51705-21.333213a73.684919 73.684919 0 0 1 0-102.911422 70.57027 70.57027 0 0 1 101.076765 0z m-479.698635 6.954628c15.530579 20.650551 19.071893 48.127729 9.301281 72.148928a71.0396 71.0396 0 0 1-93.354141 39.381111c-36.479795-15.359914-53.759698-57.941007-38.698449-95.060798a71.679597 71.679597 0 0 1 56.746347-44.287751 70.826268 70.826268 0 0 1 66.004962 27.81851z m492.583896-180.094987c15.701245 0 30.20783 8.533285 38.058453 22.357208a45.397078 45.397078 0 0 1 0 44.714415 43.754421 43.754421 0 0 1-38.058453 22.357207c-24.23453 0-43.946419-20.053221-43.946419-44.714415 0-24.703861 19.711889-44.714415 43.946419-44.714415z m-612.604554 0c15.701245 0 30.165164 8.533285 38.015786 22.357208a45.397078 45.397078 0 0 1 0 44.714415 43.754421 43.754421 0 0 1-38.015786 22.357207c-24.277197 0-43.946419-20.053221-43.94642-44.714415 0-24.703861 19.669223-44.714415 43.94642-44.714415z m427.986926-62.932979c39.466445 0 71.466265 32.59715 71.466265 72.788924s-31.99982 72.746257-71.466265 72.746257-71.423598-32.554484-71.423598-72.746257c0-40.191774 31.99982-72.788924 71.423598-72.788924z m-112.042037-29.183836a44.202418 44.202418 0 0 0 32.469151-30.634494 45.311745 45.311745 0 0 0-10.154609-43.861087 43.370423 43.370423 0 0 0-42.495761-12.54393c-23.338535 5.9733-37.589122 29.866499-32.085153 53.631699 5.546635 23.807866 28.799838 38.698449 52.266372 33.407812z m0 720.038616a44.287751 44.287751 0 0 0 31.99982-30.719827 45.311745 45.311745 0 0 0-10.111943-43.477089 43.434422 43.434422 0 0 0-42.02643-12.842594 44.245084 44.245084 0 0 0-32.511817 30.591828 45.333078 45.333078 0 0 0 10.197276 43.861086c10.453275 11.22127 25.855855 16.085243 40.661105 13.013261l1.834656-0.426665h-0.042667zM733.435874 149.335907a26.922515 26.922515 0 0 0 26.794516-27.306513c0-15.146581-11.903933-27.306513-26.794516-27.306513a26.922515 26.922515 0 0 0-26.794516 27.306513c0 15.146581 11.946599 27.306513 26.794516 27.306513zM290.558366 149.335907a26.922515 26.922515 0 0 0 26.794516-27.306513c0-15.146581-11.946599-27.306513-26.794516-27.306513a26.922515 26.922515 0 0 0-26.794516 27.306513c0 15.146581 11.903933 27.306513 26.794516 27.306513zM69.460943 484.352689A26.922515 26.922515 0 0 0 42.666427 511.659202c0 15.103915 11.946599 27.263847 26.794516 27.263847A26.879849 26.879849 0 0 0 96.212792 513.067194l0.042667-1.450659a26.453185 26.453185 0 0 0-26.794516-27.306513v0.042667z m221.097423 389.544475a26.943848 26.943848 0 0 0-26.794516 27.306513c0 15.146581 11.903933 27.306513 26.794516 27.306513a26.922515 26.922515 0 0 0 26.794516-27.306513c0-15.146581-11.946599-27.306513-26.794516-27.306513zM733.435874 874.66516a26.943848 26.943848 0 0 0-26.794516 27.306513c0 15.146581 11.946599 27.306513 26.794516 27.306513a26.922515 26.922515 0 0 0 26.794516-27.306513c0-15.146581-11.903933-27.306513-26.794516-27.306513z m221.097423-390.312471a26.943848 26.943848 0 0 0-26.794516 27.306513c0 15.103915 11.903933 27.263847 26.794516 27.263847A26.922515 26.922515 0 0 0 981.327813 511.616535c0-15.146581-11.946599-27.306513-26.794516-27.306513v0.042667z m-16.383907-212.990802a10.239942 10.239942 0 0 0 10.410608-10.62394 10.239942 10.239942 0 0 0-10.410608-10.623941 10.282609 10.282609 0 0 0-10.410609 10.623941c0 6.058633 5.205304 10.62394 10.410609 10.62394zM511.613122 21.208627a10.239942 10.239942 0 0 0 10.453275-10.581273A10.239942 10.239942 0 0 0 511.570456 0.003413a10.239942 10.239942 0 0 0-10.410608 10.623941c0 5.674635 4.607974 10.069277 9.514613 10.538607l0.895995 0.042666h0.042666zM85.802184 271.361887a10.239942 10.239942 0 0 0 10.453275-10.62394 10.239942 10.239942 0 0 0-10.410609-10.623941 10.282609 10.282609 0 0 0-10.410608 10.623941 10.239942 10.239942 0 0 0 10.410608 10.62394h-0.042666z m0 480.551963a10.239942 10.239942 0 0 0-10.367942 10.581274 10.239942 10.239942 0 0 0 10.410608 10.623941 10.197276 10.197276 0 0 0 10.410609-10.623941 10.75194 10.75194 0 0 0-10.410609-10.581274h-0.042666z m853.115201-0.767995a10.239942 10.239942 0 0 0-10.453274 10.581274 10.239942 10.239942 0 0 0 10.453274 10.666606 10.197276 10.197276 0 0 0 10.410608-10.666606 10.75194 10.75194 0 0 0-10.410608-10.581274z" fill="#3859FF" p-id="9784"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783648619239" class="icon" viewBox="0 0 1391 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10747" xmlns:xlink="http://www.w3.org/1999/xlink" width="271.6796875" height="200"><path d="M1299.71873948 109.08164852c-12.94676356-6.47485468-18.53640721 5.86654827-26.09973268 12.13814317-2.57756953 2.02376031-4.77807747 4.65435413-6.9785854 7.08168819-18.91788751 20.63528526-41.02017805 34.19182812-69.92725219 32.57311445-42.23384508-2.42733405-78.29772513 11.12773591-110.16384908 44.10589701-6.77679853-40.66668282-29.28560862-64.94444203-63.55255448-80.5232723-17.95608583-8.09209545-36.06388005-16.1856638-48.63358202-33.78825438-8.74900746-12.5431898-11.12773591-26.50330641-15.52727889-40.26016326-2.7823022-8.29535522-5.56460442-16.79249731-14.92044537-18.20942412-10.19244639-1.61871367-14.16337637 7.08168818-18.15934561 14.36516325-15.93232553 29.74073376-22.12880269 62.51710799-21.49692993 95.69705596 1.36684831 74.65672404 32.27117059 134.13819156 93.62469003 176.42358804 6.9800583 4.8546681 8.77551959 9.71080912 6.57501167 16.7910244-4.17271686 14.56695011-9.18056624 28.7303265-13.55506996 43.29727663-2.78377509 9.30723537-6.95501906 11.32952278-16.74241882 7.28347506-33.66158524-14.36516325-62.745407-35.60875491-88.46513227-61.30196805-43.62425973-43.09548975-83.0772755-90.64060097-132.26613965-127.86659668a581.67054343 581.67054343 0 0 0-35.07703915-24.481019c-50.20074429-49.77065841 6.57501167-90.63912807 19.72650787-95.49526908 13.73181759-5.05792788 4.77955037-22.4572587-39.65480261-22.25547183s-85.07599655 15.3770434-136.87041529 35.60875492c-7.58541892 3.03416756-15.55379103 5.25971475-23.69596497 7.08168819-47.03990759-9.10544849-95.84876434-11.12773591-146.85960188-5.26118764-96.02551195 10.92594905-172.73103555 57.25739323-229.12678414 136.36373875-67.72674425 95.09022244-83.68558192 203.13015422-64.13582166 315.82149433 20.48504978 118.76262107 79.88992666 217.09027084 171.13736116 293.9710692 94.6350973 79.71317902 203.61031862 118.76262107 327.93607115 111.27735912 75.51542292-4.45256725 159.57953934-14.77020989 254.41642352-96.71040901 23.92426399 12.13961607 49.03715574 16.99575708 90.66564022 20.63675815 32.09295007 3.03416756 62.97223311-1.61871367 86.87145787-6.67664152 37.45429471-8.09209545 34.84874013-43.49906349 21.3187094-49.97244528-109.7838417-52.19946535-85.68283009-30.95587367-107.58333375-48.15194474 55.78891504-67.37324899 139.85303146-137.3770918 172.73103558-364.17669887 2.60408167-18.00616433 0.40357375-29.33568711 0-43.90263723-0.20325977-8.90218873 1.76894914-12.34287584 11.75960868-13.3532831 27.49014733-3.23742733 54.19671351-10.92594905 78.70277175-24.68280587 71.11440706-39.65480265 99.81822142-104.80250446 106.59649285-182.89844271 1.01188015-11.9363563-0.20178686-24.27775924-12.56970195-30.54935415M679.88691083 811.94067418c-106.36966673-85.37941333-157.98733782-113.5014334-179.30604723-112.28776638-19.92829476 1.21366703-16.33737217 24.48101902-11.96286845 39.65480263 4.5777635 14.97199677 10.57098089 25.2896394 18.94145388 38.44113563 5.76786417 8.70040186 9.76383341 21.64863831-5.78995764 31.35944742-34.26841876 21.64863831-93.82647692-7.28347506-96.60730623-8.69892897-69.3454579-41.67856295-127.33635378-96.710409-168.17978423-171.97249367-39.45154288-72.43117687-62.33888747-150.1220685-66.13306982-233.07267484-1.01188015-20.02992464 4.77955037-27.11161282 24.27923215-30.75408683a235.19659216 235.19659216 0 0 1 77.91771776-2.0222874c108.59668681 16.18713669 201.05631542 65.75453531 278.54394725 144.25552022 44.23256614 44.71125762 77.69089163 98.12439001 112.18613649 150.32385536 36.64567431 55.43394691 76.0986901 108.24024576 126.2994344 151.53604948 17.72778682 15.17378365 31.86465106 26.7065662 45.41972101 35.20370828-40.84343042 4.65435413-108.99878765 5.66476139-155.60860934-31.96628093m51.00936468-334.83953884c0-8.90218873 6.9815312-15.98387693 15.75557788-15.98387693q2.98408908 0.05155138 5.36134465 1.01188016a15.85720779 15.85720779 0 0 1 10.16740716 14.97199677 15.78061715 15.78061715 0 0 1-15.73053865 15.98387692 15.60386953 15.60386953 0 0 1-15.55379104-15.98387692m158.39238445 82.95060636c-10.1423679 4.24930749-20.30830215 7.89178146-30.09570189 8.29535522-15.12370514 0.81009328-31.66286419-5.46150162-40.61513143-13.15002333-13.96011661-11.93782919-23.92573689-18.61447073-28.09845373-39.45301577-1.79546129-8.90218873-0.81009328-22.65904557 0.78505404-30.54935414 3.59092258-16.99575708-0.40504665-27.92023321-12.13961607-37.8343021-9.55910075-8.09356835-21.72522894-10.31911553-35.07703915-10.31911553-4.98281013 0-9.55910075-2.22407429-12.94823646-4.04604772a13.27669246 13.27669246 0 0 1-5.76639126-18.61299785c1.39041466-2.8323807 8.16868608-9.71228202 9.76236049-10.92594903 18.13136058-10.52090241 39.04649623-7.08021529 58.36795747 0.81009328 17.93104659 7.48526194 31.46107731 21.24359167 51.01083759 40.66668278 19.92829476 23.46913885 23.51921733 29.94399353 34.84874012 47.54511124 8.97877936 13.75685685 17.14746545 27.92023321 22.71206985 44.1044241 3.41270206 10.11732865-0.98684091 18.41121097-12.74644957 23.46913885" fill="#4D6BFE" p-id="10748"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783648581859" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8723" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M138.313143 679.789714l325.595428 87.113143c-0.438857 23.149714 0.256 46.299429 2.048 69.412572l203.300572 54.345142c-60.306286 24.868571-125.659429 35.035429-190.683429 29.549715l-6.144-0.548572-1.462857-0.146285-2.925714-0.292572-3.181714-0.365714a399.908571 399.908571 0 0 1-5.339429-0.658286l-3.657143-0.475428-3.766857-0.548572c-3.657143-0.548571-7.314286-1.097143-10.934857-1.755428l-1.426286-0.256-2.56-0.475429-3.657143-0.658286-2.377143-0.512-3.181714-0.658285-2.56-0.548572-3.254857-0.694857-3.291429-0.768-3.218285-0.731429-2.304-0.585142-2.998857-0.731429-3.072-0.841143-3.291429-0.877714-2.779429-0.768-3.693714-1.024-2.121143-0.694857-2.889143-0.841143-3.145142-0.950857-3.584-1.170286-2.011429-0.658286-2.706286-0.877714-3.072-1.060571-2.267428-0.804572a214.491429 214.491429 0 0 1-1.462857-0.512l-2.340572-0.877714-3.474286-1.243429-1.938285-0.731428-2.706286-1.060572-2.998857-1.170285-2.998857-1.206858-2.706286-1.097142-3.218286-1.353143-2.157714-0.950857-2.157714-0.950858a192.804571 192.804571 0 0 1-1.389715-0.585142l-2.267428-1.024-3.510857-1.609143-1.755429-0.841143-3.291428-1.572572-2.121143-1.024-2.852572-1.353142-2.925714-1.499429-3.181714-1.609143-1.792-0.914286-3.510857-1.865142-1.938286-1.024-1.974857-1.097143a226.450286 226.450286 0 0 1-1.572572-0.914286l-3.218285-1.792-2.048-1.170286-1.755429-1.024-2.450286-1.389714-2.779428-1.718857-3.181715-1.901714-1.792-1.097143-2.852571-1.828572-2.084571-1.316571-2.706286-1.682286-2.377143-1.609143-1.828571-1.206857a263.936 263.936 0 0 1-1.828572-1.206857l-1.462857-1.024-1.536-1.024a209.078857 209.078857 0 0 1-1.353143-0.987429l-1.974857-1.353142-2.56-1.828572-2.377143-1.718857-2.523428-1.828571-1.901715-1.462858-2.596571-1.938285-2.596572-2.011429-2.925714-2.267428-1.536-1.206858-2.194286-1.792-2.56-2.048-2.998857-2.486857-1.572571-1.316571-1.572572-1.353143a252.086857 252.086857 0 0 1-1.462857-1.243429l-1.536-1.353142-2.084571-1.828572-2.377143-2.121143-2.340571-2.048-2.121143-1.974857-2.267429-2.121143-1.828571-1.682285-2.998857-2.889143-3.364572-3.291429-0.987428-0.950857-1.426286-1.462857-2.340572-2.377143-1.718857-1.755429-1.682285-1.828571a220.489143 220.489143 0 0 1-5.741715-6.070857l-2.742857-2.998857-2.121143-2.413715-2.413714-2.706285-1.462857-1.682286-1.792-2.121143-1.974857-2.304-1.572572-1.938286a244.48 244.48 0 0 1-0.914285-1.097142l-1.536-1.901715-2.267429-2.779428-1.389714-1.792-1.682286-2.194286-0.731429-0.841143a409.234286 409.234286 0 0 1-49.115428-81.993143z m-34.816-197.741714l387.510857 103.643429a698.660571 698.660571 0 0 0-16.018286 68.644571l369.225143 98.779429a412.196571 412.196571 0 0 1-62.976 68.425142L124.818286 645.888l-0.548572-1.536-1.170285-3.584a408.758857 408.758857 0 0 1-1.718858-5.193143l-0.256-0.804571a406.052571 406.052571 0 0 1-7.058285-25.270857l-1.024-4.315429-0.621715-2.742857-0.731428-3.291429-0.585143-2.779428-0.621714-3.072-0.585143-2.852572-0.585143-3.218285a403.456 403.456 0 0 1-2.450286-14.555429l-0.585143-4.022857-0.365714-2.816-0.438857-3.474286-0.658286-5.485714-0.146285-1.609143c-2.56-24.356571-2.925714-48.859429-1.170286-73.216z m54.381714-175.798857l407.808 109.092571a698.221714 698.221714 0 0 0-34.486857 64l385.536 103.131429a404.662857 404.662857 0 0 1-22.784 80.749714l-394.24-105.472-393.069714-105.142857 0.512-3.401143 0.256-1.682286 0.365714-2.304 0.512-2.925714 0.585143-3.364571c0.914286-5.046857 1.938286-10.093714 2.998857-15.104l0.987429-4.242286 0.658285-2.889143 0.841143-3.291428c0.731429-3.072 1.536-6.144 2.377143-9.142858l0.950857-3.510857 0.804572-2.816 1.024-3.437714 0.841142-2.779429 1.024-3.291428 0.877715-2.779429 1.097143-3.254857c8.777143-26.514286 20.370286-52.041143 34.450285-76.178286h0.073143z m151.625143-150.198857l385.170286 103.021714A708.973714 708.973714 0 0 0 637.074286 317.805714l267.008 71.460572c9.142857 29.074286 15.104 59.501714 17.517714 90.953143L174.299429 280.32l1.536-2.194286 0.914285-1.389714 1.353143-1.828571 1.572572-2.267429 1.865142-2.56 1.828572-2.486857 2.194286-2.925714 1.718857-2.194286 1.938285-2.523429 1.901715-2.377143 2.048-2.56 1.865143-2.340571 2.194285-2.596571 1.865143-2.267429 2.267429-2.633143 1.828571-2.048 2.413714-2.779428 1.828572-2.048 2.267428-2.56 1.828572-1.974858 2.523428-2.633142 1.974858-2.048 2.157714-2.304 5.741714-5.814858 3.401143-3.328 2.011429-1.901714 2.596571-2.450286a412.452571 412.452571 0 0 1 77.531429-57.234285zM512.585143 102.4H518.692571l2.340572 0.073143 1.828571 0.073143 2.340572 0.073143h1.572571l2.596572 0.109714 1.609142 0.073143 2.048 0.109714 1.828572 0.073143 2.998857 0.182857 3.584 0.219429 4.900571 0.365714 2.998858 0.256 1.499428 0.146286 2.633143 0.256 2.816 0.292571 1.572571 0.146286 3.510858 0.402285 1.682285 0.219429 3.693715 0.475429 2.779428 0.365714 1.426286 0.182857 2.194286 0.365714 7.094857 1.097143 2.377143 0.365714 2.194285 0.365715 4.790857 0.914285 3.145143 0.621715 3.766857 0.731428 1.572572 0.365715 2.56 0.548571 1.389714 0.329143 2.121143 0.438857 1.462857 0.365714 2.194286 0.475429 1.682286 0.438857 2.413714 0.548571 3.291428 0.841143 3.803429 1.024 3.84 1.024 3.876571 1.097143 1.718858 0.512 2.377142 0.658286 2.669715 0.841143 2.486857 0.768 1.718857 0.548571 1.682286 0.548572 2.596571 0.841142 3.401143 1.133715 3.474286 1.243428 1.645714 0.585143 2.194286 0.768 3.145143 1.170286 3.766857 1.389714 3.949714 1.536 3.401143 1.353143 1.609143 0.731429 2.048 0.804571 1.389714 0.585143 2.194286 0.914286 1.353143 0.585142 1.938285 0.877715 3.730286 1.645714 3.437714 1.536 2.523429 1.206857 2.56 1.243429 2.048 0.950857 3.145143 1.572571 3.108571 1.536 3.474286 1.755429 1.828571 0.950857 1.645715 0.914286 1.572571 0.804571 2.048 1.097143 1.389714 0.768 1.792 1.024 2.998857 1.682286 3.620572 2.048 2.962286 1.755428 1.938285 1.170286 1.828572 1.097143 3.291428 1.974857 2.962286 1.901714 3.364571 2.121143 1.243429 0.804572 2.194286 1.389714 2.852571 1.938286 1.353143 0.914285 2.121143 1.426286 2.121143 1.462857 0.768 0.585143c1.828571 1.28 3.693714 2.56 5.485714 3.876571l2.852571 2.048 2.194286 1.645715 1.938286 1.462857 2.925714 2.230857 2.816 2.194286 1.353143 1.024 1.718857 1.389714 2.925714 2.340571 2.706286 2.230858 2.889143 2.413714c24.32 20.48 46.189714 43.812571 65.170286 69.339428L348.891429 136.301714l2.084571-0.877714 2.230857-0.987429 2.779429-1.133714 2.925714-1.206857c3.84-1.536 7.753143-3.072 11.629714-4.461714l3.291429-1.206857 3.181714-1.097143 2.852572-1.060572 3.291428-1.060571c2.925714-1.024 5.997714-1.974857 8.996572-2.889143l3.108571-0.914286 2.925714-0.877714 3.474286-1.024 2.925714-0.768 3.401143-0.877714 2.925714-0.841143 3.072-0.768 3.108572-0.731429 3.254857-0.768 3.072-0.694857 3.328-0.731428 3.108571-0.658286 3.254858-0.621714 3.145142-0.621715 3.401143-0.621714 3.108572-0.512 3.364571-0.585143 3.108572-0.475428 3.328-0.512 3.145142-0.475429 3.474286-0.438857 3.108572-0.365714 3.584-0.438858 3.072-0.365714 3.584-0.329143c3.181714-0.365714 6.363429-0.621714 9.545142-0.804571l3.657143-0.292572 3.035429-0.146285 3.766857-0.219429 3.181714-0.146286 3.401143-0.109714 3.291429-0.073143 3.401143-0.073143 6.729142-0.073142V102.4z" fill="#333333" p-id="8724"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783648520306" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6492" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M565.265178 954.519092c-22.289934 0-48.400999-8.151747-67.952455-14.838727a103.425292 103.425292 0 0 1-26.875292-11.272338c-12.737105-7.769634-15.411897-8.342804-19.806198-24.773669 21.971506-5.158528 81.581157-41.905075 103.871091-55.342721 148.896757-89.159735 119.028246-10.444426 119.028246-364.981743 15.029784 3.566389 82.791182 32.415932 82.791182 57.316972 0 133.102747 20.570425 273.847757-52.604243 354.91943-22.799418 25.47421-91.834527 58.972796-138.388646 58.972796z m-433.061569-299.321966c258.626916 136.860193 184.369594 157.048504 357.721593 52.094759 44.579867-27.193719 90.433445-49.292596 132.593263-77.568969v101.896839c-95.528287 22.226248-272.319304 227.038896-419.050754 100.686815l-25.856323-25.155782c-37.319718-43.943012-45.344094-72.410442-45.344094-151.889977z m375.744596-19.105658c-19.933569-13.310275-79.479535-51.330533-101.896839-57.316972v-133.739602a1158.312326 1158.312326 0 0 0 101.896839-57.316973c43.943012 10.189684 70.690933 47.063603 114.633945 57.316973v127.371049c-17.831947 12.10025-95.846715 58.718054-114.633945 63.749211z m-426.693016-178.31947c0-63.685525-4.26693-90.306074 38.84817-145.776166 23.945757-30.88748 47.509402-39.612396 82.090641-57.953828v261.110652c44.134069 23.372588 83.873836 49.037854 129.345301 74.448379l131.765351 78.396881c-59.545966 15.921381-63.685525 61.32916-109.602788 33.753328-104.699003-62.730242-272.38299-129.345301-272.38299-243.91556z m866.123138 127.37105c0 79.543221-47.573087 161.188063-121.002497 178.31947v-165.582365c0-82.791182 9.743885-84.574377-48.910483-116.608196L565.265178 362.371082c15.79401-23.62733 22.608361-19.105657 48.146256-34.835982 41.714019-25.47421 39.039227-16.112438 117.053995 28.785857 94.190891 54.196382 216.849212 100.559444 216.849212 228.885777z m-541.326961-197.425127v-95.528287c43.751956-23.181531 90.688187-50.94842 133.357489-76.804743 82.154327-49.547338 95.528287-63.303412 185.006449-63.303412 48.464684 0 102.533695 36.746548 125.651541 65.405034 42.223503 52.22213 39.930824 92.662439 39.930824 151.125751-31.078536-16.494551-192.393971-121.002497-222.899337-121.002498s-229.650003 123.422547-261.110652 140.108155z m-50.94842 159.213812c-16.36718-10.95391-63.112355-39.99451-82.791183-44.579867 0-168.320842-33.880699-314.606493 67.952455-390.519639 56.043262-41.714019 113.169178-53.814269 181.376375-30.696423 25.47421 8.661231 35.536523 20.888852 56.36169 26.429493-11.781822 16.048752-80.68956 50.311565-102.278953 63.303412-154.564769 93.235608-120.620384 7.451206-120.620384 376.063024z m-292.953415 121.002498c0 169.148754 115.143429 280.853165 274.293556 273.847756 59.800708-2.674792 26.811606-7.705949 69.417222 25.47421 97.820966 76.741057 228.822091 73.747838 319.637649 1.018969a251.939936 251.939936 0 0 0 52.604244-55.661149c58.20857-85.274918-10.95391-45.598836 81.96327-83.619094 130.236898-53.241099 199.399378-217.358696 128.64476-355.428914-27.448461-53.559526-40.249252-28.849543-28.276373-104.699003 18.723544-118.582447-63.176041-230.032116-157.621674-269.771884-98.90362-41.586648-129.090559 12.737105-178.892639-37.574459A161.888604 161.888604 0 0 0 580.103905 28.913674C474.003821-27.766443 331.284559 1.528898 258.428319 93.681853c-81.326415 102.979494 9.489143 54.705866-92.407697 98.648878C15.149614 257.353652-33.251385 439.175825 41.579107 561.06992c56.807488 92.598753 20.570425 4.967471 20.570424 106.800625z" fill="#10A37F" p-id="6493"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783648484147" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5162" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M0 512a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#FFFFFF" p-id="5163"></path><path d="M311.2704 329.8816h-86.016a16.5632 16.5632 0 0 0-14.336 8.2688l-47.7952 82.7648a16.5888 16.5888 0 0 0 0 16.5632l196.1472 339.4048h95.36l141.696-119.04-285.056-327.9616z" fill="#615CED" p-id="5164"></path><path d="M253.952 594.7904l-43.0336 74.496a16.5376 16.5376 0 0 0 0 16.5632l47.7952 82.7648a16.4352 16.4352 0 0 0 14.336 8.2944h181.5808l-200.704-182.1184zM770.1248 429.184l43.008-74.4704a16.5632 16.5632 0 0 0 0-16.5632l-47.7952-82.7648a16.5888 16.5888 0 0 0-14.336-8.2944l-392.0128 0.1792-47.6928 82.5856 32.256 182.2208 426.5728-82.8928z" fill="#615CED" p-id="5165"></path><path d="M569.344 247.1168l-43.008-74.496a16.5376 16.5376 0 0 0-14.336-8.2944h-95.5904a16.4352 16.4352 0 0 0-14.336 8.2688l-43.4688 75.2896-47.3344 81.9712L569.344 247.1168zM454.656 776.9344l42.9824 74.496a16.5632 16.5632 0 0 0 14.336 8.2688h95.5904a16.5888 16.5888 0 0 0 14.336-8.2688l195.84-339.584-47.6672-82.6112-173.9264-63.1552-141.5168 410.8544z" fill="#615CED" p-id="5166"></path><path d="M712.704 694.1184h86.0416c5.9136 0 11.392-3.1744 14.336-8.2944l47.7952-82.7648a16.4352 16.4352 0 0 0 0-16.5632l-43.4688-75.2896-47.3088-81.9712-57.3696 264.8832z" fill="#615CED" p-id="5167"></path><path d="M465.3312 760.0128l-190.72 0.768 47.2576-82.688 95.488-0.4096L225.024 347.7504l95.5392-0.1792 192.128 329.5488-47.36 82.8928z" fill="#FFFFFF" p-id="5168"></path><path d="M320.5376 347.5712l94.6944-165.5296 47.9744 82.2784-47.36 82.8672 381.8752-1.5616-47.616 82.816-381.44 1.5872-48.128-82.432z" fill="#FFFFFF" p-id="5169"></path><path d="M750.1312 428.416l96 164.7616-95.232 0.4352-48.0768-82.4832-189.568 331.52-47.9232-82.6368 189.3376-331.1616 95.488-0.4352z" fill="#FFFFFF" p-id="5170"></path><path d="M512.6912 677.12l142.0032-248.2688-286.0288 1.1776 144.0256 247.1168z" fill="#605BEC" p-id="5171"></path><path d="M512.6912 677.12l-192.128-329.5488 9.472-16.5632 192.1024 329.5744-9.4464 16.5632z" fill="#605BEC" p-id="5172"></path><path d="M368.64 430.0288l381.4912-1.5872 9.6 16.4864-381.4656 1.5872-9.6256-16.4864z" fill="#605BEC" p-id="5173"></path><path d="M654.6944 428.8l-189.3376 331.1616-19.072 0.0768 189.3632-331.136 19.0464-0.1024z" fill="#605BEC" p-id="5174"></path></svg>
@@ -0,0 +1 @@
1
+ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783648637612" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11771" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M227.541333 85.333333h568.917334A142.208 142.208 0 0 1 938.666667 227.541333v568.917334A142.208 142.208 0 0 1 796.458667 938.666667H227.541333A142.208 142.208 0 0 1 85.333333 796.458667V227.541333A142.208 142.208 0 0 1 227.541333 85.333333" fill="#8662FA" p-id="11772"></path><path d="M590.250667 450.474667c0.085333 5.205333 0.128 10.453333 0 15.658666l0.426666-0.896h145.92c15.061333 0 35.882667 13.312 45.226667 25.258667 34.986667 44.8 3.072 107.776-52.352 109.098667h-139.648c20.394667 97.109333-43.008 193.28-139.221333 214.613333-160.938667 35.413333-283.776-144.128-191.146667-281.130667a183.893333 183.893333 0 0 1 201.344-73.173333c-2.218667-55.424 4.437333-111.274667 34.133333-159.146667 50.986667-82.944 144.085333-100.224 235.008-94.464 53.632 3.541333 83.797333 62.506667 51.413334 106.410667-20.693333 28.16-48.810667 27.605333-77.909334 27.008-13.952-0.298667-28.16-0.597333-41.813333 2.261333-32.341333 7.082667-58.069333 29.269333-67.413333 61.653334-4.266667 15.274667-4.096 31.061333-3.968 46.805333z m-132.565334 212.949333c21.76-38.144-8.874667-84.693333-52.309333-80.682667-38.144 3.541333-59.861333 45.226667-42.581333 78.933334a53.802667 53.802667 0 0 0 94.890666 1.749333z" fill="#FFFFFF" p-id="11773"></path></svg>