## Summary Extract runtime-neutral provider definitions from `@proj-airi/stage-ui` into a new `@proj-airi/provider-inference` package that runs in both Node.js and browser without Vue/Pinia dependencies. ## What changed - **New package** `packages/provider-inference/` — owns `ProviderDefinition`, `ProviderRegistry`, validators, and all provider modules (cloud + local) - **Provider modules relocated** — ~45 providers moved from `stage-ui/src/libs/providers/providers/` to `provider-inference/src/providers/cloud/` and `provider-inference/src/providers/local/` - **Type decoupling** — `ProviderContext.t` changed from `ComposerTranslation` (Vue) to generic `ProviderTranslator`, removing the Vue dependency from core types - **stage-ui types slimmed** — `types.ts` now re-exports from `provider-inference` and only adds the Vue-specific `ProviderViews` extension - **validators/run.ts** — becomes a pass-through re-export - **Registry** — portable `createProviderRegistry()` with deterministic ordering and duplicate-id detection ## Verification ```bash pnpm -F @proj-airi/provider-inference typecheck pnpm -F @proj-airi/provider-inference test:node pnpm -F @proj-airi/provider-inference test:browser pnpm -F @proj-airi/provider-inference build pnpm -F @proj-airi/stage-ui typecheck pnpm -F @proj-airi/stage-web typecheck pnpm -F @proj-airi/stage-tamagotchi typecheck pnpm lint ``` ## Why Provider definitions were tightly coupled to Vue (`ComposerTranslation`, `Component`), preventing reuse in non-Vue runtimes (Node.js services, tests, future Electron backend). This extraction creates a clean boundary: runtime-neutral definitions live in `provider-inference`, while Vue/Pinia-specific concerns stay in `stage-ui`.
72 lines
2.0 KiB
JSON
72 lines
2.0 KiB
JSON
{
|
|
"name": "@proj-airi/stage-pages",
|
|
"type": "module",
|
|
"private": true,
|
|
"description": "Shared Pages",
|
|
"author": {
|
|
"name": "Moeru AI Project AIRI Team",
|
|
"email": "airi@moeru.ai",
|
|
"url": "https://github.com/moeru-ai"
|
|
},
|
|
"license": "MIT",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/moeru-ai/airi.git",
|
|
"directory": "packages/stage-pages"
|
|
},
|
|
"exports": {
|
|
"./*.vue": "./src/*.vue",
|
|
"./*": "./src/*.ts"
|
|
},
|
|
"scripts": {
|
|
"typecheck": "vue-tsc --noEmit"
|
|
},
|
|
"dependencies": {
|
|
"@moeru/eventa": "catalog:",
|
|
"@moeru/std": "catalog:",
|
|
"@proj-airi/audio": "workspace:^",
|
|
"@proj-airi/ccc": "workspace:*",
|
|
"@proj-airi/i18n": "workspace:*",
|
|
"@proj-airi/provider-inference": "workspace:^",
|
|
"@proj-airi/server-sdk": "workspace:*",
|
|
"@proj-airi/stage-ui": "workspace:*",
|
|
"@proj-airi/stage-ui-live2d": "workspace:*",
|
|
"@proj-airi/stage-ui-mmd": "workspace:*",
|
|
"@proj-airi/stage-ui-spine": "workspace:*",
|
|
"@proj-airi/stage-ui-three": "workspace:*",
|
|
"@proj-airi/ui": "workspace:*",
|
|
"@shopify/draggable": "catalog:",
|
|
"@vueuse/core": "catalog:",
|
|
"@vueuse/shared": "catalog:",
|
|
"@xsai-ext/providers": "catalog:",
|
|
"@xsai/generate-speech": "catalog:",
|
|
"@xsai/stream-transcription": "catalog:",
|
|
"animejs": "catalog:",
|
|
"d3": "catalog:",
|
|
"dompurify": "catalog:",
|
|
"nanoid": "catalog:",
|
|
"node-vibrant": "catalog:",
|
|
"pinia": "catalog:",
|
|
"posthog-js": "catalog:",
|
|
"reka-ui": "catalog:",
|
|
"splitpanes": "catalog:",
|
|
"unspeech": "catalog:xsai",
|
|
"vue": "catalog:",
|
|
"vue-i18n": "catalog:",
|
|
"vue-router": "catalog:",
|
|
"vue-sonner": "catalog:",
|
|
"xsschema": "catalog:",
|
|
"zod": "catalog:"
|
|
},
|
|
"devDependencies": {
|
|
"@nekopaw/tempora": "catalog:",
|
|
"@proj-airi/stage-shared": "workspace:^",
|
|
"@types/audioworklet": "catalog:",
|
|
"@types/splitpanes": "catalog:",
|
|
"@types/three": "catalog:",
|
|
"@webgpu/types": "catalog:",
|
|
"unplugin-info": "catalog:",
|
|
"vue-tsc": "catalog:"
|
|
}
|
|
}
|