mioku 0.9.6 → 0.9.7

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.
@@ -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\";\nimport { pathToFileURL } from \"node:url\";\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().\n// pathToFileURL also percent-encodes spaces and non-ASCII segments, which a\n// hand-rolled string replace leaves broken (e.g. \"C:\\用户\\my bot\").\nexport function toImportPath(filePath: string): string {\n if (process.platform === \"win32\") {\n return pathToFileURL(filePath).href;\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\nexport {\n resolveCommand,\n commandExists,\n buildSpawnPlan,\n runCommand,\n runCommandInherit,\n} from \"./core/exec\";\n\nexport type { RunCommandResult, SpawnPlan } from \"./core/exec\";\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","prefix: string","obj: Record<string, unknown>","allowed: Set<string>","value: unknown","pluginName: string","commands: PluginHelp[\"commands\"]","hooks: AccessHook[]","raw: unknown","config: PluginPackageConfig","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","id: string","ctx: MiokiContext","ref: ServiceRef<T>","keywords: unknown","ctx: MiokiContext","botConfig","serviceName: string","configName: string","defaults: Record<string, unknown>","value: Record<string, unknown>","result: Record<string, Record<string, unknown>>","role: unknown","pluginName: string","serviceName: string","name: string","initial: T","next: T","state: T","plugin: T","options: MiokuStartOptions","logger","signal: string","version: string"],"sources":["../src/core/logger.ts","../src/core/module-scanner.ts","../src/core/plugin-linker.ts","../src/core/registry.ts","../src/core/plugin-manifest.ts","../src/core/plugin-manager.ts","../src/core/service-manager.ts","../src/core/bootstrap.ts","../src/core/service.ts","../src/core/services.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\";\nimport { pathToFileURL } from \"node:url\";\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().\n// pathToFileURL also percent-encodes spaces and non-ASCII segments, which a\n// hand-rolled string replace leaves broken (e.g. \"C:\\用户\\my bot\").\nexport function toImportPath(filePath: string): string {\n if (process.platform === \"win32\") {\n return pathToFileURL(filePath).href;\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 { logger } from \"./logger\";\nimport type {\n AccessHook,\n PluginHelp,\n PluginPackageConfig,\n} from \"../types\";\n\nconst PLUGIN_CONFIG_KEYS = new Set([\n \"services\",\n \"help\",\n \"accessHooks\",\n]);\n\nconst ACCESS_HOOK_KEYS = new Set([\n \"id\",\n \"match\",\n \"event\",\n \"description\",\n]);\n\nconst HELP_COMMAND_KEYS = new Set([\"cmd\", \"desc\", \"usage\", \"role\"]);\n\nfunction warnUnknownFields(\n prefix: string,\n obj: Record<string, unknown>,\n allowed: Set<string>,\n): void {\n for (const key of Object.keys(obj)) {\n if (!allowed.has(key)) {\n logger.warn(`[plugin-manifest] ${prefix} 含未知字段 \"${key}\"(将被忽略)`);\n }\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction validateHelp(value: unknown, pluginName: string): PluginHelp | undefined {\n if (value === undefined) return undefined;\n if (!isPlainObject(value)) {\n logger.warn(`[plugin-manifest] ${pluginName}.help 必须是对象,已忽略`);\n return undefined;\n }\n warnUnknownFields(`${pluginName}.help`, value, HELP_COMMAND_KEYS);\n\n const title = String(value.title ?? \"\").trim();\n const description = String(value.description ?? \"\").trim();\n const rawCommands = value.commands;\n\n if (!title) {\n logger.warn(`[plugin-manifest] ${pluginName}.help.title 缺失或为空`);\n }\n if (!description) {\n logger.warn(`[plugin-manifest] ${pluginName}.help.description 缺失或为空`);\n }\n if (!Array.isArray(rawCommands)) {\n logger.warn(`[plugin-manifest] ${pluginName}.help.commands 必须是数组`);\n return { title, description, commands: [] };\n }\n\n const commands: PluginHelp[\"commands\"] = [];\n for (const cmd of rawCommands) {\n if (!isPlainObject(cmd)) {\n logger.warn(`[plugin-manifest] ${pluginName}.help.commands 项不是对象`);\n continue;\n }\n warnUnknownFields(\n `${pluginName}.help.commands[]`,\n cmd,\n HELP_COMMAND_KEYS,\n );\n const cmdName = String(cmd.cmd ?? \"\").trim();\n const desc = String(cmd.desc ?? \"\").trim();\n if (!cmdName || !desc) {\n logger.warn(\n `[plugin-manifest] ${pluginName}.help.commands 项缺少 cmd 或 desc`,\n );\n continue;\n }\n commands.push({\n cmd: cmdName,\n desc,\n usage: typeof cmd.usage === \"string\" ? cmd.usage : undefined,\n role: typeof cmd.role === \"string\" ? (cmd.role as never) : undefined,\n });\n }\n\n return { title, description, commands };\n}\n\nfunction validateAccessHooks(\n value: unknown,\n pluginName: string,\n): AccessHook[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value)) {\n logger.warn(`[plugin-manifest] ${pluginName}.accessHooks 必须是数组`);\n return undefined;\n }\n\n const hooks: AccessHook[] = [];\n for (const hook of value) {\n if (!isPlainObject(hook)) {\n logger.warn(`[plugin-manifest] ${pluginName}.accessHooks 项不是对象`);\n continue;\n }\n warnUnknownFields(\n `${pluginName}.accessHooks[]`,\n hook,\n ACCESS_HOOK_KEYS,\n );\n const id = String(hook.id ?? \"\").trim();\n if (!id) {\n logger.warn(\n `[plugin-manifest] ${pluginName}.accessHooks 项缺少 id,已忽略`,\n );\n continue;\n }\n hooks.push({\n id,\n match: typeof hook.match === \"string\" ? hook.match : undefined,\n event: typeof hook.event === \"string\" ? hook.event : undefined,\n description:\n typeof hook.description === \"string\" ? hook.description : undefined,\n });\n }\n return hooks;\n}\n\nexport function validatePluginPackageConfig(\n raw: unknown,\n pluginName: string,\n): PluginPackageConfig {\n const config: PluginPackageConfig = {};\n\n if (raw === undefined || raw === null) {\n return config;\n }\n if (!isPlainObject(raw)) {\n logger.warn(\n `[plugin-manifest] ${pluginName} 的 mioku 字段必须是对象,已使用空配置`,\n );\n return config;\n }\n\n warnUnknownFields(`${pluginName}.mioku`, raw, PLUGIN_CONFIG_KEYS);\n\n if (raw.services !== undefined) {\n if (Array.isArray(raw.services)) {\n const services = raw.services.filter(\n (s): s is string => typeof s === \"string\" && s.length > 0,\n );\n const dropped = raw.services.length - services.length;\n if (dropped > 0) {\n logger.warn(\n `[plugin-manifest] ${pluginName}.services 丢弃 ${dropped} 个非字符串项`,\n );\n }\n config.services = services;\n } else {\n logger.warn(`[plugin-manifest] ${pluginName}.services 必须是字符串数组`);\n }\n }\n\n const help = validateHelp(raw.help, pluginName);\n if (help) config.help = help;\n\n const hooks = validateAccessHooks(raw.accessHooks, pluginName);\n if (hooks) config.accessHooks = hooks;\n\n return config;\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\";\nimport { validatePluginPackageConfig } from \"./plugin-manifest\";\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\nconst config: PluginPackageConfig = validatePluginPackageConfig(\n packageJson?.mioku,\n name,\n );\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 type { MiokiContext } from \"mioki\";\n\nexport interface ServiceRef<T> {\n readonly id: string;\n}\n\nexport function defineService<T>(id: string): ServiceRef<T> {\n return { id };\n}\n\nexport function getService<T>(\n ctx: MiokiContext,\n ref: ServiceRef<T>,\n): T | undefined {\n return ctx.services[ref.id] as T | undefined;\n}\n\nexport function requireService<T>(\n ctx: MiokiContext,\n ref: ServiceRef<T>,\n): T {\n const svc = ctx.services[ref.id] as T | undefined;\n if (svc === undefined) {\n throw new Error(\n `[mioku] required service \"${ref.id}\" is not available`,\n );\n }\n return svc;\n}\n\nexport function hasService<T>(\n ctx: MiokiContext,\n ref: ServiceRef<T>,\n): boolean {\n return ctx.services[ref.id] !== undefined;\n}","import type {\n AIService,\n ConfigService,\n ScreenshotService,\n HelpService,\n} from \"../types\";\nimport { defineService } from \"./service\";\n\nexport const Services = {\n AI: defineService<AIService>(\"ai\"),\n Config: defineService<ConfigService>(\"config\"),\n Screenshot: defineService<ScreenshotService>(\"screenshot\"),\n Help: defineService<HelpService>(\"help\"),\n} as const;\n\nexport type BuiltinServiceRef =\n | typeof Services.AI\n | typeof Services.Config\n | typeof Services.Screenshot\n | typeof Services.Help;","import type { MiokiContext } from \"mioki\";\nimport { botConfig } from \"mioki\";\nimport { getService } from \"./service\";\nimport { Services } from \"./services\";\nimport pluginManager from \"./plugin-manager\";\nimport { logger } from \"./logger\";\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 = getService(ctx, Services.Help);\n if (!helpService) return;\n\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","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\n/**\n * - `\"master\"`:仅 bot 主人可触发\n * - `\"owner\"`:legacy alias\n * - `\"admin\"`:bot 主人或管理员\n * - `\"member\"`:群内任意成员\n *\n */\nexport type SkillPermissionRole = \"master\" | \"owner\" | \"admin\" | \"member\";\n\nexport function normalizeSkillPermissionRole(\n role: unknown,\n): SkillPermissionRole {\n const normalized = String(role ?? \"\")\n .trim()\n .toLowerCase();\n if (\n normalized === \"master\" ||\n normalized === \"owner\" ||\n normalized === \"admin\" ||\n normalized === \"member\"\n ) {\n return normalized as SkillPermissionRole;\n }\n return \"member\";\n}\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(\n pluginName: string,\n configName: string,\n initialConfig: any,\n ): Promise<boolean>;\n updateConfig(\n pluginName: string,\n configName: string,\n updates: any,\n ): Promise<boolean>;\n getConfig(pluginName: string, configName: string): Promise<any>;\n getPluginConfigs(pluginName: string): Promise<Record<string, any>>;\n onConfigChange(\n pluginName: string,\n configName: string,\n callback: (newConfig: any) => void,\n ): () => 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 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: {\n prompt?: string;\n messages: TextMessage[];\n model?: string;\n temperature?: number;\n max_tokens?: number;\n }): Promise<string>;\n generateMultimodal(options: {\n prompt?: string;\n messages: MultimodalMessage[];\n model?: string;\n temperature?: number;\n max_tokens?: number;\n }): Promise<string>;\n complete(options: CompleteOptions): Promise<CompleteResponse>;\n generateWithTools(options: {\n prompt?: string;\n messages: TextMessage[] | MultimodalMessage[];\n model?: string;\n temperature?: number;\n maxIterations?: number;\n }): Promise<any>;\n setUsageContext?(context: AIUsageContext | undefined): void;\n withUsageContext?<T>(\n context: AIUsageContext | undefined,\n fn: () => Promise<T>,\n ): 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: {\n name: string;\n apiUrl: string;\n apiKey: string;\n modelType: \"text\" | \"multimodal\";\n model?: string;\n }): 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?(\n input: Omit<AIProviderConfig, \"id\"> & { id?: string },\n ): Promise<AIProviderConfig>;\n updateProvider?(\n id: string,\n input: Partial<AIProviderConfig>,\n ): Promise<AIProviderConfig>;\n removeProvider?(id: string): boolean;\n testProvider?(\n id: string,\n ): 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: {\n range: AIUsageRange;\n botId?: number;\n }): 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(\n options: ChatRuntimeInformationRequestOptions,\n ): 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<{\n name: \"输入\" | \"输出\" | \"缓存写入\" | \"缓存读取\";\n value: number;\n }>;\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\nconst store = getOrCreate<Record<string, unknown>>(\n \"plugin-runtime-state\",\n () => ({}),\n);\n\nexport interface PluginStateRef<T> {\n readonly name: string;\n get(): T;\n set(next: T): void;\n reset(): void;\n}\n\nexport function defineState<T>(name: string, initial: T): PluginStateRef<T> {\n return {\n name,\n get(): T {\n const current = store[name];\n return (current === undefined ? initial : current) as T;\n },\n set(next: T): void {\n store[name] = next;\n },\n reset(): void {\n delete store[name];\n },\n };\n}\n\nexport function hasPluginState(name: string): boolean {\n return store[name] !== undefined;\n}\n\nexport function getPluginRuntimeState<T = Record<string, any>>(\n name: string,\n): T {\n if (!store[name]) store[name] = {};\n return store[name] as T;\n}\n\nexport function setPluginRuntimeState<T>(name: string, state: T): void {\n store[name] = state;\n}\n\nexport function resetPluginRuntimeState(name: string): void {\n delete store[name];\n}\n\nexport function getAllPluginRuntimeStates(): Record<string, unknown> {\n return { ...store };\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\";\nimport { default as serviceManager } from \"./core/service-manager\";\n\nexport type { MiokiPlugin, MiokiContext } from \"mioki\";\nexport type { EventMap } from \"napcat-sdk\";\n\nexport function definePlugin<T extends import(\"mioki\").MiokiPlugin>(\n plugin: T,\n): 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 {\n TOOL_RESULT_FOLLOWUP_KEY,\n normalizeSkillPermissionRole,\n} from \"./types\";\n\nexport {\n defineService,\n getService,\n requireService,\n hasService,\n} from \"./core/service\";\nexport type { ServiceRef } from \"./core/service\";\nexport { Services } from \"./core/services\";\nexport type { BuiltinServiceRef } from \"./core/services\";\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 let shuttingDown = false;\n const shutdown = async (signal: string) => {\n if (shuttingDown) return;\n shuttingDown = true;\n logger.info(`收到 ${signal} 信号,正在关闭服务...`);\n const timer = setTimeout(() => {\n logger.error(\"服务关闭超时,强制退出\");\n process.exit(1);\n }, 15_000);\n timer.unref();\n await serviceManager.disposeAll();\n clearTimeout(timer);\n logger.info(\"Mioku 服务已完全关闭\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\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 defineState,\n hasPluginState,\n getPluginRuntimeState,\n setPluginRuntimeState,\n resetPluginRuntimeState,\n getAllPluginRuntimeStates,\n} from \"./core/plugin-runtime-state\";\nexport type { PluginStateRef } from \"./core/plugin-runtime-state\";\n\nexport {\n resolveCommand,\n commandExists,\n buildSpawnPlan,\n runCommand,\n runCommandInherit,\n} from \"./core/exec\";\n\nexport type { RunCommandResult, SpawnPlan } from \"./core/exec\";\n"],"mappings":";;;;;;;;;AAUA,MAAMA,iBAA8B;CAClC,OAAO,CAAC,GAAG,SAAS,QAAQ,MAAM,GAAG,KAAK;CAC1C,MAAM,CAAC,GAAG,SAAS,QAAQ,KAAK,GAAG,KAAK;CACxC,MAAM,CAAC,GAAG,SAAS,QAAQ,KAAK,GAAG,KAAK;CACxC,OAAO,CAAC,GAAG,SAAS,QAAQ,MAAM,GAAG,KAAK;CAC1C,OAAO,CAAC,GAAG,SAAS,QAAQ,MAAM,GAAG,KAAK;AAC3C;AAED,IAAIC,eAA4B;AAEhC,SAAgB,eAAeC,UAAuC;AACpE,gBAAeC,YAAU;AAC1B;AAMD,MAAaC,SAAsB;CACjC,OAAO,CAAC,GAAG,SAAS,aAAa,MAAM,GAAG,KAAK;CAC/C,MAAM,CAAC,GAAG,SAAS,aAAa,KAAK,GAAG,KAAK;CAC7C,MAAM,CAAC,GAAG,SAAS,aAAa,KAAK,GAAG,KAAK;CAC7C,OAAO,CAAC,GAAG,SAAS,aAAa,MAAM,GAAG,KAAK;CAC/C,OAAO,CAAC,GAAG,SAAS,aAAa,QAAQ,GAAG,KAAK;AAClD;;;;ACzBD,eAAsB,WAAWC,UAAoC;AACnE,KAAI;AACF,QAAM,YAAG,OAAO,SAAS;AACzB,SAAO;CACR,QAAO;AACN,SAAO;CACR;AACF;AAED,eAAsB,gBAAgBC,GAA4B;AAChE,KAAI;AACF,SAAO,MAAM,YAAG,SAAS,EAAE;CAC5B,QAAO;AACN,SAAO;CACR;AACF;AAKD,SAAgB,aAAaD,UAA0B;AACrD,KAAI,QAAQ,aAAa,QACvB,QAAO,4BAAc,SAAS,CAAC;AAEjC,QAAO;AACR;AAED,eAAsB,aAAaE,KAA0C;CAC3E,MAAMC,UAA8B,CAAE;AACtC,MAAM,MAAM,WAAW,IAAI,CAAG,QAAO;CAErC,IAAIC;AACJ,KAAI;AACF,YAAU,MAAM,YAAG,QAAQ,KAAK,EAAE,eAAe,KAAM,EAAC;CACzD,QAAO;AACN,SAAO;CACR;AAED,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,YAAY,KAAK,KAAK,KAAK,MAAM,KAAK;AAC5C,MAAI;GACF,MAAM,OAAO,MAAM,YAAG,KAAK,UAAU;AACrC,QAAK,KAAK,aAAa,CAAE;EAC1B,QAAO;AACN;EACD;AACD,UAAQ,KAAK;GAAE,MAAM,MAAM;GAAM,MAAM,MAAM,gBAAgB,UAAU;EAAE,EAAC;CAC3E;AACD,QAAO;AACR;AAED,eAAsB,gBAAgBC,QAA6C;CACjF,MAAMF,UAA8B,CAAE;CACtC,MAAM,kBAAkB,KAAK,QAAQ,QAAQ,KAAK,EAAE,eAAe;AACnE,MAAM,MAAM,WAAW,gBAAgB,CAAG,QAAO;CAEjD,IAAIC;AACJ,KAAI;AACF,YAAU,MAAM,YAAG,QAAQ,iBAAiB,EAAE,eAAe,KAAM,EAAC;CACrE,QAAO;AACN,SAAO;CACR;AAID,MAAK,MAAM,SAAS,SAAS;AAC3B,OAAK,MAAM,KAAK,WAAW,OAAO,CAAE;EACpC,MAAM,OAAO,MAAM,KAAK,MAAM,OAAO,OAAO;EAC5C,MAAM,WAAW,KAAK,KAAK,iBAAiB,MAAM,KAAK;AACvD,UAAQ,KAAK;GAAE;GAAM,MAAM,MAAM,gBAAgB,SAAS;EAAE,EAAC;CAC9D;AACD,QAAO;AACR;;;;AC3ED,MAAa,8BAA8B;AAI3C,eAAe,sBAAsBE,WAA0C;CAC7E,IAAI;AACJ,KAAI;AACF,SAAO,MAAM,YAAG,MAAM,UAAU;CACjC,QAAO;AACN,SAAO;CACR;AACD,MAAK,KAAK,gBAAgB,CAAE,QAAO;AACnC,KAAI;AACF,QAAM,YAAG,SAAS,UAAU;AAC5B,SAAO;CACR,QAAO;AACN,QAAM,YAAG,GAAG,WAAW,EAAE,OAAO,KAAM,EAAC;AACvC,SAAO,MAAM,8CAA8C,UAAU,EAAE;AACvE,SAAO;CACR;AACF;AAED,SAAS,sBAAsBC,UAAkBC,YAA4B;AAC3E,QAAO,KAAK,SAAS,KAAK,QAAQ,SAAS,EAAE,WAAW,IAAI;AAC7D;AAED,eAAe,iBACbC,mBACAC,UACkB;CAClB,MAAM,WAAW,KAAK,KAAK,mBAAmB,SAAS,KAAK;CAC5D,MAAM,aAAa,SAAS;CAE5B,IAAI;AACJ,KAAI;AACF,SAAO,MAAM,YAAG,MAAM,SAAS;CAChC,QAAO;AACN,SAAO;CACR;AAED,KAAI,MAAM,gBAAgB,CACxB,KAAI;EACF,MAAM,gBAAgB,MAAM,YAAG,SAAS,SAAS;EACjD,MAAM,iBAAiB,MAAM,YAAG,SAAS,WAAW;AACpD,MAAI,kBAAkB,eAAgB,QAAO;AAC7C,QAAM,YAAG,GAAG,UAAU,EAAE,OAAO,KAAM,EAAC;AACtC,SAAO,MAAM,0CAA0C,SAAS,KAAK,EAAE;CACxE,QAAO;AACN,QAAM,YAAG,GAAG,UAAU,EAAE,OAAO,KAAM,EAAC;AACtC,SAAO,MAAM,8CAA8C,SAAS,EAAE;CACvE;UACQ,MAAM;AACf,SAAO,MACJ,kBAAkB,SAAS,6CAA6C,SAAS,KAAK,EACxF;AACD,SAAO;CACR;AAED,MAAM,MAAM,WAAW,WAAW,EAAG;AACnC,SAAO,MACJ,sDAAsD,SAAS,KAAK,IAAI,WAAW,EACrF;AACD,SAAO;CACR;AAGD,KAAI,QAAQ,aAAa,QACvB,OAAM,YAAG,QAAQ,YAAY,UAAU,WAAW;KAElD,OAAM,YAAG,QAAQ,sBAAsB,UAAU,WAAW,EAAE,UAAU,MAAM;AAEhF,QAAO;AACR;AAED,eAAsB,0BACpBC,SACA,oBAAoB,KAAK,QAAQ,QAAQ,KAAK,EAAE,4BAA4B,EACzD;AACnB,OAAM,YAAG,MAAM,mBAAmB,EAAE,WAAW,KAAM,EAAC;CAEtD,MAAM,kBAAkB,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK;CAC1D,MAAM,UAAU,MAAM,YAAG,QAAQ,mBAAmB,EAAE,eAAe,KAAM,EAAC;AAE5E,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,YAAY,KAAK,KAAK,mBAAmB,MAAM,KAAK;AAC1D,MAAK,MAAM,sBAAsB,UAAU,KAAM,KAAM;AACvD,MAAI,MAAM,gBAAgB,KAAK,gBAAgB,IAAI,MAAM,KAAK,EAAE;AAC9D,SAAM,YAAG,GAAG,WAAW,EAAE,OAAO,KAAM,EAAC;AACvC,UAAO,MAAM,6CAA6C,MAAM,KAAK,EAAE;EACxE;CACF;CAED,MAAMC,cAAwB,CAAE;AAChC,MAAK,MAAM,YAAY,QACrB,KAAI,MAAM,iBAAiB,mBAAmB,SAAS,CACrD,aAAY,KAAK,SAAS,KAAK;AAGnC,QAAO;AACR;;;;ACnGD,MAAM,eAAe,OAAO,IAAI,oBAAoB;AAGpD,SAASC,UAAqB;CAC5B,MAAM,IAAI;AACV,MAAK,EAAE,cAAe,GAAE,gBAAgB,CAAE;AAC1C,QAAO,EAAE;AACV;AAED,SAAgB,YAAeC,KAAaC,SAAqB;CAC/D,MAAM,IAAI,SAAO;AACjB,KAAI,EAAE,gBAAoB,GAAE,OAAO,SAAS;AAC5C,QAAO,EAAE;AACV;;;;ACZD,MAAM,qBAAqB,IAAI,IAAI;CACjC;CACA;CACA;AACD;AAED,MAAM,mBAAmB,IAAI,IAAI;CAC/B;CACA;CACA;CACA;AACD;AAED,MAAM,oBAAoB,IAAI,IAAI;CAAC;CAAO;CAAQ;CAAS;AAAO;AAElE,SAAS,kBACPC,QACAC,KACAC,SACM;AACN,MAAK,MAAM,OAAO,OAAO,KAAK,IAAI,CAChC,MAAK,QAAQ,IAAI,IAAI,CACnB,QAAO,MAAM,oBAAoB,OAAO,UAAU,IAAI,SAAS;AAGpE;AAED,SAAS,cAAcC,OAAkD;AACvE,QAAO,UAAU,eAAe,UAAU,aAAa,MAAM,QAAQ,MAAM;AAC5E;AAED,SAAS,aAAaA,OAAgBC,YAA4C;AAChF,KAAI,iBAAqB;AACzB,MAAK,cAAc,MAAM,EAAE;AACzB,SAAO,MAAM,oBAAoB,WAAW,iBAAiB;AAC7D;CACD;AACD,oBAAmB,EAAE,WAAW,QAAQ,OAAO,kBAAkB;CAEjE,MAAM,QAAQ,OAAO,MAAM,SAAS,GAAG,CAAC,MAAM;CAC9C,MAAM,cAAc,OAAO,MAAM,eAAe,GAAG,CAAC,MAAM;CAC1D,MAAM,cAAc,MAAM;AAE1B,MAAK,MACH,QAAO,MAAM,oBAAoB,WAAW,mBAAmB;AAEjE,MAAK,YACH,QAAO,MAAM,oBAAoB,WAAW,yBAAyB;AAEvE,MAAK,MAAM,QAAQ,YAAY,EAAE;AAC/B,SAAO,MAAM,oBAAoB,WAAW,sBAAsB;AAClE,SAAO;GAAE;GAAO;GAAa,UAAU,CAAE;EAAE;CAC5C;CAED,MAAMC,WAAmC,CAAE;AAC3C,MAAK,MAAM,OAAO,aAAa;AAC7B,OAAK,cAAc,IAAI,EAAE;AACvB,UAAO,MAAM,oBAAoB,WAAW,sBAAsB;AAClE;EACD;AACD,qBACG,EAAE,WAAW,mBACd,KACA,kBACD;EACD,MAAM,UAAU,OAAO,IAAI,OAAO,GAAG,CAAC,MAAM;EAC5C,MAAM,OAAO,OAAO,IAAI,QAAQ,GAAG,CAAC,MAAM;AAC1C,OAAK,YAAY,MAAM;AACrB,UAAO,MACJ,oBAAoB,WAAW,+BACjC;AACD;EACD;AACD,WAAS,KAAK;GACZ,KAAK;GACL;GACA,cAAc,IAAI,UAAU,WAAW,IAAI;GAC3C,aAAa,IAAI,SAAS,WAAY,IAAI;EAC3C,EAAC;CACH;AAED,QAAO;EAAE;EAAO;EAAa;CAAU;AACxC;AAED,SAAS,oBACPF,OACAC,YAC0B;AAC1B,KAAI,iBAAqB;AACzB,MAAK,MAAM,QAAQ,MAAM,EAAE;AACzB,SAAO,MAAM,oBAAoB,WAAW,oBAAoB;AAChE;CACD;CAED,MAAME,QAAsB,CAAE;AAC9B,MAAK,MAAM,QAAQ,OAAO;AACxB,OAAK,cAAc,KAAK,EAAE;AACxB,UAAO,MAAM,oBAAoB,WAAW,oBAAoB;AAChE;EACD;AACD,qBACG,EAAE,WAAW,iBACd,MACA,iBACD;EACD,MAAM,KAAK,OAAO,KAAK,MAAM,GAAG,CAAC,MAAM;AACvC,OAAK,IAAI;AACP,UAAO,MACJ,oBAAoB,WAAW,yBACjC;AACD;EACD;AACD,QAAM,KAAK;GACT;GACA,cAAc,KAAK,UAAU,WAAW,KAAK;GAC7C,cAAc,KAAK,UAAU,WAAW,KAAK;GAC7C,oBACS,KAAK,gBAAgB,WAAW,KAAK;EAC/C,EAAC;CACH;AACD,QAAO;AACR;AAED,SAAgB,4BACdC,KACAH,YACqB;CACrB,MAAMI,SAA8B,CAAE;AAEtC,KAAI,kBAAqB,QAAQ,KAC/B,QAAO;AAET,MAAK,cAAc,IAAI,EAAE;AACvB,SAAO,MACJ,oBAAoB,WAAW,yBACjC;AACD,SAAO;CACR;AAED,oBAAmB,EAAE,WAAW,SAAS,KAAK,mBAAmB;AAEjE,KAAI,IAAI,oBACN,KAAI,MAAM,QAAQ,IAAI,SAAS,EAAE;EAC/B,MAAM,WAAW,IAAI,SAAS,OAC5B,CAAC,aAA0B,MAAM,YAAY,EAAE,SAAS,EACzD;EACD,MAAM,UAAU,IAAI,SAAS,SAAS,SAAS;AAC/C,MAAI,UAAU,EACZ,QAAO,MACJ,oBAAoB,WAAW,eAAe,QAAQ,SACxD;AAEH,SAAO,WAAW;CACnB,MACC,QAAO,MAAM,oBAAoB,WAAW,oBAAoB;CAIpE,MAAM,OAAO,aAAa,IAAI,MAAM,WAAW;AAC/C,KAAI,KAAM,QAAO,OAAO;CAExB,MAAM,QAAQ,oBAAoB,IAAI,aAAa,WAAW;AAC9D,KAAI,MAAO,QAAO,cAAc;AAEhC,QAAO;AACR;;;;ACxJD,MAAM,gBAAgB;AAEtB,IAAa,gBAAb,MAAa,cAAc;CACzB,AAAQ,UAAU,IAAI;CAEtB,OAAO,cAA6B;AAClC,SAAO,YAAY,kBAAkB,MAAM,IAAI,gBAAgB;CAChE;CAED,MAAM,gBAAgBC,cAAkC,CAAE,GAA6B;EACrF,MAAM,gBAAgB,YAAY;EAClC,MAAM,aACJ,iBAAiB,kBAAkB,8BAC/B,KAAK,QAAQ,QAAQ,KAAK,EAAE,cAAc,GAC1C,KAAK,QAAQ,QAAQ,KAAK,EAAE,UAAU;AAE5C,OAAK,QAAQ,OAAO;AAEpB,OAAM,MAAM,WAAW,WAAW,CAChC,mBAAU,YAAY,EAAE,WAAW,KAAM,EAAC;EAG5C,MAAM,QAAQ,MAAM,aAAa,WAAW;AAC5C,OAAK,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,OAAO;GACrC,MAAM,WAAW,MAAM,KAAK,mBAAmB,MAAM,EAAE;AACvD,OAAI,SAAU,MAAK,QAAQ,IAAI,SAAS,MAAM,SAAS;EACxD;EAED,MAAM,WAAW,MAAM,gBAAgB,cAAc;AACrD,OAAK,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,UAAU;GACxC,MAAM,WAAW,MAAM,KAAK,mBAAmB,MAAM,EAAE;AACvD,OAAI,SAAU,MAAK,QAAQ,IAAI,SAAS,MAAM,SAAS;EACxD;AAED,SAAO,MAAM,UAAU,KAAK,QAAQ,KAAK,MAAM;AAC/C,SAAO,CAAC,GAAG,KAAK,QAAQ,QAAQ,AAAC;CAClC;CAED,MAAc,mBACZC,MACAC,YACgC;EAChC,MAAM,eAAe,MAAM,gBAAgB,WAAW;EACtD,IAAIC,cAAsC;AAC1C,MAAI;AACF,iBAAc,KAAK,MACjB,MAAM,YAAG,SAAS,KAAK,KAAK,cAAc,eAAe,EAAE,QAAQ,CACpE;EACF,SAAQ,OAAO;AACd,UAAO,MAAM,sBAAsB,KAAK,sBAAsB,MAAM,EAAE;EACvE;EAEL,MAAMC,SAA8B,4BAC9B,aAAa,OACb,KACD;AACD,SAAO;GACL;GACA,SAAS,aAAa,WAAW;GACjC,aAAa,aAAa;GAC1B,MAAM;GACN,aAAa,eAAe,CAAE;GAC9B;EACD;CACF;CAED,0BAAuC;EACrC,MAAM,WAAW,IAAI;AACrB,OAAK,MAAM,YAAY,KAAK,QAAQ,QAAQ,CAC1C,MAAK,MAAM,WAAW,SAAS,OAAO,YAAY,CAAE,EAAE,UAAS,IAAI,QAAQ;AAE7E,SAAO;CACR;CAED,kBAAkBH,MAA0C;AAC1D,SAAO,KAAK,QAAQ,IAAI,KAAK;CAC9B;CAED,iBAAmC;AACjC,SAAO,CAAC,GAAG,KAAK,QAAQ,QAAQ,AAAC;CAClC;CAED,QAAc;AACZ,OAAK,QAAQ,OAAO;CACrB;AACF;AAED,6BAAe,cAAc,aAAa;;;;ACxF1C,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,AAAQ,WAAW,IAAI;CACvB,AAAQ,kBAAkB,IAAI;CAE9B,OAAO,cAA8B;AACnC,SAAO,YAAY,mBAAmB,MAAM,IAAI,iBAAiB;CAClE;CAED,MAAM,iBAAiBI,cAAkC,CAAE,GAA8B;EACvF,MAAM,cAAc,YAAY,eAC5B,KAAK,QAAQ,QAAQ,KAAK,EAAE,YAAY,aAAa,GACrD,KAAK,QAAQ,QAAQ,KAAK,EAAE,WAAW;AAE3C,OAAK,gBAAgB,OAAO;AAE5B,MAAI,mBAAW,YAAY,EAAE;GAC3B,MAAM,QAAQ,MAAM,aAAa,YAAY;AAC7C,QAAK,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,OAAO;IACrC,MAAM,WAAW,MAAM,KAAK,oBAAoB,MAAM,EAAE;AACxD,QAAI,SAAU,MAAK,gBAAgB,IAAI,MAAM,SAAS;GACvD;EACF,MACC,mBAAU,aAAa,EAAE,WAAW,KAAM,EAAC;EAG7C,MAAM,WAAW,MAAM,gBAAgB,eAAe;AACtD,OAAK,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,UAAU;GACxC,MAAM,WAAW,MAAM,KAAK,oBAAoB,MAAM,EAAE;AACxD,OAAI,SAAU,MAAK,gBAAgB,IAAI,MAAM,SAAS;EACvD;AAED,SAAO,MAAM,UAAU,KAAK,gBAAgB,KAAK,MAAM;AACvD,SAAO,CAAC,GAAG,KAAK,gBAAgB,QAAQ,AAAC;CAC1C;CAED,MAAc,oBACZC,MACAC,aACiC;EACjC,MAAM,kBAAkB,KAAK,KAAK,aAAa,eAAe;AAC9D,OAAM,MAAM,WAAW,gBAAgB,CAAG,QAAO;AAEjD,MAAI;GACF,MAAMC,cAA+B,KAAK,MACxC,MAAM,YAAG,SAAS,iBAAiB,QAAQ,CAC5C;AACD,UAAO;IACL;IACA,SAAS,YAAY,WAAW;IAChC,aAAa,YAAY;IACzB,MAAM;IACN;GACD;EACF,SAAQ,OAAO;AACd,UAAO,MAAM,yBAAyB,KAAK,OAAO,MAAM,EAAE;AAC1D,UAAO;EACR;CACF;CAED,MAAM,qBAAqBC,UAA0C;EACnE,MAAMC,UAAoB,CAAE;AAC5B,OAAK,MAAM,QAAQ,SACjB,MAAK,KAAK,gBAAgB,IAAI,KAAK,CAAE,SAAQ,KAAK,KAAK;AAEzD,SAAO;CACR;CAED,MAAM,gBAAgBC,KAAkC;EACtD,MAAM,MAAM,CAAC,GAAG,KAAK,gBAAgB,QAAQ,AAAC;AAC9C,SAAO,MAAM,WAAW,IAAI,OAAO,SAAS;AAC5C,OAAK,MAAM,YAAY,IACrB,OAAM,KAAK,YAAY,UAAU,IAAI;CAExC;CAED,MAAc,YACZC,UACAD,KACkB;AAClB,MAAI;GACF,MAAM,UAAU,KAAK,KAAK,SAAS,MAAM,WAAW;GACpD,MAAM,UAAU,KAAK,KAAK,SAAS,MAAM,WAAW;GACpD,MAAM,QAAS,MAAM,WAAW,QAAQ,GACpC,UACC,MAAM,WAAW,QAAQ,GACxB,UACA;AACN,QAAK,OAAO;AACV,WAAO,OAAO,uBAAuB,SAAS,KAAK,OAAO;AAC1D,WAAO;GACR;GAED,MAAM,gBAAgB,MAAM,OAAO,aAAa,MAAM;GACtD,MAAME,UAAwB,cAAc,WAAW;AACvD,QAAK,kBAAkB,QAAQ,SAAS,YAAY;AAClD,WAAO,MAAM,uBAAuB,SAAS,KAAK,eAAe;AACjE,WAAO;GACR;AAED,SAAM,QAAQ,MAAM;AACpB,OAAI,QAAQ,IACV,KAAI,SAAS,SAAS,QAAQ,QAAQ;AAExC,QAAK,SAAS,IAAI,SAAS,MAAM,QAAQ;AACzC,UAAO;EACR,SAAQ,OAAO;AACd,UAAO,OAAO,yBAAyB,SAAS,KAAK,OAAO,MAAM,EAAE;AACpE,UAAO;EACR;CACF;CAED,uBAAuBP,MAAcO,SAA6B;AAChE,OAAK,SAAS,IAAI,MAAM,QAAQ;CACjC;CAED,WAAWP,MAAwC;AACjD,SAAO,KAAK,SAAS,IAAI,KAAK;CAC/B;CAED,MAAM,aAA4B;AAChC,OAAK,MAAM,GAAG,QAAQ,IAAI,KAAK,SAC7B,OAAM,QAAQ,WAAW;AAE3B,OAAK,SAAS,OAAO;CACtB;CAED,QAAc;AACZ,OAAK,SAAS,OAAO;AACrB,OAAK,gBAAgB,OAAO;CAC7B;AACF;AAED,8BAAe,eAAe,aAAa;;;;AClI3C,eAAsB,kBAA+C;CACnE,MAAM,kBAAkB,KAAK,KAAK,QAAQ,KAAK,EAAE,eAAe;AAChE,KAAI;EACF,MAAM,MAAM,KAAK,MAAM,MAAM,YAAG,SAAS,iBAAiB,QAAQ,CAAC;AACnE,SAAQ,IAAI,SAAS,CAAE;CACxB,QAAO;AACN,SAAO,CAAE;CACV;AACF;AAED,SAAS,2BAAiC;AACxC,MAAK,MAAM,OAAO;EAAC;EAAQ;EAAU;CAAO,EAC1C,MAAK,mBAAW,IAAI,CAAE,mBAAU,KAAK,EAAE,WAAW,KAAM,EAAC;AAE5D;AAED,eAAe,uBACbQ,aACmB;AACnB,QAAO,KAAK,oBAAoB;CAChC,MAAM,aAAa,MAAM,uBAAc,gBAAgB,YAAY;AACnE,QAAO,MACJ,UAAU,WAAW,OAAO,QAAQ,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,EAC/E;CACD,MAAM,oBAAoB,KAAK,QAC7B,QAAQ,KAAK,EACb,4BACD;AACD,QAAO,0BAA0B,YAAY,kBAAkB;AAChE;AAED,eAAe,4BACbA,aACe;AACf,QAAO,KAAK,oBAAoB;AAChC,OAAM,wBAAe,iBAAiB,YAAY;CAClD,MAAM,mBAAmB,uBAAc,yBAAyB;CAChE,MAAM,UAAU,MAAM,wBAAe,qBAAqB,iBAAiB;AAC3E,KAAI,QAAQ,SAAS,EAAG,QAAO,MAAM,UAAU,QAAQ,KAAK,KAAK,CAAC,EAAE;AACrE;AAED,SAAS,qBACPA,aACAC,aACAC,mBACM;AACN,aAAU,cAAc;AAExB,KAAI,YAAY,mBAAuB;AACvC,MAAK,MAAM,QAAQ,kBACjB,MAAK,YAAU,QAAQ,SAAS,KAAK,CAAE,aAAU,QAAQ,KAAK,KAAK;AAEtE;AAED,eAAsB,eAAeC,MAAoC;CACvE,MAAM,EAAE,KAAK,wBAAW,YAAY,GAAG;CACvC,MAAM,cAAc,MAAM,iBAAiB;AAC3C,2BAA0B;CAC1B,MAAM,oBAAoB,MAAM,uBAAuB,YAAY;AACnE,OAAM,4BAA4B,YAAY;AAC9C,sBAAqB,aAAaC,aAAW,kBAAkB;AAC/D,OAAM,WAAW,EAAE,IAAK,EAAC;AAC1B;;;;AC/ED,SAAgB,cAAiBC,IAA2B;AAC1D,QAAO,EAAE,GAAI;AACd;AAED,SAAgB,WACdC,KACAC,KACe;AACf,QAAO,IAAI,SAAS,IAAI;AACzB;AAED,SAAgB,eACdD,KACAC,KACG;CACH,MAAM,MAAM,IAAI,SAAS,IAAI;AAC7B,KAAI,eACF,OAAM,IAAI,OACP,4BAA4B,IAAI,GAAG;AAGxC,QAAO;AACR;AAED,SAAgB,WACdD,KACAC,KACS;AACT,QAAO,IAAI,SAAS,IAAI;AACzB;;;;AC3BD,MAAa,WAAW;CACtB,IAAI,cAAyB,KAAK;CAClC,QAAQ,cAA6B,SAAS;CAC9C,YAAY,cAAiC,aAAa;CAC1D,MAAM,cAA2B,OAAO;AACzC;;;;ACND,SAAS,iBAAiBC,UAA4B;AACpD,QAAO,MAAM,QAAQ,SAAS,IAAI,SAAS,SAAS,QAAQ;AAC7D;AAED,eAAsB,wBAAwBC,KAAkC;CAC9E,MAAM,iBAAiB,IAAI,IAAYC,gBAAU,WAAW,CAAE;CAC9D,MAAM,iBAAiB,uBAAc,gBAAgB,CAAC,OAAO,CAAC,aAC5D,eAAe,OAAO,IAAI,eAAe,IAAI,SAAS,KAAK,GAAG,KAC/D;CAED,MAAM,cAAc,WAAW,KAAK,SAAS,KAAK;AAClD,MAAK,YAAa;CAElB,IAAI,YAAY;AAChB,MAAK,MAAM,YAAY,gBAAgB;AACrC,OAAK,SAAS,OAAO,KAAM;AAC3B,OAAK,iBAAiB,SAAS,aAAa,SAAS,CAAE;AACvD,cAAY,aAAa,SAAS,MAAM,SAAS,OAAO,KAAK;AAC7D,eAAa;CACd;AACD,QAAO,MAAM,gCAAgC,UAAU,mBAAmB;AAC3E;;;;ACvBD,MAAM,sBAAsB;AAE5B,SAAS,iBAAiBC,aAA6B;AACrD,QAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,UAAU,qBAAqB,YAAY;AAC5E;AAED,SAAS,kBAAkBA,aAAqBC,YAA4B;AAC1E,QAAO,KAAK,KAAK,iBAAiB,YAAY,GAAG,EAAE,WAAW,OAAO;AACtE;AAED,SAAS,UAAUD,aAA2B;CAC5C,MAAM,MAAM,iBAAiB,YAAY;AACzC,MAAK,mBAAW,IAAI,CAAE,mBAAU,KAAK,EAAE,WAAW,KAAM,EAAC;AAC1D;AAED,eAAsB,sBACpBA,aACAC,YACAC,UACe;AACf,WAAU,YAAY;CACtB,MAAM,aAAa,kBAAkB,aAAa,WAAW;AAC7D,MAAK,mBAAW,WAAW,CACzB,OAAM,YAAG,UAAU,YAAY,KAAK,UAAU,UAAU,MAAM,EAAE,EAAE,QAAQ;AAE7E;AAED,eAAsB,iBACpBF,aACAC,YACkC;CAClC,MAAM,aAAa,kBAAkB,aAAa,WAAW;AAC7D,KAAI;AACF,SAAO,KAAK,MAAM,MAAM,YAAG,SAAS,YAAY,QAAQ,CAAC;CAC1D,SAAQ,OAAO;AACd,OAAK,mBAAW,WAAW,CAAE,QAAO,CAAE;AACtC,SAAO,MAAM,sBAAsB,YAAY,GAAG,WAAW,OAAO,MAAM,EAAE;AAC5E,SAAO,CAAE;CACV;AACF;AAED,eAAsB,oBACpBD,aACAC,YACAE,OACe;AACf,WAAU,YAAY;AACtB,OAAM,YAAG,UACP,kBAAkB,aAAa,WAAW,EAC1C,KAAK,UAAU,OAAO,MAAM,EAAE,EAC9B,QACD;AACF;AAED,eAAsB,kBACpBH,aACkD;CAClD,MAAM,MAAM,iBAAiB,YAAY;AACzC,MAAK,mBAAW,IAAI,CAAE,QAAO,CAAE;CAE/B,MAAMI,SAAkD,CAAE;CAC1D,MAAM,QAAQ,CAAC,MAAM,YAAG,QAAQ,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,QAAQ,CAAC;AAC9E,MAAK,MAAM,QAAQ,MACjB,KAAI;AACF,SAAO,KAAK,SAAS,MAAM,QAAQ,IAAI,KAAK,MAC1C,MAAM,YAAG,SAAS,KAAK,KAAK,KAAK,KAAK,EAAE,QAAQ,CACjD;CACF,SAAQ,OAAO;AACd,SAAO,MAAM,sBAAsB,YAAY,GAAG,KAAK,OAAO,MAAM,EAAE;CACvE;AAEH,QAAO;AACR;AAED,eAAsB,oBACpBJ,aACAC,YACkB;CAClB,MAAM,aAAa,kBAAkB,aAAa,WAAW;AAC7D,MAAK,mBAAW,WAAW,CAAE,QAAO;AACpC,OAAM,YAAG,OAAO,WAAW;AAC3B,QAAO;AACR;;;;ACVD,SAAgB,6BACdI,MACqB;CACrB,MAAM,aAAa,OAAO,QAAQ,GAAG,CAClC,MAAM,CACN,aAAa;AAChB,KACE,eAAe,YACf,eAAe,WACf,eAAe,WACf,eAAe,SAEf,QAAO;AAET,QAAO;AACR;AA8RD,MAAa,2BAA2B;;;;ACvXxC,SAAgB,iBAAiBC,YAA4B;AAC3D,QAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,QAAQ,WAAW;AACpD;AAED,SAAgB,kBAAkBC,aAA6B;AAC7D,QAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,QAAQ,YAAY;AACrD;AAED,SAAgB,aAAqB;AACnC,QAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,OAAO;AACxC;AAED,SAAgB,mBAAmBD,YAA4B;AAC7D,QAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,UAAU,WAAW;AACtD;AAED,SAAgB,oBAAoBC,aAA6B;AAC/D,QAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,UAAU,WAAW,YAAY;AAClE;AAED,SAAgB,eAAuB;AACrC,QAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,SAAS;AAC1C;AAED,SAAgB,cAAcD,YAA4B;CACxD,MAAM,MAAM,iBAAiB,WAAW;AACxC,MAAK,mBAAW,IAAI,CAAE,mBAAU,KAAK,EAAE,WAAW,KAAM,EAAC;AACzD,QAAO;AACR;;;;AC7BD,MAAM,QAAQ,YACZ,wBACA,OAAO,CAAE,GACV;AASD,SAAgB,YAAeE,MAAcC,SAA+B;AAC1E,QAAO;EACL;EACA,MAAS;GACP,MAAM,UAAU,MAAM;AACtB,UAAQ,qBAAwB,UAAU;EAC3C;EACD,IAAIC,MAAe;AACjB,SAAM,QAAQ;EACf;EACD,QAAc;AACZ,UAAO,MAAM;EACd;CACF;AACF;AAED,SAAgB,eAAeF,MAAuB;AACpD,QAAO,MAAM;AACd;AAED,SAAgB,sBACdA,MACG;AACH,MAAK,MAAM,MAAO,OAAM,QAAQ,CAAE;AAClC,QAAO,MAAM;AACd;AAED,SAAgB,sBAAyBA,MAAcG,OAAgB;AACrE,OAAM,QAAQ;AACf;AAED,SAAgB,wBAAwBH,MAAoB;AAC1D,QAAO,MAAM;AACd;AAED,SAAgB,4BAAqD;AACnE,QAAO,EAAE,GAAG,MAAO;AACpB;;;;ACzCD,SAAgB,aACdI,QACG;AACH,QAAO;AACR;AAyFD,eAAsB,MAAMC,UAA6B,CAAE,GAAiB;CAC1E,MAAM,EAAE,MAAM,QAAQ,KAAK,EAAE,GAAG;AAChC,KAAI,IAAK,SAAQ,MAAM,IAAI;CAE3B,MAAM,EAAE,OAAO,YAAY,kBAAQ,wBAAW,GAAG,MAAM,OAAO;AAC9D,gBAAeC,SAAO;CAEtB,IAAI,eAAe;CACnB,MAAM,WAAW,OAAOC,WAAmB;AACzC,MAAI,aAAc;AAClB,iBAAe;AACf,WAAO,MAAM,KAAK,OAAO,eAAe;EACxC,MAAM,QAAQ,WAAW,MAAM;AAC7B,YAAO,MAAM,cAAc;AAC3B,WAAQ,KAAK,EAAE;EAChB,GAAE,KAAO;AACV,QAAM,OAAO;AACb,QAAM,wBAAe,YAAY;AACjC,eAAa,MAAM;AACnB,WAAO,KAAK,gBAAgB;AAC5B,UAAQ,KAAK,EAAE;CAChB;AAED,SAAQ,GAAG,UAAU,MAAM,SAAS,SAAS,CAAC;AAC9C,SAAQ,GAAG,WAAW,MAAM,SAAS,UAAU,CAAC;AAEhD,UAAO,KAAK,UAAU;AACtB,UAAO,KAAK,0CAA0C;AACtD,UAAO,KAAK,sCAAsC;AAClD,UAAO,KAAK,0CAA0C;AAEtD,OAAM,eAAe;EAAE;EAAK;EAAW;CAAY,EAAC;AACrD;AAED,SAAS,cAAsB;AAC7B,KAAI;EACF,MAAM,OAAO,KAAK,QAAQ,qEAA8B,CAAC;EACzD,MAAM,UAAU,KAAK,KAAK,MAAM,MAAM,eAAe;AACrD,SAAO,KAAK,MAAM,GAAG,aAAa,SAAS,QAAQ,CAAC,CAAC,WAAW;CACjE,QAAO;AACN,SAAO;CACR;AACF;AAED,MAAaC,UAAkB,aAAa"}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as mioki0 from "mioki";
2
2
  import { MiokiContext, MiokiContext as MiokiContext$1, MiokiPlugin } from "mioki";
