@huyooo/ai-chat-core 0.2.44 → 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.
- package/dist/adapter/index.d.ts +11 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/model-adapter.d.ts +25 -0
- package/dist/adapter/model-adapter.d.ts.map +1 -0
- package/dist/adapter/model-options.d.ts +53 -0
- package/dist/adapter/model-options.d.ts.map +1 -0
- package/dist/adapter/types.d.ts +28 -0
- package/dist/adapter/types.d.ts.map +1 -0
- package/dist/chat-runtime.d.ts +96 -0
- package/dist/chat-runtime.d.ts.map +1 -0
- package/dist/constants.d.ts +12 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/events.d.ts +605 -1
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +1 -1
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/dist/extension/types.d.ts +46 -0
- package/dist/extension/types.d.ts.map +1 -0
- package/dist/families/index.d.ts +11 -0
- package/dist/families/index.d.ts.map +1 -0
- package/dist/families/presets.d.ts +31 -0
- package/dist/families/presets.d.ts.map +1 -0
- package/dist/families/resolver.d.ts +11 -0
- package/dist/families/resolver.d.ts.map +1 -0
- package/dist/families/types.d.ts +29 -0
- package/dist/families/types.d.ts.map +1 -0
- package/dist/governance/command-safety.d.ts +34 -0
- package/dist/governance/command-safety.d.ts.map +1 -0
- package/dist/governance/governance.d.ts +19 -0
- package/dist/governance/governance.d.ts.map +1 -0
- package/dist/governance/index.d.ts +12 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/types.d.ts +29 -0
- package/dist/governance/types.d.ts.map +1 -0
- package/dist/index.d.ts +72 -804
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -1
- package/dist/internal/management-args.d.ts +13 -0
- package/dist/internal/management-args.d.ts.map +1 -0
- package/dist/internal/management-results.d.ts +21 -0
- package/dist/internal/management-results.d.ts.map +1 -0
- package/dist/llm-config.d.ts +108 -0
- package/dist/llm-config.d.ts.map +1 -0
- package/dist/logger/core.d.ts +31 -0
- package/dist/logger/core.d.ts.map +1 -0
- package/dist/logger/index.d.ts +9 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/orchestrator/compression-handler.d.ts +29 -0
- package/dist/orchestrator/compression-handler.d.ts.map +1 -0
- package/dist/orchestrator/context-compressor.d.ts +51 -0
- package/dist/orchestrator/context-compressor.d.ts.map +1 -0
- package/dist/orchestrator/context-summarizer.d.ts +41 -0
- package/dist/orchestrator/context-summarizer.d.ts.map +1 -0
- package/dist/orchestrator/index.d.ts +12 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +46 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/types.d.ts +58 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/parts/index.d.ts +13 -0
- package/dist/parts/index.d.ts.map +1 -0
- package/dist/parts/registry.d.ts +11 -0
- package/dist/parts/registry.d.ts.map +1 -0
- package/dist/parts/summaries.d.ts +9 -0
- package/dist/parts/summaries.d.ts.map +1 -0
- package/dist/parts/types.d.ts +61 -0
- package/dist/parts/types.d.ts.map +1 -0
- package/dist/platform.d.ts +17 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +1 -0
- package/dist/protocols/anthropic.d.ts +20 -0
- package/dist/protocols/anthropic.d.ts.map +1 -0
- package/dist/protocols/ark.d.ts +36 -0
- package/dist/protocols/ark.d.ts.map +1 -0
- package/dist/protocols/deepseek.d.ts +24 -0
- package/dist/protocols/deepseek.d.ts.map +1 -0
- package/dist/protocols/error-utils.d.ts +14 -0
- package/dist/protocols/error-utils.d.ts.map +1 -0
- package/dist/protocols/gemini.d.ts +24 -0
- package/dist/protocols/gemini.d.ts.map +1 -0
- package/dist/protocols/glm.d.ts +20 -0
- package/dist/protocols/glm.d.ts.map +1 -0
- package/dist/protocols/grok.d.ts +20 -0
- package/dist/protocols/grok.d.ts.map +1 -0
- package/dist/protocols/index.d.ts +31 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/minimax.d.ts +38 -0
- package/dist/protocols/minimax.d.ts.map +1 -0
- package/dist/protocols/moonshot.d.ts +20 -0
- package/dist/protocols/moonshot.d.ts.map +1 -0
- package/dist/protocols/openai-sse.d.ts +33 -0
- package/dist/protocols/openai-sse.d.ts.map +1 -0
- package/dist/protocols/openai.d.ts +19 -0
- package/dist/protocols/openai.d.ts.map +1 -0
- package/dist/protocols/qwen.d.ts +26 -0
- package/dist/protocols/qwen.d.ts.map +1 -0
- package/dist/protocols/responses-sse.d.ts +30 -0
- package/dist/protocols/responses-sse.d.ts.map +1 -0
- package/dist/protocols/sse-reader.d.ts +23 -0
- package/dist/protocols/sse-reader.d.ts.map +1 -0
- package/dist/protocols/tool-arguments.d.ts +8 -0
- package/dist/protocols/tool-arguments.d.ts.map +1 -0
- package/dist/protocols/types.d.ts +148 -0
- package/dist/protocols/types.d.ts.map +1 -0
- package/dist/protocols/vercel-gateway.d.ts +15 -0
- package/dist/protocols/vercel-gateway.d.ts.map +1 -0
- package/dist/runtime.d.ts +151 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/skills/index.d.ts +14 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/management/admin.d.ts +10 -0
- package/dist/skills/management/admin.d.ts.map +1 -0
- package/dist/skills/management/index.d.ts +11 -0
- package/dist/skills/management/index.d.ts.map +1 -0
- package/dist/skills/management/inputs.d.ts +44 -0
- package/dist/skills/management/inputs.d.ts.map +1 -0
- package/dist/skills/management/operations.d.ts +78 -0
- package/dist/skills/management/operations.d.ts.map +1 -0
- package/dist/skills/management/types.d.ts +70 -0
- package/dist/skills/management/types.d.ts.map +1 -0
- package/dist/skills/registry.d.ts +37 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/summaries.d.ts +9 -0
- package/dist/skills/summaries.d.ts.map +1 -0
- package/dist/skills/types.d.ts +61 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/test-utils/mock-sse.d.ts +13 -0
- package/dist/test-utils/mock-sse.d.ts.map +1 -0
- package/dist/tool-manager/define-tool.d.ts +35 -0
- package/dist/tool-manager/define-tool.d.ts.map +1 -0
- package/dist/tool-manager/formats.d.ts +46 -0
- package/dist/tool-manager/formats.d.ts.map +1 -0
- package/dist/tool-manager/identity.d.ts +18 -0
- package/dist/tool-manager/identity.d.ts.map +1 -0
- package/dist/tool-manager/in-process-provider.d.ts +15 -0
- package/dist/tool-manager/in-process-provider.d.ts.map +1 -0
- package/dist/tool-manager/index.d.ts +18 -0
- package/dist/tool-manager/index.d.ts.map +1 -0
- package/dist/tool-manager/manager.d.ts +18 -0
- package/dist/tool-manager/manager.d.ts.map +1 -0
- package/dist/tool-manager/mcp-provider.d.ts +21 -0
- package/dist/tool-manager/mcp-provider.d.ts.map +1 -0
- package/dist/tool-manager/summaries.d.ts +39 -0
- package/dist/tool-manager/summaries.d.ts.map +1 -0
- package/dist/tool-manager/types.d.ts +314 -0
- package/dist/tool-manager/types.d.ts.map +1 -0
- package/dist/types.d.ts +663 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +26 -15
- package/src/adapter/index.ts +25 -0
- package/src/adapter/model-adapter.ts +196 -0
- package/src/adapter/model-options.ts +143 -0
- package/src/adapter/types.ts +41 -0
- package/src/chat-runtime.ts +515 -0
- package/src/constants.ts +9 -102
- package/src/events.ts +364 -150
- package/src/extension/index.ts +24 -0
- package/src/extension/types.ts +49 -0
- package/src/families/index.ts +28 -0
- package/src/families/presets.ts +124 -0
- package/src/families/resolver.ts +22 -0
- package/src/families/types.ts +55 -0
- package/src/governance/command-safety.ts +224 -0
- package/src/governance/governance.ts +125 -0
- package/src/governance/index.ts +38 -0
- package/src/governance/types.ts +44 -0
- package/src/index.ts +250 -145
- package/src/internal/management-args.ts +39 -0
- package/src/internal/management-results.ts +60 -0
- package/src/llm-config.ts +137 -0
- package/src/logger/core.ts +96 -0
- package/src/logger/index.ts +8 -0
- package/src/orchestrator/compression-handler.ts +137 -0
- package/src/{providers → orchestrator}/context-compressor.ts +79 -47
- package/src/orchestrator/context-summarizer.ts +123 -0
- package/src/orchestrator/index.ts +20 -0
- package/src/orchestrator/orchestrator.ts +1002 -0
- package/src/orchestrator/types.ts +70 -0
- package/src/parts/index.ts +20 -0
- package/src/parts/registry.ts +95 -0
- package/src/parts/summaries.ts +40 -0
- package/src/parts/types.ts +63 -0
- package/src/platform.ts +73 -0
- package/src/protocols/anthropic.ts +377 -0
- package/src/protocols/ark.ts +300 -0
- package/src/protocols/deepseek.ts +192 -0
- package/src/{providers/protocols → protocols}/error-utils.ts +17 -20
- package/src/protocols/gemini.ts +352 -0
- package/src/protocols/glm.ts +212 -0
- package/src/protocols/grok.ts +98 -0
- package/src/protocols/index.ts +48 -0
- package/src/protocols/minimax.ts +308 -0
- package/src/protocols/moonshot.ts +186 -0
- package/src/protocols/openai-sse.ts +156 -0
- package/src/protocols/openai.ts +97 -0
- package/src/protocols/qwen.ts +358 -0
- package/src/protocols/responses-sse.ts +224 -0
- package/src/protocols/sse-reader.ts +54 -0
- package/src/protocols/tool-arguments.ts +32 -0
- package/src/{providers/protocols → protocols}/types.ts +46 -37
- package/src/protocols/vercel-gateway.ts +391 -0
- package/src/runtime.ts +167 -0
- package/src/skills/index.ts +29 -0
- package/src/skills/management/admin.ts +170 -0
- package/src/skills/management/index.ts +27 -0
- package/src/skills/management/inputs.ts +79 -0
- package/src/skills/management/operations.ts +256 -0
- package/src/skills/management/types.ts +57 -0
- package/src/skills/registry.ts +120 -0
- package/src/skills/summaries.ts +48 -0
- package/src/skills/types.ts +65 -0
- package/src/test-utils/mock-sse.ts +3 -3
- package/src/tool-manager/define-tool.ts +201 -0
- package/src/tool-manager/formats.ts +146 -0
- package/src/tool-manager/identity.ts +80 -0
- package/src/tool-manager/in-process-provider.ts +164 -0
- package/src/tool-manager/index.ts +63 -0
- package/src/tool-manager/manager.ts +562 -0
- package/src/tool-manager/mcp-provider.ts +509 -0
- package/src/tool-manager/summaries.ts +136 -0
- package/src/tool-manager/types.ts +389 -0
- package/src/types.ts +750 -191
- package/dist/events-CU5D5ray.d.ts +0 -1128
- package/src/agent.ts +0 -409
- package/src/internal/update-plan.ts +0 -2
- package/src/internal/web-search.ts +0 -77
- package/src/mcp/client-manager.ts +0 -302
- package/src/mcp/index.ts +0 -2
- package/src/mcp/types.ts +0 -43
- package/src/providers/context-summarizer.ts +0 -70
- package/src/providers/index.ts +0 -125
- package/src/providers/model-registry.ts +0 -466
- package/src/providers/orchestrator.ts +0 -839
- package/src/providers/protocols/anthropic.ts +0 -406
- package/src/providers/protocols/ark.ts +0 -362
- package/src/providers/protocols/deepseek.ts +0 -344
- package/src/providers/protocols/gemini.ts +0 -350
- package/src/providers/protocols/index.ts +0 -36
- package/src/providers/protocols/openai.ts +0 -420
- package/src/providers/protocols/qwen.ts +0 -315
- package/src/providers/types.ts +0 -264
- package/src/providers/unified-adapter.ts +0 -367
- package/src/router.ts +0 -72
- package/src/tools.ts +0 -162
- package/src/utils.ts +0 -86
package/src/runtime.ts
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 扩展运行时框架
|
|
3
|
+
*
|
|
4
|
+
* 仅包含扩展生命周期类型和 defineExtension 入口。
|
|
5
|
+
* 平台工具(路径、Safari 自动化)见 @huyooo/ai-chat-core/platform。
|
|
6
|
+
*/
|
|
7
|
+
import type { Tool } from './types'
|
|
8
|
+
|
|
9
|
+
/* ------------------------------------------------------------------ */
|
|
10
|
+
/* 扩展生命周期类型 */
|
|
11
|
+
/* ------------------------------------------------------------------ */
|
|
12
|
+
|
|
13
|
+
/** SQLite 数据库迁移定义 */
|
|
14
|
+
export interface Migration {
|
|
15
|
+
version: number
|
|
16
|
+
name: string
|
|
17
|
+
up: (db: import('better-sqlite3').Database) => void
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** 扩展声明一个数据库所需的全部信息 */
|
|
21
|
+
export interface DatabaseDeclaration {
|
|
22
|
+
description: string
|
|
23
|
+
workspaceKey?: string | null
|
|
24
|
+
customScope?: Record<string, unknown> | null
|
|
25
|
+
queryHint: string
|
|
26
|
+
migrations: Migration[]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 宿主注入的环境路径
|
|
31
|
+
*
|
|
32
|
+
* 扩展自包含原则:
|
|
33
|
+
* - extensionDir 是只读的,包含扩展自带的所有静态资源(代码、二进制、预置模型等)
|
|
34
|
+
* - dataDir 是可写的,存放运行时产物(拷贝后的二进制、下载的模型、缓存等)
|
|
35
|
+
*
|
|
36
|
+
* 二进制约定:扩展打包 bin/ 在 extensionDir 内,运行时拷贝到 dataDir/bin/
|
|
37
|
+
*/
|
|
38
|
+
export interface ExtensionPaths {
|
|
39
|
+
/** 扩展安装目录(只读:含代码、bin/、models/ 等静态资源) */
|
|
40
|
+
extensionDir: string
|
|
41
|
+
/** 扩展数据目录(可写:运行时二进制、下载模型、缓存) */
|
|
42
|
+
dataDir: string
|
|
43
|
+
/** 用户下载目录 */
|
|
44
|
+
downloadsDir: string
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** 扩展 AI 输入附件 */
|
|
48
|
+
export interface AiAttachment {
|
|
49
|
+
mimeType: string
|
|
50
|
+
/** 本地文件路径。由宿主决定是否以内联或文件上传方式发送,扩展不会接触 API key。 */
|
|
51
|
+
filePath?: string
|
|
52
|
+
/** 已由宿主或上游返回的文件 URI。仅支持对应协议显式处理的场景。 */
|
|
53
|
+
fileUri?: string
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** 扩展 AI 消息 */
|
|
57
|
+
export interface AiMessage {
|
|
58
|
+
role: 'system' | 'user' | 'assistant'
|
|
59
|
+
content: string
|
|
60
|
+
attachments?: AiAttachment[]
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** 扩展 AI 输出片段 */
|
|
64
|
+
export type AiOutputPart =
|
|
65
|
+
| { type: 'text'; text: string }
|
|
66
|
+
| { type: 'binary'; mimeType: string; data: string }
|
|
67
|
+
|
|
68
|
+
/** 扩展 AI 调用结果 */
|
|
69
|
+
export interface AiGenerateResult {
|
|
70
|
+
text: string
|
|
71
|
+
parts: AiOutputPart[]
|
|
72
|
+
finishReason?: 'stop' | 'tool_calls' | 'length' | 'error'
|
|
73
|
+
usage?: {
|
|
74
|
+
promptTokens?: number
|
|
75
|
+
completionTokens?: number
|
|
76
|
+
totalTokens?: number
|
|
77
|
+
reasoningTokens?: number
|
|
78
|
+
cachedTokens?: number
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** 扩展 AI 生成参数 */
|
|
83
|
+
export interface AiGenerateInput {
|
|
84
|
+
model: string
|
|
85
|
+
messages: AiMessage[]
|
|
86
|
+
enableThinking?: boolean
|
|
87
|
+
signal?: AbortSignal
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** 单厂商 AI 入口 */
|
|
91
|
+
export interface ExtensionAiProvider {
|
|
92
|
+
generate(input: AiGenerateInput): Promise<AiGenerateResult>
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** 扩展可用的宿主 AI 能力 */
|
|
96
|
+
export interface ExtensionAi {
|
|
97
|
+
gemini: ExtensionAiProvider
|
|
98
|
+
doubao: ExtensionAiProvider
|
|
99
|
+
deepseek: ExtensionAiProvider
|
|
100
|
+
qwen: ExtensionAiProvider
|
|
101
|
+
glm: ExtensionAiProvider
|
|
102
|
+
moonshot: ExtensionAiProvider
|
|
103
|
+
minimax: ExtensionAiProvider
|
|
104
|
+
openai: ExtensionAiProvider
|
|
105
|
+
anthropic: ExtensionAiProvider
|
|
106
|
+
grok: ExtensionAiProvider
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export type ExtensionRecoveryTargetKind = 'file' | 'directory' | 'resource'
|
|
110
|
+
|
|
111
|
+
export interface ExtensionRecoveryTargetInput {
|
|
112
|
+
id?: string
|
|
113
|
+
kind: ExtensionRecoveryTargetKind
|
|
114
|
+
path: string
|
|
115
|
+
displayName: string
|
|
116
|
+
workspaceKey?: string | null
|
|
117
|
+
customScope?: Record<string, unknown> | null
|
|
118
|
+
tags?: Record<string, string>
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface ExtensionRecoveryTarget {
|
|
122
|
+
id: string
|
|
123
|
+
kind: ExtensionRecoveryTargetKind
|
|
124
|
+
path: string
|
|
125
|
+
displayName: string
|
|
126
|
+
workspaceKey: string | null
|
|
127
|
+
customScope: Record<string, unknown> | null
|
|
128
|
+
tags: Record<string, string>
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export interface ExtensionRecovery {
|
|
132
|
+
registerTarget(input: ExtensionRecoveryTargetInput): ExtensionRecoveryTarget
|
|
133
|
+
listTargets(): ExtensionRecoveryTarget[]
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** 宿主注入给扩展 activate 的上下文 */
|
|
137
|
+
export interface ExtensionContext {
|
|
138
|
+
/** 获取已声明的数据库连接(已完成 WAL 配置 + migration) */
|
|
139
|
+
getDatabase(name: string): import('better-sqlite3').Database
|
|
140
|
+
/** 宿主提供的环境路径 */
|
|
141
|
+
paths: ExtensionPaths
|
|
142
|
+
/** 宿主提供的 AI 能力(按厂商分组,调用方式统一) */
|
|
143
|
+
ai: ExtensionAi
|
|
144
|
+
/** 宿主提供的恢复目标注册能力(支持时注入) */
|
|
145
|
+
recovery?: ExtensionRecovery
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** defineExtension 的输入定义 */
|
|
149
|
+
export interface ExtensionDefinition {
|
|
150
|
+
/** 数据库声明(可选,无 DB 需求的扩展不填) */
|
|
151
|
+
databases?: Record<string, DatabaseDeclaration>
|
|
152
|
+
/** 激活:接收宿主注入的上下文,返回工具数组 */
|
|
153
|
+
activate(ctx: ExtensionContext): Tool[]
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** defineExtension 返回的带标记对象,宿主据此识别完整扩展 */
|
|
157
|
+
export type ExtensionDefinitionMarked = ExtensionDefinition & { __isExtension: true }
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* 定义一个完整扩展(数据库 + 生命周期 + 工具)。
|
|
161
|
+
*
|
|
162
|
+
* 宿主加载模块后检查 default export 是否携带 __isExtension 标记,
|
|
163
|
+
* 有则走 defineExtension 流程(注册 DB → 注入上下文 → activate 返回工具)。
|
|
164
|
+
*/
|
|
165
|
+
export function defineExtension(definition: ExtensionDefinition): ExtensionDefinitionMarked {
|
|
166
|
+
return { ...definition, __isExtension: true as const }
|
|
167
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills 子系统导出(barrel)
|
|
3
|
+
*
|
|
4
|
+
* - registry:内存索引与启用状态
|
|
5
|
+
* - management:skillManagementPlugin 与宿主回调
|
|
6
|
+
* - summaries:管理 API 用摘要构造
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export type {
|
|
10
|
+
SkillMeta,
|
|
11
|
+
SkillSearchQuery,
|
|
12
|
+
ManagedSkillSummary,
|
|
13
|
+
ManagedSkillDetail,
|
|
14
|
+
} from './types';
|
|
15
|
+
|
|
16
|
+
export { skillRegistry } from './registry';
|
|
17
|
+
export type { SkillRegistry } from './registry';
|
|
18
|
+
export { createManagedSkillSummary, createManagedSkillDetail } from './summaries';
|
|
19
|
+
|
|
20
|
+
export { skillManagementPlugin } from './management';
|
|
21
|
+
export type {
|
|
22
|
+
SkillManagementOptions,
|
|
23
|
+
OnSkillCreate,
|
|
24
|
+
OnSkillUpdate,
|
|
25
|
+
OnSkillDelete,
|
|
26
|
+
OnSkillSetEnabled,
|
|
27
|
+
OnSkillLoadContent,
|
|
28
|
+
OnSkillLoadReference,
|
|
29
|
+
} from './management';
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill 管理命令装配
|
|
3
|
+
*
|
|
4
|
+
* - 将解析后的输入与 operations 绑定为具体 Tool 定义列表
|
|
5
|
+
* - 供 skillManagementPlugin 注册到 Agent
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Tool } from '../../types';
|
|
9
|
+
import type { SkillAdminContext } from './types';
|
|
10
|
+
import {
|
|
11
|
+
parseSkillCreateInput,
|
|
12
|
+
parseSkillEnableItems,
|
|
13
|
+
parseSkillIdInput,
|
|
14
|
+
parseSkillReferenceInput,
|
|
15
|
+
parseSkillSearchInput,
|
|
16
|
+
parseSkillUpdateInput,
|
|
17
|
+
} from './inputs';
|
|
18
|
+
import {
|
|
19
|
+
createManagedSkill,
|
|
20
|
+
deleteManagedSkill,
|
|
21
|
+
inspectManagedSkill,
|
|
22
|
+
listManagedSkills,
|
|
23
|
+
loadManagedSkillReference,
|
|
24
|
+
searchManagedSkills,
|
|
25
|
+
setManagedSkillsEnabled,
|
|
26
|
+
updateManagedSkill,
|
|
27
|
+
} from './operations';
|
|
28
|
+
|
|
29
|
+
export function createSkillAdminTools(ctx: SkillAdminContext): Tool[] {
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
name: 'skill_search',
|
|
33
|
+
description:
|
|
34
|
+
'搜索可用技能。按关键词/分类/标签/来源查找,返回匹配技能的名称和描述。' +
|
|
35
|
+
'找到后用 skill_enable 启用,或用 skill_inspect 查看详情。',
|
|
36
|
+
parameters: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
keyword: { type: 'string', description: '关键词(匹配名称、描述、标签)' },
|
|
40
|
+
category: { type: 'string', description: '按分类过滤' },
|
|
41
|
+
tags: { type: 'string', description: '按标签过滤(逗号分隔,AND 逻辑)' },
|
|
42
|
+
source: { type: 'string', description: '按来源过滤:system | bundled | market | user' },
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
execute: async args => searchManagedSkills(ctx, parseSkillSearchInput(args)),
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'skill_list',
|
|
49
|
+
description: '列出当前已启用的技能,这些技能的指令会被注入到系统提示中。',
|
|
50
|
+
parameters: { type: 'object', properties: {} },
|
|
51
|
+
execute: async () => listManagedSkills(ctx),
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'skill_create',
|
|
55
|
+
description:
|
|
56
|
+
'创建一个新技能。传入结构化参数,系统自动完成持久化和注册。' +
|
|
57
|
+
'创建成功后默认启用。' +
|
|
58
|
+
'当需求只是沉淀策略、约束和知识,而不需要执行逻辑或渲染 UI 时,优先创建 skill。' +
|
|
59
|
+
(ctx.onSkillCreate ? '' : '(当前环境未配置技能持久化,此功能不可用)'),
|
|
60
|
+
parameters: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
properties: {
|
|
63
|
+
id: { type: 'string', description: '技能 ID(kebab-case,全局唯一,如 "my-skill")' },
|
|
64
|
+
name: { type: 'string', description: '技能名称' },
|
|
65
|
+
description: { type: 'string', description: '一句话描述' },
|
|
66
|
+
instructions: { type: 'string', description: '技能指令内容(Markdown 格式)' },
|
|
67
|
+
category: { type: 'string', description: '分类,默认 "通用"' },
|
|
68
|
+
tags: {
|
|
69
|
+
type: 'array',
|
|
70
|
+
description: '标签列表',
|
|
71
|
+
items: { type: 'string' },
|
|
72
|
+
},
|
|
73
|
+
icon: { type: 'string', description: 'Emoji 图标,默认 "✨"' },
|
|
74
|
+
},
|
|
75
|
+
required: ['id', 'name', 'description', 'instructions'],
|
|
76
|
+
},
|
|
77
|
+
execute: async args => createManagedSkill(ctx, parseSkillCreateInput(args)),
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'skill_update',
|
|
81
|
+
description:
|
|
82
|
+
'原地更新已存在的技能。覆盖指令内容和元数据,保留当前启用状态。' +
|
|
83
|
+
(ctx.onSkillUpdate ? '' : '(当前环境未配置技能持久化,此功能不可用)'),
|
|
84
|
+
parameters: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
properties: {
|
|
87
|
+
id: { type: 'string', description: '要更新的技能 ID(必须已存在)' },
|
|
88
|
+
name: { type: 'string', description: '新的技能名称' },
|
|
89
|
+
description: { type: 'string', description: '新的一句话描述' },
|
|
90
|
+
instructions: { type: 'string', description: '新的技能指令内容(Markdown 格式)' },
|
|
91
|
+
category: { type: 'string', description: '新的分类' },
|
|
92
|
+
tags: {
|
|
93
|
+
type: 'array',
|
|
94
|
+
description: '新的标签列表',
|
|
95
|
+
items: { type: 'string' },
|
|
96
|
+
},
|
|
97
|
+
icon: { type: 'string', description: '新的 Emoji 图标' },
|
|
98
|
+
},
|
|
99
|
+
required: ['id', 'name', 'description', 'instructions'],
|
|
100
|
+
},
|
|
101
|
+
execute: async args => {
|
|
102
|
+
const id = parseSkillIdInput(args).id;
|
|
103
|
+
return updateManagedSkill(ctx, parseSkillUpdateInput(args, ctx.registry.get(id)));
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'skill_enable',
|
|
108
|
+
description:
|
|
109
|
+
'批量设置技能的启用/禁用状态。启用的技能会被注入系统提示。',
|
|
110
|
+
parameters: {
|
|
111
|
+
type: 'object',
|
|
112
|
+
properties: {
|
|
113
|
+
items: {
|
|
114
|
+
type: 'array',
|
|
115
|
+
description: '每项包含 id 和 enabled',
|
|
116
|
+
items: {
|
|
117
|
+
type: 'object',
|
|
118
|
+
properties: {
|
|
119
|
+
id: { type: 'string', description: '技能 ID' },
|
|
120
|
+
enabled: { type: 'boolean', description: 'true 启用,false 禁用' },
|
|
121
|
+
},
|
|
122
|
+
required: ['id', 'enabled'],
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
required: ['items'],
|
|
127
|
+
},
|
|
128
|
+
execute: async args => setManagedSkillsEnabled(ctx, parseSkillEnableItems(args)),
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: 'skill_delete',
|
|
132
|
+
description:
|
|
133
|
+
'彻底删除技能(从注册表和持久化存储中移除)。仅可删除 user 来源的技能。' +
|
|
134
|
+
(ctx.onSkillDelete ? '' : '(当前环境未配置技能持久化,此功能不可用)'),
|
|
135
|
+
parameters: {
|
|
136
|
+
type: 'object',
|
|
137
|
+
properties: {
|
|
138
|
+
id: { type: 'string', description: '要删除的技能 ID' },
|
|
139
|
+
},
|
|
140
|
+
required: ['id'],
|
|
141
|
+
},
|
|
142
|
+
execute: async args => deleteManagedSkill(ctx, parseSkillIdInput(args).id),
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
name: 'skill_inspect',
|
|
146
|
+
description: '查看技能的完整指令内容和元数据。',
|
|
147
|
+
parameters: {
|
|
148
|
+
type: 'object',
|
|
149
|
+
properties: {
|
|
150
|
+
id: { type: 'string', description: '技能 ID' },
|
|
151
|
+
},
|
|
152
|
+
required: ['id'],
|
|
153
|
+
},
|
|
154
|
+
execute: async args => inspectManagedSkill(ctx, parseSkillIdInput(args).id),
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
name: 'skill_load_reference',
|
|
158
|
+
description: '读取技能的某个参考文档内容。',
|
|
159
|
+
parameters: {
|
|
160
|
+
type: 'object',
|
|
161
|
+
properties: {
|
|
162
|
+
id: { type: 'string', description: '技能 ID' },
|
|
163
|
+
referenceName: { type: 'string', description: '参考文档文件名(从 skill_inspect 返回的 references 列表中获取)' },
|
|
164
|
+
},
|
|
165
|
+
required: ['id', 'referenceName'],
|
|
166
|
+
},
|
|
167
|
+
execute: async args => loadManagedSkillReference(ctx, parseSkillReferenceInput(args)),
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill 管理插件入口(skillManagementPlugin)
|
|
3
|
+
*
|
|
4
|
+
* - 分层:types(回调) / inputs(解析) / operations(业务) / admin(装配 Tool)
|
|
5
|
+
* - 宿主注入 registry 与持久化回调后即可挂载
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolPlugin } from '../../types';
|
|
8
|
+
import type { SkillManagementOptions } from './types';
|
|
9
|
+
import { createSkillAdminTools } from './admin';
|
|
10
|
+
|
|
11
|
+
export type {
|
|
12
|
+
SkillManagementOptions,
|
|
13
|
+
SkillAdminContext,
|
|
14
|
+
SkillOperationContext,
|
|
15
|
+
OnSkillCreate,
|
|
16
|
+
OnSkillUpdate,
|
|
17
|
+
OnSkillDelete,
|
|
18
|
+
OnSkillSetEnabled,
|
|
19
|
+
OnSkillLoadContent,
|
|
20
|
+
OnSkillLoadReference,
|
|
21
|
+
} from './types';
|
|
22
|
+
|
|
23
|
+
export function skillManagementPlugin(options: SkillManagementOptions): ToolPlugin {
|
|
24
|
+
return {
|
|
25
|
+
tools: createSkillAdminTools(options),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill 管理插件 — 命令参数解析
|
|
3
|
+
*
|
|
4
|
+
* - 将未知 JSON args 转为强类型 Create/Update/Search 等结构
|
|
5
|
+
* - 校验 AssetSource、启用项等约束
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
getOptionalString,
|
|
10
|
+
getRequiredString,
|
|
11
|
+
getStringArray,
|
|
12
|
+
} from '../../internal/management-args';
|
|
13
|
+
import type { AssetSource } from '../../governance/types';
|
|
14
|
+
import type { SkillMeta } from '../types';
|
|
15
|
+
|
|
16
|
+
function isAssetSource(value: unknown): value is AssetSource {
|
|
17
|
+
return value === 'system' || value === 'bundled' || value === 'market' || value === 'user';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function isEnableItem(value: unknown): value is { id: string; enabled: boolean } {
|
|
21
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
|
|
22
|
+
const item = value as { id?: unknown; enabled?: unknown };
|
|
23
|
+
return typeof item.id === 'string' && typeof item.enabled === 'boolean';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function parseSkillSearchInput(args: Record<string, unknown>) {
|
|
27
|
+
return {
|
|
28
|
+
keyword: getOptionalString(args.keyword),
|
|
29
|
+
category: getOptionalString(args.category),
|
|
30
|
+
tags: getOptionalString(args.tags),
|
|
31
|
+
source: isAssetSource(args.source) ? args.source : undefined,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function parseSkillCreateInput(args: Record<string, unknown>) {
|
|
36
|
+
return {
|
|
37
|
+
id: getRequiredString(args.id),
|
|
38
|
+
name: getRequiredString(args.name),
|
|
39
|
+
description: getRequiredString(args.description),
|
|
40
|
+
instructions: getRequiredString(args.instructions),
|
|
41
|
+
category: getOptionalString(args.category) ?? '通用',
|
|
42
|
+
tags: getStringArray(args.tags) ?? [],
|
|
43
|
+
icon: getOptionalString(args.icon) ?? '✨',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function parseSkillUpdateInput(
|
|
48
|
+
args: Record<string, unknown>,
|
|
49
|
+
existingMeta?: SkillMeta,
|
|
50
|
+
) {
|
|
51
|
+
return {
|
|
52
|
+
id: getRequiredString(args.id),
|
|
53
|
+
name: getRequiredString(args.name),
|
|
54
|
+
description: getRequiredString(args.description),
|
|
55
|
+
instructions: getRequiredString(args.instructions),
|
|
56
|
+
category: getOptionalString(args.category) ?? existingMeta?.category ?? '通用',
|
|
57
|
+
tags: getStringArray(args.tags) ?? existingMeta?.tags ?? [],
|
|
58
|
+
icon: getOptionalString(args.icon) ?? existingMeta?.icon ?? '✨',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function parseSkillEnableItems(args: Record<string, unknown>) {
|
|
63
|
+
return Array.isArray(args.items)
|
|
64
|
+
? args.items.filter(isEnableItem)
|
|
65
|
+
: [];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function parseSkillReferenceInput(args: Record<string, unknown>) {
|
|
69
|
+
return {
|
|
70
|
+
id: getRequiredString(args.id),
|
|
71
|
+
referenceName: getRequiredString(args.referenceName),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function parseSkillIdInput(args: Record<string, unknown>) {
|
|
76
|
+
return {
|
|
77
|
+
id: getRequiredString(args.id),
|
|
78
|
+
};
|
|
79
|
+
}
|