@huyooo/ai-chat-host-node 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/asset/files.d.ts +25 -0
  2. package/dist/asset/files.d.ts.map +1 -0
  3. package/dist/asset/loader.d.ts +40 -0
  4. package/dist/asset/loader.d.ts.map +1 -0
  5. package/dist/asset/manager.d.ts +37 -0
  6. package/dist/asset/manager.d.ts.map +1 -0
  7. package/dist/asset/metadata.d.ts +10 -0
  8. package/dist/asset/metadata.d.ts.map +1 -0
  9. package/dist/asset/tool-modules.d.ts +12 -0
  10. package/dist/asset/tool-modules.d.ts.map +1 -0
  11. package/dist/build-externals.d.ts +16 -0
  12. package/dist/build-externals.d.ts.map +1 -0
  13. package/dist/index.d.ts +32 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +24 -0
  16. package/dist/llm-config-loader.d.ts +9 -0
  17. package/dist/llm-config-loader.d.ts.map +1 -0
  18. package/dist/metadata-store/index.d.ts +11 -0
  19. package/dist/metadata-store/index.d.ts.map +1 -0
  20. package/dist/metadata-store/json-file-store.d.ts +9 -0
  21. package/dist/metadata-store/json-file-store.d.ts.map +1 -0
  22. package/dist/metadata-store/sqlite-store.d.ts +16 -0
  23. package/dist/metadata-store/sqlite-store.d.ts.map +1 -0
  24. package/dist/metadata-store/types.d.ts +12 -0
  25. package/dist/metadata-store/types.d.ts.map +1 -0
  26. package/dist/scaffold-types.d.ts +39 -0
  27. package/dist/scaffold-types.d.ts.map +1 -0
  28. package/dist/skills/frontmatter.d.ts +28 -0
  29. package/dist/skills/frontmatter.d.ts.map +1 -0
  30. package/dist/skills/scan-skills.d.ts +16 -0
  31. package/dist/skills/scan-skills.d.ts.map +1 -0
  32. package/dist/skills/skill-file-ops.d.ts +15 -0
  33. package/dist/skills/skill-file-ops.d.ts.map +1 -0
  34. package/dist/tool-executor.d.ts +12 -0
  35. package/dist/tool-executor.d.ts.map +1 -0
  36. package/package.json +61 -0
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 资产目录路径与 package.json 辅助(Node fs)
3
+ *
4
+ * - manifest / entry / package.json 路径解析与读写
5
+ * - 工具资产 npm 依赖合并等构建前准备
6
+ */
7
+ interface AssetPackageJson {
8
+ dependencies?: Record<string, string>;
9
+ [key: string]: unknown;
10
+ }
11
+ export declare function getAssetManifestPath(assetDir: string): string;
12
+ export declare function hasAssetManifest(assetDir: string): boolean;
13
+ export declare function getAssetPackageJsonPath(assetDir: string): string;
14
+ export declare function hasAssetPackageJson(assetDir: string): boolean;
15
+ export declare function readAssetPackageJson(assetDir: string): AssetPackageJson | undefined;
16
+ export declare function writeAssetPackageJson(assetDir: string, pkg: AssetPackageJson): void;
17
+ export declare function readAssetDependencies(assetDir: string): Record<string, string> | undefined;
18
+ export declare function writeAssetDependencies(assetDir: string, dependencies: Record<string, string>): void;
19
+ export declare function getAssetEntryPath(assetDir: string): string;
20
+ export declare function hasAssetEntry(assetDir: string): boolean;
21
+ export declare function resolveAssetSourcePath(assetDir: string, relativePaths: string[]): string | undefined;
22
+ export declare function readAssetSourceFile(assetDir: string, relativePaths: string[]): string | undefined;
23
+ export declare function writeAssetSourceFile(assetDir: string, relativePaths: string[], content: string): string;
24
+ export {};
25
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/asset/files.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,UAAU,gBAAgB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAWnF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAEnF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAE1F;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAMnG;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAQpG;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAIjG;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,EAAE,MAAM,GACd,MAAM,CAKR"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 工具资产动态加载(Node ESM)
3
+ *
4
+ * 市场扩展统一使用 defineExtension 模式:
5
+ * export default defineExtension({ databases, activate })
6
+ * 宿主负责注册 DB、注入 ExtensionContext、调用 activate 获取 tools
7
+ *
8
+ * loadAssetTools 仅保留给用户自定义 tool 资产(单工具/多工具导出)。
9
+ */
10
+ import { type Tool } from '@huyooo/ai-chat-core';
11
+ import type { AssetMeta, AssetToolMeta } from '@huyooo/ai-chat-core';
12
+ import type { ExtensionDefinitionMarked, ExtensionContext } from '@huyooo/ai-chat-core/runtime';
13
+ /** 检查 default export 是否为 defineExtension 产物 */
14
+ export declare function isExtensionDefinition(value: unknown): value is ExtensionDefinitionMarked;
15
+ interface ImportAssetModuleOptions {
16
+ mode?: 'runtime' | 'metadata';
17
+ }
18
+ export declare function importAssetModule(assetDir: string, options?: ImportAssetModuleOptions): Promise<any>;
19
+ /**
20
+ * 从 defineExtension 模块激活扩展并获取工具。
21
+ * 宿主需先注册 databases,构建 ctx 后调用此函数。
22
+ */
23
+ export declare function activateExtension(definition: ExtensionDefinitionMarked, ctx: ExtensionContext, assetId: string): Tool[];
24
+ /**
25
+ * 动态加载 Tool 资产产物。
26
+ *
27
+ * 用户工具资产统一使用 defineExtension + defineTool:
28
+ * export default defineExtension({ activate() { return [defineTool(...)] } })
29
+ */
30
+ export declare function loadAssetTools(assetDir: string, fallbackName: string, metaOverride?: AssetMeta, preloadedModule?: Record<string, unknown>): Promise<Tool[]>;
31
+ export declare function loadAssetTool(assetDir: string, name: string, metaOverride?: AssetMeta): Promise<Tool | undefined>;
32
+ /**
33
+ * 从已构建产物中提取 Tool 元数据(用于自动回写 manifest)。
34
+ *
35
+ * 用户工具资产统一通过 defineExtension.activate() 获取 Tool[],
36
+ * 再从 defineTool 产物提取 schema / governance 等元数据。
37
+ */
38
+ export declare function extractToolMetaFromBuild(assetDir: string): Promise<AssetToolMeta[]>;
39
+ export {};
40
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/asset/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EAA8B,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAKhG,+CAA+C;AAC/C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,yBAAyB,CAIxF;AAiDD,UAAU,wBAAwB;IAChC,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;CAC/B;AAgHD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,gBAmB/F;AAkDD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,yBAAyB,EACrC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,GACd,IAAI,EAAE,CAGR;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,SAAS,EACxB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,OAAO,CAAC,IAAI,EAAE,CAAC,CAajB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,SAAS,GACvB,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAG3B;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAoBzF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Asset Manager — 项目模式资产编排
3
+ *
4
+ * - 扫描本地 skills 并装配 SkillRegistry
5
+ * - 注入 skill 管理插件与元数据存储回调
6
+ * - 单一入口供宿主初始化「市场 + 本地」资产运行时
7
+ */
8
+ import type { Tool, ToolPlugin, ToolConfigItem, ToolRuntimeManager, InProcessProvider, SkillRegistry, PartRegistry } from '@huyooo/ai-chat-core';
9
+ import type { SkillScanResult } from '../skills/scan-skills';
10
+ import type { AssetMetadataStore } from '../metadata-store/types.js';
11
+ export type { AssetMetadataStore } from '../metadata-store/types.js';
12
+ export interface AssetManagerOptions {
13
+ tools?: (Tool | ToolPlugin)[];
14
+ assetsDir?: string;
15
+ metadataStore?: AssetMetadataStore;
16
+ preloadTools?: string[] | true;
17
+ }
18
+ export interface AssetManager {
19
+ readonly tools: ToolConfigItem[];
20
+ bind(agent: unknown): Promise<void>;
21
+ unbind(): void;
22
+ readonly toolRuntimeManager: ToolRuntimeManager;
23
+ readonly inProcessProvider: InProcessProvider;
24
+ readonly skillRegistry: SkillRegistry;
25
+ readonly partRegistry: PartRegistry;
26
+ readonly skillScanResult: SkillScanResult | undefined;
27
+ getEnabledSkillContents(): string[];
28
+ getMcpConnectionInfos(): Array<{
29
+ name: string;
30
+ status: string;
31
+ toolCount: number;
32
+ error?: string;
33
+ }>;
34
+ destroy(): Promise<void>;
35
+ }
36
+ export declare function assetManager(options?: AssetManagerOptions): Promise<AssetManager>;
37
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/asset/manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,KAAK,EACV,IAAI,EACJ,UAAU,EACV,cAAc,EACd,kBAAkB,EAElB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAU7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,IAAI,CAAC;IACf,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChD,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IACtD,uBAAuB,IAAI,MAAM,EAAE,CAAC;IACpC,qBAAqB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6K3F"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * manifest.json 读写(AssetMeta)
3
+ *
4
+ * - 读取失败返回 undefined,更新时与磁盘原子写协调
5
+ * - 供扫描器与管理 API 同步资产元数据
6
+ */
7
+ import type { AssetMeta } from '@huyooo/ai-chat-core';
8
+ export declare function readAssetMeta(assetDir: string): AssetMeta | undefined;
9
+ export declare function updateAssetMeta(assetDir: string, partial: Partial<AssetMeta>): void;
10
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/asset/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAWrE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAKnF"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 工具模块文件操作 & 入口代码生成
3
+ *
4
+ * - 管理插件创建/删除单工具模块文件
5
+ * - renderToolModulesIndex 生成 defineExtension 入口
6
+ */
7
+ /** 生成多工具 defineExtension 入口文件。每个子工具模块默认导出 defineTool(...)。 */
8
+ export declare function renderToolModulesIndex(toolNames: string[]): string;
9
+ export declare function getToolModulePath(toolName: string): string;
10
+ export declare function writeToolModule(assetDir: string, toolName: string, code: string): void;
11
+ export declare function deleteToolModule(assetDir: string, toolName: string): void;
12
+ //# sourceMappingURL=tool-modules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-modules.d.ts","sourceRoot":"","sources":["../../src/asset/tool-modules.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAYlE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAItF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGzE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 扩展构建 externals 判定
3
+ *
4
+ * 由宿主运行时提供的模块,构建时标记为 external 不打包。
5
+ * 唯一真相源 — superx-ext 和 superx 均从此处引用。
6
+ *
7
+ * 设计原则 (Platform API Contract):
8
+ * - Node 内置模块通过 builtinModules 动态获取,无需手动枚举子路径
9
+ * - 平台 SDK / 宿主预装原生包按包名前缀匹配,自动覆盖任意深度的子路径 import
10
+ * - 第三方 npm 包不在此列,由扩展开发者自行声明依赖并打包进产物
11
+ */
12
+ /** 判断 import specifier 是否由 Node 端宿主运行时提供(不打包) */
13
+ export declare function isExtensionNodeExternal(id: string): boolean;
14
+ /** 判断 import specifier 是否由前端宿主提供(不打包) */
15
+ export declare function isExtensionFrontendExternal(id: string): boolean;
16
+ //# sourceMappingURL=build-externals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-externals.d.ts","sourceRoot":"","sources":["../src/build-externals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuCH,iDAAiD;AACjD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED,yCAAyC;AACzC,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE/D"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @huyooo/ai-chat-host-node
3
+ *
4
+ * Node.js 宿主能力:
5
+ *
6
+ * asset/ 资产子系统
7
+ * files.ts — 资产目录路径与 package.json 读写
8
+ * metadata.ts — manifest.json 读写(AssetMeta)
9
+ * loader.ts — Tool 动态加载(defineTool 产物)
10
+ * tool-modules.ts — 工具源码文件操作
11
+ * manager.ts — 高层编排(assetManager)
12
+ * skills/ 技能文件扫描与 frontmatter
13
+ * metadata-store/ 元数据持久化
14
+ * llm-config-loader.ts — LLM 配置文件加载
15
+ * tool-executor.ts — 默认工具执行器
16
+ */
17
+ export { getAssetManifestPath, hasAssetManifest, getAssetPackageJsonPath, hasAssetPackageJson, readAssetPackageJson, writeAssetPackageJson, readAssetDependencies, writeAssetDependencies, getAssetEntryPath, hasAssetEntry, resolveAssetSourcePath, readAssetSourceFile, writeAssetSourceFile, } from './asset/files';
18
+ export { readAssetMeta, updateAssetMeta } from './asset/metadata';
19
+ export { loadAssetTool, loadAssetTools, extractToolMetaFromBuild, importAssetModule, isExtensionDefinition, activateExtension, } from './asset/loader';
20
+ export { getToolModulePath, writeToolModule, deleteToolModule, renderToolModulesIndex } from './asset/tool-modules';
21
+ export { isExtensionNodeExternal, isExtensionFrontendExternal } from './build-externals';
22
+ export type { ProjectTemplate, ScaffoldParams, ScaffoldResult } from './scaffold-types';
23
+ export { assetManager } from './asset/manager';
24
+ export type { AssetManager, AssetManagerOptions, AssetMetadataStore } from './asset/manager';
25
+ export { scanSkillsDir } from './skills/scan-skills';
26
+ export type { SkillScanResult } from './skills/scan-skills';
27
+ export { parseFrontmatter, buildSkillMd } from './skills/frontmatter';
28
+ export type { SqliteMetadataStoreInput } from './metadata-store';
29
+ export { createJsonFileStore, createSqliteMetadataStore } from './metadata-store';
30
+ export { loadLLMConfigFromFile } from './llm-config-loader';
31
+ export { createDefaultToolExecutor } from './tool-executor';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,EACL,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAGpH,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGzF,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGxF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG7F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGtE,YAAY,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAGlF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ import{builtinModules as e}from"node:module";import{existsSync as t,mkdirSync as n,readFileSync as r,rmSync as i,writeFileSync as a}from"fs";import{dirname as o,join as s}from"path";import{builtinModules as c,createRequire as l}from"module";import{homedir as u,tmpdir as d}from"os";import{pathToFileURL as f}from"url";import{createInProcessProvider as p,createResolvedOutputSchema as m,createToolRuntimeManager as h,partRegistry as g,skillManagementPlugin as ee,skillRegistry as te}from"@huyooo/ai-chat-core";import _ from"node:path";import v from"node:fs";import{parse as y,stringify as b}from"yaml";function x(e){return s(e,`manifest.json`)}function ne(e){return t(x(e))}function S(e){return s(e,`package.json`)}function re(e){return t(S(e))}function C(e){let n=S(e);if(t(n))try{let e=JSON.parse(r(n,`utf-8`));return!e||typeof e!=`object`?void 0:e}catch{return}}function w(e,t){a(S(e),JSON.stringify(t,null,2),`utf-8`)}function ie(e){return C(e)?.dependencies}function T(e,t){let n=C(e);n&&(n.dependencies=t,w(e,n))}function E(e){return s(e,`dist`,`index.mjs`)}function ae(e){return t(E(e))}function D(e,n){for(let r of n){let n=s(e,r);if(t(n))return n}}function oe(e,t){let n=D(e,t);if(n)return r(n,`utf-8`)}function se(e,t,r){let i=D(e,t)??s(e,t[0]);return n(o(i),{recursive:!0}),a(i,r,`utf-8`),i}function O(e){let n=x(e);if(t(n))try{let e=JSON.parse(r(n,`utf-8`));return!e||typeof e!=`object`||Array.isArray(e)?void 0:e}catch{return}}function ce(e,t){let n=x(e),r={...O(e)??{},...t};a(n,JSON.stringify(r,null,2),`utf-8`)}const le=new Set([`@huyooo/ai-chat-core`,`@sinclair/typebox`,`better-sqlite3`,`electron`]),ue=new Set([`react`,`react-dom`,`vue`,`@huyooo/ai-chat-shared`]);function k(e){if(e.startsWith(`@`)){let t=e.split(`/`);return t.length>=2?`${t[0]}/${t[1]}`:e}return e.split(`/`)[0]}function de(t){return t.startsWith(`node:`)?!0:e.includes(k(t))}function A(e){return de(e)?!0:le.has(k(e))}function j(e){return ue.has(k(e))}function M(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.__isExtension===!0&&typeof t.activate==`function`}function N(e,t){return e.assetId===t?e:{...e,assetId:t}}function P(e,t){if(e){if(Array.isArray(e.tools)&&e.tools.length>0)return e.tools.find(e=>e.name===t.name);if(e.name===t.name||!t.assetId)return{description:e.description??t.description,parameters:e.parameters,outputSchema:e.outputSchema,errorSchema:e.errorSchema,category:e.category,tags:e.tags,enabled:e.enabled,governance:e.governance}}}function F(e,t){let n=P(t,e);if(!n)return{...e,resolvedOutputSchema:e.resolvedOutputSchema??(e.outputSchema?m(e.outputSchema):void 0)};let r=e.outputSchema??n.outputSchema;return{...e,outputSchema:r,resolvedOutputSchema:e.resolvedOutputSchema??(r?m(r):void 0),errorSchema:e.errorSchema??n.errorSchema}}const I=l(import.meta.url),L=/\b(?<kind>import|export)\b(?<prefix>[\s\S]*?\bfrom\s*)(?<quote>['"])(?<specifier>[^'"]+)\k<quote>/g,R=/\bimport\s*(?<quote>['"])(?<specifier>[^'"]+)\k<quote>/g,z=/\bimport\s*\(\s*(?<quote>['"])(?<specifier>[^'"]+)\k<quote>\s*\)/g;function B(e){if(e.startsWith(`@`)){let t=e.split(`/`);return t.length>=2?`${t[0]}/${t[1]}`:e}return e.split(`/`)[0]}function V(e){return!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`file:`)}function H(e){return e.startsWith(`node:`)?!0:c.includes(B(e))}function fe(e,t){let n=s(d(),`superx-asset-stub-${e}.mjs`);return a(n,t),f(n).href}function pe(e){if(e===`electron`)return fe(`electron`,`
2
+ export const shell = {};
3
+ export class Notification { show() {} }
4
+ export const nativeTheme = {};
5
+ export const net = {};
6
+ export const screen = {};
7
+ export const clipboard = {};
8
+ export const nativeImage = {};
9
+ export const powerMonitor = {};
10
+ export const ipcMain = {};
11
+ export class BrowserWindow {}
12
+ export default { shell, Notification, nativeTheme, net, screen, clipboard, nativeImage, powerMonitor, ipcMain, BrowserWindow };
13
+ `)}function me(e,t,n){if(!(!V(e)||H(e)||!A(e))){if(n.mode===`metadata`){let t=pe(e);if(t)return t}if(e!==`electron`)try{return f(I.resolve(e)).href}catch(n){try{return f(t.resolve(e)).href}catch{throw Error(`扩展产物依赖平台包 "${e}",但宿主和扩展依赖目录都无法解析该包。请确认宿主已安装该平台依赖,或扩展 tools/package.json 已声明该依赖。`,{cause:n})}}}}function he(e,t,n){let r=!1,i=e=>{let i=me(e,t,n);return i?(r=!0,i):e};return{code:e.replace(L,(e,t,n,r,a)=>{let o=i(a);return o===a?e:`${t}${n}${r}${o}${r}`}).replace(R,(e,t,n)=>{let r=i(n);return r===n?e:`import ${t}${r}${t}`}).replace(z,(e,t,n)=>{let r=i(n);return r===n?e:`import(${t}${r}${t})`}),changed:r}}async function U(e,n={}){let c=E(e);if(!t(c))return;let u=he(r(c,`utf-8`),l(f(c)),n),d=c;u.changed&&(d=s(o(c),`.superx-asset-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`),a(d,u.code));let p=f(d).href;try{return await import(`${p}?t=${Date.now()}-${Math.random().toString(36).slice(2)}`)}finally{d!==c&&i(d,{force:!0})}}function W(e){let t=async()=>{throw Error(`standalone tool asset does not provide host AI services`)};return{getDatabase(e){throw Error(`standalone tool asset does not provide database "${e}"`)},paths:{extensionDir:e,dataDir:e,downloadsDir:e},ai:{gemini:{generate:t},doubao:{generate:t},deepseek:{generate:t},qwen:{generate:t},glm:{generate:t},moonshot:{generate:t},minimax:{generate:t},openai:{generate:t},anthropic:{generate:t},grok:{generate:t}}}}function ge(e){let t={run:()=>({changes:0,lastInsertRowid:0}),get:()=>void 0,all:()=>[],iterate:()=>[][Symbol.iterator]()},n={exec:()=>void 0,prepare:()=>t,transaction:e=>e};return{...W(e),getDatabase(){return n}}}function G(e,t,n){return e.activate(t).map(e=>N(e,n))}async function K(e,t,n,r){let i=r??await U(e);if(!i)return[];let a=n??O(e),o=a?.assetId??t;return i.default&&M(i.default)?G(i.default,W(e),o).map(e=>F(e,a)):[]}async function _e(e,t,n){return(await K(e,t,n))[0]}async function ve(e){let t=await U(e,{mode:`metadata`});if(!t)return[];let n=[];return t.default&&M(t.default)&&(n=G(t.default,ge(e),``)),n.map(e=>({name:e.name,displayName:e.displayName,description:e.description,parameters:e.parameters,outputSchema:e.outputSchema,errorSchema:e.errorSchema,category:e.category,tags:e.tags,enabled:!0}))}function ye(e,t){let n=e.replace(/[^a-zA-Z0-9_]/g,`_`);return`${/^[A-Za-z_]/.test(n)?n:`tool_${n}`}_${t}`}function be(e){let t=e.map((e,t)=>{let n=ye(e,t);return{identifier:n,statement:`import ${n} from './tools/${e}';`}}),n=t.map(e=>e.identifier).join(`, `);return`import { defineExtension } from '@huyooo/ai-chat-core/runtime';\n${t.map(e=>e.statement).join(`
14
+ `)}\n\nexport default defineExtension({\n activate() {\n return [${n}];\n },\n});\n`}function q(e){return s(`src`,`tools`,`${e}.ts`)}function xe(e,t,r){let i=s(e,q(t));n(o(i),{recursive:!0}),a(i,r,`utf-8`)}function Se(e,t){i(s(e,q(t)),{force:!0})}const Ce=/^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/;function we(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t=e,n={};return typeof t.name==`string`&&(n.name=t.name),typeof t.description==`string`&&(n.description=t.description),typeof t.category==`string`&&(n.category=t.category),typeof t.icon==`string`&&(n.icon=t.icon),typeof t.source==`string`&&(n.source=t.source),Array.isArray(t.tags)&&(n.tags=t.tags.filter(e=>typeof e==`string`)),n}function J(e){let t=e.match(Ce);if(!t||t[1]===void 0||t[2]===void 0)return{meta:{},body:e};try{return{meta:we(y(t[1])),body:t[2]}}catch{return{meta:{},body:t[2]}}}function Y(e){return`---
15
+ ${b({name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:e.source}).trimEnd()}
16
+ ---
17
+
18
+ ${e.instructions}
19
+ `}function X(e,t,n){let r={registered:[],errors:[]};if(!v.existsSync(e))return v.mkdirSync(e,{recursive:!0}),r;for(let i of v.readdirSync(e,{withFileTypes:!0})){if(!i.isDirectory())continue;let a=i.name,o=_.join(e,a),s=_.join(o,`SKILL.md`);if(v.existsSync(s))try{let{meta:e}=J(v.readFileSync(s,`utf-8`)),i=_.join(o,`references`),c=_.join(o,`scripts`),l=v.existsSync(i)?v.readdirSync(i).filter(e=>e.endsWith(`.md`)):[],u=v.existsSync(c)?v.readdirSync(c):[],d=e.source||`user`,f=n[a]??!1;t.add({id:a,name:e.name||a,description:e.description||``,category:e.category||`通用`,tags:Array.isArray(e.tags)?e.tags:[],icon:e.icon||`✨`,source:d,enabled:f,references:l,scripts:u}),r.registered.push(a)}catch(e){r.errors.push({id:a,error:e instanceof Error?e.message:String(e)})}}return r}function Te(e){return async(t,n)=>{e.setSkillEnabled(t,n)}}function Ee(e,t){return async n=>{let r=_.join(e,n.id);try{v.mkdirSync(r,{recursive:!0});let e=Y({name:n.name,description:n.description,category:n.category,tags:n.tags,icon:n.icon,source:`user`,instructions:n.instructions});return v.writeFileSync(_.join(r,`SKILL.md`),e,`utf-8`),t.setSkillEnabled(n.id,!0),{ok:!0}}catch(e){return{error:`创建技能文件失败: ${e instanceof Error?e.message:String(e)}`}}}}function De(e){return async t=>{let n=_.join(e,t.id);try{v.mkdirSync(n,{recursive:!0});let e=Y({name:t.name,description:t.description,category:t.category,tags:t.tags,icon:t.icon,source:`user`,instructions:t.instructions});return v.writeFileSync(_.join(n,`SKILL.md`),e,`utf-8`),{ok:!0}}catch(e){return{error:`更新技能文件失败: ${e instanceof Error?e.message:String(e)}`}}}}function Oe(e,t){return async n=>{let r=_.join(e,n);try{return v.existsSync(r)&&v.rmSync(r,{recursive:!0,force:!0}),t.removeSkillState(n),{ok:!0}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}}function ke(e){return async t=>{let n=_.join(e,t,`SKILL.md`);try{let{meta:e,body:r}=J(v.readFileSync(n,`utf-8`));return{name:e.name||t,instructions:r.trim()}}catch(e){return{error:e instanceof Error?e.message:String(e)}}}}function Z(e){return async(t,n)=>{let r=_.basename(n),i=_.join(e,t,`references`,r);try{return v.existsSync(i)?{content:v.readFileSync(i,`utf-8`)}:{error:`Reference 不存在: ${n}`}}catch(e){return{error:e instanceof Error?e.message:String(e)}}}}function Q(e){let t=_.join(e,`skills-state.json`);function n(){try{if(v.existsSync(t))return JSON.parse(v.readFileSync(t,`utf-8`))}catch{}return{}}function r(n){v.mkdirSync(e,{recursive:!0}),v.writeFileSync(t,JSON.stringify(n,null,2),`utf-8`)}return{getSkillEnabledState:n,setSkillEnabled(e,t){let i=n();i[e]=t,r(i)},removeSkillState(e){let t=n();delete t[e],r(t)}}}async function Ae(e={}){let{tools:t=[],assetsDir:n,metadataStore:r,preloadTools:i}=e,a=r??(n?Q(n):void 0),o=h(),s=p(`user-tools`),c=te(),l=g(),u=null,d,f=null,m=null,y=[...t],b=n?_.join(n,`skills`):void 0;if(n&&(await o.addProvider(s),i)){let e=o.getAllDescriptors(),t=i===!0?e.map(e=>e.alias):i;await o.enable(t)}n&&b&&a&&(v.mkdirSync(b,{recursive:!0}),d=X(b,c,a.getSkillEnabledState()),y.push(ee({registry:c,onSkillSetEnabled:Te(a),onSkillLoadContent:ke(b),onSkillLoadReference:Z(b),onSkillCreate:Ee(b,a),onSkillUpdate:De(b),onSkillDelete:Oe(b,a)})));let x=()=>{m&&=(o.removeSessionToolsChangeListener(m),null),u&&f&&u.removeProvider(f.id),f=null,u=null};return{tools:y,async bind(e){m&&x();let t=e;if(!t.getToolRuntimeManager)return;u=t.getToolRuntimeManager(),f=p(`asset-manager-session`),await u.addProvider(f);let n=async()=>{if(!u||!f)return;let e=o.getSessionTools(),t=new Set(e.keys()),n=f.getDescriptors().map(e=>e.alias);for(let e of n)t.has(e)||(u.disable([e]),f.unregister(e));for(let[t,n]of e){let e=o.getDescriptor(t),r=e?{category:e.category,tags:e.tags,source:e.source}:void 0;f.has(t)?f.replace(n,r):f.register(n,r)}let r=[...t];r.length>0&&(u.disable(r),await u.enable(r))};m=()=>{n()},o.addSessionToolsChangeListener(m),await n()},unbind:x,get toolRuntimeManager(){return o},get inProcessProvider(){return s},get skillRegistry(){return c},get partRegistry(){return l},get skillScanResult(){return d},getMcpConnectionInfos(){let e=[];for(let t of o.getProviders())if(`getConnectionInfo`in(o.getProvider(t.id)??{})){let n=o.getProvider(t.id);if(n&&`getConnectionInfo`in n){let t=n.getConnectionInfo();e.push(t)}}return e},getEnabledSkillContents(){return b?c.listEnabled().map(e=>{try{let t=_.join(b,e.id,`SKILL.md`),{body:n}=J(v.readFileSync(t,`utf-8`));return n.trim()}catch{return``}}).filter(Boolean):[]},async destroy(){x(),await o.destroy()}}}function $(e){return e.exec(`
20
+ CREATE TABLE IF NOT EXISTS skill_settings (
21
+ skill_id TEXT PRIMARY KEY,
22
+ enabled INTEGER NOT NULL DEFAULT 0
23
+ );
24
+ `),{getSkillEnabledState(){let t=e.prepare(`SELECT skill_id, enabled FROM skill_settings`).all(),n={};for(let e of t)n[e.skill_id]=e.enabled!==0;return n},setSkillEnabled(t,n){e.prepare(`INSERT INTO skill_settings(skill_id, enabled) VALUES(?, ?) ON CONFLICT(skill_id) DO UPDATE SET enabled = excluded.enabled`).run(t,n?1:0)},removeSkillState(t){e.prepare(`DELETE FROM skill_settings WHERE skill_id = ?`).run(t)}}}function je(e){if(`db`in e)return $(e.db);let{dbPath:t,sqliteFactory:n}=e,r=_.dirname(t);v.mkdirSync(r,{recursive:!0});let i=n(t);return i.pragma(`journal_mode = WAL`),$(i)}function Me(e){let n=e??s(u(),`.ai-chat`,`llm-config.json`);if(!t(n))return;let i=r(n,`utf-8`),a=JSON.parse(i);if(!a||typeof a!=`object`||!(`models`in a))throw Error(`LLM 配置格式错误 (${n}):缺少 models 字段`);return a}const Ne=[`rm -rf /`,`rm -rf ~`,`format`,`mkfs`,`dd if=`,`shutdown`,`reboot`,`sudo rm`,`sudo format`];function Pe(e){let t=e.toLowerCase().trim();return Ne.some(e=>t.includes(e.toLowerCase()))}function Fe(e){return{async executeCommand(t,n,r,i,a){if(r?.aborted)return{success:!1,error:`操作已取消`};if(Pe(t))return{success:!1,error:`该命令被安全策略阻止`};try{let{spawn:o}=await import(`child_process`);return new Promise(s=>{let c=``,l=``,u=!1,d=null,f=o(`sh`,[`-c`,t],{cwd:n||e,env:process.env,detached:process.platform!==`win32`}),p=e=>{if(!u){u=!0;try{process.platform!==`win32`&&typeof f.pid==`number`?process.kill(-f.pid,e):f.kill(e)}catch{try{f.kill(e)}catch{}}d&&clearTimeout(d),d=setTimeout(()=>{try{process.platform!==`win32`&&typeof f.pid==`number`?process.kill(-f.pid,`SIGKILL`):f.kill(`SIGKILL`)}catch{}},1500)}},m=a??3e4,h=setTimeout(()=>{u||(p(`SIGTERM`),s({success:!1,error:`命令执行超时(${m/1e3}秒)`}))},m),g=()=>{u||(p(`SIGTERM`),clearTimeout(h),s({success:!1,error:`操作已取消`}))};r?.addEventListener(`abort`,g),f.stdout?.on(`data`,e=>{let t=e.toString();c+=t,i?.onStdout?.(t)}),f.stderr?.on(`data`,e=>{let t=e.toString();l+=t,i?.onStderr?.(t)}),f.on(`close`,e=>{if(clearTimeout(h),r?.removeEventListener(`abort`,g),d&&=(clearTimeout(d),null),u)return;let t=c.trim(),n=l.trim();s(e===0?{success:!0,output:t||n||`执行成功`}:t?{success:!0,output:t+(n?`\n[警告: ${n}]`:``)}:n?{success:!1,error:n}:{success:!1,error:`命令退出码: ${e}`})}),f.on(`error`,e=>{clearTimeout(h),r?.removeEventListener(`abort`,g),d&&=(clearTimeout(d),null),u||s({success:!1,error:e.message})})})}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}}}export{G as activateExtension,Ae as assetManager,Y as buildSkillMd,Fe as createDefaultToolExecutor,Q as createJsonFileStore,je as createSqliteMetadataStore,Se as deleteToolModule,ve as extractToolMetaFromBuild,E as getAssetEntryPath,x as getAssetManifestPath,S as getAssetPackageJsonPath,q as getToolModulePath,ae as hasAssetEntry,ne as hasAssetManifest,re as hasAssetPackageJson,U as importAssetModule,M as isExtensionDefinition,j as isExtensionFrontendExternal,A as isExtensionNodeExternal,_e as loadAssetTool,K as loadAssetTools,Me as loadLLMConfigFromFile,J as parseFrontmatter,ie as readAssetDependencies,O as readAssetMeta,C as readAssetPackageJson,oe as readAssetSourceFile,be as renderToolModulesIndex,D as resolveAssetSourcePath,X as scanSkillsDir,ce as updateAssetMeta,T as writeAssetDependencies,w as writeAssetPackageJson,se as writeAssetSourceFile,xe as writeToolModule};
@@ -0,0 +1,9 @@
1
+ /**
2
+ * LLMConfig 文件加载(Node)
3
+ *
4
+ * - 默认路径:`~/.ai-chat/llm-config.json`,可传入覆盖
5
+ * - 校验 JSON 且必须包含 `models`,否则抛错
6
+ */
7
+ import type { LLMConfig } from '@huyooo/ai-chat-core';
8
+ export declare function loadLLMConfigFromFile(filePath?: string): LLMConfig | undefined;
9
+ //# sourceMappingURL=llm-config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-config-loader.d.ts","sourceRoot":"","sources":["../src/llm-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,wBAAgB,qBAAqB,CACnC,QAAQ,CAAC,EAAE,MAAM,GAChB,SAAS,GAAG,SAAS,CAavB"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 元数据存储模块导出(barrel)
3
+ *
4
+ * - JSON 文件实现(默认)与 SQLite 实现(技能启用状态等)
5
+ * - 供 skill 管理与扫描回调持久化
6
+ */
7
+ export type { AssetMetadataStore } from './types.js';
8
+ export type { SqliteMetadataStoreInput } from './sqlite-store.js';
9
+ export { createJsonFileStore } from './json-file-store.js';
10
+ export { createSqliteMetadataStore } from './sqlite-store.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metadata-store/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * JSON 文件元数据存储(skills-state.json)
3
+ *
4
+ * - 适合单用户/开发机,无额外原生依赖
5
+ * - 随 assets 目录分发或本地保存启用位
6
+ */
7
+ import type { AssetMetadataStore } from './types.js';
8
+ export declare function createJsonFileStore(assetsDir: string): AssetMetadataStore;
9
+ //# sourceMappingURL=json-file-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-file-store.d.ts","sourceRoot":"","sources":["../../src/metadata-store/json-file-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,CAkCzE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SQLite 元数据存储
3
+ *
4
+ * - 通过 better-sqlite3 工厂注入,便于测试内存库或自定义路径
5
+ * - 表结构:skill_settings 等,与 core SkillRegistry 对齐
6
+ */
7
+ import type BetterSqlite3 from 'better-sqlite3';
8
+ import type { AssetMetadataStore } from './types.js';
9
+ export type SqliteMetadataStoreInput = {
10
+ dbPath: string;
11
+ sqliteFactory: (dbPath: string) => BetterSqlite3.Database;
12
+ } | {
13
+ db: BetterSqlite3.Database;
14
+ };
15
+ export declare function createSqliteMetadataStore(input: SqliteMetadataStoreInput): AssetMetadataStore;
16
+ //# sourceMappingURL=sqlite-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../src/metadata-store/sqlite-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,aAAa,CAAC,QAAQ,CAAA;CAAE,GAC7E;IAAE,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAA;CAAE,CAAC;AAmCnC,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,kBAAkB,CAWpB"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 资产元数据存储抽象
3
+ *
4
+ * - 技能启用状态等轻量 KV,可由 JSON 或 SQLite 实现
5
+ * - 与 skillManagementPlugin 宿主回调对接
6
+ */
7
+ export interface AssetMetadataStore {
8
+ getSkillEnabledState(): Record<string, boolean>;
9
+ setSkillEnabled(id: string, enabled: boolean): void;
10
+ removeSkillState(id: string): void;
11
+ }
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metadata-store/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpD,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 扩展脚手架 & 构建模板类型
3
+ *
4
+ * ProjectTemplate 描述"如何构建扩展",属于 Node.js 宿主构建工具链职责。
5
+ * 运行时类型(AssetMeta, AssetToolMeta)留在 ai-chat-core。
6
+ */
7
+ import type { AssetGovernance, AssetType, JsonSchemaObject } from '@huyooo/ai-chat-core';
8
+ export interface ScaffoldParams {
9
+ name: string;
10
+ description: string;
11
+ code: string;
12
+ category?: string;
13
+ tags?: string[];
14
+ dependencies?: Record<string, string>;
15
+ governance?: Partial<AssetGovernance>;
16
+ /** 多工具集时的子工具名 */
17
+ toolName?: string;
18
+ displayName?: string;
19
+ parameters?: JsonSchemaObject;
20
+ outputSchema?: JsonSchemaObject;
21
+ errorSchema?: JsonSchemaObject;
22
+ }
23
+ export interface ScaffoldResult {
24
+ projectDir: string;
25
+ templateId: string;
26
+ }
27
+ export interface ProjectTemplate {
28
+ id: string;
29
+ label: string;
30
+ assetType: AssetType;
31
+ assetDir: string;
32
+ entryFile: string;
33
+ platform: 'node' | 'browser';
34
+ externals: (id: string) => boolean;
35
+ buildCommand?: string;
36
+ packageJson(params: ScaffoldParams): Record<string, unknown>;
37
+ files(params: ScaffoldParams): Record<string, string>;
38
+ }
39
+ //# sourceMappingURL=scaffold-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-types.d.ts","sourceRoot":"","sources":["../src/scaffold-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * SKILL.md YAML Frontmatter 解析
3
+ *
4
+ * - 使用 eemeli/yaml 解析与序列化
5
+ * - 兼容 Agent Skills 常见 frontmatter 字段(name、category、tags 等)
6
+ */
7
+ export interface SkillFrontmatter {
8
+ name?: string;
9
+ description?: string;
10
+ category?: string;
11
+ tags?: string[];
12
+ icon?: string;
13
+ source?: string;
14
+ }
15
+ export declare function parseFrontmatter(content: string): {
16
+ meta: SkillFrontmatter;
17
+ body: string;
18
+ };
19
+ export declare function buildSkillMd(params: {
20
+ name: string;
21
+ description: string;
22
+ category: string;
23
+ tags: string[];
24
+ icon: string;
25
+ source: string;
26
+ instructions: string;
27
+ }): string;
28
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/skills/frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAqBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAY1F;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAgBT"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Skills 目录扫描
3
+ *
4
+ * - 遍历 assetsDir/skills/<id>/SKILL.md,解析 frontmatter + 正文
5
+ * - 将 SkillMeta 写入 SkillRegistry,并收集错误列表
6
+ */
7
+ import type { SkillRegistry } from '@huyooo/ai-chat-core';
8
+ export interface SkillScanResult {
9
+ registered: string[];
10
+ errors: Array<{
11
+ id: string;
12
+ error: string;
13
+ }>;
14
+ }
15
+ export declare function scanSkillsDir(skillsDir: string, registry: SkillRegistry, enabledState: Record<string, boolean>): SkillScanResult;
16
+ //# sourceMappingURL=scan-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-skills.d.ts","sourceRoot":"","sources":["../../src/skills/scan-skills.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGvE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,eAAe,CAwDjB"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Skill 文件系统操作(宿主回调实现)
3
+ *
4
+ * - 实现 OnSkillCreate / Update / Delete 等对 SKILL.md 与目录的读写
5
+ * - 与 AssetMetadataStore 联动持久化启用状态
6
+ */
7
+ import type { OnSkillCreate, OnSkillUpdate, OnSkillDelete, OnSkillSetEnabled, OnSkillLoadContent, OnSkillLoadReference } from '@huyooo/ai-chat-core';
8
+ import type { AssetMetadataStore } from '../metadata-store/types.js';
9
+ export declare function createSkillSetEnabledHandler(store: AssetMetadataStore): OnSkillSetEnabled;
10
+ export declare function createSkillCreateHandler(skillsDir: string, store: AssetMetadataStore): OnSkillCreate;
11
+ export declare function createSkillUpdateHandler(skillsDir: string): OnSkillUpdate;
12
+ export declare function createSkillDeleteHandler(skillsDir: string, store: AssetMetadataStore): OnSkillDelete;
13
+ export declare function createSkillLoadContentHandler(skillsDir: string): OnSkillLoadContent;
14
+ export declare function createSkillLoadReferenceHandler(skillsDir: string): OnSkillLoadReference;
15
+ //# sourceMappingURL=skill-file-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-file-ops.d.ts","sourceRoot":"","sources":["../../src/skills/skill-file-ops.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,kBAAkB,GAAG,iBAAiB,CAIzF;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAwBpG;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAqBzE;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAgBpG;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,CAcnF;AAED,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAavF"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 默认工具执行器(Node.js 环境)
3
+ *
4
+ * 通过 child_process.spawn 执行 shell 命令,包含:
5
+ * - 危险命令黑名单检查
6
+ * - AbortSignal 取消支持
7
+ * - 超时控制
8
+ * - 进程树 kill
9
+ */
10
+ import type { ToolExecutor } from '@huyooo/ai-chat-core';
11
+ export declare function createDefaultToolExecutor(defaultCwd: string): ToolExecutor;
12
+ //# sourceMappingURL=tool-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../src/tool-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAczD,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAiI1E"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@huyooo/ai-chat-host-node",
3
+ "version": "0.3.2",
4
+ "description": "AI Chat Node.js 宿主辅助包(asset manager、skills、metadata store)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "npm run clean && npm run build:js && npm run build:types",
20
+ "build:js": "tsdown",
21
+ "build:types": "tsc -b tsconfig.json --emitDeclarationOnly",
22
+ "dev": "tsdown --watch",
23
+ "typecheck": "tsc --noEmit",
24
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest"
27
+ },
28
+ "peerDependencies": {
29
+ "@huyooo/ai-chat-core": ">=0.3.2",
30
+ "better-sqlite3": ">=9.0.0"
31
+ },
32
+ "peerDependenciesMeta": {
33
+ "better-sqlite3": {
34
+ "optional": true
35
+ }
36
+ },
37
+ "devDependencies": {
38
+ "@huyooo/ai-chat-core": "^0.3.2",
39
+ "@types/node": "^22.0.0",
40
+ "better-sqlite3": ">=9.0.0",
41
+ "tsdown": "^0.21.0",
42
+ "typescript": "^5.0.0",
43
+ "vitest": "^4.0.18"
44
+ },
45
+ "keywords": [
46
+ "ai",
47
+ "chat",
48
+ "host",
49
+ "node",
50
+ "asset-manager",
51
+ "skills"
52
+ ],
53
+ "author": "huyooo",
54
+ "license": "SEE LICENSE IN LICENSE",
55
+ "publishConfig": {
56
+ "access": "public"
57
+ },
58
+ "dependencies": {
59
+ "yaml": "^2.8.3"
60
+ }
61
+ }