3
+ import { EventMap } from "napcat-sdk";
3
4
 
4
5
  //#region src/types.d.ts
5
6
  interface MiokuService {
@@ -56,6 +57,15 @@ interface PluginHelp {
56
57
  }>;
57
58
  }
58
59
  type CommandRole = "master" | "admin" | "owner" | "member";
60
+ /**
61
+ * - `"master"`:仅 bot 主人可触发
62
+ * - `"owner"`:legacy alias
63
+ * - `"admin"`:bot 主人或管理员
64
+ * - `"member"`:群内任意成员
65
+ *
66
+ */
67
+ type SkillPermissionRole = "master" | "owner" | "admin" | "member";
68
+ declare function normalizeSkillPermissionRole(role: unknown): SkillPermissionRole;
59
69
  interface AccessHook {
60
70
  id: string;
61
71
  match?: string;
@@ -112,7 +122,6 @@ interface AITool {
112
122
  };
113
123
  handler: (args: any, event?: any) => Promise<any> | any;
114
124
  }
115
- type SkillPermissionRole = "owner" | "admin" | "member";
116
125
  interface AISkill {
117
126
  name: string;
118
127
  description: string;
@@ -513,6 +522,26 @@ declare function getServiceConfigs(serviceName: string): Promise<Record<string,
513
522
  declare function deleteServiceConfig(serviceName: string, configName: string): Promise<boolean>;
514
523
  //# sourceMappingURL=service-config.d.ts.map
515
524
  //#endregion
525
+ //#region src/core/service.d.ts
526
+ interface ServiceRef<T> {
527
+ readonly id: string;
528
+ }
529
+ declare function defineService<T>(id: string): ServiceRef<T>;
530
+ declare function getService<T>(ctx: MiokiContext$1, ref: ServiceRef<T>): T | undefined;
531
+ declare function requireService<T>(ctx: MiokiContext$1, ref: ServiceRef<T>): T;
532
+ declare function hasService<T>(ctx: MiokiContext$1, ref: ServiceRef<T>): boolean;
533
+ //# sourceMappingURL=service.d.ts.map
534
+ //#endregion
535
+ //#region src/core/services.d.ts
536
+ declare const Services: {
537
+ readonly AI: ServiceRef<AIService>;
538
+ readonly Config: ServiceRef<ConfigService>;
539
+ readonly Screenshot: ServiceRef<ScreenshotService>;
540
+ readonly Help: ServiceRef<HelpService>;
541
+ };
542
+ type BuiltinServiceRef = typeof Services.AI | typeof Services.Config | typeof Services.Screenshot | typeof Services.Help;
543
+ //# sourceMappingURL=services.d.ts.map
544
+ //#endregion
516
545
  //#region src/core/data-paths.d.ts
517
546
  declare function getPluginDataDir(pluginName: string): string;
518
547
  declare function getServiceDataDir(serviceName: string): string;
@@ -524,9 +553,19 @@ declare function ensureDataDir(pluginName: string): string;
524
553
  //# sourceMappingURL=data-paths.d.ts.map
525
554
  //#endregion
526
555
  //#region src/core/plugin-runtime-state.d.ts
527
- declare function getPluginRuntimeState(pluginName: string): Record<string, any>;
528
- declare function setPluginRuntimeState(pluginName: string, state: Record<string, any>): Record<string, any>;
529
- declare function resetPluginRuntimeState(pluginName: string): void;
556
+ interface PluginStateRef<T> {
557
+ readonly name: string;
558
+ get(): T;
559
+ set(next: T): void;
560
+ reset(): void;
561
+ }
562
+ declare function defineState<T>(name: string, initial: T): PluginStateRef<T>;
563
+ declare function hasPluginState(name: string): boolean;
564
+ declare function getPluginRuntimeState<T = Record<string, any>>(name: string): T;
565
+ declare function setPluginRuntimeState<T>(name: string, state: T): void;
566
+ declare function resetPluginRuntimeState(name: string): void;
567
+ declare function getAllPluginRuntimeStates(): Record<string, unknown>;
568
+ //# sourceMappingURL=plugin-runtime-state.d.ts.map
530
569
  //#endregion
531
570
  //#region src/core/exec.d.ts
532
571
  declare function resolveCommand(command: string): string | null;
@@ -559,5 +598,5 @@ interface MiokuStartOptions {
559
598
  declare function start(options?: MiokuStartOptions): Promise<void>;
560
599
  declare const version: string;
561
600
  //#endregion
562
- 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 RunCommandResult, type ScreenshotService, type ServiceMetadata, type SessionToolDefinition, type SkillPermissionRole, type SpawnPlan, TOOL_RESULT_FOLLOWUP_KEY, type TextMessage, type ToolCallRecord, type ToolResultFollowup, type WebUIService, buildSpawnPlan, commandExists, definePlugin, deleteServiceConfig, ensureDataDir, getConfigDir, getDataDir, getPluginConfigDir, getPluginDataDir, getPluginRuntimeState, getServiceConfig, getServiceConfigDir, getServiceConfigs, getServiceDataDir, _default as pluginManager, registerPluginArtifacts, registerServiceConfig, resetPluginRuntimeState, resolveCommand, runCommand, runCommandInherit, _default$1 as serviceManager, setPluginRuntimeState, start, updateServiceConfig, version };
601
+ 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 BuiltinServiceRef, 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 EventMap, type HelpService, type MiokiContext, type MiokiPlugin, type MiokuRuntimeConfig, type MiokuService, MiokuStartOptions, type MultimodalContentItem, type MultimodalMessage, type PackageJsonLike, type PluginHelp, type PluginMetadata, type PluginPackageConfig, type PluginStateRef, type RunCommandResult, type ScreenshotService, type ServiceMetadata, type ServiceRef, Services, type SessionToolDefinition, type SkillPermissionRole, type SpawnPlan, TOOL_RESULT_FOLLOWUP_KEY, type TextMessage, type ToolCallRecord, type ToolResultFollowup, type WebUIService, buildSpawnPlan, commandExists, definePlugin, defineService, defineState, deleteServiceConfig, ensureDataDir, getAllPluginRuntimeStates, getConfigDir, getDataDir, getPluginConfigDir, getPluginDataDir, getPluginRuntimeState, getService, getServiceConfig, getServiceConfigDir, getServiceConfigs, getServiceDataDir, hasPluginState, hasService, normalizeSkillPermissionRole, _default as pluginManager, registerPluginArtifacts, registerServiceConfig, requireService, resetPluginRuntimeState, resolveCommand, runCommand, runCommandInherit, _default$1 as serviceManager, setPluginRuntimeState, start, updateServiceConfig, version };
563
602
  //# sourceMappingURL=index.d.cts.map
