diff --git a/apps/stage-pocket/package.json b/apps/stage-pocket/package.json index 8e63762fd..e38242fe6 100644 --- a/apps/stage-pocket/package.json +++ b/apps/stage-pocket/package.json @@ -82,6 +82,7 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "shiki": "^3.20.0", + "splitpanes": "catalog:", "three": "^0.182.0", "unified": "^11.0.5", "unspeech": "^0.1.7", @@ -118,6 +119,7 @@ "@types/audioworklet": "catalog:", "@types/culori": "^4.0.1", "@types/nprogress": "^0.2.3", + "@types/splitpanes": "catalog:", "@types/three": "^0.182.0", "@types/yauzl": "^2.10.3", "@unocss/reset": "^66.5.11", diff --git a/apps/stage-pocket/src/main.ts b/apps/stage-pocket/src/main.ts index 4cdd0ee6c..357f39b2f 100644 --- a/apps/stage-pocket/src/main.ts +++ b/apps/stage-pocket/src/main.ts @@ -22,6 +22,7 @@ import './modules/posthog' import '@proj-airi/font-cjkfonts-allseto/index.css' import '@proj-airi/font-xiaolai/index.css' import '@unocss/reset/tailwind.css' +import 'splitpanes/dist/splitpanes.css' import './styles/main.css' import 'uno.css' diff --git a/apps/stage-tamagotchi/package.json b/apps/stage-tamagotchi/package.json index 7ffb18079..ef7a7e8f5 100644 --- a/apps/stage-tamagotchi/package.json +++ b/apps/stage-tamagotchi/package.json @@ -107,6 +107,7 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "shiki": "^3.20.0", + "splitpanes": "catalog:", "std-env": "^3.10.0", "three": "^0.182.0", "unified": "^11.0.5", @@ -144,6 +145,7 @@ "@types/audioworklet": "catalog:", "@types/culori": "^4.0.1", "@types/nprogress": "^0.2.3", + "@types/splitpanes": "catalog:", "@types/three": "^0.182.0", "@types/yauzl": "^2.10.3", "@unocss/reset": "^66.5.11", diff --git a/apps/stage-tamagotchi/src/renderer/main.ts b/apps/stage-tamagotchi/src/renderer/main.ts index 197b56caf..5d4a1cc7b 100644 --- a/apps/stage-tamagotchi/src/renderer/main.ts +++ b/apps/stage-tamagotchi/src/renderer/main.ts @@ -19,8 +19,9 @@ import './modules/posthog' // eslint-disable-next-line perfectionist/sort-imports import '@unocss/reset/tailwind.css' -import 'uno.css' +import 'splitpanes/dist/splitpanes.css' import './styles/main.css' +import 'uno.css' // Fonts import '@proj-airi/font-cjkfonts-allseto/index.css' import '@proj-airi/font-xiaolai/index.css' diff --git a/apps/stage-web/package.json b/apps/stage-web/package.json index cc1c58697..ca61ea543 100644 --- a/apps/stage-web/package.json +++ b/apps/stage-web/package.json @@ -78,6 +78,7 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "shiki": "^3.20.0", + "splitpanes": "catalog:", "three": "^0.182.0", "unified": "^11.0.5", "unspeech": "^0.1.7", @@ -113,6 +114,7 @@ "@types/audioworklet": "catalog:", "@types/culori": "^4.0.1", "@types/nprogress": "^0.2.3", + "@types/splitpanes": "catalog:", "@types/three": "^0.182.0", "@types/yauzl": "^2.10.3", "@unocss/reset": "^66.5.11", diff --git a/apps/stage-web/src/main.ts b/apps/stage-web/src/main.ts index ed5c49946..d1d34665d 100644 --- a/apps/stage-web/src/main.ts +++ b/apps/stage-web/src/main.ts @@ -22,6 +22,7 @@ import './modules/posthog' import '@proj-airi/font-cjkfonts-allseto/index.css' import '@proj-airi/font-xiaolai/index.css' import '@unocss/reset/tailwind.css' +import 'splitpanes/dist/splitpanes.css' import './styles/main.css' import 'uno.css' diff --git a/cspell.config.yaml b/cspell.config.yaml index 3c7b86a53..a5d541d07 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -259,6 +259,7 @@ words: - sonarjs - sonner - specta + - splitpanes - splt - srgb - ssml diff --git a/packages/i18n/src/locales/en/settings.yaml b/packages/i18n/src/locales/en/settings.yaml index c3991eba8..e7fc4a073 100644 --- a/packages/i18n/src/locales/en/settings.yaml +++ b/packages/i18n/src/locales/en/settings.yaml @@ -190,7 +190,7 @@ pages: reset: Reset desktop data confirmations: tooltip: Are you sure? - yes: Yes + 'yes': 'Yes' status: exported: Chat sessions exported. imported: Chat sessions imported. @@ -424,6 +424,71 @@ pages: AIRI requires at least one {chat} provider to be configured to think, and behave properly. You could think of it as the brain of the characters living in AIRI system. + catalog: + edit: + config-id-not-found: Provider configuration not found. + definition-id-not-found: Provider definition not found. + actions: + more-options: More options + delete: Delete + validation: + failed: + title: Please check your provider settings, validation failed. + description: You can still save the current configuration if you want to proceed. + action: Save anyway + config: + common: + fields: + field: + api-key: + label: API Key + description: API Key used to authorize requests to this provider + placeholder: sk-... + base-url: + label: Base URL + description: >- + The base url used to connect to remote service. Often looks + like http://localhost:11434/v1 or https://example.com/v1. + placeholder: Base url... + headers: + label: Custom HTTP Headers + description: Add custom HTTP headers + key: + placeholder: Key + value: + placeholder: Value + validators: + actions: + validate: Validate + empty: No validation steps available. + openai-compatible: + check-config: + title: Configuration + check-connectivity: + title: Connectivity + check-supports-model-listing: + title: List Models + check-supports-chat-completion: + title: Chat Completion + status: + validating: Validating... + valid: Passed + invalid: Errored + title: Checks + providers: + provider: + ollama: + troubleshooting: + validators: + openai-compatible-check-connectivity: + label: Extra configuration needed for Ollama + content: >- + Sorry to hear that Connectivity check failed for Ollama. + Don't worry, for Ollama instances, extra configuration is + needed for making it pass for Ollama. You need to set + OLLAMA_HOST explicitly when start the Ollama + application or Ollama CLI server, for detailed + information, check Ollama integration guide. common: continueAnyway: Continue Anyway fields: @@ -801,4 +866,6 @@ vrm: skybox-specular-mix: Specular Mix wip: title: Work in Progress - description: This feature is currently under development and not yet publicly available. Check back in future updates for this functionality. + description: >- + This feature is currently under development and not yet publicly available. + Check back in future updates for this functionality. diff --git a/packages/stage-pages/package.json b/packages/stage-pages/package.json index 0830be258..832a49cfb 100644 --- a/packages/stage-pages/package.json +++ b/packages/stage-pages/package.json @@ -22,6 +22,7 @@ }, "dependencies": { "@moeru/eventa": "^1.0.0-alpha.10", + "@moeru/std": "catalog:", "@proj-airi/ccc": "workspace:*", "@proj-airi/i18n": "workspace:*", "@proj-airi/server-sdk": "workspace:*", @@ -40,15 +41,18 @@ "pinia": "^3.0.4", "posthog-js": "catalog:", "reka-ui": "^2.7.0", + "splitpanes": "catalog:", "unspeech": "^0.1.7", "vue": "^3.5.25", "vue-i18n": "^11.2.2", - "vue-router": "^4.6.4" + "vue-router": "^4.6.4", + "zod": "catalog:" }, "devDependencies": { "@nekopaw/tempora": "catalog:", "@proj-airi/stage-shared": "workspace:^", "@types/audioworklet": "catalog:", + "@types/splitpanes": "catalog:", "@types/three": "^0.182.0", "unplugin-info": "catalog:", "vue-tsc": "^3.1.8" diff --git a/packages/stage-pages/src/pages/v2/settings/index.vue b/packages/stage-pages/src/pages/v2/settings/index.vue new file mode 100644 index 000000000..53cf091d7 --- /dev/null +++ b/packages/stage-pages/src/pages/v2/settings/index.vue @@ -0,0 +1,5 @@ + diff --git a/packages/stage-pages/src/pages/v2/settings/providers.vue b/packages/stage-pages/src/pages/v2/settings/providers.vue new file mode 100644 index 000000000..c3fcf85a1 --- /dev/null +++ b/packages/stage-pages/src/pages/v2/settings/providers.vue @@ -0,0 +1,148 @@ + + + diff --git a/packages/stage-pages/src/pages/v2/settings/providers/edit.vue b/packages/stage-pages/src/pages/v2/settings/providers/edit.vue new file mode 100644 index 000000000..a78fb6fd3 --- /dev/null +++ b/packages/stage-pages/src/pages/v2/settings/providers/edit.vue @@ -0,0 +1,7 @@ + + + diff --git a/packages/stage-pages/src/pages/v2/settings/providers/edit/[providerId]/index.vue b/packages/stage-pages/src/pages/v2/settings/providers/edit/[providerId]/index.vue new file mode 100644 index 000000000..190936636 --- /dev/null +++ b/packages/stage-pages/src/pages/v2/settings/providers/edit/[providerId]/index.vue @@ -0,0 +1,523 @@ + + + diff --git a/packages/stage-pages/src/pages/v2/settings/providers/index.vue b/packages/stage-pages/src/pages/v2/settings/providers/index.vue new file mode 100644 index 000000000..a78fb6fd3 --- /dev/null +++ b/packages/stage-pages/src/pages/v2/settings/providers/index.vue @@ -0,0 +1,7 @@ + + + diff --git a/packages/stage-ui/package.json b/packages/stage-ui/package.json index 31fa7712a..b3b8cf0b3 100644 --- a/packages/stage-ui/package.json +++ b/packages/stage-ui/package.json @@ -126,6 +126,7 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "shiki": "^3.20.0", + "splitpanes": "catalog:", "three": "^0.182.0", "unified": "^11.0.5", "unist-builder": "^4.0.0", @@ -164,12 +165,14 @@ "@proj-airi/vite-plugin-warpdrive": "workspace:*", "@types/audioworklet": "catalog:", "@types/culori": "^4.0.1", + "@types/splitpanes": "catalog:", "@types/three": "^0.182.0", "@unocss/reset": "^66.5.11", "@vitejs/plugin-vue": "^6.0.3", "clustr": "^1.0.2", "csstype": "^3.2.3", "histoire": "1.0.0-alpha.2", + "is-network-error": "catalog:", "unocss": "^66.5.11", "unplugin-info": "catalog:", "unplugin-yaml": "^3.0.7", diff --git a/packages/stage-ui/src/components/layouts/index.ts b/packages/stage-ui/src/components/layouts/index.ts index 170e7cbe0..42d9d22b8 100644 --- a/packages/stage-ui/src/components/layouts/index.ts +++ b/packages/stage-ui/src/components/layouts/index.ts @@ -2,4 +2,5 @@ export * from './backgrounds' export { default as Callout } from './Callout.vue' export { default as PageHeader } from './PageHeader.vue' export { default as Section } from './Section.vue' +export * from './splitpanes' export { default as Tabs } from './Tabs.vue' diff --git a/packages/stage-ui/src/components/layouts/splitpanes/index.ts b/packages/stage-ui/src/components/layouts/splitpanes/index.ts new file mode 100644 index 000000000..9a96b64f9 --- /dev/null +++ b/packages/stage-ui/src/components/layouts/splitpanes/index.ts @@ -0,0 +1 @@ +export { default as PaneArea } from './pane-area.vue' diff --git a/packages/stage-ui/src/components/layouts/splitpanes/pane-area.vue b/packages/stage-ui/src/components/layouts/splitpanes/pane-area.vue new file mode 100644 index 000000000..8a59e911d --- /dev/null +++ b/packages/stage-ui/src/components/layouts/splitpanes/pane-area.vue @@ -0,0 +1,19 @@ + + + diff --git a/packages/stage-ui/src/components/misc/Alert.vue b/packages/stage-ui/src/components/misc/Alert.vue index 0e06f1f21..40407d0a0 100644 --- a/packages/stage-ui/src/components/misc/Alert.vue +++ b/packages/stage-ui/src/components/misc/Alert.vue @@ -15,15 +15,15 @@ const slots = useSlots() const containerClass = computed(() => { switch (props.type) { case 'error': - return 'border-red-200 bg-red-50 dark:border-red-800/30 dark:bg-red-900/20' + return ' bg-red-50/50 dark:bg-red-900/20' case 'warning': - return 'border-amber-200 bg-amber-50 dark:border-amber-800/30 dark:bg-amber-900/20' + return ' bg-amber-50/50 dark:bg-amber-900/20' case 'success': - return 'border-green-200 bg-green-50 dark:border-green-800/30 text-green-700 dark:bg-green-900/30 dark:text-green-300' + return ' bg-green-50 text-green-700 dark:bg-green-900/30 dark:text-green-300' case 'info': - return 'border-blue-200 bg-blue-50 dark:border-blue-800/30 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300' + return ' bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300' case 'loading': - return 'border-blue-200 bg-blue-50 dark:border-blue-800/30 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300' + return ' bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300' } return '' }) @@ -31,15 +31,15 @@ const containerClass = computed(() => { const iconClass = computed(() => { switch (props.type) { case 'error': - return 'i-solar:close-circle-bold-duotone text-red-500 dark:text-red-400' + return 'i-solar:close-circle-bold-duotone text-red-400 dark:text-red-400' case 'warning': - return 'i-solar:danger-circle-bold-duotone text-amber-500 dark:text-amber-400' + return 'i-solar:danger-circle-bold-duotone text-amber-400 dark:text-amber-400' case 'success': - return 'i-solar:check-circle-bold-duotone text-green-500 dark:text-green-400' + return 'i-solar:check-circle-bold-duotone text-green-400 dark:text-green-400' case 'info': - return 'i-solar:info-circle-bold-duotone text-blue-500 dark:text-blue-400' + return 'i-solar:info-circle-bold-duotone text-blue-400 dark:text-blue-400' case 'loading': - return 'i-svg-spinners:3-dots-fade text-blue-500 dark:text-blue-400' + return 'i-svg-spinners:3-dots-fade text-blue-400 dark:text-blue-400' } return '' }) @@ -47,22 +47,22 @@ const iconClass = computed(() => { const titleClass = computed(() => { switch (props.type) { case 'error': - return 'text-red-500 dark:text-red-400' + return 'text-red-600 dark:text-red-400' case 'warning': - return 'text-amber-500 dark:text-amber-400' + return 'text-amber-600 dark:text-amber-400' case 'success': - return 'text-green-500 dark:text-green-400' + return 'text-green-600 dark:text-green-400' case 'info': - return 'text-blue-500 dark:text-blue-400' + return 'text-blue-600 dark:text-blue-400' case 'loading': - return 'text-blue-500 dark:text-blue-400' + return 'text-blue-600 dark:text-blue-400' } return '' })