mioku 0.9.4 → 0.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +60 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +60 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["fallbackLogger: MiokuLogger","activeLogger: MiokuLogger","logger: MiokuLogger | undefined","logger","logger: MiokuLogger","filePath: string","p: string","dir: string","results: DiscoveredModule[]","entries: import(\"fs\").Dirent[]","prefix: string","entryPath: string","linkPath: string","targetPath: string","runtimePluginsDir: string","metadata: PluginMetadata","plugins: PluginMetadata[]","linkedNames: string[]","store","key: string","factory: () => T","miokuConfig: MiokuRuntimeConfig","name: string","pluginPath: string","packageJson: PackageJsonLike | null","config: PluginPackageConfig","miokuConfig: MiokuRuntimeConfig","name: string","servicePath: string","packageJson: PackageJsonLike","required: Set<string>","missing: string[]","ctx: MiokiContext","metadata: ServiceMetadata","service: MiokuService","miokuConfig: MiokuRuntimeConfig","botConfig: BotConfigLike","linkedPluginNames: string[]","deps: BootstrapDeps","botConfig","value: unknown","moduleExports: Record<string, unknown>","pluginPath: string","keywords: unknown","ctx: MiokiContext","botConfig","serviceName: string","configName: string","defaults: Record<string, unknown>","value: Record<string, unknown>","result: Record<string, Record<string, unknown>>","pluginName: string","serviceName: string","pluginName: string","state: Record<string, any>","plugin: T","options: MiokuStartOptions","logger","version: string"],"sources":["../src/core/logger.ts","../src/core/module-scanner.ts","../src/core/plugin-linker.ts","../src/core/registry.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/bootstrap.ts","../src/core/plugin-artifact-registry.ts","../src/core/service-config.ts","../src/types.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/index.ts"],"sourcesContent":["type LogMethod = (...args: unknown[]) => void;\n\nexport interface MiokuLogger {\n error: LogMethod;\n warn: LogMethod;\n info: LogMethod;\n debug: LogMethod;\n trace?: LogMethod;\n}\n\nconst fallbackLogger: MiokuLogger = {\n error: (...args) => console.error(...args),\n warn: (...args) => console.warn(...args),\n info: (...args) => console.info(...args),\n debug: (...args) => console.debug(...args),\n trace: (...args) => console.debug(...args),\n};\n\nlet activeLogger: MiokuLogger = fallbackLogger;\n\nexport function setMiokuLogger(logger: MiokuLogger | undefined): void {\n activeLogger = logger || fallbackLogger;\n}\n\nexport function getMiokuLogger(): MiokuLogger {\n return activeLogger;\n}\n\nexport const logger: MiokuLogger = {\n error: (...args) => activeLogger.error(...args),\n warn: (...args) => activeLogger.warn(...args),\n info: (...args) => activeLogger.info(...args),\n debug: (...args) => activeLogger.debug(...args),\n trace: (...args) => activeLogger.trace?.(...args),\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nexport interface DiscoveredModule {\n name: string;\n path: string;\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveRealpath(p: string): Promise<string> {\n try {\n return await fs.realpath(p);\n } catch {\n return p;\n }\n}\n\n// Windows requires file:// URLs for absolute paths in dynamic import().\nexport function toImportPath(filePath: string): string {\n if (process.platform === \"win32\") {\n return \"file:///\" + filePath.replace(/\\\\/g, \"/\");\n }\n return filePath;\n}\n\nexport async function scanLocalDir(dir: string): Promise<DiscoveredModule[]> {\n const results: DiscoveredModule[] = [];\n if (!(await pathExists(dir))) return results;\n\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n try {\n const stat = await fs.stat(entryPath);\n if (!stat.isDirectory()) continue;\n } catch {\n continue;\n }\n results.push({ name: entry.name, path: await resolveRealpath(entryPath) });\n }\n return results;\n}\n\nexport async function scanNodeModules(prefix: string): Promise<DiscoveredModule[]> {\n const results: DiscoveredModule[] = [];\n const nodeModulesPath = path.resolve(process.cwd(), \"node_modules\");\n if (!(await pathExists(nodeModulesPath))) return results;\n\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(nodeModulesPath, { withFileTypes: true });\n } catch {\n return results;\n }\n\n // Don't filter by isDirectory(): node_modules entries are often symlinks\n // into the workspace, and Dirent.isDirectory() returns false for symlinks.\n for (const entry of entries) {\n if (!entry.name.startsWith(prefix)) continue;\n const name = entry.name.slice(prefix.length);\n const fullPath = path.join(nodeModulesPath, entry.name);\n results.push({ name, path: await resolveRealpath(fullPath) });\n }\n return results;\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { PluginMetadata } from \"../types\";\nimport { logger } from \"./logger\";\nimport { pathExists } from \"./module-scanner\";\n\nexport const DEFAULT_RUNTIME_PLUGINS_DIR = \".mioku/plugins\";\n\ntype SymlinkState = \"ok\" | \"blocked\" | \"removed\";\n\nasync function removeIfBrokenSymlink(entryPath: string): Promise<SymlinkState> {\n let stat;\n try {\n stat = await fs.lstat(entryPath);\n } catch {\n return \"removed\";\n }\n if (!stat.isSymbolicLink()) return \"blocked\";\n try {\n await fs.realpath(entryPath);\n return \"ok\";\n } catch {\n await fs.rm(entryPath, { force: true });\n logger.warn(`[plugin-linker] Removed broken plugin link: ${entryPath}`);\n return \"removed\";\n }\n}\n\nfunction relativeSymlinkTarget(linkPath: string, targetPath: string): string {\n return path.relative(path.dirname(linkPath), targetPath) || \".\";\n}\n\nasync function ensurePluginLink(\n runtimePluginsDir: string,\n metadata: PluginMetadata,\n): Promise<boolean> {\n const linkPath = path.join(runtimePluginsDir, metadata.name);\n const targetPath = metadata.path;\n\n let stat;\n try {\n stat = await fs.lstat(linkPath);\n } catch {\n stat = null;\n }\n\n if (stat?.isSymbolicLink()) {\n try {\n const currentTarget = await fs.realpath(linkPath);\n const expectedTarget = await fs.realpath(targetPath);\n if (currentTarget === expectedTarget) return true;\n await fs.rm(linkPath, { force: true });\n logger.info(`[plugin-linker] Rebuilding plugin link: ${metadata.name}`);\n } catch {\n await fs.rm(linkPath, { force: true });\n logger.warn(`[plugin-linker] Removed broken plugin link: ${linkPath}`);\n }\n } else if (stat) {\n logger.warn(\n `[plugin-linker] ${linkPath} exists and is not a symlink, skip linking ${metadata.name}`,\n );\n return false;\n }\n\n if (!(await pathExists(targetPath))) {\n logger.warn(\n `[plugin-linker] Plugin target missing, skip linking ${metadata.name}: ${targetPath}`,\n );\n return false;\n }\n\n // Junctions on Windows don't require admin rights; relative dir symlinks elsewhere.\n if (process.platform === \"win32\") {\n await fs.symlink(targetPath, linkPath, \"junction\");\n } else {\n await fs.symlink(relativeSymlinkTarget(linkPath, targetPath), linkPath, \"dir\");\n }\n return true;\n}\n\nexport async function prepareRuntimePluginLinks(\n plugins: PluginMetadata[],\n runtimePluginsDir = path.resolve(process.cwd(), DEFAULT_RUNTIME_PLUGINS_DIR),\n): Promise<string[]> {\n await fs.mkdir(runtimePluginsDir, { recursive: true });\n\n const discoveredNames = new Set(plugins.map((p) => p.name));\n const entries = await fs.readdir(runtimePluginsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(runtimePluginsDir, entry.name);\n if ((await removeIfBrokenSymlink(entryPath)) !== \"ok\") continue;\n if (entry.isSymbolicLink() && !discoveredNames.has(entry.name)) {\n await fs.rm(entryPath, { force: true });\n logger.info(`[plugin-linker] Removed stale plugin link: ${entry.name}`);\n }\n }\n\n const linkedNames: string[] = [];\n for (const metadata of plugins) {\n if (await ensurePluginLink(runtimePluginsDir, metadata)) {\n linkedNames.push(metadata.name);\n }\n }\n return linkedNames;\n}\n","// Framework singletons are stashed on globalThis so they survive jiti's\n// moduleCache-off re-evaluation (mioki loads plugins via jiti). Callers that\n// live in the normally-cached `mioku` dist could use a plain module-level\n// const, but the global indirection keeps things stable if a plugin ever\n// re-imports the framework through jiti.\n\nconst STORE_SYMBOL = Symbol.for(\"mioku.globalStore\");\ntype GlobalStore = Record<string, unknown>;\n\nfunction store(): GlobalStore {\n const g = globalThis as unknown as Record<symbol, GlobalStore>;\n if (!g[STORE_SYMBOL]) g[STORE_SYMBOL] = {};\n return g[STORE_SYMBOL]!;\n}\n\nexport function getOrCreate<T>(key: string, factory: () => T): T {\n const s = store();\n if (s[key] === undefined) s[key] = factory();\n return s[key] as T;\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { mkdirSync } from \"fs\";\nimport type {\n MiokuRuntimeConfig,\n PackageJsonLike,\n PluginMetadata,\n PluginPackageConfig,\n} from \"../types\";\nimport { DEFAULT_RUNTIME_PLUGINS_DIR } from \"./plugin-linker\";\nimport { logger } from \"./logger\";\nimport {\n scanLocalDir,\n scanNodeModules,\n pathExists,\n resolveRealpath,\n} from \"./module-scanner\";\nimport { getOrCreate } from \"./registry\";\n\nconst PLUGIN_PREFIX = \"mioku-plugin-\";\n\nexport class PluginManager {\n private plugins = new Map<string, PluginMetadata>();\n\n static getInstance(): PluginManager {\n return getOrCreate(\"plugin-manager\", () => new PluginManager());\n }\n\n async discoverPlugins(miokuConfig: MiokuRuntimeConfig = {}): Promise<PluginMetadata[]> {\n const configuredDir = miokuConfig.plugins_dir;\n const pluginsDir =\n configuredDir && configuredDir !== DEFAULT_RUNTIME_PLUGINS_DIR\n ? path.resolve(process.cwd(), configuredDir)\n : path.resolve(process.cwd(), \"plugins\");\n\n this.plugins.clear();\n\n if (!(await pathExists(pluginsDir))) {\n mkdirSync(pluginsDir, { recursive: true });\n }\n\n const local = await scanLocalDir(pluginsDir);\n for (const { name, path: p } of local) {\n const metadata = await this.loadPluginMetadata(name, p);\n if (metadata) this.plugins.set(metadata.name, metadata);\n }\n\n const external = await scanNodeModules(PLUGIN_PREFIX);\n for (const { name, path: p } of external) {\n const metadata = await this.loadPluginMetadata(name, p);\n if (metadata) this.plugins.set(metadata.name, metadata);\n }\n\n logger.info(`O.o 发现了 ${this.plugins.size} 个插件`);\n return [...this.plugins.values()];\n }\n\n private async loadPluginMetadata(\n name: string,\n pluginPath: string,\n ): Promise<PluginMetadata | null> {\n const resolvedPath = await resolveRealpath(pluginPath);\n let packageJson: PackageJsonLike | null = null;\n try {\n packageJson = JSON.parse(\n await fs.readFile(path.join(resolvedPath, \"package.json\"), \"utf-8\"),\n );\n } catch (error) {\n logger.warn(`[plugin-manager] 读取 ${name} 的 package.json 失败: ${error}`);\n }\n\n const config: PluginPackageConfig = packageJson?.mioku ?? {};\n return {\n name,\n version: packageJson?.version ?? \"0.0.0\",\n description: packageJson?.description,\n path: resolvedPath,\n packageJson: packageJson ?? {},\n config,\n };\n }\n\n collectRequiredServices(): Set<string> {\n const services = new Set<string>();\n for (const metadata of this.plugins.values()) {\n for (const service of metadata.config.services ?? []) services.add(service);\n }\n return services;\n }\n\n getPluginMetadata(name: string): PluginMetadata | undefined {\n return this.plugins.get(name);\n }\n\n getAllMetadata(): PluginMetadata[] {\n return [...this.plugins.values()];\n }\n\n reset(): void {\n this.plugins.clear();\n }\n}\n\nexport default PluginManager.getInstance();\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport type { MiokiContext } from \"mioki\";\nimport type {\n MiokuRuntimeConfig,\n PackageJsonLike,\n ServiceMetadata,\n MiokuService,\n} from \"../types\";\nimport { logger } from \"./logger\";\nimport {\n scanLocalDir,\n scanNodeModules,\n pathExists,\n toImportPath,\n} from \"./module-scanner\";\nimport { getOrCreate } from \"./registry\";\n\nconst SERVICE_PREFIX = \"mioku-service-\";\n\nexport class ServiceManager {\n private services = new Map<string, MiokuService>();\n private serviceMetadata = new Map<string, ServiceMetadata>();\n\n static getInstance(): ServiceManager {\n return getOrCreate(\"service-manager\", () => new ServiceManager());\n }\n\n async discoverServices(miokuConfig: MiokuRuntimeConfig = {}): Promise<ServiceMetadata[]> {\n const servicesDir = miokuConfig.services_dir\n ? path.resolve(process.cwd(), miokuConfig.services_dir)\n : path.resolve(process.cwd(), \"services\");\n\n this.serviceMetadata.clear();\n\n if (existsSync(servicesDir)) {\n const local = await scanLocalDir(servicesDir);\n for (const { name, path: p } of local) {\n const metadata = await this.loadServiceMetadata(name, p);\n if (metadata) this.serviceMetadata.set(name, metadata);\n }\n } else {\n mkdirSync(servicesDir, { recursive: true });\n }\n\n const external = await scanNodeModules(SERVICE_PREFIX);\n for (const { name, path: p } of external) {\n const metadata = await this.loadServiceMetadata(name, p);\n if (metadata) this.serviceMetadata.set(name, metadata);\n }\n\n logger.info(`o.O 发现了 ${this.serviceMetadata.size} 个服务`);\n return [...this.serviceMetadata.values()];\n }\n\n private async loadServiceMetadata(\n name: string,\n servicePath: string,\n ): Promise<ServiceMetadata | null> {\n const packageJsonPath = path.join(servicePath, \"package.json\");\n if (!(await pathExists(packageJsonPath))) return null;\n\n try {\n const packageJson: PackageJsonLike = JSON.parse(\n await fs.readFile(packageJsonPath, \"utf-8\"),\n );\n return {\n name,\n version: packageJson.version ?? \"0.0.0\",\n description: packageJson.description,\n path: servicePath,\n packageJson,\n };\n } catch (error) {\n logger.warn(`[service-manager] 解析服务 ${name} 失败: ${error}`);\n return null;\n }\n }\n\n async checkMissingServices(required: Set<string>): Promise<string[]> {\n const missing: string[] = [];\n for (const name of required) {\n if (!this.serviceMetadata.has(name)) missing.push(name);\n }\n return missing;\n }\n\n async loadAllServices(ctx: MiokiContext): Promise<void> {\n const all = [...this.serviceMetadata.values()];\n logger.info(`O.o 准备加载 ${all.length} 个服务...`);\n for (const metadata of all) {\n await this.loadService(metadata, ctx);\n }\n }\n\n private async loadService(\n metadata: ServiceMetadata,\n ctx: MiokiContext,\n ): Promise<boolean> {\n try {\n const tsEntry = path.join(metadata.path, \"index.ts\");\n const jsEntry = path.join(metadata.path, \"index.js\");\n const entry = (await pathExists(tsEntry))\n ? tsEntry\n : (await pathExists(jsEntry))\n ? jsEntry\n : null;\n if (!entry) {\n logger.error(`[service-manager] 服务 ${metadata.name} 入口丢失`);\n return false;\n }\n\n const serviceModule = await import(toImportPath(entry));\n const service: MiokuService = serviceModule.default ?? serviceModule;\n if (!service || typeof service.init !== \"function\") {\n logger.warn(`[service-manager] 服务 ${metadata.name} 无效:缺少 init()`);\n return false;\n }\n\n await service.init();\n if (service.api) {\n ctx.services[metadata.name] = service.api;\n }\n this.services.set(metadata.name, service);\n return true;\n } catch (error) {\n logger.error(`[service-manager] 加载服务 ${metadata.name} 失败: ${error}`);\n return false;\n }\n }\n\n registerBuiltinService(name: string, service: MiokuService): void {\n this.services.set(name, service);\n }\n\n getService(name: string): MiokuService | undefined {\n return this.services.get(name);\n }\n\n async disposeAll(): Promise<void> {\n for (const [, service] of this.services) {\n await service.dispose?.();\n }\n this.services.clear();\n }\n\n reset(): void {\n this.services.clear();\n this.serviceMetadata.clear();\n }\n}\n\nexport default ServiceManager.getInstance();\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport type { MiokuRuntimeConfig } from \"../types\";\nimport pluginManager from \"./plugin-manager\";\nimport serviceManager from \"./service-manager\";\nimport {\n prepareRuntimePluginLinks,\n DEFAULT_RUNTIME_PLUGINS_DIR,\n} from \"./plugin-linker\";\nimport { logger } from \"./logger\";\n\ninterface BotConfigLike {\n plugins: string[];\n plugins_dir?: string;\n}\n\nexport interface BootstrapDeps {\n cwd: string;\n botConfig: BotConfigLike;\n startMioki: (opts: { cwd: string }) => Promise<void>;\n}\n\nexport async function readMiokuConfig(): Promise<MiokuRuntimeConfig> {\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n try {\n const pkg = JSON.parse(await fs.readFile(packageJsonPath, \"utf-8\"));\n return (pkg.mioki ?? {}) as MiokuRuntimeConfig;\n } catch {\n return {};\n }\n}\n\nfunction ensureRuntimeDirectories(): void {\n for (const dir of [\"data\", \"config\", \"temp\"]) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n }\n}\n\nasync function discoverAndLinkPlugins(\n miokuConfig: MiokuRuntimeConfig,\n): Promise<string[]> {\n logger.info(\"O.o Miku 正在翻找插件..\");\n const discovered = await pluginManager.discoverPlugins(miokuConfig);\n logger.info(\n `O.o 共发现 ${discovered.length} 个插件: ${discovered.map((p) => p.name).join(\", \")}`,\n );\n const runtimePluginsDir = path.resolve(\n process.cwd(),\n DEFAULT_RUNTIME_PLUGINS_DIR,\n );\n return prepareRuntimePluginLinks(discovered, runtimePluginsDir);\n}\n\nasync function discoverAndValidateServices(\n miokuConfig: MiokuRuntimeConfig,\n): Promise<void> {\n logger.info(\"o.O Miku 正在翻找服务..\");\n await serviceManager.discoverServices(miokuConfig);\n const requiredServices = pluginManager.collectRequiredServices();\n const missing = await serviceManager.checkMissingServices(requiredServices);\n if (missing.length > 0) logger.warn(`发现缺失服务: ${missing.join(\", \")}`);\n}\n\nfunction applyPluginAllowlist(\n miokuConfig: MiokuRuntimeConfig,\n botConfig: BotConfigLike,\n linkedPluginNames: string[],\n): void {\n botConfig.plugins_dir = DEFAULT_RUNTIME_PLUGINS_DIR;\n // Respect an explicit plugins list; only auto-load when undefined.\n if (miokuConfig.plugins !== undefined) return;\n for (const name of linkedPluginNames) {\n if (!botConfig.plugins.includes(name)) botConfig.plugins.push(name);\n }\n}\n\nexport async function bootstrapMioku(deps: BootstrapDeps): Promise<void> {\n const { cwd, botConfig, startMioki } = deps;\n const miokuConfig = await readMiokuConfig();\n ensureRuntimeDirectories();\n const linkedPluginNames = await discoverAndLinkPlugins(miokuConfig);\n await discoverAndValidateServices(miokuConfig);\n applyPluginAllowlist(miokuConfig, botConfig, linkedPluginNames);\n await startMioki({ cwd });\n}\n","import * as path from \"path\";\nimport type { MiokiContext } from \"mioki\";\nimport { botConfig } from \"mioki\";\nimport type { AIService, AISkill, HelpService } from \"../types\";\nimport pluginManager from \"./plugin-manager\";\nimport { logger } from \"./logger\";\nimport { pathExists, toImportPath } from \"./module-scanner\";\n\nfunction isAISkill(value: unknown): value is AISkill {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as AISkill).name === \"string\" &&\n Array.isArray((value as AISkill).tools)\n );\n}\n\nfunction extractSkills(moduleExports: Record<string, unknown>): AISkill[] {\n const candidates = [moduleExports?.default, moduleExports?.skills, moduleExports];\n for (const candidate of candidates) {\n if (Array.isArray(candidate)) return candidate.filter(isAISkill);\n if (isAISkill(candidate)) return [candidate];\n }\n return [];\n}\n\nasync function resolveSkillsEntry(pluginPath: string): Promise<string | null> {\n const tsPath = path.join(pluginPath, \"skills.ts\");\n if (await pathExists(tsPath)) return tsPath;\n const jsPath = path.join(pluginPath, \"skills.js\");\n if (await pathExists(jsPath)) return jsPath;\n return null;\n}\n\nfunction hasPublicKeyword(keywords: unknown): boolean {\n return Array.isArray(keywords) && keywords.includes(\"mioku\");\n}\n\nexport async function registerPluginArtifacts(ctx: MiokiContext): Promise<void> {\n const enabledPlugins = new Set<string>(botConfig.plugins ?? []);\n const pluginMetadata = pluginManager.getAllMetadata().filter((metadata) =>\n enabledPlugins.size > 0 ? enabledPlugins.has(metadata.name) : true,\n );\n\n const helpService = ctx.services.help as HelpService | undefined;\n const aiService = ctx.services.ai as AIService | undefined;\n\n if (helpService) {\n let helpCount = 0;\n for (const metadata of pluginMetadata) {\n if (!metadata.config.help) continue;\n if (!hasPublicKeyword(metadata.packageJson?.keywords)) continue;\n helpService.registerHelp(metadata.name, metadata.config.help);\n helpCount += 1;\n }\n logger.info(`[plugin-artifacts] Registered ${helpCount} help manifest(s)`);\n }\n\n if (!aiService) return;\n\n let skillCount = 0;\n for (const metadata of pluginMetadata) {\n const skillsEntry = await resolveSkillsEntry(metadata.path);\n if (!skillsEntry) continue;\n\n try {\n const moduleExports = (await import(toImportPath(skillsEntry))) as Record<\n string,\n unknown\n >;\n const skills = extractSkills(moduleExports);\n if (skills.length === 0) {\n logger.warn(\n `[plugin-artifacts] Plugin ${metadata.name} has ${path.basename(skillsEntry)} but exported no valid skill`,\n );\n continue;\n }\n for (const skill of skills) {\n aiService.registerSkill(skill);\n skillCount += 1;\n }\n } catch (error) {\n logger.error(\n `[plugin-artifacts] Failed to load skills for plugin ${metadata.name}: ${error}`,\n );\n }\n }\n logger.info(`[plugin-artifacts] Registered ${skillCount} skill(s)`);\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport { logger } from \"./logger\";\n\nconst SERVICE_CONFIG_ROOT = \"service\";\n\nfunction resolveConfigDir(serviceName: string): string {\n return path.join(process.cwd(), \"config\", SERVICE_CONFIG_ROOT, serviceName);\n}\n\nfunction resolveConfigPath(serviceName: string, configName: string): string {\n return path.join(resolveConfigDir(serviceName), `${configName}.json`);\n}\n\nfunction ensureDir(serviceName: string): void {\n const dir = resolveConfigDir(serviceName);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nexport async function registerServiceConfig(\n serviceName: string,\n configName: string,\n defaults: Record<string, unknown>,\n): Promise<void> {\n ensureDir(serviceName);\n const configPath = resolveConfigPath(serviceName, configName);\n if (!existsSync(configPath)) {\n await fs.writeFile(configPath, JSON.stringify(defaults, null, 2), \"utf-8\");\n }\n}\n\nexport async function getServiceConfig(\n serviceName: string,\n configName: string,\n): Promise<Record<string, unknown>> {\n const configPath = resolveConfigPath(serviceName, configName);\n try {\n return JSON.parse(await fs.readFile(configPath, \"utf-8\"));\n } catch (error) {\n if (!existsSync(configPath)) return {};\n logger.warn(`[service-config] 读取 ${serviceName}/${configName} 失败: ${error}`);\n return {};\n }\n}\n\nexport async function updateServiceConfig(\n serviceName: string,\n configName: string,\n value: Record<string, unknown>,\n): Promise<void> {\n ensureDir(serviceName);\n await fs.writeFile(\n resolveConfigPath(serviceName, configName),\n JSON.stringify(value, null, 2),\n \"utf-8\",\n );\n}\n\nexport async function getServiceConfigs(\n serviceName: string,\n): Promise<Record<string, Record<string, unknown>>> {\n const dir = resolveConfigDir(serviceName);\n if (!existsSync(dir)) return {};\n\n const result: Record<string, Record<string, unknown>> = {};\n const files = (await fs.readdir(dir)).filter((name) => name.endsWith(\".json\"));\n for (const file of files) {\n try {\n result[path.basename(file, \".json\")] = JSON.parse(\n await fs.readFile(path.join(dir, file), \"utf-8\"),\n );\n } catch (error) {\n logger.warn(`[service-config] 读取 ${serviceName}/${file} 失败: ${error}`);\n }\n }\n return result;\n}\n\nexport async function deleteServiceConfig(\n serviceName: string,\n configName: string,\n): Promise<boolean> {\n const configPath = resolveConfigPath(serviceName, configName);\n if (!existsSync(configPath)) return false;\n await fs.unlink(configPath);\n return true;\n}\n","// Mioku framework types — single source of truth for the public API surface.\n\n// ---------- framework ----------\n\nexport interface MiokuService {\n name: string;\n version: string;\n description?: string;\n init(): Promise<void>;\n api: Record<string, any>;\n dispose?(): Promise<void>;\n}\n\nexport interface MiokuRuntimeConfig {\n plugins?: string[];\n plugins_dir?: string;\n services_dir?: string;\n [key: string]: unknown;\n}\n\nexport interface PackageJsonLike {\n name?: string;\n version?: string;\n description?: string;\n keywords?: string[];\n mioki?: MiokuRuntimeConfig;\n mioku?: PluginPackageConfig;\n dependencies?: Record<string, string>;\n}\n\nexport interface PluginMetadata {\n name: string;\n version: string;\n description?: string;\n path: string;\n packageJson: PackageJsonLike;\n config: PluginPackageConfig;\n}\n\nexport interface ServiceMetadata {\n name: string;\n version: string;\n description?: string;\n path: string;\n packageJson: PackageJsonLike;\n}\n\n// ---------- plugin package config ----------\n\nexport interface PluginPackageConfig {\n services?: string[];\n help?: PluginHelp;\n accessHooks?: AccessHook[];\n}\n\nexport interface PluginHelp {\n title: string;\n description: string;\n commands: Array<{\n cmd: string;\n desc: string;\n usage?: string;\n role?: CommandRole;\n }>;\n}\n\nexport type CommandRole = \"master\" | \"admin\" | \"owner\" | \"member\";\n\nexport interface AccessHook {\n id: string;\n match?: string;\n event?: string;\n description?: string;\n}\n\nexport type AccessAction = \"allow\" | \"block\";\n\nexport interface AccessRuleEntry {\n action: AccessAction;\n}\n\nexport interface AccessScopeConfig {\n plugins?: Record<string, AccessRuleEntry>;\n commands?: Record<string, Record<string, AccessRuleEntry>>;\n}\n\nexport interface AccessControlConfig {\n version: 1;\n global: AccessScopeConfig;\n groups: Record<string, AccessScopeConfig>;\n users: Record<string, AccessScopeConfig>;\n}\n\n// ---------- built-in service contracts ----------\n\nexport interface ConfigService {\n registerConfig(pluginName: string, configName: string, initialConfig: any): Promise<boolean>;\n updateConfig(pluginName: string, configName: string, updates: any): Promise<boolean>;\n getConfig(pluginName: string, configName: string): Promise<any>;\n getPluginConfigs(pluginName: string): Promise<Record<string, any>>;\n onConfigChange(pluginName: string, configName: string, callback: (newConfig: any) => void): () => void;\n}\n\nexport interface ScreenshotService {\n screenshot(html: string, options?: any): Promise<string>;\n screenshotMarkdown(markdownContent: string, options?: any): Promise<string>;\n screenshotFromUrl(url: string, options?: any): Promise<string>;\n cleanupTemp(olderThanMs?: number): Promise<number>;\n}\n\nexport interface HelpService {\n registerHelp(pluginName: string, help: PluginHelp): void;\n getHelp(pluginName: string): PluginHelp | undefined;\n getAllHelp(): Map<string, PluginHelp>;\n unregisterHelp(pluginName: string): boolean;\n}\n\nexport interface WebUIService {\n getSettings(): { port: number; host: string; packageManager: string };\n}\n\n// ---------- AI service ----------\n\nexport interface AITool {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n handler: (args: any, event?: any) => Promise<any> | any;\n}\n\nexport type SkillPermissionRole = \"owner\" | \"admin\" | \"member\";\n\nexport interface AISkill {\n name: string;\n description: string;\n permission?: SkillPermissionRole;\n tools: AITool[];\n}\n\nexport interface TextMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface MultimodalContentItem {\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string;\n detail?: \"auto\" | \"low\" | \"high\";\n };\n}\n\nexport interface MultimodalMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | MultimodalContentItem[];\n}\n\nexport interface ToolCallRecord {\n name: string;\n arguments: any;\n result: any;\n}\n\nexport interface SessionToolDefinition {\n name: string;\n tool: AITool;\n}\n\nexport interface CompleteOptions {\n model?: string;\n messages: any[];\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n tools?: any[];\n executableTools?: SessionToolDefinition[];\n executableToolsProvider?: () => SessionToolDefinition[];\n maxIterations?: number;\n onTextDelta?: (delta: string) => void | Promise<void>;\n usageContext?: AIUsageContext;\n usageContextTokens?: number;\n usageBreakdown?: AIUsageFinalization[\"breakdown\"];\n}\n\nexport interface CompleteResponse {\n content: string | null;\n reasoning: string | null;\n toolCalls: Array<{ id: string; name: string; arguments: string }>;\n raw: any;\n turnMessages: any[];\n iterations?: number;\n allToolCalls?: ToolCallRecord[];\n}\n\nexport interface AIInstance {\n generateText(options: { prompt?: string; messages: TextMessage[]; model?: string; temperature?: number; max_tokens?: number }): Promise<string>;\n generateMultimodal(options: { prompt?: string; messages: MultimodalMessage[]; model?: string; temperature?: number; max_tokens?: number }): Promise<string>;\n complete(options: CompleteOptions): Promise<CompleteResponse>;\n generateWithTools(options: { prompt?: string; messages: TextMessage[] | MultimodalMessage[]; model?: string; temperature?: number; maxIterations?: number }): Promise<any>;\n setUsageContext?(context: AIUsageContext | undefined): void;\n withUsageContext?<T>(context: AIUsageContext | undefined, fn: () => Promise<T>): Promise<T>;\n registerPrompt(name: string, prompt: string): boolean;\n getPrompt(name: string): string | undefined;\n getAllPrompts(): Record<string, string>;\n removePrompt(name: string): boolean;\n}\n\nexport interface AIService {\n create(options: { name: string; apiUrl: string; apiKey: string; modelType: \"text\" | \"multimodal\"; model?: string }): Promise<AIInstance>;\n get(name: string): AIInstance | undefined;\n list(): string[];\n remove(name: string): boolean;\n setDefault(name: string): boolean;\n getDefault(): AIInstance | undefined;\n registerChatRuntime(runtime: any): boolean;\n getChatRuntime(): any;\n removeChatRuntime(): boolean;\n registerSkill(skill: AISkill): boolean;\n getSkill(skillName: string): AISkill | undefined;\n getAllSkills(): Map<string, AISkill>;\n removeSkill(skillName: string): boolean;\n getTool(toolName: string): AITool | undefined;\n getAllTools(): Map<string, AITool>;\n getUsageSummary?(options: { range: AIUsageRange; botId?: number }): AIUsageSummary;\n cleanupUsageStats?(retentionMs?: number): number;\n finalizeUsage?(usageId: string, finalization: AIUsageFinalization): boolean;\n}\n\n// ---------- chat runtime ----------\n\nexport interface ChatRuntime {\n generateNotice(options: ChatRuntimeNoticeOptions): Promise<ChatRuntimeResult>;\n requestInformation(options: ChatRuntimeInformationRequestOptions): Promise<ChatRuntimeResult>;\n}\n\nexport const TOOL_RESULT_FOLLOWUP_KEY = \"__miokuFollowup\";\n\nexport interface ToolResultFollowup {\n text: string;\n images?: Array<{ url: string; detail?: \"auto\" | \"low\" | \"high\" }>;\n videos?: Array<{ url: string; detail?: \"auto\" | \"low\" | \"high\" }>;\n}\n\nexport interface ChatRuntimePromptInjection {\n content: string;\n title?: string;\n}\n\nexport interface ChatRuntimeGroupTarget {\n selfId: number;\n groupId: number;\n}\n\nexport interface ChatRuntimePrivateTarget {\n selfId: number;\n userId: number;\n}\n\nexport type ChatRuntimeSource =\n | { event: any }\n | ChatRuntimeGroupTarget\n | ChatRuntimePrivateTarget;\n\nexport type ChatRuntimeBaseOptions = ChatRuntimeSource & {\n targetMessage?: string;\n promptInjections?: ChatRuntimePromptInjection[];\n send?: boolean;\n};\n\nexport type ChatRuntimeNoticeOptions = ChatRuntimeBaseOptions & {\n instruction: string;\n};\n\nexport type ChatRuntimeInformationRequestOptions = ChatRuntimeBaseOptions & {\n task: string;\n schema: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n toolName?: string;\n toolDescription?: string;\n};\n\nexport interface ChatRuntimeCollectedInfo {\n data: any;\n isComplete?: boolean;\n confidence?: number;\n notes?: string;\n}\n\nexport interface ChatRuntimeResult {\n messages: string[];\n toolCalls: ToolCallRecord[];\n collectedInfo: ChatRuntimeCollectedInfo | null;\n pendingAt?: number[];\n pendingPoke?: number[];\n pendingQuote?: number;\n emojiPath?: string | null;\n protocolMessages?: any[];\n}\n\n// ---------- usage tracking ----------\n\nexport type AIUsageRange = \"today\" | \"7d\" | \"30d\";\n\nexport type AIUsageScope = \"all\" | \"bot\";\n\nexport interface AIUsageContext {\n usageId?: string;\n source?: string;\n botId?: number;\n groupId?: number;\n groupName?: string;\n userId?: number;\n userName?: string;\n sessionId?: string;\n}\n\nexport interface AIUsageBreakdown {\n systemPromptTokens?: number;\n chatHistoryTokens?: number;\n toolDefinitionTokens?: number;\n toolUseTokens?: number;\n otherContextTokens?: number;\n}\n\nexport interface AIUsageFinalization {\n sentUserMessages?: number;\n sentAssistantMessages?: number;\n breakdown?: AIUsageBreakdown;\n}\n\nexport interface AIUsageBotOption {\n botId: number;\n label: string;\n}\n\nexport interface AIUsageSummary {\n generatedAt: number;\n range: AIUsageRange;\n scope: AIUsageScope;\n botId?: number;\n bots: AIUsageBotOption[];\n totals: {\n requests: number;\n successfulRequests: number;\n failedRequests: number;\n userMessages: number;\n assistantMessages: number;\n systemMessages: number;\n toolMessages: number;\n sentUserMessages: number;\n sentAssistantMessages: number;\n inputTokens: number;\n outputTokens: number;\n systemPromptTokens: number;\n totalTokens: number;\n cacheWriteTokens: number;\n cacheReadTokens: number;\n toolDefinitionTokens: number;\n toolUseTokens: number;\n chatHistoryTokens: number;\n otherContextTokens: number;\n durationMs: number;\n toolCalls: number;\n };\n rates: {\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n };\n toolRanking: Array<{ name: string; count: number }>;\n groupRanking: Array<{\n groupId: number;\n groupName: string;\n requests: number;\n totalTokens: number;\n userMessages: number;\n assistantMessages: number;\n errorRate: number;\n }>;\n tokenFlow: Array<{ name: \"输入\" | \"输出\" | \"缓存写入\" | \"缓存读取\"; value: number }>;\n tokenCategories: Array<{\n name: \"系统提示词\" | \"工具定义\" | \"工具使用\" | \"聊天上下文\" | \"其他上下文\";\n value: number;\n }>;\n dailyActivity: Array<{\n day: string;\n requests: number;\n userMessages: number;\n assistantMessages: number;\n totalTokens: number;\n inputTokens: number;\n cacheReadTokens: number;\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n }>;\n hourlyActivity: Array<{\n hour: string;\n requests: number;\n userMessages: number;\n assistantMessages: number;\n totalTokens: number;\n inputTokens: number;\n cacheReadTokens: number;\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n }>;\n}\n","import * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\n\nexport function getPluginDataDir(pluginName: string): string {\n return path.join(process.cwd(), \"data\", pluginName);\n}\n\nexport function getServiceDataDir(serviceName: string): string {\n return path.join(process.cwd(), \"data\", serviceName);\n}\n\nexport function getDataDir(): string {\n return path.join(process.cwd(), \"data\");\n}\n\nexport function getPluginConfigDir(pluginName: string): string {\n return path.join(process.cwd(), \"config\", pluginName);\n}\n\nexport function getServiceConfigDir(serviceName: string): string {\n return path.join(process.cwd(), \"config\", \"service\", serviceName);\n}\n\nexport function getConfigDir(): string {\n return path.join(process.cwd(), \"config\");\n}\n\nexport function ensureDataDir(pluginName: string): string {\n const dir = getPluginDataDir(pluginName);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n return dir;\n}\n","import { getOrCreate } from \"./registry\";\n\ninterface PluginStateStore {\n [pluginName: string]: Record<string, any>;\n}\n\n// Stashed via the global registry so it survives jiti re-evaluation when a\n// plugin re-imports the framework through its loader. Values are `any` because\n// the state bag is plugin-defined and consumed via casts.\nconst store = getOrCreate<PluginStateStore>(\"plugin-runtime-state\", () => ({}));\n\nexport function getPluginRuntimeState(pluginName: string): Record<string, any> {\n if (!store[pluginName]) store[pluginName] = {};\n return store[pluginName];\n}\n\nexport function setPluginRuntimeState(\n pluginName: string,\n state: Record<string, any>,\n): Record<string, any> {\n if (!store[pluginName]) store[pluginName] = {};\n Object.assign(store[pluginName], state);\n return store[pluginName];\n}\n\nexport function resetPluginRuntimeState(pluginName: string): void {\n delete store[pluginName];\n}\n\nexport function getAllPluginRuntimeStates(): PluginStateStore {\n return { ...store };\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { bootstrapMioku } from \"./core/bootstrap\";\nimport { setMiokuLogger } from \"./core/logger\";\n\nexport type { MiokiPlugin, MiokiContext } from \"mioki\";\n\nexport function definePlugin<T extends import(\"mioki\").MiokiPlugin>(plugin: T): T {\n return plugin;\n}\n\nexport { default as pluginManager } from \"./core/plugin-manager\";\nexport { default as serviceManager } from \"./core/service-manager\";\nexport { registerPluginArtifacts } from \"./core/plugin-artifact-registry\";\n\nexport {\n registerServiceConfig,\n getServiceConfig,\n updateServiceConfig,\n getServiceConfigs,\n deleteServiceConfig,\n} from \"./core/service-config\";\n\nexport type {\n MiokuService,\n MiokuRuntimeConfig,\n PackageJsonLike,\n PluginMetadata,\n ServiceMetadata,\n PluginPackageConfig,\n PluginHelp,\n CommandRole,\n AccessHook,\n AccessAction,\n AccessRuleEntry,\n AccessScopeConfig,\n AccessControlConfig,\n ConfigService,\n ScreenshotService,\n HelpService,\n WebUIService,\n AITool,\n AISkill,\n AIInstance,\n AIService,\n ChatRuntime,\n TextMessage,\n MultimodalMessage,\n ToolCallRecord,\n CompleteOptions,\n CompleteResponse,\n SessionToolDefinition,\n SkillPermissionRole,\n MultimodalContentItem,\n ToolResultFollowup,\n ChatRuntimePromptInjection,\n ChatRuntimeGroupTarget,\n ChatRuntimePrivateTarget,\n ChatRuntimeSource,\n ChatRuntimeBaseOptions,\n ChatRuntimeNoticeOptions,\n ChatRuntimeInformationRequestOptions,\n ChatRuntimeCollectedInfo,\n ChatRuntimeResult,\n AIUsageRange,\n AIUsageScope,\n AIUsageBotOption,\n AIUsageContext,\n AIUsageBreakdown,\n AIUsageFinalization,\n AIUsageSummary,\n} from \"./types\";\n\nexport { TOOL_RESULT_FOLLOWUP_KEY } from \"./types\";\n\nexport interface MiokuStartOptions {\n cwd?: string;\n}\n\nexport async function start(options: MiokuStartOptions = {}): Promise<void> {\n const { cwd = process.cwd() } = options;\n if (cwd) process.chdir(cwd);\n\n const { start: startMioki, logger, botConfig } = await import(\"mioki\");\n setMiokuLogger(logger);\n\n logger.info(\"こんにちは..\");\n logger.info(\"---------------------------------------\");\n logger.info(\"---------- Mioku 正在启动 ------------\");\n logger.info(\"---------------------------------------\");\n\n await bootstrapMioku({ cwd, botConfig, startMioki });\n}\n\nfunction readVersion(): string {\n try {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = path.join(here, \"..\", \"package.json\");\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const version: string = readVersion();\n\nexport {\n getDataDir,\n getPluginDataDir,\n getServiceDataDir,\n getConfigDir,\n getPluginConfigDir,\n getServiceConfigDir,\n ensureDataDir,\n} from \"./core/data-paths\";\n\nexport {\n getPluginRuntimeState,\n setPluginRuntimeState,\n resetPluginRuntimeState,\n} from \"./core/plugin-runtime-state\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["fallbackLogger: MiokuLogger","activeLogger: MiokuLogger","logger: MiokuLogger | undefined","logger","logger: MiokuLogger","filePath: string","p: string","dir: string","results: DiscoveredModule[]","entries: import(\"fs\").Dirent[]","prefix: string","entryPath: string","linkPath: string","targetPath: string","runtimePluginsDir: string","metadata: PluginMetadata","plugins: PluginMetadata[]","linkedNames: string[]","store","key: string","factory: () => T","miokuConfig: MiokuRuntimeConfig","name: string","pluginPath: string","packageJson: PackageJsonLike | null","config: PluginPackageConfig","miokuConfig: MiokuRuntimeConfig","name: string","servicePath: string","packageJson: PackageJsonLike","required: Set<string>","missing: string[]","ctx: MiokiContext","metadata: ServiceMetadata","service: MiokuService","miokuConfig: MiokuRuntimeConfig","botConfig: BotConfigLike","linkedPluginNames: string[]","deps: BootstrapDeps","botConfig","value: unknown","moduleExports: Record<string, unknown>","pluginPath: string","keywords: unknown","ctx: MiokiContext","botConfig","serviceName: string","configName: string","defaults: Record<string, unknown>","value: Record<string, unknown>","result: Record<string, Record<string, unknown>>","pluginName: string","serviceName: string","pluginName: string","state: Record<string, any>","plugin: T","options: MiokuStartOptions","logger","version: string"],"sources":["../src/core/logger.ts","../src/core/module-scanner.ts","../src/core/plugin-linker.ts","../src/core/registry.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/bootstrap.ts","../src/core/plugin-artifact-registry.ts","../src/core/service-config.ts","../src/types.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/index.ts"],"sourcesContent":["type LogMethod = (...args: unknown[]) => void;\n\nexport interface MiokuLogger {\n error: LogMethod;\n warn: LogMethod;\n info: LogMethod;\n debug: LogMethod;\n trace?: LogMethod;\n}\n\nconst fallbackLogger: MiokuLogger = {\n error: (...args) => console.error(...args),\n warn: (...args) => console.warn(...args),\n info: (...args) => console.info(...args),\n debug: (...args) => console.debug(...args),\n trace: (...args) => console.debug(...args),\n};\n\nlet activeLogger: MiokuLogger = fallbackLogger;\n\nexport function setMiokuLogger(logger: MiokuLogger | undefined): void {\n activeLogger = logger || fallbackLogger;\n}\n\nexport function getMiokuLogger(): MiokuLogger {\n return activeLogger;\n}\n\nexport const logger: MiokuLogger = {\n error: (...args) => activeLogger.error(...args),\n warn: (...args) => activeLogger.warn(...args),\n info: (...args) => activeLogger.info(...args),\n debug: (...args) => activeLogger.debug(...args),\n trace: (...args) => activeLogger.trace?.(...args),\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nexport interface DiscoveredModule {\n name: string;\n path: string;\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveRealpath(p: string): Promise<string> {\n try {\n return await fs.realpath(p);\n } catch {\n return p;\n }\n}\n\n// Windows requires file:// URLs for absolute paths in dynamic import().\nexport function toImportPath(filePath: string): string {\n if (process.platform === \"win32\") {\n return \"file:///\" + filePath.replace(/\\\\/g, \"/\");\n }\n return filePath;\n}\n\nexport async function scanLocalDir(dir: string): Promise<DiscoveredModule[]> {\n const results: DiscoveredModule[] = [];\n if (!(await pathExists(dir))) return results;\n\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n try {\n const stat = await fs.stat(entryPath);\n if (!stat.isDirectory()) continue;\n } catch {\n continue;\n }\n results.push({ name: entry.name, path: await resolveRealpath(entryPath) });\n }\n return results;\n}\n\nexport async function scanNodeModules(prefix: string): Promise<DiscoveredModule[]> {\n const results: DiscoveredModule[] = [];\n const nodeModulesPath = path.resolve(process.cwd(), \"node_modules\");\n if (!(await pathExists(nodeModulesPath))) return results;\n\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(nodeModulesPath, { withFileTypes: true });\n } catch {\n return results;\n }\n\n // Don't filter by isDirectory(): node_modules entries are often symlinks\n // into the workspace, and Dirent.isDirectory() returns false for symlinks.\n for (const entry of entries) {\n if (!entry.name.startsWith(prefix)) continue;\n const name = entry.name.slice(prefix.length);\n const fullPath = path.join(nodeModulesPath, entry.name);\n results.push({ name, path: await resolveRealpath(fullPath) });\n }\n return results;\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { PluginMetadata } from \"../types\";\nimport { logger } from \"./logger\";\nimport { pathExists } from \"./module-scanner\";\n\nexport const DEFAULT_RUNTIME_PLUGINS_DIR = \".mioku/plugins\";\n\ntype SymlinkState = \"ok\" | \"blocked\" | \"removed\";\n\nasync function removeIfBrokenSymlink(entryPath: string): Promise<SymlinkState> {\n let stat;\n try {\n stat = await fs.lstat(entryPath);\n } catch {\n return \"removed\";\n }\n if (!stat.isSymbolicLink()) return \"blocked\";\n try {\n await fs.realpath(entryPath);\n return \"ok\";\n } catch {\n await fs.rm(entryPath, { force: true });\n logger.warn(`[plugin-linker] Removed broken plugin link: ${entryPath}`);\n return \"removed\";\n }\n}\n\nfunction relativeSymlinkTarget(linkPath: string, targetPath: string): string {\n return path.relative(path.dirname(linkPath), targetPath) || \".\";\n}\n\nasync function ensurePluginLink(\n runtimePluginsDir: string,\n metadata: PluginMetadata,\n): Promise<boolean> {\n const linkPath = path.join(runtimePluginsDir, metadata.name);\n const targetPath = metadata.path;\n\n let stat;\n try {\n stat = await fs.lstat(linkPath);\n } catch {\n stat = null;\n }\n\n if (stat?.isSymbolicLink()) {\n try {\n const currentTarget = await fs.realpath(linkPath);\n const expectedTarget = await fs.realpath(targetPath);\n if (currentTarget === expectedTarget) return true;\n await fs.rm(linkPath, { force: true });\n logger.info(`[plugin-linker] Rebuilding plugin link: ${metadata.name}`);\n } catch {\n await fs.rm(linkPath, { force: true });\n logger.warn(`[plugin-linker] Removed broken plugin link: ${linkPath}`);\n }\n } else if (stat) {\n logger.warn(\n `[plugin-linker] ${linkPath} exists and is not a symlink, skip linking ${metadata.name}`,\n );\n return false;\n }\n\n if (!(await pathExists(targetPath))) {\n logger.warn(\n `[plugin-linker] Plugin target missing, skip linking ${metadata.name}: ${targetPath}`,\n );\n return false;\n }\n\n // Junctions on Windows don't require admin rights; relative dir symlinks elsewhere.\n if (process.platform === \"win32\") {\n await fs.symlink(targetPath, linkPath, \"junction\");\n } else {\n await fs.symlink(relativeSymlinkTarget(linkPath, targetPath), linkPath, \"dir\");\n }\n return true;\n}\n\nexport async function prepareRuntimePluginLinks(\n plugins: PluginMetadata[],\n runtimePluginsDir = path.resolve(process.cwd(), DEFAULT_RUNTIME_PLUGINS_DIR),\n): Promise<string[]> {\n await fs.mkdir(runtimePluginsDir, { recursive: true });\n\n const discoveredNames = new Set(plugins.map((p) => p.name));\n const entries = await fs.readdir(runtimePluginsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(runtimePluginsDir, entry.name);\n if ((await removeIfBrokenSymlink(entryPath)) !== \"ok\") continue;\n if (entry.isSymbolicLink() && !discoveredNames.has(entry.name)) {\n await fs.rm(entryPath, { force: true });\n logger.info(`[plugin-linker] Removed stale plugin link: ${entry.name}`);\n }\n }\n\n const linkedNames: string[] = [];\n for (const metadata of plugins) {\n if (await ensurePluginLink(runtimePluginsDir, metadata)) {\n linkedNames.push(metadata.name);\n }\n }\n return linkedNames;\n}\n","// Framework singletons are stashed on globalThis so they survive jiti's\n// moduleCache-off re-evaluation (mioki loads plugins via jiti). Callers that\n// live in the normally-cached `mioku` dist could use a plain module-level\n// const, but the global indirection keeps things stable if a plugin ever\n// re-imports the framework through jiti.\n\nconst STORE_SYMBOL = Symbol.for(\"mioku.globalStore\");\ntype GlobalStore = Record<string, unknown>;\n\nfunction store(): GlobalStore {\n const g = globalThis as unknown as Record<symbol, GlobalStore>;\n if (!g[STORE_SYMBOL]) g[STORE_SYMBOL] = {};\n return g[STORE_SYMBOL]!;\n}\n\nexport function getOrCreate<T>(key: string, factory: () => T): T {\n const s = store();\n if (s[key] === undefined) s[key] = factory();\n return s[key] as T;\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { mkdirSync } from \"fs\";\nimport type {\n MiokuRuntimeConfig,\n PackageJsonLike,\n PluginMetadata,\n PluginPackageConfig,\n} from \"../types\";\nimport { DEFAULT_RUNTIME_PLUGINS_DIR } from \"./plugin-linker\";\nimport { logger } from \"./logger\";\nimport {\n scanLocalDir,\n scanNodeModules,\n pathExists,\n resolveRealpath,\n} from \"./module-scanner\";\nimport { getOrCreate } from \"./registry\";\n\nconst PLUGIN_PREFIX = \"mioku-plugin-\";\n\nexport class PluginManager {\n private plugins = new Map<string, PluginMetadata>();\n\n static getInstance(): PluginManager {\n return getOrCreate(\"plugin-manager\", () => new PluginManager());\n }\n\n async discoverPlugins(miokuConfig: MiokuRuntimeConfig = {}): Promise<PluginMetadata[]> {\n const configuredDir = miokuConfig.plugins_dir;\n const pluginsDir =\n configuredDir && configuredDir !== DEFAULT_RUNTIME_PLUGINS_DIR\n ? path.resolve(process.cwd(), configuredDir)\n : path.resolve(process.cwd(), \"plugins\");\n\n this.plugins.clear();\n\n if (!(await pathExists(pluginsDir))) {\n mkdirSync(pluginsDir, { recursive: true });\n }\n\n const local = await scanLocalDir(pluginsDir);\n for (const { name, path: p } of local) {\n const metadata = await this.loadPluginMetadata(name, p);\n if (metadata) this.plugins.set(metadata.name, metadata);\n }\n\n const external = await scanNodeModules(PLUGIN_PREFIX);\n for (const { name, path: p } of external) {\n const metadata = await this.loadPluginMetadata(name, p);\n if (metadata) this.plugins.set(metadata.name, metadata);\n }\n\n logger.info(`O.o 发现了 ${this.plugins.size} 个插件`);\n return [...this.plugins.values()];\n }\n\n private async loadPluginMetadata(\n name: string,\n pluginPath: string,\n ): Promise<PluginMetadata | null> {\n const resolvedPath = await resolveRealpath(pluginPath);\n let packageJson: PackageJsonLike | null = null;\n try {\n packageJson = JSON.parse(\n await fs.readFile(path.join(resolvedPath, \"package.json\"), \"utf-8\"),\n );\n } catch (error) {\n logger.warn(`[plugin-manager] 读取 ${name} 的 package.json 失败: ${error}`);\n }\n\n const config: PluginPackageConfig = packageJson?.mioku ?? {};\n return {\n name,\n version: packageJson?.version ?? \"0.0.0\",\n description: packageJson?.description,\n path: resolvedPath,\n packageJson: packageJson ?? {},\n config,\n };\n }\n\n collectRequiredServices(): Set<string> {\n const services = new Set<string>();\n for (const metadata of this.plugins.values()) {\n for (const service of metadata.config.services ?? []) services.add(service);\n }\n return services;\n }\n\n getPluginMetadata(name: string): PluginMetadata | undefined {\n return this.plugins.get(name);\n }\n\n getAllMetadata(): PluginMetadata[] {\n return [...this.plugins.values()];\n }\n\n reset(): void {\n this.plugins.clear();\n }\n}\n\nexport default PluginManager.getInstance();\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport type { MiokiContext } from \"mioki\";\nimport type {\n MiokuRuntimeConfig,\n PackageJsonLike,\n ServiceMetadata,\n MiokuService,\n} from \"../types\";\nimport { logger } from \"./logger\";\nimport {\n scanLocalDir,\n scanNodeModules,\n pathExists,\n toImportPath,\n} from \"./module-scanner\";\nimport { getOrCreate } from \"./registry\";\n\nconst SERVICE_PREFIX = \"mioku-service-\";\n\nexport class ServiceManager {\n private services = new Map<string, MiokuService>();\n private serviceMetadata = new Map<string, ServiceMetadata>();\n\n static getInstance(): ServiceManager {\n return getOrCreate(\"service-manager\", () => new ServiceManager());\n }\n\n async discoverServices(miokuConfig: MiokuRuntimeConfig = {}): Promise<ServiceMetadata[]> {\n const servicesDir = miokuConfig.services_dir\n ? path.resolve(process.cwd(), miokuConfig.services_dir)\n : path.resolve(process.cwd(), \"services\");\n\n this.serviceMetadata.clear();\n\n if (existsSync(servicesDir)) {\n const local = await scanLocalDir(servicesDir);\n for (const { name, path: p } of local) {\n const metadata = await this.loadServiceMetadata(name, p);\n if (metadata) this.serviceMetadata.set(name, metadata);\n }\n } else {\n mkdirSync(servicesDir, { recursive: true });\n }\n\n const external = await scanNodeModules(SERVICE_PREFIX);\n for (const { name, path: p } of external) {\n const metadata = await this.loadServiceMetadata(name, p);\n if (metadata) this.serviceMetadata.set(name, metadata);\n }\n\n logger.info(`o.O 发现了 ${this.serviceMetadata.size} 个服务`);\n return [...this.serviceMetadata.values()];\n }\n\n private async loadServiceMetadata(\n name: string,\n servicePath: string,\n ): Promise<ServiceMetadata | null> {\n const packageJsonPath = path.join(servicePath, \"package.json\");\n if (!(await pathExists(packageJsonPath))) return null;\n\n try {\n const packageJson: PackageJsonLike = JSON.parse(\n await fs.readFile(packageJsonPath, \"utf-8\"),\n );\n return {\n name,\n version: packageJson.version ?? \"0.0.0\",\n description: packageJson.description,\n path: servicePath,\n packageJson,\n };\n } catch (error) {\n logger.warn(`[service-manager] 解析服务 ${name} 失败: ${error}`);\n return null;\n }\n }\n\n async checkMissingServices(required: Set<string>): Promise<string[]> {\n const missing: string[] = [];\n for (const name of required) {\n if (!this.serviceMetadata.has(name)) missing.push(name);\n }\n return missing;\n }\n\n async loadAllServices(ctx: MiokiContext): Promise<void> {\n const all = [...this.serviceMetadata.values()];\n logger.info(`O.o 准备加载 ${all.length} 个服务...`);\n for (const metadata of all) {\n await this.loadService(metadata, ctx);\n }\n }\n\n private async loadService(\n metadata: ServiceMetadata,\n ctx: MiokiContext,\n ): Promise<boolean> {\n try {\n const tsEntry = path.join(metadata.path, \"index.ts\");\n const jsEntry = path.join(metadata.path, \"index.js\");\n const entry = (await pathExists(tsEntry))\n ? tsEntry\n : (await pathExists(jsEntry))\n ? jsEntry\n : null;\n if (!entry) {\n logger.error(`[service-manager] 服务 ${metadata.name} 入口丢失`);\n return false;\n }\n\n const serviceModule = await import(toImportPath(entry));\n const service: MiokuService = serviceModule.default ?? serviceModule;\n if (!service || typeof service.init !== \"function\") {\n logger.warn(`[service-manager] 服务 ${metadata.name} 无效:缺少 init()`);\n return false;\n }\n\n await service.init();\n if (service.api) {\n ctx.services[metadata.name] = service.api;\n }\n this.services.set(metadata.name, service);\n return true;\n } catch (error) {\n logger.error(`[service-manager] 加载服务 ${metadata.name} 失败: ${error}`);\n return false;\n }\n }\n\n registerBuiltinService(name: string, service: MiokuService): void {\n this.services.set(name, service);\n }\n\n getService(name: string): MiokuService | undefined {\n return this.services.get(name);\n }\n\n async disposeAll(): Promise<void> {\n for (const [, service] of this.services) {\n await service.dispose?.();\n }\n this.services.clear();\n }\n\n reset(): void {\n this.services.clear();\n this.serviceMetadata.clear();\n }\n}\n\nexport default ServiceManager.getInstance();\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport type { MiokuRuntimeConfig } from \"../types\";\nimport pluginManager from \"./plugin-manager\";\nimport serviceManager from \"./service-manager\";\nimport {\n prepareRuntimePluginLinks,\n DEFAULT_RUNTIME_PLUGINS_DIR,\n} from \"./plugin-linker\";\nimport { logger } from \"./logger\";\n\ninterface BotConfigLike {\n plugins: string[];\n plugins_dir?: string;\n}\n\nexport interface BootstrapDeps {\n cwd: string;\n botConfig: BotConfigLike;\n startMioki: (opts: { cwd: string }) => Promise<void>;\n}\n\nexport async function readMiokuConfig(): Promise<MiokuRuntimeConfig> {\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n try {\n const pkg = JSON.parse(await fs.readFile(packageJsonPath, \"utf-8\"));\n return (pkg.mioki ?? {}) as MiokuRuntimeConfig;\n } catch {\n return {};\n }\n}\n\nfunction ensureRuntimeDirectories(): void {\n for (const dir of [\"data\", \"config\", \"temp\"]) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n }\n}\n\nasync function discoverAndLinkPlugins(\n miokuConfig: MiokuRuntimeConfig,\n): Promise<string[]> {\n logger.info(\"O.o Miku 正在翻找插件..\");\n const discovered = await pluginManager.discoverPlugins(miokuConfig);\n logger.info(\n `O.o 共发现 ${discovered.length} 个插件: ${discovered.map((p) => p.name).join(\", \")}`,\n );\n const runtimePluginsDir = path.resolve(\n process.cwd(),\n DEFAULT_RUNTIME_PLUGINS_DIR,\n );\n return prepareRuntimePluginLinks(discovered, runtimePluginsDir);\n}\n\nasync function discoverAndValidateServices(\n miokuConfig: MiokuRuntimeConfig,\n): Promise<void> {\n logger.info(\"o.O Miku 正在翻找服务..\");\n await serviceManager.discoverServices(miokuConfig);\n const requiredServices = pluginManager.collectRequiredServices();\n const missing = await serviceManager.checkMissingServices(requiredServices);\n if (missing.length > 0) logger.warn(`发现缺失服务: ${missing.join(\", \")}`);\n}\n\nfunction applyPluginAllowlist(\n miokuConfig: MiokuRuntimeConfig,\n botConfig: BotConfigLike,\n linkedPluginNames: string[],\n): void {\n botConfig.plugins_dir = DEFAULT_RUNTIME_PLUGINS_DIR;\n // Respect an explicit plugins list; only auto-load when undefined.\n if (miokuConfig.plugins !== undefined) return;\n for (const name of linkedPluginNames) {\n if (!botConfig.plugins.includes(name)) botConfig.plugins.push(name);\n }\n}\n\nexport async function bootstrapMioku(deps: BootstrapDeps): Promise<void> {\n const { cwd, botConfig, startMioki } = deps;\n const miokuConfig = await readMiokuConfig();\n ensureRuntimeDirectories();\n const linkedPluginNames = await discoverAndLinkPlugins(miokuConfig);\n await discoverAndValidateServices(miokuConfig);\n applyPluginAllowlist(miokuConfig, botConfig, linkedPluginNames);\n await startMioki({ cwd });\n}\n","import * as path from \"path\";\nimport type { MiokiContext } from \"mioki\";\nimport { botConfig } from \"mioki\";\nimport type { AIService, AISkill, HelpService } from \"../types\";\nimport pluginManager from \"./plugin-manager\";\nimport { logger } from \"./logger\";\nimport { pathExists, toImportPath } from \"./module-scanner\";\n\nfunction isAISkill(value: unknown): value is AISkill {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as AISkill).name === \"string\" &&\n Array.isArray((value as AISkill).tools)\n );\n}\n\nfunction extractSkills(moduleExports: Record<string, unknown>): AISkill[] {\n const candidates = [moduleExports?.default, moduleExports?.skills, moduleExports];\n for (const candidate of candidates) {\n if (Array.isArray(candidate)) return candidate.filter(isAISkill);\n if (isAISkill(candidate)) return [candidate];\n }\n return [];\n}\n\nasync function resolveSkillsEntry(pluginPath: string): Promise<string | null> {\n const tsPath = path.join(pluginPath, \"skills.ts\");\n if (await pathExists(tsPath)) return tsPath;\n const jsPath = path.join(pluginPath, \"skills.js\");\n if (await pathExists(jsPath)) return jsPath;\n return null;\n}\n\nfunction hasPublicKeyword(keywords: unknown): boolean {\n return Array.isArray(keywords) && keywords.includes(\"mioku\");\n}\n\nexport async function registerPluginArtifacts(ctx: MiokiContext): Promise<void> {\n const enabledPlugins = new Set<string>(botConfig.plugins ?? []);\n const pluginMetadata = pluginManager.getAllMetadata().filter((metadata) =>\n enabledPlugins.size > 0 ? enabledPlugins.has(metadata.name) : true,\n );\n\n const helpService = ctx.services.help as HelpService | undefined;\n const aiService = ctx.services.ai as AIService | undefined;\n\n if (helpService) {\n let helpCount = 0;\n for (const metadata of pluginMetadata) {\n if (!metadata.config.help) continue;\n if (!hasPublicKeyword(metadata.packageJson?.keywords)) continue;\n helpService.registerHelp(metadata.name, metadata.config.help);\n helpCount += 1;\n }\n logger.info(`[plugin-artifacts] Registered ${helpCount} help manifest(s)`);\n }\n\n if (!aiService) return;\n\n let skillCount = 0;\n for (const metadata of pluginMetadata) {\n const skillsEntry = await resolveSkillsEntry(metadata.path);\n if (!skillsEntry) continue;\n\n try {\n const moduleExports = (await import(toImportPath(skillsEntry))) as Record<\n string,\n unknown\n >;\n const skills = extractSkills(moduleExports);\n if (skills.length === 0) {\n logger.warn(\n `[plugin-artifacts] Plugin ${metadata.name} has ${path.basename(skillsEntry)} but exported no valid skill`,\n );\n continue;\n }\n for (const skill of skills) {\n aiService.registerSkill(skill);\n skillCount += 1;\n }\n } catch (error) {\n logger.error(\n `[plugin-artifacts] Failed to load skills for plugin ${metadata.name}: ${error}`,\n );\n }\n }\n logger.info(`[plugin-artifacts] Registered ${skillCount} skill(s)`);\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport { logger } from \"./logger\";\n\nconst SERVICE_CONFIG_ROOT = \"service\";\n\nfunction resolveConfigDir(serviceName: string): string {\n return path.join(process.cwd(), \"config\", SERVICE_CONFIG_ROOT, serviceName);\n}\n\nfunction resolveConfigPath(serviceName: string, configName: string): string {\n return path.join(resolveConfigDir(serviceName), `${configName}.json`);\n}\n\nfunction ensureDir(serviceName: string): void {\n const dir = resolveConfigDir(serviceName);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nexport async function registerServiceConfig(\n serviceName: string,\n configName: string,\n defaults: Record<string, unknown>,\n): Promise<void> {\n ensureDir(serviceName);\n const configPath = resolveConfigPath(serviceName, configName);\n if (!existsSync(configPath)) {\n await fs.writeFile(configPath, JSON.stringify(defaults, null, 2), \"utf-8\");\n }\n}\n\nexport async function getServiceConfig(\n serviceName: string,\n configName: string,\n): Promise<Record<string, unknown>> {\n const configPath = resolveConfigPath(serviceName, configName);\n try {\n return JSON.parse(await fs.readFile(configPath, \"utf-8\"));\n } catch (error) {\n if (!existsSync(configPath)) return {};\n logger.warn(`[service-config] 读取 ${serviceName}/${configName} 失败: ${error}`);\n return {};\n }\n}\n\nexport async function updateServiceConfig(\n serviceName: string,\n configName: string,\n value: Record<string, unknown>,\n): Promise<void> {\n ensureDir(serviceName);\n await fs.writeFile(\n resolveConfigPath(serviceName, configName),\n JSON.stringify(value, null, 2),\n \"utf-8\",\n );\n}\n\nexport async function getServiceConfigs(\n serviceName: string,\n): Promise<Record<string, Record<string, unknown>>> {\n const dir = resolveConfigDir(serviceName);\n if (!existsSync(dir)) return {};\n\n const result: Record<string, Record<string, unknown>> = {};\n const files = (await fs.readdir(dir)).filter((name) => name.endsWith(\".json\"));\n for (const file of files) {\n try {\n result[path.basename(file, \".json\")] = JSON.parse(\n await fs.readFile(path.join(dir, file), \"utf-8\"),\n );\n } catch (error) {\n logger.warn(`[service-config] 读取 ${serviceName}/${file} 失败: ${error}`);\n }\n }\n return result;\n}\n\nexport async function deleteServiceConfig(\n serviceName: string,\n configName: string,\n): Promise<boolean> {\n const configPath = resolveConfigPath(serviceName, configName);\n if (!existsSync(configPath)) return false;\n await fs.unlink(configPath);\n return true;\n}\n","// Mioku framework types — single source of truth for the public API surface.\n\n// ---------- framework ----------\n\nexport interface MiokuService {\n name: string;\n version: string;\n description?: string;\n init(): Promise<void>;\n api: Record<string, any>;\n dispose?(): Promise<void>;\n}\n\nexport interface MiokuRuntimeConfig {\n plugins?: string[];\n plugins_dir?: string;\n services_dir?: string;\n [key: string]: unknown;\n}\n\nexport interface PackageJsonLike {\n name?: string;\n version?: string;\n description?: string;\n keywords?: string[];\n mioki?: MiokuRuntimeConfig;\n mioku?: PluginPackageConfig;\n dependencies?: Record<string, string>;\n}\n\nexport interface PluginMetadata {\n name: string;\n version: string;\n description?: string;\n path: string;\n packageJson: PackageJsonLike;\n config: PluginPackageConfig;\n}\n\nexport interface ServiceMetadata {\n name: string;\n version: string;\n description?: string;\n path: string;\n packageJson: PackageJsonLike;\n}\n\n// ---------- plugin package config ----------\n\nexport interface PluginPackageConfig {\n services?: string[];\n help?: PluginHelp;\n accessHooks?: AccessHook[];\n}\n\nexport interface PluginHelp {\n title: string;\n description: string;\n commands: Array<{\n cmd: string;\n desc: string;\n usage?: string;\n role?: CommandRole;\n }>;\n}\n\nexport type CommandRole = \"master\" | \"admin\" | \"owner\" | \"member\";\n\nexport interface AccessHook {\n id: string;\n match?: string;\n event?: string;\n description?: string;\n}\n\nexport type AccessAction = \"allow\" | \"block\";\n\nexport interface AccessRuleEntry {\n action: AccessAction;\n}\n\nexport interface AccessScopeConfig {\n plugins?: Record<string, AccessRuleEntry>;\n commands?: Record<string, Record<string, AccessRuleEntry>>;\n}\n\nexport interface AccessControlConfig {\n version: 1;\n global: AccessScopeConfig;\n groups: Record<string, AccessScopeConfig>;\n users: Record<string, AccessScopeConfig>;\n}\n\n// ---------- built-in service contracts ----------\n\nexport interface ConfigService {\n registerConfig(pluginName: string, configName: string, initialConfig: any): Promise<boolean>;\n updateConfig(pluginName: string, configName: string, updates: any): Promise<boolean>;\n getConfig(pluginName: string, configName: string): Promise<any>;\n getPluginConfigs(pluginName: string): Promise<Record<string, any>>;\n onConfigChange(pluginName: string, configName: string, callback: (newConfig: any) => void): () => void;\n}\n\nexport interface ScreenshotService {\n screenshot(html: string, options?: any): Promise<string>;\n screenshotMarkdown(markdownContent: string, options?: any): Promise<string>;\n screenshotFromUrl(url: string, options?: any): Promise<string>;\n cleanupTemp(olderThanMs?: number): Promise<number>;\n}\n\nexport interface HelpService {\n registerHelp(pluginName: string, help: PluginHelp): void;\n getHelp(pluginName: string): PluginHelp | undefined;\n getAllHelp(): Map<string, PluginHelp>;\n unregisterHelp(pluginName: string): boolean;\n}\n\nexport interface WebUIService {\n getSettings(): { port: number; host: string; packageManager: string };\n}\n\n// ---------- AI service ----------\n\nexport interface AITool {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n handler: (args: any, event?: any) => Promise<any> | any;\n}\n\nexport type SkillPermissionRole = \"owner\" | \"admin\" | \"member\";\n\nexport interface AISkill {\n name: string;\n description: string;\n permission?: SkillPermissionRole;\n tools: AITool[];\n}\n\nexport interface TextMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface MultimodalContentItem {\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string;\n detail?: \"auto\" | \"low\" | \"high\";\n };\n}\n\nexport interface MultimodalMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | MultimodalContentItem[];\n}\n\nexport interface ToolCallRecord {\n name: string;\n arguments: any;\n result: any;\n}\n\nexport interface SessionToolDefinition {\n name: string;\n tool: AITool;\n}\n\nexport interface CompleteOptions {\n model?: string;\n messages: any[];\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n tools?: any[];\n executableTools?: SessionToolDefinition[];\n executableToolsProvider?: () => SessionToolDefinition[];\n maxIterations?: number;\n onTextDelta?: (delta: string) => void | Promise<void>;\n usageContext?: AIUsageContext;\n usageContextTokens?: number;\n usageBreakdown?: AIUsageFinalization[\"breakdown\"];\n}\n\nexport interface CompleteResponse {\n content: string | null;\n reasoning: string | null;\n toolCalls: Array<{ id: string; name: string; arguments: string }>;\n raw: any;\n turnMessages: any[];\n iterations?: number;\n allToolCalls?: ToolCallRecord[];\n}\n\nexport type AIProtocol =\n | \"openai-chat\"\n | \"openai-response\"\n | \"anthropic\"\n | \"gemini\";\n\nexport type AIModelCapability = \"text\" | \"vision\" | \"tool-use\" | \"reasoning\";\n\nexport type AIModelRole = \"main\" | \"working\" | \"vision\";\n\nexport interface AIProviderConfig {\n id: string;\n name: string;\n protocol: AIProtocol;\n apiUrl: string;\n apiKey: string;\n enabled: boolean;\n headers?: Record<string, string>;\n}\n\nexport interface AIModelDescriptor {\n id: string;\n providerId: string;\n modelId: string;\n name: string;\n capabilities: AIModelCapability[];\n contextWindow?: number;\n maxOutputTokens?: number;\n isCustom?: boolean;\n}\n\nexport interface AIInstanceInfo {\n name: string;\n providerId: string;\n modelId: string;\n role?: AIModelRole;\n}\n\nexport interface AIInstance {\n generateText(options: { prompt?: string; messages: TextMessage[]; model?: string; temperature?: number; max_tokens?: number }): Promise<string>;\n generateMultimodal(options: { prompt?: string; messages: MultimodalMessage[]; model?: string; temperature?: number; max_tokens?: number }): Promise<string>;\n complete(options: CompleteOptions): Promise<CompleteResponse>;\n generateWithTools(options: { prompt?: string; messages: TextMessage[] | MultimodalMessage[]; model?: string; temperature?: number; maxIterations?: number }): Promise<any>;\n setUsageContext?(context: AIUsageContext | undefined): void;\n withUsageContext?<T>(context: AIUsageContext | undefined, fn: () => Promise<T>): Promise<T>;\n registerPrompt(name: string, prompt: string): boolean;\n getPrompt(name: string): string | undefined;\n getAllPrompts(): Record<string, string>;\n removePrompt(name: string): boolean;\n}\n\nexport interface AIService {\n create(options: { name: string; apiUrl: string; apiKey: string; modelType: \"text\" | \"multimodal\"; model?: string }): Promise<AIInstance>;\n createInstance?(options: {\n name: string;\n providerId: string;\n modelId: string;\n role?: AIModelRole;\n }): Promise<AIInstance>;\n get(name: string): AIInstance | undefined;\n list(): string[];\n listInstances?(): AIInstanceInfo[];\n remove(name: string): boolean;\n setDefault(name: string): boolean;\n getDefault(): AIInstance | undefined;\n listProviders?(): AIProviderConfig[];\n getProvider?(id: string): AIProviderConfig | undefined;\n createProvider?(input: Omit<AIProviderConfig, \"id\"> & { id?: string }): Promise<AIProviderConfig>;\n updateProvider?(id: string, input: Partial<AIProviderConfig>): Promise<AIProviderConfig>;\n removeProvider?(id: string): boolean;\n testProvider?(id: string): Promise<{ ok: boolean; error?: string; models?: AIModelDescriptor[] }>;\n listModels?(providerId?: string): AIModelDescriptor[];\n refreshModels?(providerId: string): Promise<AIModelDescriptor[]>;\n registerCustomModel?(input: {\n providerId: string;\n modelId: string;\n name?: string;\n capabilities?: AIModelCapability[];\n }): AIModelDescriptor;\n removeCustomModel?(modelFullId: string): boolean;\n getRoleBindings?(): Record<AIModelRole, string | undefined>;\n setRoleBinding?(role: AIModelRole, modelFullId: string | undefined): boolean;\n getInstanceByRole?(role: AIModelRole): AIInstance | undefined;\n registerChatRuntime(runtime: any): boolean;\n getChatRuntime(): any;\n removeChatRuntime(): boolean;\n registerSkill(skill: AISkill): boolean;\n getSkill(skillName: string): AISkill | undefined;\n getAllSkills(): Map<string, AISkill>;\n removeSkill(skillName: string): boolean;\n getTool(toolName: string): AITool | undefined;\n getAllTools(): Map<string, AITool>;\n getUsageSummary?(options: { range: AIUsageRange; botId?: number }): AIUsageSummary;\n cleanupUsageStats?(retentionMs?: number): number;\n finalizeUsage?(usageId: string, finalization: AIUsageFinalization): boolean;\n}\n\n// ---------- chat runtime ----------\n\nexport interface ChatRuntime {\n generateNotice(options: ChatRuntimeNoticeOptions): Promise<ChatRuntimeResult>;\n requestInformation(options: ChatRuntimeInformationRequestOptions): Promise<ChatRuntimeResult>;\n}\n\nexport const TOOL_RESULT_FOLLOWUP_KEY = \"__miokuFollowup\";\n\nexport interface ToolResultFollowup {\n text: string;\n images?: Array<{ url: string; detail?: \"auto\" | \"low\" | \"high\" }>;\n videos?: Array<{ url: string; detail?: \"auto\" | \"low\" | \"high\" }>;\n}\n\nexport interface ChatRuntimePromptInjection {\n content: string;\n title?: string;\n}\n\nexport interface ChatRuntimeGroupTarget {\n selfId: number;\n groupId: number;\n}\n\nexport interface ChatRuntimePrivateTarget {\n selfId: number;\n userId: number;\n}\n\nexport type ChatRuntimeSource =\n | { event: any }\n | ChatRuntimeGroupTarget\n | ChatRuntimePrivateTarget;\n\nexport type ChatRuntimeBaseOptions = ChatRuntimeSource & {\n targetMessage?: string;\n promptInjections?: ChatRuntimePromptInjection[];\n send?: boolean;\n};\n\nexport type ChatRuntimeNoticeOptions = ChatRuntimeBaseOptions & {\n instruction: string;\n};\n\nexport type ChatRuntimeInformationRequestOptions = ChatRuntimeBaseOptions & {\n task: string;\n schema: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n toolName?: string;\n toolDescription?: string;\n};\n\nexport interface ChatRuntimeCollectedInfo {\n data: any;\n isComplete?: boolean;\n confidence?: number;\n notes?: string;\n}\n\nexport interface ChatRuntimeResult {\n messages: string[];\n toolCalls: ToolCallRecord[];\n collectedInfo: ChatRuntimeCollectedInfo | null;\n pendingAt?: number[];\n pendingPoke?: number[];\n pendingQuote?: number;\n emojiPath?: string | null;\n protocolMessages?: any[];\n}\n\n// ---------- usage tracking ----------\n\nexport type AIUsageRange = \"today\" | \"7d\" | \"30d\";\n\nexport type AIUsageScope = \"all\" | \"bot\";\n\nexport interface AIUsageContext {\n usageId?: string;\n source?: string;\n botId?: number;\n groupId?: number;\n groupName?: string;\n userId?: number;\n userName?: string;\n sessionId?: string;\n}\n\nexport interface AIUsageBreakdown {\n systemPromptTokens?: number;\n chatHistoryTokens?: number;\n toolDefinitionTokens?: number;\n toolUseTokens?: number;\n otherContextTokens?: number;\n}\n\nexport interface AIUsageFinalization {\n sentUserMessages?: number;\n sentAssistantMessages?: number;\n breakdown?: AIUsageBreakdown;\n}\n\nexport interface AIUsageBotOption {\n botId: number;\n label: string;\n}\n\nexport interface AIUsageSummary {\n generatedAt: number;\n range: AIUsageRange;\n scope: AIUsageScope;\n botId?: number;\n bots: AIUsageBotOption[];\n totals: {\n requests: number;\n successfulRequests: number;\n failedRequests: number;\n userMessages: number;\n assistantMessages: number;\n systemMessages: number;\n toolMessages: number;\n sentUserMessages: number;\n sentAssistantMessages: number;\n inputTokens: number;\n outputTokens: number;\n systemPromptTokens: number;\n totalTokens: number;\n cacheWriteTokens: number;\n cacheReadTokens: number;\n toolDefinitionTokens: number;\n toolUseTokens: number;\n chatHistoryTokens: number;\n otherContextTokens: number;\n durationMs: number;\n toolCalls: number;\n };\n rates: {\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n };\n toolRanking: Array<{ name: string; count: number }>;\n groupRanking: Array<{\n groupId: number;\n groupName: string;\n requests: number;\n totalTokens: number;\n userMessages: number;\n assistantMessages: number;\n errorRate: number;\n }>;\n tokenFlow: Array<{ name: \"输入\" | \"输出\" | \"缓存写入\" | \"缓存读取\"; value: number }>;\n tokenCategories: Array<{\n name: \"系统提示词\" | \"工具定义\" | \"工具使用\" | \"聊天上下文\" | \"其他上下文\";\n value: number;\n }>;\n dailyActivity: Array<{\n day: string;\n requests: number;\n userMessages: number;\n assistantMessages: number;\n totalTokens: number;\n inputTokens: number;\n cacheReadTokens: number;\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n }>;\n hourlyActivity: Array<{\n hour: string;\n requests: number;\n userMessages: number;\n assistantMessages: number;\n totalTokens: number;\n inputTokens: number;\n cacheReadTokens: number;\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n }>;\n}\n","import * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\n\nexport function getPluginDataDir(pluginName: string): string {\n return path.join(process.cwd(), \"data\", pluginName);\n}\n\nexport function getServiceDataDir(serviceName: string): string {\n return path.join(process.cwd(), \"data\", serviceName);\n}\n\nexport function getDataDir(): string {\n return path.join(process.cwd(), \"data\");\n}\n\nexport function getPluginConfigDir(pluginName: string): string {\n return path.join(process.cwd(), \"config\", pluginName);\n}\n\nexport function getServiceConfigDir(serviceName: string): string {\n return path.join(process.cwd(), \"config\", \"service\", serviceName);\n}\n\nexport function getConfigDir(): string {\n return path.join(process.cwd(), \"config\");\n}\n\nexport function ensureDataDir(pluginName: string): string {\n const dir = getPluginDataDir(pluginName);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n return dir;\n}\n","import { getOrCreate } from \"./registry\";\n\ninterface PluginStateStore {\n [pluginName: string]: Record<string, any>;\n}\n\n// Stashed via the global registry so it survives jiti re-evaluation when a\n// plugin re-imports the framework through its loader. Values are `any` because\n// the state bag is plugin-defined and consumed via casts.\nconst store = getOrCreate<PluginStateStore>(\"plugin-runtime-state\", () => ({}));\n\nexport function getPluginRuntimeState(pluginName: string): Record<string, any> {\n if (!store[pluginName]) store[pluginName] = {};\n return store[pluginName];\n}\n\nexport function setPluginRuntimeState(\n pluginName: string,\n state: Record<string, any>,\n): Record<string, any> {\n if (!store[pluginName]) store[pluginName] = {};\n Object.assign(store[pluginName], state);\n return store[pluginName];\n}\n\nexport function resetPluginRuntimeState(pluginName: string): void {\n delete store[pluginName];\n}\n\nexport function getAllPluginRuntimeStates(): PluginStateStore {\n return { ...store };\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { bootstrapMioku } from \"./core/bootstrap\";\nimport { setMiokuLogger } from \"./core/logger\";\n\nexport type { MiokiPlugin, MiokiContext } from \"mioki\";\n\nexport function definePlugin<T extends import(\"mioki\").MiokiPlugin>(plugin: T): T {\n return plugin;\n}\n\nexport { default as pluginManager } from \"./core/plugin-manager\";\nexport { default as serviceManager } from \"./core/service-manager\";\nexport { registerPluginArtifacts } from \"./core/plugin-artifact-registry\";\n\nexport {\n registerServiceConfig,\n getServiceConfig,\n updateServiceConfig,\n getServiceConfigs,\n deleteServiceConfig,\n} from \"./core/service-config\";\n\nexport type {\n MiokuService,\n MiokuRuntimeConfig,\n PackageJsonLike,\n PluginMetadata,\n ServiceMetadata,\n PluginPackageConfig,\n PluginHelp,\n CommandRole,\n AccessHook,\n AccessAction,\n AccessRuleEntry,\n AccessScopeConfig,\n AccessControlConfig,\n ConfigService,\n ScreenshotService,\n HelpService,\n WebUIService,\n AITool,\n AISkill,\n AIInstance,\n AIService,\n AIProtocol,\n AIModelCapability,\n AIModelRole,\n AIProviderConfig,\n AIModelDescriptor,\n AIInstanceInfo,\n ChatRuntime,\n TextMessage,\n MultimodalMessage,\n ToolCallRecord,\n CompleteOptions,\n CompleteResponse,\n SessionToolDefinition,\n SkillPermissionRole,\n MultimodalContentItem,\n ToolResultFollowup,\n ChatRuntimePromptInjection,\n ChatRuntimeGroupTarget,\n ChatRuntimePrivateTarget,\n ChatRuntimeSource,\n ChatRuntimeBaseOptions,\n ChatRuntimeNoticeOptions,\n ChatRuntimeInformationRequestOptions,\n ChatRuntimeCollectedInfo,\n ChatRuntimeResult,\n AIUsageRange,\n AIUsageScope,\n AIUsageBotOption,\n AIUsageContext,\n AIUsageBreakdown,\n AIUsageFinalization,\n AIUsageSummary,\n} from \"./types\";\n\nexport { TOOL_RESULT_FOLLOWUP_KEY } from \"./types\";\n\nexport interface MiokuStartOptions {\n cwd?: string;\n}\n\nexport async function start(options: MiokuStartOptions = {}): Promise<void> {\n const { cwd = process.cwd() } = options;\n if (cwd) process.chdir(cwd);\n\n const { start: startMioki, logger, botConfig } = await import(\"mioki\");\n setMiokuLogger(logger);\n\n logger.info(\"こんにちは..\");\n logger.info(\"---------------------------------------\");\n logger.info(\"---------- Mioku 正在启动 ------------\");\n logger.info(\"---------------------------------------\");\n\n await bootstrapMioku({ cwd, botConfig, startMioki });\n}\n\nfunction readVersion(): string {\n try {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = path.join(here, \"..\", \"package.json\");\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const version: string = readVersion();\n\nexport {\n getDataDir,\n getPluginDataDir,\n getServiceDataDir,\n getConfigDir,\n getPluginConfigDir,\n getServiceConfigDir,\n ensureDataDir,\n} from \"./core/data-paths\";\n\nexport {\n getPluginRuntimeState,\n setPluginRuntimeState,\n resetPluginRuntimeState,\n} from \"./core/plugin-runtime-state\";\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -172,6 +172,34 @@ interface CompleteResponse {
|
|
|
172
172
|
iterations?: number;
|
|
173
173
|
allToolCalls?: ToolCallRecord[];
|
|
174
174
|
}
|
|
175
|
+
type AIProtocol = "openai-chat" | "openai-response" | "anthropic" | "gemini";
|
|
176
|
+
type AIModelCapability = "text" | "vision" | "tool-use" | "reasoning";
|
|
177
|
+
type AIModelRole = "main" | "working" | "vision";
|
|
178
|
+
interface AIProviderConfig {
|
|
179
|
+
id: string;
|
|
180
|
+
name: string;
|
|
181
|
+
protocol: AIProtocol;
|
|
182
|
+
apiUrl: string;
|
|
183
|
+
apiKey: string;
|
|
184
|
+
enabled: boolean;
|
|
185
|
+
headers?: Record<string, string>;
|
|
186
|
+
}
|
|
187
|
+
interface AIModelDescriptor {
|
|
188
|
+
id: string;
|
|
189
|
+
providerId: string;
|
|
190
|
+
modelId: string;
|
|
191
|
+
name: string;
|
|
192
|
+
capabilities: AIModelCapability[];
|
|
193
|
+
contextWindow?: number;
|
|
194
|
+
maxOutputTokens?: number;
|
|
195
|
+
isCustom?: boolean;
|
|
196
|
+
}
|
|
197
|
+
interface AIInstanceInfo {
|
|
198
|
+
name: string;
|
|
199
|
+
providerId: string;
|
|
200
|
+
modelId: string;
|
|
201
|
+
role?: AIModelRole;
|
|
202
|
+
}
|
|
175
203
|
interface AIInstance {
|
|
176
204
|
generateText(options: {
|
|
177
205
|
prompt?: string;
|
|
@@ -210,11 +238,42 @@ interface AIService {
|
|
|
210
238
|
modelType: "text" | "multimodal";
|
|
211
239
|
model?: string;
|
|
212
240
|
}): Promise<AIInstance>;
|
|
241
|
+
createInstance?(options: {
|
|
242
|
+
name: string;
|
|
243
|
+
providerId: string;
|
|
244
|
+
modelId: string;
|
|
245
|
+
role?: AIModelRole;
|
|
246
|
+
}): Promise<AIInstance>;
|
|
213
247
|
get(name: string): AIInstance | undefined;
|
|
214
248
|
list(): string[];
|
|
249
|
+
listInstances?(): AIInstanceInfo[];
|
|
215
250
|
remove(name: string): boolean;
|
|
216
251
|
setDefault(name: string): boolean;
|
|
217
252
|
getDefault(): AIInstance | undefined;
|
|
253
|
+
listProviders?(): AIProviderConfig[];
|
|
254
|
+
getProvider?(id: string): AIProviderConfig | undefined;
|
|
255
|
+
createProvider?(input: Omit<AIProviderConfig, "id"> & {
|
|
256
|
+
id?: string;
|
|
257
|
+
}): Promise<AIProviderConfig>;
|
|
258
|
+
updateProvider?(id: string, input: Partial<AIProviderConfig>): Promise<AIProviderConfig>;
|
|
259
|
+
removeProvider?(id: string): boolean;
|
|
260
|
+
testProvider?(id: string): Promise<{
|
|
261
|
+
ok: boolean;
|
|
262
|
+
error?: string;
|
|
263
|
+
models?: AIModelDescriptor[];
|
|
264
|
+
}>;
|
|
265
|
+
listModels?(providerId?: string): AIModelDescriptor[];
|
|
266
|
+
refreshModels?(providerId: string): Promise<AIModelDescriptor[]>;
|
|
267
|
+
registerCustomModel?(input: {
|
|
268
|
+
providerId: string;
|
|
269
|
+
modelId: string;
|
|
270
|
+
name?: string;
|
|
271
|
+
capabilities?: AIModelCapability[];
|
|
272
|
+
}): AIModelDescriptor;
|
|
273
|
+
removeCustomModel?(modelFullId: string): boolean;
|
|
274
|
+
getRoleBindings?(): Record<AIModelRole, string | undefined>;
|
|
275
|
+
setRoleBinding?(role: AIModelRole, modelFullId: string | undefined): boolean;
|
|
276
|
+
getInstanceByRole?(role: AIModelRole): AIInstance | undefined;
|
|
218
277
|
registerChatRuntime(runtime: any): boolean;
|
|
219
278
|
getChatRuntime(): any;
|
|
220
279
|
removeChatRuntime(): boolean;
|
|
@@ -477,5 +536,5 @@ interface MiokuStartOptions {
|
|
|
477
536
|
declare function start(options?: MiokuStartOptions): Promise<void>;
|
|
478
537
|
declare const version: string;
|
|
479
538
|
//#endregion
|
|
480
|
-
export { type AIInstance, type AIService, type AISkill, type AITool, type AIUsageBotOption, type AIUsageBreakdown, type AIUsageContext, type AIUsageFinalization, type AIUsageRange, type AIUsageScope, type AIUsageSummary, type AccessAction, type AccessControlConfig, type AccessHook, type AccessRuleEntry, type AccessScopeConfig, type ChatRuntime, type ChatRuntimeBaseOptions, type ChatRuntimeCollectedInfo, type ChatRuntimeGroupTarget, type ChatRuntimeInformationRequestOptions, type ChatRuntimeNoticeOptions, type ChatRuntimePrivateTarget, type ChatRuntimePromptInjection, type ChatRuntimeResult, type ChatRuntimeSource, type CommandRole, type CompleteOptions, type CompleteResponse, type ConfigService, type HelpService, type MiokiContext, type MiokiPlugin, type MiokuRuntimeConfig, type MiokuService, MiokuStartOptions, type MultimodalContentItem, type MultimodalMessage, type PackageJsonLike, type PluginHelp, type PluginMetadata, type PluginPackageConfig, type ScreenshotService, type ServiceMetadata, type SessionToolDefinition, type SkillPermissionRole, TOOL_RESULT_FOLLOWUP_KEY, type TextMessage, type ToolCallRecord, type ToolResultFollowup, type WebUIService, definePlugin, deleteServiceConfig, ensureDataDir, getConfigDir, getDataDir, getPluginConfigDir, getPluginDataDir, getPluginRuntimeState, getServiceConfig, getServiceConfigDir, getServiceConfigs, getServiceDataDir, _default as pluginManager, registerPluginArtifacts, registerServiceConfig, resetPluginRuntimeState, _default$1 as serviceManager, setPluginRuntimeState, start, updateServiceConfig, version };
|
|
539
|
+
export { type AIInstance, type AIInstanceInfo, type AIModelCapability, type AIModelDescriptor, type AIModelRole, type AIProtocol, type AIProviderConfig, type AIService, type AISkill, type AITool, type AIUsageBotOption, type AIUsageBreakdown, type AIUsageContext, type AIUsageFinalization, type AIUsageRange, type AIUsageScope, type AIUsageSummary, type AccessAction, type AccessControlConfig, type AccessHook, type AccessRuleEntry, type AccessScopeConfig, type ChatRuntime, type ChatRuntimeBaseOptions, type ChatRuntimeCollectedInfo, type ChatRuntimeGroupTarget, type ChatRuntimeInformationRequestOptions, type ChatRuntimeNoticeOptions, type ChatRuntimePrivateTarget, type ChatRuntimePromptInjection, type ChatRuntimeResult, type ChatRuntimeSource, type CommandRole, type CompleteOptions, type CompleteResponse, type ConfigService, type HelpService, type MiokiContext, type MiokiPlugin, type MiokuRuntimeConfig, type MiokuService, MiokuStartOptions, type MultimodalContentItem, type MultimodalMessage, type PackageJsonLike, type PluginHelp, type PluginMetadata, type PluginPackageConfig, type ScreenshotService, type ServiceMetadata, type SessionToolDefinition, type SkillPermissionRole, TOOL_RESULT_FOLLOWUP_KEY, type TextMessage, type ToolCallRecord, type ToolResultFollowup, type WebUIService, definePlugin, deleteServiceConfig, ensureDataDir, getConfigDir, getDataDir, getPluginConfigDir, getPluginDataDir, getPluginRuntimeState, getServiceConfig, getServiceConfigDir, getServiceConfigs, getServiceDataDir, _default as pluginManager, registerPluginArtifacts, registerServiceConfig, resetPluginRuntimeState, _default$1 as serviceManager, setPluginRuntimeState, start, updateServiceConfig, version };
|
|
481
540
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/plugin-artifact-registry.ts","../src/core/service-config.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/types.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/plugin-artifact-registry.ts","../src/core/service-config.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -172,6 +172,34 @@ interface CompleteResponse {
|
|
|
172
172
|
iterations?: number;
|
|
173
173
|
allToolCalls?: ToolCallRecord[];
|
|
174
174
|
}
|
|
175
|
+
type AIProtocol = "openai-chat" | "openai-response" | "anthropic" | "gemini";
|
|
176
|
+
type AIModelCapability = "text" | "vision" | "tool-use" | "reasoning";
|
|
177
|
+
type AIModelRole = "main" | "working" | "vision";
|
|
178
|
+
interface AIProviderConfig {
|
|
179
|
+
id: string;
|
|
180
|
+
name: string;
|
|
181
|
+
protocol: AIProtocol;
|
|
182
|
+
apiUrl: string;
|
|
183
|
+
apiKey: string;
|
|
184
|
+
enabled: boolean;
|
|
185
|
+
headers?: Record<string, string>;
|
|
186
|
+
}
|
|
187
|
+
interface AIModelDescriptor {
|
|
188
|
+
id: string;
|
|
189
|
+
providerId: string;
|
|
190
|
+
modelId: string;
|
|
191
|
+
name: string;
|
|
192
|
+
capabilities: AIModelCapability[];
|
|
193
|
+
contextWindow?: number;
|
|
194
|
+
maxOutputTokens?: number;
|
|
195
|
+
isCustom?: boolean;
|
|
196
|
+
}
|
|
197
|
+
interface AIInstanceInfo {
|
|
198
|
+
name: string;
|
|
199
|
+
providerId: string;
|
|
200
|
+
modelId: string;
|
|
201
|
+
role?: AIModelRole;
|
|
202
|
+
}
|
|
175
203
|
interface AIInstance {
|
|
176
204
|
generateText(options: {
|
|
177
205
|
prompt?: string;
|
|
@@ -210,11 +238,42 @@ interface AIService {
|
|
|
210
238
|
modelType: "text" | "multimodal";
|
|
211
239
|
model?: string;
|
|
212
240
|
}): Promise<AIInstance>;
|
|
241
|
+
createInstance?(options: {
|
|
242
|
+
name: string;
|
|
243
|
+
providerId: string;
|
|
244
|
+
modelId: string;
|
|
245
|
+
role?: AIModelRole;
|
|
246
|
+
}): Promise<AIInstance>;
|
|
213
247
|
get(name: string): AIInstance | undefined;
|
|
214
248
|
list(): string[];
|
|
249
|
+
listInstances?(): AIInstanceInfo[];
|
|
215
250
|
remove(name: string): boolean;
|
|
216
251
|
setDefault(name: string): boolean;
|
|
217
252
|
getDefault(): AIInstance | undefined;
|
|
253
|
+
listProviders?(): AIProviderConfig[];
|
|
254
|
+
getProvider?(id: string): AIProviderConfig | undefined;
|
|
255
|
+
createProvider?(input: Omit<AIProviderConfig, "id"> & {
|
|
256
|
+
id?: string;
|
|
257
|
+
}): Promise<AIProviderConfig>;
|
|
258
|
+
updateProvider?(id: string, input: Partial<AIProviderConfig>): Promise<AIProviderConfig>;
|
|
259
|
+
removeProvider?(id: string): boolean;
|
|
260
|
+
testProvider?(id: string): Promise<{
|
|
261
|
+
ok: boolean;
|
|
262
|
+
error?: string;
|
|
263
|
+
models?: AIModelDescriptor[];
|
|
264
|
+
}>;
|
|
265
|
+
listModels?(providerId?: string): AIModelDescriptor[];
|
|
266
|
+
refreshModels?(providerId: string): Promise<AIModelDescriptor[]>;
|
|
267
|
+
registerCustomModel?(input: {
|
|
268
|
+
providerId: string;
|
|
269
|
+
modelId: string;
|
|
270
|
+
name?: string;
|
|
271
|
+
capabilities?: AIModelCapability[];
|
|
272
|
+
}): AIModelDescriptor;
|
|
273
|
+
removeCustomModel?(modelFullId: string): boolean;
|
|
274
|
+
getRoleBindings?(): Record<AIModelRole, string | undefined>;
|
|
275
|
+
setRoleBinding?(role: AIModelRole, modelFullId: string | undefined): boolean;
|
|
276
|
+
getInstanceByRole?(role: AIModelRole): AIInstance | undefined;
|
|
218
277
|
registerChatRuntime(runtime: any): boolean;
|
|
219
278
|
getChatRuntime(): any;
|
|
220
279
|
removeChatRuntime(): boolean;
|
|
@@ -477,5 +536,5 @@ interface MiokuStartOptions {
|
|
|
477
536
|
declare function start(options?: MiokuStartOptions): Promise<void>;
|
|
478
537
|
declare const version: string;
|
|
479
538
|
//#endregion
|
|
480
|
-
export { type AIInstance, type AIService, type AISkill, type AITool, type AIUsageBotOption, type AIUsageBreakdown, type AIUsageContext, type AIUsageFinalization, type AIUsageRange, type AIUsageScope, type AIUsageSummary, type AccessAction, type AccessControlConfig, type AccessHook, type AccessRuleEntry, type AccessScopeConfig, type ChatRuntime, type ChatRuntimeBaseOptions, type ChatRuntimeCollectedInfo, type ChatRuntimeGroupTarget, type ChatRuntimeInformationRequestOptions, type ChatRuntimeNoticeOptions, type ChatRuntimePrivateTarget, type ChatRuntimePromptInjection, type ChatRuntimeResult, type ChatRuntimeSource, type CommandRole, type CompleteOptions, type CompleteResponse, type ConfigService, type HelpService, type MiokiContext, type MiokiPlugin, type MiokuRuntimeConfig, type MiokuService, MiokuStartOptions, type MultimodalContentItem, type MultimodalMessage, type PackageJsonLike, type PluginHelp, type PluginMetadata, type PluginPackageConfig, type ScreenshotService, type ServiceMetadata, type SessionToolDefinition, type SkillPermissionRole, TOOL_RESULT_FOLLOWUP_KEY, type TextMessage, type ToolCallRecord, type ToolResultFollowup, type WebUIService, definePlugin, deleteServiceConfig, ensureDataDir, getConfigDir, getDataDir, getPluginConfigDir, getPluginDataDir, getPluginRuntimeState, getServiceConfig, getServiceConfigDir, getServiceConfigs, getServiceDataDir, _default as pluginManager, registerPluginArtifacts, registerServiceConfig, resetPluginRuntimeState, _default$1 as serviceManager, setPluginRuntimeState, start, updateServiceConfig, version };
|
|
539
|
+
export { type AIInstance, type AIInstanceInfo, type AIModelCapability, type AIModelDescriptor, type AIModelRole, type AIProtocol, type AIProviderConfig, type AIService, type AISkill, type AITool, type AIUsageBotOption, type AIUsageBreakdown, type AIUsageContext, type AIUsageFinalization, type AIUsageRange, type AIUsageScope, type AIUsageSummary, type AccessAction, type AccessControlConfig, type AccessHook, type AccessRuleEntry, type AccessScopeConfig, type ChatRuntime, type ChatRuntimeBaseOptions, type ChatRuntimeCollectedInfo, type ChatRuntimeGroupTarget, type ChatRuntimeInformationRequestOptions, type ChatRuntimeNoticeOptions, type ChatRuntimePrivateTarget, type ChatRuntimePromptInjection, type ChatRuntimeResult, type ChatRuntimeSource, type CommandRole, type CompleteOptions, type CompleteResponse, type ConfigService, type HelpService, type MiokiContext, type MiokiPlugin, type MiokuRuntimeConfig, type MiokuService, MiokuStartOptions, type MultimodalContentItem, type MultimodalMessage, type PackageJsonLike, type PluginHelp, type PluginMetadata, type PluginPackageConfig, type ScreenshotService, type ServiceMetadata, type SessionToolDefinition, type SkillPermissionRole, TOOL_RESULT_FOLLOWUP_KEY, type TextMessage, type ToolCallRecord, type ToolResultFollowup, type WebUIService, definePlugin, deleteServiceConfig, ensureDataDir, getConfigDir, getDataDir, getPluginConfigDir, getPluginDataDir, getPluginRuntimeState, getServiceConfig, getServiceConfigDir, getServiceConfigs, getServiceDataDir, _default as pluginManager, registerPluginArtifacts, registerServiceConfig, resetPluginRuntimeState, _default$1 as serviceManager, setPluginRuntimeState, start, updateServiceConfig, version };
|
|
481
540
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/plugin-artifact-registry.ts","../src/core/service-config.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/plugin-artifact-registry.ts","../src/core/service-config.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["fallbackLogger: MiokuLogger","activeLogger: MiokuLogger","logger: MiokuLogger | undefined","logger","logger: MiokuLogger","filePath: string","p: string","dir: string","results: DiscoveredModule[]","entries: import(\"fs\").Dirent[]","prefix: string","entryPath: string","linkPath: string","targetPath: string","runtimePluginsDir: string","metadata: PluginMetadata","plugins: PluginMetadata[]","linkedNames: string[]","store","key: string","factory: () => T","miokuConfig: MiokuRuntimeConfig","name: string","pluginPath: string","packageJson: PackageJsonLike | null","config: PluginPackageConfig","miokuConfig: MiokuRuntimeConfig","name: string","servicePath: string","packageJson: PackageJsonLike","required: Set<string>","missing: string[]","ctx: MiokiContext","metadata: ServiceMetadata","service: MiokuService","miokuConfig: MiokuRuntimeConfig","botConfig: BotConfigLike","linkedPluginNames: string[]","deps: BootstrapDeps","botConfig","value: unknown","moduleExports: Record<string, unknown>","pluginPath: string","keywords: unknown","ctx: MiokiContext","serviceName: string","configName: string","defaults: Record<string, unknown>","value: Record<string, unknown>","result: Record<string, Record<string, unknown>>","pluginName: string","serviceName: string","pluginName: string","state: Record<string, any>","plugin: T","options: MiokuStartOptions","logger","version: string"],"sources":["../src/core/logger.ts","../src/core/module-scanner.ts","../src/core/plugin-linker.ts","../src/core/registry.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/bootstrap.ts","../src/core/plugin-artifact-registry.ts","../src/core/service-config.ts","../src/types.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/index.ts"],"sourcesContent":["type LogMethod = (...args: unknown[]) => void;\n\nexport interface MiokuLogger {\n error: LogMethod;\n warn: LogMethod;\n info: LogMethod;\n debug: LogMethod;\n trace?: LogMethod;\n}\n\nconst fallbackLogger: MiokuLogger = {\n error: (...args) => console.error(...args),\n warn: (...args) => console.warn(...args),\n info: (...args) => console.info(...args),\n debug: (...args) => console.debug(...args),\n trace: (...args) => console.debug(...args),\n};\n\nlet activeLogger: MiokuLogger = fallbackLogger;\n\nexport function setMiokuLogger(logger: MiokuLogger | undefined): void {\n activeLogger = logger || fallbackLogger;\n}\n\nexport function getMiokuLogger(): MiokuLogger {\n return activeLogger;\n}\n\nexport const logger: MiokuLogger = {\n error: (...args) => activeLogger.error(...args),\n warn: (...args) => activeLogger.warn(...args),\n info: (...args) => activeLogger.info(...args),\n debug: (...args) => activeLogger.debug(...args),\n trace: (...args) => activeLogger.trace?.(...args),\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nexport interface DiscoveredModule {\n name: string;\n path: string;\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveRealpath(p: string): Promise<string> {\n try {\n return await fs.realpath(p);\n } catch {\n return p;\n }\n}\n\n// Windows requires file:// URLs for absolute paths in dynamic import().\nexport function toImportPath(filePath: string): string {\n if (process.platform === \"win32\") {\n return \"file:///\" + filePath.replace(/\\\\/g, \"/\");\n }\n return filePath;\n}\n\nexport async function scanLocalDir(dir: string): Promise<DiscoveredModule[]> {\n const results: DiscoveredModule[] = [];\n if (!(await pathExists(dir))) return results;\n\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n try {\n const stat = await fs.stat(entryPath);\n if (!stat.isDirectory()) continue;\n } catch {\n continue;\n }\n results.push({ name: entry.name, path: await resolveRealpath(entryPath) });\n }\n return results;\n}\n\nexport async function scanNodeModules(prefix: string): Promise<DiscoveredModule[]> {\n const results: DiscoveredModule[] = [];\n const nodeModulesPath = path.resolve(process.cwd(), \"node_modules\");\n if (!(await pathExists(nodeModulesPath))) return results;\n\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(nodeModulesPath, { withFileTypes: true });\n } catch {\n return results;\n }\n\n // Don't filter by isDirectory(): node_modules entries are often symlinks\n // into the workspace, and Dirent.isDirectory() returns false for symlinks.\n for (const entry of entries) {\n if (!entry.name.startsWith(prefix)) continue;\n const name = entry.name.slice(prefix.length);\n const fullPath = path.join(nodeModulesPath, entry.name);\n results.push({ name, path: await resolveRealpath(fullPath) });\n }\n return results;\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { PluginMetadata } from \"../types\";\nimport { logger } from \"./logger\";\nimport { pathExists } from \"./module-scanner\";\n\nexport const DEFAULT_RUNTIME_PLUGINS_DIR = \".mioku/plugins\";\n\ntype SymlinkState = \"ok\" | \"blocked\" | \"removed\";\n\nasync function removeIfBrokenSymlink(entryPath: string): Promise<SymlinkState> {\n let stat;\n try {\n stat = await fs.lstat(entryPath);\n } catch {\n return \"removed\";\n }\n if (!stat.isSymbolicLink()) return \"blocked\";\n try {\n await fs.realpath(entryPath);\n return \"ok\";\n } catch {\n await fs.rm(entryPath, { force: true });\n logger.warn(`[plugin-linker] Removed broken plugin link: ${entryPath}`);\n return \"removed\";\n }\n}\n\nfunction relativeSymlinkTarget(linkPath: string, targetPath: string): string {\n return path.relative(path.dirname(linkPath), targetPath) || \".\";\n}\n\nasync function ensurePluginLink(\n runtimePluginsDir: string,\n metadata: PluginMetadata,\n): Promise<boolean> {\n const linkPath = path.join(runtimePluginsDir, metadata.name);\n const targetPath = metadata.path;\n\n let stat;\n try {\n stat = await fs.lstat(linkPath);\n } catch {\n stat = null;\n }\n\n if (stat?.isSymbolicLink()) {\n try {\n const currentTarget = await fs.realpath(linkPath);\n const expectedTarget = await fs.realpath(targetPath);\n if (currentTarget === expectedTarget) return true;\n await fs.rm(linkPath, { force: true });\n logger.info(`[plugin-linker] Rebuilding plugin link: ${metadata.name}`);\n } catch {\n await fs.rm(linkPath, { force: true });\n logger.warn(`[plugin-linker] Removed broken plugin link: ${linkPath}`);\n }\n } else if (stat) {\n logger.warn(\n `[plugin-linker] ${linkPath} exists and is not a symlink, skip linking ${metadata.name}`,\n );\n return false;\n }\n\n if (!(await pathExists(targetPath))) {\n logger.warn(\n `[plugin-linker] Plugin target missing, skip linking ${metadata.name}: ${targetPath}`,\n );\n return false;\n }\n\n // Junctions on Windows don't require admin rights; relative dir symlinks elsewhere.\n if (process.platform === \"win32\") {\n await fs.symlink(targetPath, linkPath, \"junction\");\n } else {\n await fs.symlink(relativeSymlinkTarget(linkPath, targetPath), linkPath, \"dir\");\n }\n return true;\n}\n\nexport async function prepareRuntimePluginLinks(\n plugins: PluginMetadata[],\n runtimePluginsDir = path.resolve(process.cwd(), DEFAULT_RUNTIME_PLUGINS_DIR),\n): Promise<string[]> {\n await fs.mkdir(runtimePluginsDir, { recursive: true });\n\n const discoveredNames = new Set(plugins.map((p) => p.name));\n const entries = await fs.readdir(runtimePluginsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(runtimePluginsDir, entry.name);\n if ((await removeIfBrokenSymlink(entryPath)) !== \"ok\") continue;\n if (entry.isSymbolicLink() && !discoveredNames.has(entry.name)) {\n await fs.rm(entryPath, { force: true });\n logger.info(`[plugin-linker] Removed stale plugin link: ${entry.name}`);\n }\n }\n\n const linkedNames: string[] = [];\n for (const metadata of plugins) {\n if (await ensurePluginLink(runtimePluginsDir, metadata)) {\n linkedNames.push(metadata.name);\n }\n }\n return linkedNames;\n}\n","// Framework singletons are stashed on globalThis so they survive jiti's\n// moduleCache-off re-evaluation (mioki loads plugins via jiti). Callers that\n// live in the normally-cached `mioku` dist could use a plain module-level\n// const, but the global indirection keeps things stable if a plugin ever\n// re-imports the framework through jiti.\n\nconst STORE_SYMBOL = Symbol.for(\"mioku.globalStore\");\ntype GlobalStore = Record<string, unknown>;\n\nfunction store(): GlobalStore {\n const g = globalThis as unknown as Record<symbol, GlobalStore>;\n if (!g[STORE_SYMBOL]) g[STORE_SYMBOL] = {};\n return g[STORE_SYMBOL]!;\n}\n\nexport function getOrCreate<T>(key: string, factory: () => T): T {\n const s = store();\n if (s[key] === undefined) s[key] = factory();\n return s[key] as T;\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { mkdirSync } from \"fs\";\nimport type {\n MiokuRuntimeConfig,\n PackageJsonLike,\n PluginMetadata,\n PluginPackageConfig,\n} from \"../types\";\nimport { DEFAULT_RUNTIME_PLUGINS_DIR } from \"./plugin-linker\";\nimport { logger } from \"./logger\";\nimport {\n scanLocalDir,\n scanNodeModules,\n pathExists,\n resolveRealpath,\n} from \"./module-scanner\";\nimport { getOrCreate } from \"./registry\";\n\nconst PLUGIN_PREFIX = \"mioku-plugin-\";\n\nexport class PluginManager {\n private plugins = new Map<string, PluginMetadata>();\n\n static getInstance(): PluginManager {\n return getOrCreate(\"plugin-manager\", () => new PluginManager());\n }\n\n async discoverPlugins(miokuConfig: MiokuRuntimeConfig = {}): Promise<PluginMetadata[]> {\n const configuredDir = miokuConfig.plugins_dir;\n const pluginsDir =\n configuredDir && configuredDir !== DEFAULT_RUNTIME_PLUGINS_DIR\n ? path.resolve(process.cwd(), configuredDir)\n : path.resolve(process.cwd(), \"plugins\");\n\n this.plugins.clear();\n\n if (!(await pathExists(pluginsDir))) {\n mkdirSync(pluginsDir, { recursive: true });\n }\n\n const local = await scanLocalDir(pluginsDir);\n for (const { name, path: p } of local) {\n const metadata = await this.loadPluginMetadata(name, p);\n if (metadata) this.plugins.set(metadata.name, metadata);\n }\n\n const external = await scanNodeModules(PLUGIN_PREFIX);\n for (const { name, path: p } of external) {\n const metadata = await this.loadPluginMetadata(name, p);\n if (metadata) this.plugins.set(metadata.name, metadata);\n }\n\n logger.info(`O.o 发现了 ${this.plugins.size} 个插件`);\n return [...this.plugins.values()];\n }\n\n private async loadPluginMetadata(\n name: string,\n pluginPath: string,\n ): Promise<PluginMetadata | null> {\n const resolvedPath = await resolveRealpath(pluginPath);\n let packageJson: PackageJsonLike | null = null;\n try {\n packageJson = JSON.parse(\n await fs.readFile(path.join(resolvedPath, \"package.json\"), \"utf-8\"),\n );\n } catch (error) {\n logger.warn(`[plugin-manager] 读取 ${name} 的 package.json 失败: ${error}`);\n }\n\n const config: PluginPackageConfig = packageJson?.mioku ?? {};\n return {\n name,\n version: packageJson?.version ?? \"0.0.0\",\n description: packageJson?.description,\n path: resolvedPath,\n packageJson: packageJson ?? {},\n config,\n };\n }\n\n collectRequiredServices(): Set<string> {\n const services = new Set<string>();\n for (const metadata of this.plugins.values()) {\n for (const service of metadata.config.services ?? []) services.add(service);\n }\n return services;\n }\n\n getPluginMetadata(name: string): PluginMetadata | undefined {\n return this.plugins.get(name);\n }\n\n getAllMetadata(): PluginMetadata[] {\n return [...this.plugins.values()];\n }\n\n reset(): void {\n this.plugins.clear();\n }\n}\n\nexport default PluginManager.getInstance();\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport type { MiokiContext } from \"mioki\";\nimport type {\n MiokuRuntimeConfig,\n PackageJsonLike,\n ServiceMetadata,\n MiokuService,\n} from \"../types\";\nimport { logger } from \"./logger\";\nimport {\n scanLocalDir,\n scanNodeModules,\n pathExists,\n toImportPath,\n} from \"./module-scanner\";\nimport { getOrCreate } from \"./registry\";\n\nconst SERVICE_PREFIX = \"mioku-service-\";\n\nexport class ServiceManager {\n private services = new Map<string, MiokuService>();\n private serviceMetadata = new Map<string, ServiceMetadata>();\n\n static getInstance(): ServiceManager {\n return getOrCreate(\"service-manager\", () => new ServiceManager());\n }\n\n async discoverServices(miokuConfig: MiokuRuntimeConfig = {}): Promise<ServiceMetadata[]> {\n const servicesDir = miokuConfig.services_dir\n ? path.resolve(process.cwd(), miokuConfig.services_dir)\n : path.resolve(process.cwd(), \"services\");\n\n this.serviceMetadata.clear();\n\n if (existsSync(servicesDir)) {\n const local = await scanLocalDir(servicesDir);\n for (const { name, path: p } of local) {\n const metadata = await this.loadServiceMetadata(name, p);\n if (metadata) this.serviceMetadata.set(name, metadata);\n }\n } else {\n mkdirSync(servicesDir, { recursive: true });\n }\n\n const external = await scanNodeModules(SERVICE_PREFIX);\n for (const { name, path: p } of external) {\n const metadata = await this.loadServiceMetadata(name, p);\n if (metadata) this.serviceMetadata.set(name, metadata);\n }\n\n logger.info(`o.O 发现了 ${this.serviceMetadata.size} 个服务`);\n return [...this.serviceMetadata.values()];\n }\n\n private async loadServiceMetadata(\n name: string,\n servicePath: string,\n ): Promise<ServiceMetadata | null> {\n const packageJsonPath = path.join(servicePath, \"package.json\");\n if (!(await pathExists(packageJsonPath))) return null;\n\n try {\n const packageJson: PackageJsonLike = JSON.parse(\n await fs.readFile(packageJsonPath, \"utf-8\"),\n );\n return {\n name,\n version: packageJson.version ?? \"0.0.0\",\n description: packageJson.description,\n path: servicePath,\n packageJson,\n };\n } catch (error) {\n logger.warn(`[service-manager] 解析服务 ${name} 失败: ${error}`);\n return null;\n }\n }\n\n async checkMissingServices(required: Set<string>): Promise<string[]> {\n const missing: string[] = [];\n for (const name of required) {\n if (!this.serviceMetadata.has(name)) missing.push(name);\n }\n return missing;\n }\n\n async loadAllServices(ctx: MiokiContext): Promise<void> {\n const all = [...this.serviceMetadata.values()];\n logger.info(`O.o 准备加载 ${all.length} 个服务...`);\n for (const metadata of all) {\n await this.loadService(metadata, ctx);\n }\n }\n\n private async loadService(\n metadata: ServiceMetadata,\n ctx: MiokiContext,\n ): Promise<boolean> {\n try {\n const tsEntry = path.join(metadata.path, \"index.ts\");\n const jsEntry = path.join(metadata.path, \"index.js\");\n const entry = (await pathExists(tsEntry))\n ? tsEntry\n : (await pathExists(jsEntry))\n ? jsEntry\n : null;\n if (!entry) {\n logger.error(`[service-manager] 服务 ${metadata.name} 入口丢失`);\n return false;\n }\n\n const serviceModule = await import(toImportPath(entry));\n const service: MiokuService = serviceModule.default ?? serviceModule;\n if (!service || typeof service.init !== \"function\") {\n logger.warn(`[service-manager] 服务 ${metadata.name} 无效:缺少 init()`);\n return false;\n }\n\n await service.init();\n if (service.api) {\n ctx.services[metadata.name] = service.api;\n }\n this.services.set(metadata.name, service);\n return true;\n } catch (error) {\n logger.error(`[service-manager] 加载服务 ${metadata.name} 失败: ${error}`);\n return false;\n }\n }\n\n registerBuiltinService(name: string, service: MiokuService): void {\n this.services.set(name, service);\n }\n\n getService(name: string): MiokuService | undefined {\n return this.services.get(name);\n }\n\n async disposeAll(): Promise<void> {\n for (const [, service] of this.services) {\n await service.dispose?.();\n }\n this.services.clear();\n }\n\n reset(): void {\n this.services.clear();\n this.serviceMetadata.clear();\n }\n}\n\nexport default ServiceManager.getInstance();\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport type { MiokuRuntimeConfig } from \"../types\";\nimport pluginManager from \"./plugin-manager\";\nimport serviceManager from \"./service-manager\";\nimport {\n prepareRuntimePluginLinks,\n DEFAULT_RUNTIME_PLUGINS_DIR,\n} from \"./plugin-linker\";\nimport { logger } from \"./logger\";\n\ninterface BotConfigLike {\n plugins: string[];\n plugins_dir?: string;\n}\n\nexport interface BootstrapDeps {\n cwd: string;\n botConfig: BotConfigLike;\n startMioki: (opts: { cwd: string }) => Promise<void>;\n}\n\nexport async function readMiokuConfig(): Promise<MiokuRuntimeConfig> {\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n try {\n const pkg = JSON.parse(await fs.readFile(packageJsonPath, \"utf-8\"));\n return (pkg.mioki ?? {}) as MiokuRuntimeConfig;\n } catch {\n return {};\n }\n}\n\nfunction ensureRuntimeDirectories(): void {\n for (const dir of [\"data\", \"config\", \"temp\"]) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n }\n}\n\nasync function discoverAndLinkPlugins(\n miokuConfig: MiokuRuntimeConfig,\n): Promise<string[]> {\n logger.info(\"O.o Miku 正在翻找插件..\");\n const discovered = await pluginManager.discoverPlugins(miokuConfig);\n logger.info(\n `O.o 共发现 ${discovered.length} 个插件: ${discovered.map((p) => p.name).join(\", \")}`,\n );\n const runtimePluginsDir = path.resolve(\n process.cwd(),\n DEFAULT_RUNTIME_PLUGINS_DIR,\n );\n return prepareRuntimePluginLinks(discovered, runtimePluginsDir);\n}\n\nasync function discoverAndValidateServices(\n miokuConfig: MiokuRuntimeConfig,\n): Promise<void> {\n logger.info(\"o.O Miku 正在翻找服务..\");\n await serviceManager.discoverServices(miokuConfig);\n const requiredServices = pluginManager.collectRequiredServices();\n const missing = await serviceManager.checkMissingServices(requiredServices);\n if (missing.length > 0) logger.warn(`发现缺失服务: ${missing.join(\", \")}`);\n}\n\nfunction applyPluginAllowlist(\n miokuConfig: MiokuRuntimeConfig,\n botConfig: BotConfigLike,\n linkedPluginNames: string[],\n): void {\n botConfig.plugins_dir = DEFAULT_RUNTIME_PLUGINS_DIR;\n // Respect an explicit plugins list; only auto-load when undefined.\n if (miokuConfig.plugins !== undefined) return;\n for (const name of linkedPluginNames) {\n if (!botConfig.plugins.includes(name)) botConfig.plugins.push(name);\n }\n}\n\nexport async function bootstrapMioku(deps: BootstrapDeps): Promise<void> {\n const { cwd, botConfig, startMioki } = deps;\n const miokuConfig = await readMiokuConfig();\n ensureRuntimeDirectories();\n const linkedPluginNames = await discoverAndLinkPlugins(miokuConfig);\n await discoverAndValidateServices(miokuConfig);\n applyPluginAllowlist(miokuConfig, botConfig, linkedPluginNames);\n await startMioki({ cwd });\n}\n","import * as path from \"path\";\nimport type { MiokiContext } from \"mioki\";\nimport { botConfig } from \"mioki\";\nimport type { AIService, AISkill, HelpService } from \"../types\";\nimport pluginManager from \"./plugin-manager\";\nimport { logger } from \"./logger\";\nimport { pathExists, toImportPath } from \"./module-scanner\";\n\nfunction isAISkill(value: unknown): value is AISkill {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as AISkill).name === \"string\" &&\n Array.isArray((value as AISkill).tools)\n );\n}\n\nfunction extractSkills(moduleExports: Record<string, unknown>): AISkill[] {\n const candidates = [moduleExports?.default, moduleExports?.skills, moduleExports];\n for (const candidate of candidates) {\n if (Array.isArray(candidate)) return candidate.filter(isAISkill);\n if (isAISkill(candidate)) return [candidate];\n }\n return [];\n}\n\nasync function resolveSkillsEntry(pluginPath: string): Promise<string | null> {\n const tsPath = path.join(pluginPath, \"skills.ts\");\n if (await pathExists(tsPath)) return tsPath;\n const jsPath = path.join(pluginPath, \"skills.js\");\n if (await pathExists(jsPath)) return jsPath;\n return null;\n}\n\nfunction hasPublicKeyword(keywords: unknown): boolean {\n return Array.isArray(keywords) && keywords.includes(\"mioku\");\n}\n\nexport async function registerPluginArtifacts(ctx: MiokiContext): Promise<void> {\n const enabledPlugins = new Set<string>(botConfig.plugins ?? []);\n const pluginMetadata = pluginManager.getAllMetadata().filter((metadata) =>\n enabledPlugins.size > 0 ? enabledPlugins.has(metadata.name) : true,\n );\n\n const helpService = ctx.services.help as HelpService | undefined;\n const aiService = ctx.services.ai as AIService | undefined;\n\n if (helpService) {\n let helpCount = 0;\n for (const metadata of pluginMetadata) {\n if (!metadata.config.help) continue;\n if (!hasPublicKeyword(metadata.packageJson?.keywords)) continue;\n helpService.registerHelp(metadata.name, metadata.config.help);\n helpCount += 1;\n }\n logger.info(`[plugin-artifacts] Registered ${helpCount} help manifest(s)`);\n }\n\n if (!aiService) return;\n\n let skillCount = 0;\n for (const metadata of pluginMetadata) {\n const skillsEntry = await resolveSkillsEntry(metadata.path);\n if (!skillsEntry) continue;\n\n try {\n const moduleExports = (await import(toImportPath(skillsEntry))) as Record<\n string,\n unknown\n >;\n const skills = extractSkills(moduleExports);\n if (skills.length === 0) {\n logger.warn(\n `[plugin-artifacts] Plugin ${metadata.name} has ${path.basename(skillsEntry)} but exported no valid skill`,\n );\n continue;\n }\n for (const skill of skills) {\n aiService.registerSkill(skill);\n skillCount += 1;\n }\n } catch (error) {\n logger.error(\n `[plugin-artifacts] Failed to load skills for plugin ${metadata.name}: ${error}`,\n );\n }\n }\n logger.info(`[plugin-artifacts] Registered ${skillCount} skill(s)`);\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport { logger } from \"./logger\";\n\nconst SERVICE_CONFIG_ROOT = \"service\";\n\nfunction resolveConfigDir(serviceName: string): string {\n return path.join(process.cwd(), \"config\", SERVICE_CONFIG_ROOT, serviceName);\n}\n\nfunction resolveConfigPath(serviceName: string, configName: string): string {\n return path.join(resolveConfigDir(serviceName), `${configName}.json`);\n}\n\nfunction ensureDir(serviceName: string): void {\n const dir = resolveConfigDir(serviceName);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nexport async function registerServiceConfig(\n serviceName: string,\n configName: string,\n defaults: Record<string, unknown>,\n): Promise<void> {\n ensureDir(serviceName);\n const configPath = resolveConfigPath(serviceName, configName);\n if (!existsSync(configPath)) {\n await fs.writeFile(configPath, JSON.stringify(defaults, null, 2), \"utf-8\");\n }\n}\n\nexport async function getServiceConfig(\n serviceName: string,\n configName: string,\n): Promise<Record<string, unknown>> {\n const configPath = resolveConfigPath(serviceName, configName);\n try {\n return JSON.parse(await fs.readFile(configPath, \"utf-8\"));\n } catch (error) {\n if (!existsSync(configPath)) return {};\n logger.warn(`[service-config] 读取 ${serviceName}/${configName} 失败: ${error}`);\n return {};\n }\n}\n\nexport async function updateServiceConfig(\n serviceName: string,\n configName: string,\n value: Record<string, unknown>,\n): Promise<void> {\n ensureDir(serviceName);\n await fs.writeFile(\n resolveConfigPath(serviceName, configName),\n JSON.stringify(value, null, 2),\n \"utf-8\",\n );\n}\n\nexport async function getServiceConfigs(\n serviceName: string,\n): Promise<Record<string, Record<string, unknown>>> {\n const dir = resolveConfigDir(serviceName);\n if (!existsSync(dir)) return {};\n\n const result: Record<string, Record<string, unknown>> = {};\n const files = (await fs.readdir(dir)).filter((name) => name.endsWith(\".json\"));\n for (const file of files) {\n try {\n result[path.basename(file, \".json\")] = JSON.parse(\n await fs.readFile(path.join(dir, file), \"utf-8\"),\n );\n } catch (error) {\n logger.warn(`[service-config] 读取 ${serviceName}/${file} 失败: ${error}`);\n }\n }\n return result;\n}\n\nexport async function deleteServiceConfig(\n serviceName: string,\n configName: string,\n): Promise<boolean> {\n const configPath = resolveConfigPath(serviceName, configName);\n if (!existsSync(configPath)) return false;\n await fs.unlink(configPath);\n return true;\n}\n","// Mioku framework types — single source of truth for the public API surface.\n\n// ---------- framework ----------\n\nexport interface MiokuService {\n name: string;\n version: string;\n description?: string;\n init(): Promise<void>;\n api: Record<string, any>;\n dispose?(): Promise<void>;\n}\n\nexport interface MiokuRuntimeConfig {\n plugins?: string[];\n plugins_dir?: string;\n services_dir?: string;\n [key: string]: unknown;\n}\n\nexport interface PackageJsonLike {\n name?: string;\n version?: string;\n description?: string;\n keywords?: string[];\n mioki?: MiokuRuntimeConfig;\n mioku?: PluginPackageConfig;\n dependencies?: Record<string, string>;\n}\n\nexport interface PluginMetadata {\n name: string;\n version: string;\n description?: string;\n path: string;\n packageJson: PackageJsonLike;\n config: PluginPackageConfig;\n}\n\nexport interface ServiceMetadata {\n name: string;\n version: string;\n description?: string;\n path: string;\n packageJson: PackageJsonLike;\n}\n\n// ---------- plugin package config ----------\n\nexport interface PluginPackageConfig {\n services?: string[];\n help?: PluginHelp;\n accessHooks?: AccessHook[];\n}\n\nexport interface PluginHelp {\n title: string;\n description: string;\n commands: Array<{\n cmd: string;\n desc: string;\n usage?: string;\n role?: CommandRole;\n }>;\n}\n\nexport type CommandRole = \"master\" | \"admin\" | \"owner\" | \"member\";\n\nexport interface AccessHook {\n id: string;\n match?: string;\n event?: string;\n description?: string;\n}\n\nexport type AccessAction = \"allow\" | \"block\";\n\nexport interface AccessRuleEntry {\n action: AccessAction;\n}\n\nexport interface AccessScopeConfig {\n plugins?: Record<string, AccessRuleEntry>;\n commands?: Record<string, Record<string, AccessRuleEntry>>;\n}\n\nexport interface AccessControlConfig {\n version: 1;\n global: AccessScopeConfig;\n groups: Record<string, AccessScopeConfig>;\n users: Record<string, AccessScopeConfig>;\n}\n\n// ---------- built-in service contracts ----------\n\nexport interface ConfigService {\n registerConfig(pluginName: string, configName: string, initialConfig: any): Promise<boolean>;\n updateConfig(pluginName: string, configName: string, updates: any): Promise<boolean>;\n getConfig(pluginName: string, configName: string): Promise<any>;\n getPluginConfigs(pluginName: string): Promise<Record<string, any>>;\n onConfigChange(pluginName: string, configName: string, callback: (newConfig: any) => void): () => void;\n}\n\nexport interface ScreenshotService {\n screenshot(html: string, options?: any): Promise<string>;\n screenshotMarkdown(markdownContent: string, options?: any): Promise<string>;\n screenshotFromUrl(url: string, options?: any): Promise<string>;\n cleanupTemp(olderThanMs?: number): Promise<number>;\n}\n\nexport interface HelpService {\n registerHelp(pluginName: string, help: PluginHelp): void;\n getHelp(pluginName: string): PluginHelp | undefined;\n getAllHelp(): Map<string, PluginHelp>;\n unregisterHelp(pluginName: string): boolean;\n}\n\nexport interface WebUIService {\n getSettings(): { port: number; host: string; packageManager: string };\n}\n\n// ---------- AI service ----------\n\nexport interface AITool {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n handler: (args: any, event?: any) => Promise<any> | any;\n}\n\nexport type SkillPermissionRole = \"owner\" | \"admin\" | \"member\";\n\nexport interface AISkill {\n name: string;\n description: string;\n permission?: SkillPermissionRole;\n tools: AITool[];\n}\n\nexport interface TextMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface MultimodalContentItem {\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string;\n detail?: \"auto\" | \"low\" | \"high\";\n };\n}\n\nexport interface MultimodalMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | MultimodalContentItem[];\n}\n\nexport interface ToolCallRecord {\n name: string;\n arguments: any;\n result: any;\n}\n\nexport interface SessionToolDefinition {\n name: string;\n tool: AITool;\n}\n\nexport interface CompleteOptions {\n model?: string;\n messages: any[];\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n tools?: any[];\n executableTools?: SessionToolDefinition[];\n executableToolsProvider?: () => SessionToolDefinition[];\n maxIterations?: number;\n onTextDelta?: (delta: string) => void | Promise<void>;\n usageContext?: AIUsageContext;\n usageContextTokens?: number;\n usageBreakdown?: AIUsageFinalization[\"breakdown\"];\n}\n\nexport interface CompleteResponse {\n content: string | null;\n reasoning: string | null;\n toolCalls: Array<{ id: string; name: string; arguments: string }>;\n raw: any;\n turnMessages: any[];\n iterations?: number;\n allToolCalls?: ToolCallRecord[];\n}\n\nexport interface AIInstance {\n generateText(options: { prompt?: string; messages: TextMessage[]; model?: string; temperature?: number; max_tokens?: number }): Promise<string>;\n generateMultimodal(options: { prompt?: string; messages: MultimodalMessage[]; model?: string; temperature?: number; max_tokens?: number }): Promise<string>;\n complete(options: CompleteOptions): Promise<CompleteResponse>;\n generateWithTools(options: { prompt?: string; messages: TextMessage[] | MultimodalMessage[]; model?: string; temperature?: number; maxIterations?: number }): Promise<any>;\n setUsageContext?(context: AIUsageContext | undefined): void;\n withUsageContext?<T>(context: AIUsageContext | undefined, fn: () => Promise<T>): Promise<T>;\n registerPrompt(name: string, prompt: string): boolean;\n getPrompt(name: string): string | undefined;\n getAllPrompts(): Record<string, string>;\n removePrompt(name: string): boolean;\n}\n\nexport interface AIService {\n create(options: { name: string; apiUrl: string; apiKey: string; modelType: \"text\" | \"multimodal\"; model?: string }): Promise<AIInstance>;\n get(name: string): AIInstance | undefined;\n list(): string[];\n remove(name: string): boolean;\n setDefault(name: string): boolean;\n getDefault(): AIInstance | undefined;\n registerChatRuntime(runtime: any): boolean;\n getChatRuntime(): any;\n removeChatRuntime(): boolean;\n registerSkill(skill: AISkill): boolean;\n getSkill(skillName: string): AISkill | undefined;\n getAllSkills(): Map<string, AISkill>;\n removeSkill(skillName: string): boolean;\n getTool(toolName: string): AITool | undefined;\n getAllTools(): Map<string, AITool>;\n getUsageSummary?(options: { range: AIUsageRange; botId?: number }): AIUsageSummary;\n cleanupUsageStats?(retentionMs?: number): number;\n finalizeUsage?(usageId: string, finalization: AIUsageFinalization): boolean;\n}\n\n// ---------- chat runtime ----------\n\nexport interface ChatRuntime {\n generateNotice(options: ChatRuntimeNoticeOptions): Promise<ChatRuntimeResult>;\n requestInformation(options: ChatRuntimeInformationRequestOptions): Promise<ChatRuntimeResult>;\n}\n\nexport const TOOL_RESULT_FOLLOWUP_KEY = \"__miokuFollowup\";\n\nexport interface ToolResultFollowup {\n text: string;\n images?: Array<{ url: string; detail?: \"auto\" | \"low\" | \"high\" }>;\n videos?: Array<{ url: string; detail?: \"auto\" | \"low\" | \"high\" }>;\n}\n\nexport interface ChatRuntimePromptInjection {\n content: string;\n title?: string;\n}\n\nexport interface ChatRuntimeGroupTarget {\n selfId: number;\n groupId: number;\n}\n\nexport interface ChatRuntimePrivateTarget {\n selfId: number;\n userId: number;\n}\n\nexport type ChatRuntimeSource =\n | { event: any }\n | ChatRuntimeGroupTarget\n | ChatRuntimePrivateTarget;\n\nexport type ChatRuntimeBaseOptions = ChatRuntimeSource & {\n targetMessage?: string;\n promptInjections?: ChatRuntimePromptInjection[];\n send?: boolean;\n};\n\nexport type ChatRuntimeNoticeOptions = ChatRuntimeBaseOptions & {\n instruction: string;\n};\n\nexport type ChatRuntimeInformationRequestOptions = ChatRuntimeBaseOptions & {\n task: string;\n schema: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n toolName?: string;\n toolDescription?: string;\n};\n\nexport interface ChatRuntimeCollectedInfo {\n data: any;\n isComplete?: boolean;\n confidence?: number;\n notes?: string;\n}\n\nexport interface ChatRuntimeResult {\n messages: string[];\n toolCalls: ToolCallRecord[];\n collectedInfo: ChatRuntimeCollectedInfo | null;\n pendingAt?: number[];\n pendingPoke?: number[];\n pendingQuote?: number;\n emojiPath?: string | null;\n protocolMessages?: any[];\n}\n\n// ---------- usage tracking ----------\n\nexport type AIUsageRange = \"today\" | \"7d\" | \"30d\";\n\nexport type AIUsageScope = \"all\" | \"bot\";\n\nexport interface AIUsageContext {\n usageId?: string;\n source?: string;\n botId?: number;\n groupId?: number;\n groupName?: string;\n userId?: number;\n userName?: string;\n sessionId?: string;\n}\n\nexport interface AIUsageBreakdown {\n systemPromptTokens?: number;\n chatHistoryTokens?: number;\n toolDefinitionTokens?: number;\n toolUseTokens?: number;\n otherContextTokens?: number;\n}\n\nexport interface AIUsageFinalization {\n sentUserMessages?: number;\n sentAssistantMessages?: number;\n breakdown?: AIUsageBreakdown;\n}\n\nexport interface AIUsageBotOption {\n botId: number;\n label: string;\n}\n\nexport interface AIUsageSummary {\n generatedAt: number;\n range: AIUsageRange;\n scope: AIUsageScope;\n botId?: number;\n bots: AIUsageBotOption[];\n totals: {\n requests: number;\n successfulRequests: number;\n failedRequests: number;\n userMessages: number;\n assistantMessages: number;\n systemMessages: number;\n toolMessages: number;\n sentUserMessages: number;\n sentAssistantMessages: number;\n inputTokens: number;\n outputTokens: number;\n systemPromptTokens: number;\n totalTokens: number;\n cacheWriteTokens: number;\n cacheReadTokens: number;\n toolDefinitionTokens: number;\n toolUseTokens: number;\n chatHistoryTokens: number;\n otherContextTokens: number;\n durationMs: number;\n toolCalls: number;\n };\n rates: {\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n };\n toolRanking: Array<{ name: string; count: number }>;\n groupRanking: Array<{\n groupId: number;\n groupName: string;\n requests: number;\n totalTokens: number;\n userMessages: number;\n assistantMessages: number;\n errorRate: number;\n }>;\n tokenFlow: Array<{ name: \"输入\" | \"输出\" | \"缓存写入\" | \"缓存读取\"; value: number }>;\n tokenCategories: Array<{\n name: \"系统提示词\" | \"工具定义\" | \"工具使用\" | \"聊天上下文\" | \"其他上下文\";\n value: number;\n }>;\n dailyActivity: Array<{\n day: string;\n requests: number;\n userMessages: number;\n assistantMessages: number;\n totalTokens: number;\n inputTokens: number;\n cacheReadTokens: number;\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n }>;\n hourlyActivity: Array<{\n hour: string;\n requests: number;\n userMessages: number;\n assistantMessages: number;\n totalTokens: number;\n inputTokens: number;\n cacheReadTokens: number;\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n }>;\n}\n","import * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\n\nexport function getPluginDataDir(pluginName: string): string {\n return path.join(process.cwd(), \"data\", pluginName);\n}\n\nexport function getServiceDataDir(serviceName: string): string {\n return path.join(process.cwd(), \"data\", serviceName);\n}\n\nexport function getDataDir(): string {\n return path.join(process.cwd(), \"data\");\n}\n\nexport function getPluginConfigDir(pluginName: string): string {\n return path.join(process.cwd(), \"config\", pluginName);\n}\n\nexport function getServiceConfigDir(serviceName: string): string {\n return path.join(process.cwd(), \"config\", \"service\", serviceName);\n}\n\nexport function getConfigDir(): string {\n return path.join(process.cwd(), \"config\");\n}\n\nexport function ensureDataDir(pluginName: string): string {\n const dir = getPluginDataDir(pluginName);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n return dir;\n}\n","import { getOrCreate } from \"./registry\";\n\ninterface PluginStateStore {\n [pluginName: string]: Record<string, any>;\n}\n\n// Stashed via the global registry so it survives jiti re-evaluation when a\n// plugin re-imports the framework through its loader. Values are `any` because\n// the state bag is plugin-defined and consumed via casts.\nconst store = getOrCreate<PluginStateStore>(\"plugin-runtime-state\", () => ({}));\n\nexport function getPluginRuntimeState(pluginName: string): Record<string, any> {\n if (!store[pluginName]) store[pluginName] = {};\n return store[pluginName];\n}\n\nexport function setPluginRuntimeState(\n pluginName: string,\n state: Record<string, any>,\n): Record<string, any> {\n if (!store[pluginName]) store[pluginName] = {};\n Object.assign(store[pluginName], state);\n return store[pluginName];\n}\n\nexport function resetPluginRuntimeState(pluginName: string): void {\n delete store[pluginName];\n}\n\nexport function getAllPluginRuntimeStates(): PluginStateStore {\n return { ...store };\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { bootstrapMioku } from \"./core/bootstrap\";\nimport { setMiokuLogger } from \"./core/logger\";\n\nexport type { MiokiPlugin, MiokiContext } from \"mioki\";\n\nexport function definePlugin<T extends import(\"mioki\").MiokiPlugin>(plugin: T): T {\n return plugin;\n}\n\nexport { default as pluginManager } from \"./core/plugin-manager\";\nexport { default as serviceManager } from \"./core/service-manager\";\nexport { registerPluginArtifacts } from \"./core/plugin-artifact-registry\";\n\nexport {\n registerServiceConfig,\n getServiceConfig,\n updateServiceConfig,\n getServiceConfigs,\n deleteServiceConfig,\n} from \"./core/service-config\";\n\nexport type {\n MiokuService,\n MiokuRuntimeConfig,\n PackageJsonLike,\n PluginMetadata,\n ServiceMetadata,\n PluginPackageConfig,\n PluginHelp,\n CommandRole,\n AccessHook,\n AccessAction,\n AccessRuleEntry,\n AccessScopeConfig,\n AccessControlConfig,\n ConfigService,\n ScreenshotService,\n HelpService,\n WebUIService,\n AITool,\n AISkill,\n AIInstance,\n AIService,\n ChatRuntime,\n TextMessage,\n MultimodalMessage,\n ToolCallRecord,\n CompleteOptions,\n CompleteResponse,\n SessionToolDefinition,\n SkillPermissionRole,\n MultimodalContentItem,\n ToolResultFollowup,\n ChatRuntimePromptInjection,\n ChatRuntimeGroupTarget,\n ChatRuntimePrivateTarget,\n ChatRuntimeSource,\n ChatRuntimeBaseOptions,\n ChatRuntimeNoticeOptions,\n ChatRuntimeInformationRequestOptions,\n ChatRuntimeCollectedInfo,\n ChatRuntimeResult,\n AIUsageRange,\n AIUsageScope,\n AIUsageBotOption,\n AIUsageContext,\n AIUsageBreakdown,\n AIUsageFinalization,\n AIUsageSummary,\n} from \"./types\";\n\nexport { TOOL_RESULT_FOLLOWUP_KEY } from \"./types\";\n\nexport interface MiokuStartOptions {\n cwd?: string;\n}\n\nexport async function start(options: MiokuStartOptions = {}): Promise<void> {\n const { cwd = process.cwd() } = options;\n if (cwd) process.chdir(cwd);\n\n const { start: startMioki, logger, botConfig } = await import(\"mioki\");\n setMiokuLogger(logger);\n\n logger.info(\"こんにちは..\");\n logger.info(\"---------------------------------------\");\n logger.info(\"---------- Mioku 正在启动 ------------\");\n logger.info(\"---------------------------------------\");\n\n await bootstrapMioku({ cwd, botConfig, startMioki });\n}\n\nfunction readVersion(): string {\n try {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = path.join(here, \"..\", \"package.json\");\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const version: string = readVersion();\n\nexport {\n getDataDir,\n getPluginDataDir,\n getServiceDataDir,\n getConfigDir,\n getPluginConfigDir,\n getServiceConfigDir,\n ensureDataDir,\n} from \"./core/data-paths\";\n\nexport {\n getPluginRuntimeState,\n setPluginRuntimeState,\n resetPluginRuntimeState,\n} from \"./core/plugin-runtime-state\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["fallbackLogger: MiokuLogger","activeLogger: MiokuLogger","logger: MiokuLogger | undefined","logger","logger: MiokuLogger","filePath: string","p: string","dir: string","results: DiscoveredModule[]","entries: import(\"fs\").Dirent[]","prefix: string","entryPath: string","linkPath: string","targetPath: string","runtimePluginsDir: string","metadata: PluginMetadata","plugins: PluginMetadata[]","linkedNames: string[]","store","key: string","factory: () => T","miokuConfig: MiokuRuntimeConfig","name: string","pluginPath: string","packageJson: PackageJsonLike | null","config: PluginPackageConfig","miokuConfig: MiokuRuntimeConfig","name: string","servicePath: string","packageJson: PackageJsonLike","required: Set<string>","missing: string[]","ctx: MiokiContext","metadata: ServiceMetadata","service: MiokuService","miokuConfig: MiokuRuntimeConfig","botConfig: BotConfigLike","linkedPluginNames: string[]","deps: BootstrapDeps","botConfig","value: unknown","moduleExports: Record<string, unknown>","pluginPath: string","keywords: unknown","ctx: MiokiContext","serviceName: string","configName: string","defaults: Record<string, unknown>","value: Record<string, unknown>","result: Record<string, Record<string, unknown>>","pluginName: string","serviceName: string","pluginName: string","state: Record<string, any>","plugin: T","options: MiokuStartOptions","logger","version: string"],"sources":["../src/core/logger.ts","../src/core/module-scanner.ts","../src/core/plugin-linker.ts","../src/core/registry.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/bootstrap.ts","../src/core/plugin-artifact-registry.ts","../src/core/service-config.ts","../src/types.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/index.ts"],"sourcesContent":["type LogMethod = (...args: unknown[]) => void;\n\nexport interface MiokuLogger {\n error: LogMethod;\n warn: LogMethod;\n info: LogMethod;\n debug: LogMethod;\n trace?: LogMethod;\n}\n\nconst fallbackLogger: MiokuLogger = {\n error: (...args) => console.error(...args),\n warn: (...args) => console.warn(...args),\n info: (...args) => console.info(...args),\n debug: (...args) => console.debug(...args),\n trace: (...args) => console.debug(...args),\n};\n\nlet activeLogger: MiokuLogger = fallbackLogger;\n\nexport function setMiokuLogger(logger: MiokuLogger | undefined): void {\n activeLogger = logger || fallbackLogger;\n}\n\nexport function getMiokuLogger(): MiokuLogger {\n return activeLogger;\n}\n\nexport const logger: MiokuLogger = {\n error: (...args) => activeLogger.error(...args),\n warn: (...args) => activeLogger.warn(...args),\n info: (...args) => activeLogger.info(...args),\n debug: (...args) => activeLogger.debug(...args),\n trace: (...args) => activeLogger.trace?.(...args),\n};\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nexport interface DiscoveredModule {\n name: string;\n path: string;\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveRealpath(p: string): Promise<string> {\n try {\n return await fs.realpath(p);\n } catch {\n return p;\n }\n}\n\n// Windows requires file:// URLs for absolute paths in dynamic import().\nexport function toImportPath(filePath: string): string {\n if (process.platform === \"win32\") {\n return \"file:///\" + filePath.replace(/\\\\/g, \"/\");\n }\n return filePath;\n}\n\nexport async function scanLocalDir(dir: string): Promise<DiscoveredModule[]> {\n const results: DiscoveredModule[] = [];\n if (!(await pathExists(dir))) return results;\n\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n try {\n const stat = await fs.stat(entryPath);\n if (!stat.isDirectory()) continue;\n } catch {\n continue;\n }\n results.push({ name: entry.name, path: await resolveRealpath(entryPath) });\n }\n return results;\n}\n\nexport async function scanNodeModules(prefix: string): Promise<DiscoveredModule[]> {\n const results: DiscoveredModule[] = [];\n const nodeModulesPath = path.resolve(process.cwd(), \"node_modules\");\n if (!(await pathExists(nodeModulesPath))) return results;\n\n let entries: import(\"fs\").Dirent[];\n try {\n entries = await fs.readdir(nodeModulesPath, { withFileTypes: true });\n } catch {\n return results;\n }\n\n // Don't filter by isDirectory(): node_modules entries are often symlinks\n // into the workspace, and Dirent.isDirectory() returns false for symlinks.\n for (const entry of entries) {\n if (!entry.name.startsWith(prefix)) continue;\n const name = entry.name.slice(prefix.length);\n const fullPath = path.join(nodeModulesPath, entry.name);\n results.push({ name, path: await resolveRealpath(fullPath) });\n }\n return results;\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport type { PluginMetadata } from \"../types\";\nimport { logger } from \"./logger\";\nimport { pathExists } from \"./module-scanner\";\n\nexport const DEFAULT_RUNTIME_PLUGINS_DIR = \".mioku/plugins\";\n\ntype SymlinkState = \"ok\" | \"blocked\" | \"removed\";\n\nasync function removeIfBrokenSymlink(entryPath: string): Promise<SymlinkState> {\n let stat;\n try {\n stat = await fs.lstat(entryPath);\n } catch {\n return \"removed\";\n }\n if (!stat.isSymbolicLink()) return \"blocked\";\n try {\n await fs.realpath(entryPath);\n return \"ok\";\n } catch {\n await fs.rm(entryPath, { force: true });\n logger.warn(`[plugin-linker] Removed broken plugin link: ${entryPath}`);\n return \"removed\";\n }\n}\n\nfunction relativeSymlinkTarget(linkPath: string, targetPath: string): string {\n return path.relative(path.dirname(linkPath), targetPath) || \".\";\n}\n\nasync function ensurePluginLink(\n runtimePluginsDir: string,\n metadata: PluginMetadata,\n): Promise<boolean> {\n const linkPath = path.join(runtimePluginsDir, metadata.name);\n const targetPath = metadata.path;\n\n let stat;\n try {\n stat = await fs.lstat(linkPath);\n } catch {\n stat = null;\n }\n\n if (stat?.isSymbolicLink()) {\n try {\n const currentTarget = await fs.realpath(linkPath);\n const expectedTarget = await fs.realpath(targetPath);\n if (currentTarget === expectedTarget) return true;\n await fs.rm(linkPath, { force: true });\n logger.info(`[plugin-linker] Rebuilding plugin link: ${metadata.name}`);\n } catch {\n await fs.rm(linkPath, { force: true });\n logger.warn(`[plugin-linker] Removed broken plugin link: ${linkPath}`);\n }\n } else if (stat) {\n logger.warn(\n `[plugin-linker] ${linkPath} exists and is not a symlink, skip linking ${metadata.name}`,\n );\n return false;\n }\n\n if (!(await pathExists(targetPath))) {\n logger.warn(\n `[plugin-linker] Plugin target missing, skip linking ${metadata.name}: ${targetPath}`,\n );\n return false;\n }\n\n // Junctions on Windows don't require admin rights; relative dir symlinks elsewhere.\n if (process.platform === \"win32\") {\n await fs.symlink(targetPath, linkPath, \"junction\");\n } else {\n await fs.symlink(relativeSymlinkTarget(linkPath, targetPath), linkPath, \"dir\");\n }\n return true;\n}\n\nexport async function prepareRuntimePluginLinks(\n plugins: PluginMetadata[],\n runtimePluginsDir = path.resolve(process.cwd(), DEFAULT_RUNTIME_PLUGINS_DIR),\n): Promise<string[]> {\n await fs.mkdir(runtimePluginsDir, { recursive: true });\n\n const discoveredNames = new Set(plugins.map((p) => p.name));\n const entries = await fs.readdir(runtimePluginsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(runtimePluginsDir, entry.name);\n if ((await removeIfBrokenSymlink(entryPath)) !== \"ok\") continue;\n if (entry.isSymbolicLink() && !discoveredNames.has(entry.name)) {\n await fs.rm(entryPath, { force: true });\n logger.info(`[plugin-linker] Removed stale plugin link: ${entry.name}`);\n }\n }\n\n const linkedNames: string[] = [];\n for (const metadata of plugins) {\n if (await ensurePluginLink(runtimePluginsDir, metadata)) {\n linkedNames.push(metadata.name);\n }\n }\n return linkedNames;\n}\n","// Framework singletons are stashed on globalThis so they survive jiti's\n// moduleCache-off re-evaluation (mioki loads plugins via jiti). Callers that\n// live in the normally-cached `mioku` dist could use a plain module-level\n// const, but the global indirection keeps things stable if a plugin ever\n// re-imports the framework through jiti.\n\nconst STORE_SYMBOL = Symbol.for(\"mioku.globalStore\");\ntype GlobalStore = Record<string, unknown>;\n\nfunction store(): GlobalStore {\n const g = globalThis as unknown as Record<symbol, GlobalStore>;\n if (!g[STORE_SYMBOL]) g[STORE_SYMBOL] = {};\n return g[STORE_SYMBOL]!;\n}\n\nexport function getOrCreate<T>(key: string, factory: () => T): T {\n const s = store();\n if (s[key] === undefined) s[key] = factory();\n return s[key] as T;\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { mkdirSync } from \"fs\";\nimport type {\n MiokuRuntimeConfig,\n PackageJsonLike,\n PluginMetadata,\n PluginPackageConfig,\n} from \"../types\";\nimport { DEFAULT_RUNTIME_PLUGINS_DIR } from \"./plugin-linker\";\nimport { logger } from \"./logger\";\nimport {\n scanLocalDir,\n scanNodeModules,\n pathExists,\n resolveRealpath,\n} from \"./module-scanner\";\nimport { getOrCreate } from \"./registry\";\n\nconst PLUGIN_PREFIX = \"mioku-plugin-\";\n\nexport class PluginManager {\n private plugins = new Map<string, PluginMetadata>();\n\n static getInstance(): PluginManager {\n return getOrCreate(\"plugin-manager\", () => new PluginManager());\n }\n\n async discoverPlugins(miokuConfig: MiokuRuntimeConfig = {}): Promise<PluginMetadata[]> {\n const configuredDir = miokuConfig.plugins_dir;\n const pluginsDir =\n configuredDir && configuredDir !== DEFAULT_RUNTIME_PLUGINS_DIR\n ? path.resolve(process.cwd(), configuredDir)\n : path.resolve(process.cwd(), \"plugins\");\n\n this.plugins.clear();\n\n if (!(await pathExists(pluginsDir))) {\n mkdirSync(pluginsDir, { recursive: true });\n }\n\n const local = await scanLocalDir(pluginsDir);\n for (const { name, path: p } of local) {\n const metadata = await this.loadPluginMetadata(name, p);\n if (metadata) this.plugins.set(metadata.name, metadata);\n }\n\n const external = await scanNodeModules(PLUGIN_PREFIX);\n for (const { name, path: p } of external) {\n const metadata = await this.loadPluginMetadata(name, p);\n if (metadata) this.plugins.set(metadata.name, metadata);\n }\n\n logger.info(`O.o 发现了 ${this.plugins.size} 个插件`);\n return [...this.plugins.values()];\n }\n\n private async loadPluginMetadata(\n name: string,\n pluginPath: string,\n ): Promise<PluginMetadata | null> {\n const resolvedPath = await resolveRealpath(pluginPath);\n let packageJson: PackageJsonLike | null = null;\n try {\n packageJson = JSON.parse(\n await fs.readFile(path.join(resolvedPath, \"package.json\"), \"utf-8\"),\n );\n } catch (error) {\n logger.warn(`[plugin-manager] 读取 ${name} 的 package.json 失败: ${error}`);\n }\n\n const config: PluginPackageConfig = packageJson?.mioku ?? {};\n return {\n name,\n version: packageJson?.version ?? \"0.0.0\",\n description: packageJson?.description,\n path: resolvedPath,\n packageJson: packageJson ?? {},\n config,\n };\n }\n\n collectRequiredServices(): Set<string> {\n const services = new Set<string>();\n for (const metadata of this.plugins.values()) {\n for (const service of metadata.config.services ?? []) services.add(service);\n }\n return services;\n }\n\n getPluginMetadata(name: string): PluginMetadata | undefined {\n return this.plugins.get(name);\n }\n\n getAllMetadata(): PluginMetadata[] {\n return [...this.plugins.values()];\n }\n\n reset(): void {\n this.plugins.clear();\n }\n}\n\nexport default PluginManager.getInstance();\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport type { MiokiContext } from \"mioki\";\nimport type {\n MiokuRuntimeConfig,\n PackageJsonLike,\n ServiceMetadata,\n MiokuService,\n} from \"../types\";\nimport { logger } from \"./logger\";\nimport {\n scanLocalDir,\n scanNodeModules,\n pathExists,\n toImportPath,\n} from \"./module-scanner\";\nimport { getOrCreate } from \"./registry\";\n\nconst SERVICE_PREFIX = \"mioku-service-\";\n\nexport class ServiceManager {\n private services = new Map<string, MiokuService>();\n private serviceMetadata = new Map<string, ServiceMetadata>();\n\n static getInstance(): ServiceManager {\n return getOrCreate(\"service-manager\", () => new ServiceManager());\n }\n\n async discoverServices(miokuConfig: MiokuRuntimeConfig = {}): Promise<ServiceMetadata[]> {\n const servicesDir = miokuConfig.services_dir\n ? path.resolve(process.cwd(), miokuConfig.services_dir)\n : path.resolve(process.cwd(), \"services\");\n\n this.serviceMetadata.clear();\n\n if (existsSync(servicesDir)) {\n const local = await scanLocalDir(servicesDir);\n for (const { name, path: p } of local) {\n const metadata = await this.loadServiceMetadata(name, p);\n if (metadata) this.serviceMetadata.set(name, metadata);\n }\n } else {\n mkdirSync(servicesDir, { recursive: true });\n }\n\n const external = await scanNodeModules(SERVICE_PREFIX);\n for (const { name, path: p } of external) {\n const metadata = await this.loadServiceMetadata(name, p);\n if (metadata) this.serviceMetadata.set(name, metadata);\n }\n\n logger.info(`o.O 发现了 ${this.serviceMetadata.size} 个服务`);\n return [...this.serviceMetadata.values()];\n }\n\n private async loadServiceMetadata(\n name: string,\n servicePath: string,\n ): Promise<ServiceMetadata | null> {\n const packageJsonPath = path.join(servicePath, \"package.json\");\n if (!(await pathExists(packageJsonPath))) return null;\n\n try {\n const packageJson: PackageJsonLike = JSON.parse(\n await fs.readFile(packageJsonPath, \"utf-8\"),\n );\n return {\n name,\n version: packageJson.version ?? \"0.0.0\",\n description: packageJson.description,\n path: servicePath,\n packageJson,\n };\n } catch (error) {\n logger.warn(`[service-manager] 解析服务 ${name} 失败: ${error}`);\n return null;\n }\n }\n\n async checkMissingServices(required: Set<string>): Promise<string[]> {\n const missing: string[] = [];\n for (const name of required) {\n if (!this.serviceMetadata.has(name)) missing.push(name);\n }\n return missing;\n }\n\n async loadAllServices(ctx: MiokiContext): Promise<void> {\n const all = [...this.serviceMetadata.values()];\n logger.info(`O.o 准备加载 ${all.length} 个服务...`);\n for (const metadata of all) {\n await this.loadService(metadata, ctx);\n }\n }\n\n private async loadService(\n metadata: ServiceMetadata,\n ctx: MiokiContext,\n ): Promise<boolean> {\n try {\n const tsEntry = path.join(metadata.path, \"index.ts\");\n const jsEntry = path.join(metadata.path, \"index.js\");\n const entry = (await pathExists(tsEntry))\n ? tsEntry\n : (await pathExists(jsEntry))\n ? jsEntry\n : null;\n if (!entry) {\n logger.error(`[service-manager] 服务 ${metadata.name} 入口丢失`);\n return false;\n }\n\n const serviceModule = await import(toImportPath(entry));\n const service: MiokuService = serviceModule.default ?? serviceModule;\n if (!service || typeof service.init !== \"function\") {\n logger.warn(`[service-manager] 服务 ${metadata.name} 无效:缺少 init()`);\n return false;\n }\n\n await service.init();\n if (service.api) {\n ctx.services[metadata.name] = service.api;\n }\n this.services.set(metadata.name, service);\n return true;\n } catch (error) {\n logger.error(`[service-manager] 加载服务 ${metadata.name} 失败: ${error}`);\n return false;\n }\n }\n\n registerBuiltinService(name: string, service: MiokuService): void {\n this.services.set(name, service);\n }\n\n getService(name: string): MiokuService | undefined {\n return this.services.get(name);\n }\n\n async disposeAll(): Promise<void> {\n for (const [, service] of this.services) {\n await service.dispose?.();\n }\n this.services.clear();\n }\n\n reset(): void {\n this.services.clear();\n this.serviceMetadata.clear();\n }\n}\n\nexport default ServiceManager.getInstance();\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport type { MiokuRuntimeConfig } from \"../types\";\nimport pluginManager from \"./plugin-manager\";\nimport serviceManager from \"./service-manager\";\nimport {\n prepareRuntimePluginLinks,\n DEFAULT_RUNTIME_PLUGINS_DIR,\n} from \"./plugin-linker\";\nimport { logger } from \"./logger\";\n\ninterface BotConfigLike {\n plugins: string[];\n plugins_dir?: string;\n}\n\nexport interface BootstrapDeps {\n cwd: string;\n botConfig: BotConfigLike;\n startMioki: (opts: { cwd: string }) => Promise<void>;\n}\n\nexport async function readMiokuConfig(): Promise<MiokuRuntimeConfig> {\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n try {\n const pkg = JSON.parse(await fs.readFile(packageJsonPath, \"utf-8\"));\n return (pkg.mioki ?? {}) as MiokuRuntimeConfig;\n } catch {\n return {};\n }\n}\n\nfunction ensureRuntimeDirectories(): void {\n for (const dir of [\"data\", \"config\", \"temp\"]) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n }\n}\n\nasync function discoverAndLinkPlugins(\n miokuConfig: MiokuRuntimeConfig,\n): Promise<string[]> {\n logger.info(\"O.o Miku 正在翻找插件..\");\n const discovered = await pluginManager.discoverPlugins(miokuConfig);\n logger.info(\n `O.o 共发现 ${discovered.length} 个插件: ${discovered.map((p) => p.name).join(\", \")}`,\n );\n const runtimePluginsDir = path.resolve(\n process.cwd(),\n DEFAULT_RUNTIME_PLUGINS_DIR,\n );\n return prepareRuntimePluginLinks(discovered, runtimePluginsDir);\n}\n\nasync function discoverAndValidateServices(\n miokuConfig: MiokuRuntimeConfig,\n): Promise<void> {\n logger.info(\"o.O Miku 正在翻找服务..\");\n await serviceManager.discoverServices(miokuConfig);\n const requiredServices = pluginManager.collectRequiredServices();\n const missing = await serviceManager.checkMissingServices(requiredServices);\n if (missing.length > 0) logger.warn(`发现缺失服务: ${missing.join(\", \")}`);\n}\n\nfunction applyPluginAllowlist(\n miokuConfig: MiokuRuntimeConfig,\n botConfig: BotConfigLike,\n linkedPluginNames: string[],\n): void {\n botConfig.plugins_dir = DEFAULT_RUNTIME_PLUGINS_DIR;\n // Respect an explicit plugins list; only auto-load when undefined.\n if (miokuConfig.plugins !== undefined) return;\n for (const name of linkedPluginNames) {\n if (!botConfig.plugins.includes(name)) botConfig.plugins.push(name);\n }\n}\n\nexport async function bootstrapMioku(deps: BootstrapDeps): Promise<void> {\n const { cwd, botConfig, startMioki } = deps;\n const miokuConfig = await readMiokuConfig();\n ensureRuntimeDirectories();\n const linkedPluginNames = await discoverAndLinkPlugins(miokuConfig);\n await discoverAndValidateServices(miokuConfig);\n applyPluginAllowlist(miokuConfig, botConfig, linkedPluginNames);\n await startMioki({ cwd });\n}\n","import * as path from \"path\";\nimport type { MiokiContext } from \"mioki\";\nimport { botConfig } from \"mioki\";\nimport type { AIService, AISkill, HelpService } from \"../types\";\nimport pluginManager from \"./plugin-manager\";\nimport { logger } from \"./logger\";\nimport { pathExists, toImportPath } from \"./module-scanner\";\n\nfunction isAISkill(value: unknown): value is AISkill {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as AISkill).name === \"string\" &&\n Array.isArray((value as AISkill).tools)\n );\n}\n\nfunction extractSkills(moduleExports: Record<string, unknown>): AISkill[] {\n const candidates = [moduleExports?.default, moduleExports?.skills, moduleExports];\n for (const candidate of candidates) {\n if (Array.isArray(candidate)) return candidate.filter(isAISkill);\n if (isAISkill(candidate)) return [candidate];\n }\n return [];\n}\n\nasync function resolveSkillsEntry(pluginPath: string): Promise<string | null> {\n const tsPath = path.join(pluginPath, \"skills.ts\");\n if (await pathExists(tsPath)) return tsPath;\n const jsPath = path.join(pluginPath, \"skills.js\");\n if (await pathExists(jsPath)) return jsPath;\n return null;\n}\n\nfunction hasPublicKeyword(keywords: unknown): boolean {\n return Array.isArray(keywords) && keywords.includes(\"mioku\");\n}\n\nexport async function registerPluginArtifacts(ctx: MiokiContext): Promise<void> {\n const enabledPlugins = new Set<string>(botConfig.plugins ?? []);\n const pluginMetadata = pluginManager.getAllMetadata().filter((metadata) =>\n enabledPlugins.size > 0 ? enabledPlugins.has(metadata.name) : true,\n );\n\n const helpService = ctx.services.help as HelpService | undefined;\n const aiService = ctx.services.ai as AIService | undefined;\n\n if (helpService) {\n let helpCount = 0;\n for (const metadata of pluginMetadata) {\n if (!metadata.config.help) continue;\n if (!hasPublicKeyword(metadata.packageJson?.keywords)) continue;\n helpService.registerHelp(metadata.name, metadata.config.help);\n helpCount += 1;\n }\n logger.info(`[plugin-artifacts] Registered ${helpCount} help manifest(s)`);\n }\n\n if (!aiService) return;\n\n let skillCount = 0;\n for (const metadata of pluginMetadata) {\n const skillsEntry = await resolveSkillsEntry(metadata.path);\n if (!skillsEntry) continue;\n\n try {\n const moduleExports = (await import(toImportPath(skillsEntry))) as Record<\n string,\n unknown\n >;\n const skills = extractSkills(moduleExports);\n if (skills.length === 0) {\n logger.warn(\n `[plugin-artifacts] Plugin ${metadata.name} has ${path.basename(skillsEntry)} but exported no valid skill`,\n );\n continue;\n }\n for (const skill of skills) {\n aiService.registerSkill(skill);\n skillCount += 1;\n }\n } catch (error) {\n logger.error(\n `[plugin-artifacts] Failed to load skills for plugin ${metadata.name}: ${error}`,\n );\n }\n }\n logger.info(`[plugin-artifacts] Registered ${skillCount} skill(s)`);\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport { logger } from \"./logger\";\n\nconst SERVICE_CONFIG_ROOT = \"service\";\n\nfunction resolveConfigDir(serviceName: string): string {\n return path.join(process.cwd(), \"config\", SERVICE_CONFIG_ROOT, serviceName);\n}\n\nfunction resolveConfigPath(serviceName: string, configName: string): string {\n return path.join(resolveConfigDir(serviceName), `${configName}.json`);\n}\n\nfunction ensureDir(serviceName: string): void {\n const dir = resolveConfigDir(serviceName);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nexport async function registerServiceConfig(\n serviceName: string,\n configName: string,\n defaults: Record<string, unknown>,\n): Promise<void> {\n ensureDir(serviceName);\n const configPath = resolveConfigPath(serviceName, configName);\n if (!existsSync(configPath)) {\n await fs.writeFile(configPath, JSON.stringify(defaults, null, 2), \"utf-8\");\n }\n}\n\nexport async function getServiceConfig(\n serviceName: string,\n configName: string,\n): Promise<Record<string, unknown>> {\n const configPath = resolveConfigPath(serviceName, configName);\n try {\n return JSON.parse(await fs.readFile(configPath, \"utf-8\"));\n } catch (error) {\n if (!existsSync(configPath)) return {};\n logger.warn(`[service-config] 读取 ${serviceName}/${configName} 失败: ${error}`);\n return {};\n }\n}\n\nexport async function updateServiceConfig(\n serviceName: string,\n configName: string,\n value: Record<string, unknown>,\n): Promise<void> {\n ensureDir(serviceName);\n await fs.writeFile(\n resolveConfigPath(serviceName, configName),\n JSON.stringify(value, null, 2),\n \"utf-8\",\n );\n}\n\nexport async function getServiceConfigs(\n serviceName: string,\n): Promise<Record<string, Record<string, unknown>>> {\n const dir = resolveConfigDir(serviceName);\n if (!existsSync(dir)) return {};\n\n const result: Record<string, Record<string, unknown>> = {};\n const files = (await fs.readdir(dir)).filter((name) => name.endsWith(\".json\"));\n for (const file of files) {\n try {\n result[path.basename(file, \".json\")] = JSON.parse(\n await fs.readFile(path.join(dir, file), \"utf-8\"),\n );\n } catch (error) {\n logger.warn(`[service-config] 读取 ${serviceName}/${file} 失败: ${error}`);\n }\n }\n return result;\n}\n\nexport async function deleteServiceConfig(\n serviceName: string,\n configName: string,\n): Promise<boolean> {\n const configPath = resolveConfigPath(serviceName, configName);\n if (!existsSync(configPath)) return false;\n await fs.unlink(configPath);\n return true;\n}\n","// Mioku framework types — single source of truth for the public API surface.\n\n// ---------- framework ----------\n\nexport interface MiokuService {\n name: string;\n version: string;\n description?: string;\n init(): Promise<void>;\n api: Record<string, any>;\n dispose?(): Promise<void>;\n}\n\nexport interface MiokuRuntimeConfig {\n plugins?: string[];\n plugins_dir?: string;\n services_dir?: string;\n [key: string]: unknown;\n}\n\nexport interface PackageJsonLike {\n name?: string;\n version?: string;\n description?: string;\n keywords?: string[];\n mioki?: MiokuRuntimeConfig;\n mioku?: PluginPackageConfig;\n dependencies?: Record<string, string>;\n}\n\nexport interface PluginMetadata {\n name: string;\n version: string;\n description?: string;\n path: string;\n packageJson: PackageJsonLike;\n config: PluginPackageConfig;\n}\n\nexport interface ServiceMetadata {\n name: string;\n version: string;\n description?: string;\n path: string;\n packageJson: PackageJsonLike;\n}\n\n// ---------- plugin package config ----------\n\nexport interface PluginPackageConfig {\n services?: string[];\n help?: PluginHelp;\n accessHooks?: AccessHook[];\n}\n\nexport interface PluginHelp {\n title: string;\n description: string;\n commands: Array<{\n cmd: string;\n desc: string;\n usage?: string;\n role?: CommandRole;\n }>;\n}\n\nexport type CommandRole = \"master\" | \"admin\" | \"owner\" | \"member\";\n\nexport interface AccessHook {\n id: string;\n match?: string;\n event?: string;\n description?: string;\n}\n\nexport type AccessAction = \"allow\" | \"block\";\n\nexport interface AccessRuleEntry {\n action: AccessAction;\n}\n\nexport interface AccessScopeConfig {\n plugins?: Record<string, AccessRuleEntry>;\n commands?: Record<string, Record<string, AccessRuleEntry>>;\n}\n\nexport interface AccessControlConfig {\n version: 1;\n global: AccessScopeConfig;\n groups: Record<string, AccessScopeConfig>;\n users: Record<string, AccessScopeConfig>;\n}\n\n// ---------- built-in service contracts ----------\n\nexport interface ConfigService {\n registerConfig(pluginName: string, configName: string, initialConfig: any): Promise<boolean>;\n updateConfig(pluginName: string, configName: string, updates: any): Promise<boolean>;\n getConfig(pluginName: string, configName: string): Promise<any>;\n getPluginConfigs(pluginName: string): Promise<Record<string, any>>;\n onConfigChange(pluginName: string, configName: string, callback: (newConfig: any) => void): () => void;\n}\n\nexport interface ScreenshotService {\n screenshot(html: string, options?: any): Promise<string>;\n screenshotMarkdown(markdownContent: string, options?: any): Promise<string>;\n screenshotFromUrl(url: string, options?: any): Promise<string>;\n cleanupTemp(olderThanMs?: number): Promise<number>;\n}\n\nexport interface HelpService {\n registerHelp(pluginName: string, help: PluginHelp): void;\n getHelp(pluginName: string): PluginHelp | undefined;\n getAllHelp(): Map<string, PluginHelp>;\n unregisterHelp(pluginName: string): boolean;\n}\n\nexport interface WebUIService {\n getSettings(): { port: number; host: string; packageManager: string };\n}\n\n// ---------- AI service ----------\n\nexport interface AITool {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n handler: (args: any, event?: any) => Promise<any> | any;\n}\n\nexport type SkillPermissionRole = \"owner\" | \"admin\" | \"member\";\n\nexport interface AISkill {\n name: string;\n description: string;\n permission?: SkillPermissionRole;\n tools: AITool[];\n}\n\nexport interface TextMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface MultimodalContentItem {\n type: \"text\" | \"image_url\";\n text?: string;\n image_url?: {\n url: string;\n detail?: \"auto\" | \"low\" | \"high\";\n };\n}\n\nexport interface MultimodalMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | MultimodalContentItem[];\n}\n\nexport interface ToolCallRecord {\n name: string;\n arguments: any;\n result: any;\n}\n\nexport interface SessionToolDefinition {\n name: string;\n tool: AITool;\n}\n\nexport interface CompleteOptions {\n model?: string;\n messages: any[];\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n tools?: any[];\n executableTools?: SessionToolDefinition[];\n executableToolsProvider?: () => SessionToolDefinition[];\n maxIterations?: number;\n onTextDelta?: (delta: string) => void | Promise<void>;\n usageContext?: AIUsageContext;\n usageContextTokens?: number;\n usageBreakdown?: AIUsageFinalization[\"breakdown\"];\n}\n\nexport interface CompleteResponse {\n content: string | null;\n reasoning: string | null;\n toolCalls: Array<{ id: string; name: string; arguments: string }>;\n raw: any;\n turnMessages: any[];\n iterations?: number;\n allToolCalls?: ToolCallRecord[];\n}\n\nexport type AIProtocol =\n | \"openai-chat\"\n | \"openai-response\"\n | \"anthropic\"\n | \"gemini\";\n\nexport type AIModelCapability = \"text\" | \"vision\" | \"tool-use\" | \"reasoning\";\n\nexport type AIModelRole = \"main\" | \"working\" | \"vision\";\n\nexport interface AIProviderConfig {\n id: string;\n name: string;\n protocol: AIProtocol;\n apiUrl: string;\n apiKey: string;\n enabled: boolean;\n headers?: Record<string, string>;\n}\n\nexport interface AIModelDescriptor {\n id: string;\n providerId: string;\n modelId: string;\n name: string;\n capabilities: AIModelCapability[];\n contextWindow?: number;\n maxOutputTokens?: number;\n isCustom?: boolean;\n}\n\nexport interface AIInstanceInfo {\n name: string;\n providerId: string;\n modelId: string;\n role?: AIModelRole;\n}\n\nexport interface AIInstance {\n generateText(options: { prompt?: string; messages: TextMessage[]; model?: string; temperature?: number; max_tokens?: number }): Promise<string>;\n generateMultimodal(options: { prompt?: string; messages: MultimodalMessage[]; model?: string; temperature?: number; max_tokens?: number }): Promise<string>;\n complete(options: CompleteOptions): Promise<CompleteResponse>;\n generateWithTools(options: { prompt?: string; messages: TextMessage[] | MultimodalMessage[]; model?: string; temperature?: number; maxIterations?: number }): Promise<any>;\n setUsageContext?(context: AIUsageContext | undefined): void;\n withUsageContext?<T>(context: AIUsageContext | undefined, fn: () => Promise<T>): Promise<T>;\n registerPrompt(name: string, prompt: string): boolean;\n getPrompt(name: string): string | undefined;\n getAllPrompts(): Record<string, string>;\n removePrompt(name: string): boolean;\n}\n\nexport interface AIService {\n create(options: { name: string; apiUrl: string; apiKey: string; modelType: \"text\" | \"multimodal\"; model?: string }): Promise<AIInstance>;\n createInstance?(options: {\n name: string;\n providerId: string;\n modelId: string;\n role?: AIModelRole;\n }): Promise<AIInstance>;\n get(name: string): AIInstance | undefined;\n list(): string[];\n listInstances?(): AIInstanceInfo[];\n remove(name: string): boolean;\n setDefault(name: string): boolean;\n getDefault(): AIInstance | undefined;\n listProviders?(): AIProviderConfig[];\n getProvider?(id: string): AIProviderConfig | undefined;\n createProvider?(input: Omit<AIProviderConfig, \"id\"> & { id?: string }): Promise<AIProviderConfig>;\n updateProvider?(id: string, input: Partial<AIProviderConfig>): Promise<AIProviderConfig>;\n removeProvider?(id: string): boolean;\n testProvider?(id: string): Promise<{ ok: boolean; error?: string; models?: AIModelDescriptor[] }>;\n listModels?(providerId?: string): AIModelDescriptor[];\n refreshModels?(providerId: string): Promise<AIModelDescriptor[]>;\n registerCustomModel?(input: {\n providerId: string;\n modelId: string;\n name?: string;\n capabilities?: AIModelCapability[];\n }): AIModelDescriptor;\n removeCustomModel?(modelFullId: string): boolean;\n getRoleBindings?(): Record<AIModelRole, string | undefined>;\n setRoleBinding?(role: AIModelRole, modelFullId: string | undefined): boolean;\n getInstanceByRole?(role: AIModelRole): AIInstance | undefined;\n registerChatRuntime(runtime: any): boolean;\n getChatRuntime(): any;\n removeChatRuntime(): boolean;\n registerSkill(skill: AISkill): boolean;\n getSkill(skillName: string): AISkill | undefined;\n getAllSkills(): Map<string, AISkill>;\n removeSkill(skillName: string): boolean;\n getTool(toolName: string): AITool | undefined;\n getAllTools(): Map<string, AITool>;\n getUsageSummary?(options: { range: AIUsageRange; botId?: number }): AIUsageSummary;\n cleanupUsageStats?(retentionMs?: number): number;\n finalizeUsage?(usageId: string, finalization: AIUsageFinalization): boolean;\n}\n\n// ---------- chat runtime ----------\n\nexport interface ChatRuntime {\n generateNotice(options: ChatRuntimeNoticeOptions): Promise<ChatRuntimeResult>;\n requestInformation(options: ChatRuntimeInformationRequestOptions): Promise<ChatRuntimeResult>;\n}\n\nexport const TOOL_RESULT_FOLLOWUP_KEY = \"__miokuFollowup\";\n\nexport interface ToolResultFollowup {\n text: string;\n images?: Array<{ url: string; detail?: \"auto\" | \"low\" | \"high\" }>;\n videos?: Array<{ url: string; detail?: \"auto\" | \"low\" | \"high\" }>;\n}\n\nexport interface ChatRuntimePromptInjection {\n content: string;\n title?: string;\n}\n\nexport interface ChatRuntimeGroupTarget {\n selfId: number;\n groupId: number;\n}\n\nexport interface ChatRuntimePrivateTarget {\n selfId: number;\n userId: number;\n}\n\nexport type ChatRuntimeSource =\n | { event: any }\n | ChatRuntimeGroupTarget\n | ChatRuntimePrivateTarget;\n\nexport type ChatRuntimeBaseOptions = ChatRuntimeSource & {\n targetMessage?: string;\n promptInjections?: ChatRuntimePromptInjection[];\n send?: boolean;\n};\n\nexport type ChatRuntimeNoticeOptions = ChatRuntimeBaseOptions & {\n instruction: string;\n};\n\nexport type ChatRuntimeInformationRequestOptions = ChatRuntimeBaseOptions & {\n task: string;\n schema: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n toolName?: string;\n toolDescription?: string;\n};\n\nexport interface ChatRuntimeCollectedInfo {\n data: any;\n isComplete?: boolean;\n confidence?: number;\n notes?: string;\n}\n\nexport interface ChatRuntimeResult {\n messages: string[];\n toolCalls: ToolCallRecord[];\n collectedInfo: ChatRuntimeCollectedInfo | null;\n pendingAt?: number[];\n pendingPoke?: number[];\n pendingQuote?: number;\n emojiPath?: string | null;\n protocolMessages?: any[];\n}\n\n// ---------- usage tracking ----------\n\nexport type AIUsageRange = \"today\" | \"7d\" | \"30d\";\n\nexport type AIUsageScope = \"all\" | \"bot\";\n\nexport interface AIUsageContext {\n usageId?: string;\n source?: string;\n botId?: number;\n groupId?: number;\n groupName?: string;\n userId?: number;\n userName?: string;\n sessionId?: string;\n}\n\nexport interface AIUsageBreakdown {\n systemPromptTokens?: number;\n chatHistoryTokens?: number;\n toolDefinitionTokens?: number;\n toolUseTokens?: number;\n otherContextTokens?: number;\n}\n\nexport interface AIUsageFinalization {\n sentUserMessages?: number;\n sentAssistantMessages?: number;\n breakdown?: AIUsageBreakdown;\n}\n\nexport interface AIUsageBotOption {\n botId: number;\n label: string;\n}\n\nexport interface AIUsageSummary {\n generatedAt: number;\n range: AIUsageRange;\n scope: AIUsageScope;\n botId?: number;\n bots: AIUsageBotOption[];\n totals: {\n requests: number;\n successfulRequests: number;\n failedRequests: number;\n userMessages: number;\n assistantMessages: number;\n systemMessages: number;\n toolMessages: number;\n sentUserMessages: number;\n sentAssistantMessages: number;\n inputTokens: number;\n outputTokens: number;\n systemPromptTokens: number;\n totalTokens: number;\n cacheWriteTokens: number;\n cacheReadTokens: number;\n toolDefinitionTokens: number;\n toolUseTokens: number;\n chatHistoryTokens: number;\n otherContextTokens: number;\n durationMs: number;\n toolCalls: number;\n };\n rates: {\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n };\n toolRanking: Array<{ name: string; count: number }>;\n groupRanking: Array<{\n groupId: number;\n groupName: string;\n requests: number;\n totalTokens: number;\n userMessages: number;\n assistantMessages: number;\n errorRate: number;\n }>;\n tokenFlow: Array<{ name: \"输入\" | \"输出\" | \"缓存写入\" | \"缓存读取\"; value: number }>;\n tokenCategories: Array<{\n name: \"系统提示词\" | \"工具定义\" | \"工具使用\" | \"聊天上下文\" | \"其他上下文\";\n value: number;\n }>;\n dailyActivity: Array<{\n day: string;\n requests: number;\n userMessages: number;\n assistantMessages: number;\n totalTokens: number;\n inputTokens: number;\n cacheReadTokens: number;\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n }>;\n hourlyActivity: Array<{\n hour: string;\n requests: number;\n userMessages: number;\n assistantMessages: number;\n totalTokens: number;\n inputTokens: number;\n cacheReadTokens: number;\n throughputTokPerMin: number;\n averageTokensPerUserMessage: number;\n averageTokensPerSentMessage: number;\n errorRate: number;\n cacheHitRate: number;\n }>;\n}\n","import * as path from \"path\";\nimport { existsSync, mkdirSync } from \"fs\";\n\nexport function getPluginDataDir(pluginName: string): string {\n return path.join(process.cwd(), \"data\", pluginName);\n}\n\nexport function getServiceDataDir(serviceName: string): string {\n return path.join(process.cwd(), \"data\", serviceName);\n}\n\nexport function getDataDir(): string {\n return path.join(process.cwd(), \"data\");\n}\n\nexport function getPluginConfigDir(pluginName: string): string {\n return path.join(process.cwd(), \"config\", pluginName);\n}\n\nexport function getServiceConfigDir(serviceName: string): string {\n return path.join(process.cwd(), \"config\", \"service\", serviceName);\n}\n\nexport function getConfigDir(): string {\n return path.join(process.cwd(), \"config\");\n}\n\nexport function ensureDataDir(pluginName: string): string {\n const dir = getPluginDataDir(pluginName);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n return dir;\n}\n","import { getOrCreate } from \"./registry\";\n\ninterface PluginStateStore {\n [pluginName: string]: Record<string, any>;\n}\n\n// Stashed via the global registry so it survives jiti re-evaluation when a\n// plugin re-imports the framework through its loader. Values are `any` because\n// the state bag is plugin-defined and consumed via casts.\nconst store = getOrCreate<PluginStateStore>(\"plugin-runtime-state\", () => ({}));\n\nexport function getPluginRuntimeState(pluginName: string): Record<string, any> {\n if (!store[pluginName]) store[pluginName] = {};\n return store[pluginName];\n}\n\nexport function setPluginRuntimeState(\n pluginName: string,\n state: Record<string, any>,\n): Record<string, any> {\n if (!store[pluginName]) store[pluginName] = {};\n Object.assign(store[pluginName], state);\n return store[pluginName];\n}\n\nexport function resetPluginRuntimeState(pluginName: string): void {\n delete store[pluginName];\n}\n\nexport function getAllPluginRuntimeStates(): PluginStateStore {\n return { ...store };\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { bootstrapMioku } from \"./core/bootstrap\";\nimport { setMiokuLogger } from \"./core/logger\";\n\nexport type { MiokiPlugin, MiokiContext } from \"mioki\";\n\nexport function definePlugin<T extends import(\"mioki\").MiokiPlugin>(plugin: T): T {\n return plugin;\n}\n\nexport { default as pluginManager } from \"./core/plugin-manager\";\nexport { default as serviceManager } from \"./core/service-manager\";\nexport { registerPluginArtifacts } from \"./core/plugin-artifact-registry\";\n\nexport {\n registerServiceConfig,\n getServiceConfig,\n updateServiceConfig,\n getServiceConfigs,\n deleteServiceConfig,\n} from \"./core/service-config\";\n\nexport type {\n MiokuService,\n MiokuRuntimeConfig,\n PackageJsonLike,\n PluginMetadata,\n ServiceMetadata,\n PluginPackageConfig,\n PluginHelp,\n CommandRole,\n AccessHook,\n AccessAction,\n AccessRuleEntry,\n AccessScopeConfig,\n AccessControlConfig,\n ConfigService,\n ScreenshotService,\n HelpService,\n WebUIService,\n AITool,\n AISkill,\n AIInstance,\n AIService,\n AIProtocol,\n AIModelCapability,\n AIModelRole,\n AIProviderConfig,\n AIModelDescriptor,\n AIInstanceInfo,\n ChatRuntime,\n TextMessage,\n MultimodalMessage,\n ToolCallRecord,\n CompleteOptions,\n CompleteResponse,\n SessionToolDefinition,\n SkillPermissionRole,\n MultimodalContentItem,\n ToolResultFollowup,\n ChatRuntimePromptInjection,\n ChatRuntimeGroupTarget,\n ChatRuntimePrivateTarget,\n ChatRuntimeSource,\n ChatRuntimeBaseOptions,\n ChatRuntimeNoticeOptions,\n ChatRuntimeInformationRequestOptions,\n ChatRuntimeCollectedInfo,\n ChatRuntimeResult,\n AIUsageRange,\n AIUsageScope,\n AIUsageBotOption,\n AIUsageContext,\n AIUsageBreakdown,\n AIUsageFinalization,\n AIUsageSummary,\n} from \"./types\";\n\nexport { TOOL_RESULT_FOLLOWUP_KEY } from \"./types\";\n\nexport interface MiokuStartOptions {\n cwd?: string;\n}\n\nexport async function start(options: MiokuStartOptions = {}): Promise<void> {\n const { cwd = process.cwd() } = options;\n if (cwd) process.chdir(cwd);\n\n const { start: startMioki, logger, botConfig } = await import(\"mioki\");\n setMiokuLogger(logger);\n\n logger.info(\"こんにちは..\");\n logger.info(\"---------------------------------------\");\n logger.info(\"---------- Mioku 正在启动 ------------\");\n logger.info(\"---------------------------------------\");\n\n await bootstrapMioku({ cwd, botConfig, startMioki });\n}\n\nfunction readVersion(): string {\n try {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const pkgPath = path.join(here, \"..\", \"package.json\");\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const version: string = readVersion();\n\nexport {\n getDataDir,\n getPluginDataDir,\n getServiceDataDir,\n getConfigDir,\n getPluginConfigDir,\n getServiceConfigDir,\n ensureDataDir,\n} from \"./core/data-paths\";\n\nexport {\n getPluginRuntimeState,\n setPluginRuntimeState,\n resetPluginRuntimeState,\n} from \"./core/plugin-runtime-state\";\n"],"mappings":"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"}
|