@@ -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/core/exec.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/service.ts","../src/core/services.ts","../src/core/data-paths.ts","../src/core/plugin-runtime-state.ts","../src/core/exec.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as mioki0 from "mioki";
2
2
  import { MiokiContext, MiokiContext as MiokiContext$1, MiokiPlugin } from "mioki";
3
+ import { EventMap } from "napcat-sdk";
3
4
 
4
5
  //#region src/types.d.ts
5
6
  interface MiokuService {
@@ -56,6 +57,15 @@ interface PluginHelp {
56
57
  }>;
57
58
  }
58
59
  type CommandRole = "master" | "admin" | "owner" | "member";
60
+ /**
61
+ * - `"master"`:仅 bot 主人可触发
62
+ * - `"owner"`:legacy alias
63
+ * - `"admin"`:bot 主人或管理员
64
+ * - `"member"`:群内任意成员
65
+ *
66
+ */
67
+ type SkillPermissionRole = "master" | "owner" | "admin" | "member";
68
+ declare function normalizeSkillPermissionRole(role: unknown): SkillPermissionRole;
59
69
  interface AccessHook {
60
70
  id: string;
61
71
  match?: string;
@@ -112,7 +122,6 @@ interface AITool {
112
122
  };
113
123
  handler: (args: any, event?: any) => Promise<any> | any;
114
124
  }
115
- type SkillPermissionRole = "owner" | "admin" | "member";
116
125
  interface AISkill {
117
126
  name: string;
118
127
  description: string;
@@ -513,6 +522,26 @@ declare function getServiceConfigs(serviceName: string): Promise<Record<string,
513
522
  declare function deleteServiceConfig(serviceName: string, configName: string): Promise<boolean>;
514
523
  //# sourceMappingURL=service-config.d.ts.map
515
524
  //#endregion
525
+ //#region src/core/service.d.ts
526
+ interface ServiceRef<T> {
527
+ readonly id: string;
528
+ }
529
+ declare function defineService<T>(id: string): ServiceRef<T>;
530
+ declare function getService<T>(ctx: MiokiContext$1, ref: ServiceRef<T>): T | undefined;
531
+ declare function requireService<T>(ctx: MiokiContext$1, ref: ServiceRef<T>): T;
532
+ declare function hasService<T>(ctx: MiokiContext$1, ref: ServiceRef<T>): boolean;
533
+ //# sourceMappingURL=service.d.ts.map
534
+ //#endregion
535
+ //#region src/core/services.d.ts
536
+ declare const Services: {
537
+ readonly AI: ServiceRef<AIService>;
538
+ readonly Config: ServiceRef<ConfigService>;
539
+ readonly Screenshot: ServiceRef<ScreenshotService>;
540
+ readonly Help: ServiceRef<HelpService>;
541
+ };
542
+ type BuiltinServiceRef = typeof Services.AI | typeof Services.Config | typeof Services.Screenshot | typeof Services.Help;
543
+ //# sourceMappingURL=services.d.ts.map
544
+ //#endregion
516
545
  //#region src/core/data-paths.d.ts
517
546
  declare function getPluginDataDir(pluginName: string): string;
518
547
  declare function getServiceDataDir(serviceName: string): string;
@@ -524,9 +553,19 @@ declare function ensureDataDir(pluginName: string): string;
524
553
  //# sourceMappingURL=data-paths.d.ts.map
525
554
  //#endregion
526
555
  //#region src/core/plugin-runtime-state.d.ts
527
- declare function getPluginRuntimeState(pluginName: string): Record<string, any>;
528
- declare function setPluginRuntimeState(pluginName: string, state: Record<string, any>): Record<string, any>;
529
- declare function resetPluginRuntimeState(pluginName: string): void;
556
+ interface PluginStateRef<T> {
557
+ readonly name: string;
558
+ get(): T;
559
+ set(next: T): void;
560
+ reset(): void;
561
+ }
562
+ declare function defineState<T>(name: string, initial: T): PluginStateRef<T>;
563
+ declare function hasPluginState(name: string): boolean;
564
+ declare function getPluginRuntimeState<T = Record<string, any>>(name: string): T;
565
+ declare function setPluginRuntimeState<T>(name: string, state: T): void;
566
+ declare function resetPluginRuntimeState(name: string): void;
567
+ declare function getAllPluginRuntimeStates(): Record<string, unknown>;
568
+ //# sourceMappingURL=plugin-runtime-state.d.ts.map
530
569
  //#endregion
531
570
  //#region src/core/exec.d.ts
532
571
  declare function resolveCommand(command: string): string | null;
@@ -559,5 +598,5 @@ interface MiokuStartOptions {
559
598
  declare function start(options?: MiokuStartOptions): Promise<void>;
560
599
  declare const version: string;
561
600
  //#endregion
562
- 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 RunCommandResult, type ScreenshotService, type ServiceMetadata, type SessionToolDefinition, type SkillPermissionRole, type SpawnPlan, TOOL_RESULT_FOLLOWUP_KEY, type TextMessage, type ToolCallRecord, type ToolResultFollowup, type WebUIService, buildSpawnPlan, commandExists, definePlugin, deleteServiceConfig, ensureDataDir, getConfigDir, getDataDir, getPluginConfigDir, getPluginDataDir, getPluginRuntimeState, getServiceConfig, getServiceConfigDir, getServiceConfigs, getServiceDataDir, _default as pluginManager, registerPluginArtifacts, registerServiceConfig, resetPluginRuntimeState, resolveCommand, runCommand, runCommandInherit, _default$1 as serviceManager, setPluginRuntimeState, start, updateServiceConfig, version };
601
+ 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 BuiltinServiceRef, 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 EventMap, type HelpService, type MiokiContext, type MiokiPlugin, type MiokuRuntimeConfig, type MiokuService, MiokuStartOptions, type MultimodalContentItem, type MultimodalMessage, type PackageJsonLike, type PluginHelp, type PluginMetadata, type PluginPackageConfig, type PluginStateRef, type RunCommandResult, type ScreenshotService, type ServiceMetadata, type ServiceRef, Services, type SessionToolDefinition, type SkillPermissionRole, type SpawnPlan, TOOL_RESULT_FOLLOWUP_KEY, type TextMessage, type ToolCallRecord, type ToolResultFollowup, type WebUIService, buildSpawnPlan, commandExists, definePlugin, defineService, defineState, deleteServiceConfig, ensureDataDir, getAllPluginRuntimeStates, getConfigDir, getDataDir, getPluginConfigDir, getPluginDataDir, getPluginRuntimeState, getService, getServiceConfig, getServiceConfigDir, getServiceConfigs, getServiceDataDir, hasPluginState, hasService, normalizeSkillPermissionRole, _default as pluginManager, registerPluginArtifacts, registerServiceConfig, requireService, resetPluginRuntimeState, resolveCommand, runCommand, runCommandInherit, _default$1 as serviceManager, setPluginRuntimeState, start, updateServiceConfig, version };
563
602
  //# sourceMappingURL=index.d.ts.map