@aalis/core 0.1.0

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 (217) hide show
  1. package/README.md +21 -0
  2. package/dist/app.d.ts +166 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +348 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config.d.ts +174 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +377 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/constants.d.ts +31 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +36 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/context.d.ts +328 -0
  15. package/dist/context.d.ts.map +1 -0
  16. package/dist/context.js +521 -0
  17. package/dist/context.js.map +1 -0
  18. package/dist/disposable-chain.d.ts +31 -0
  19. package/dist/disposable-chain.d.ts.map +1 -0
  20. package/dist/disposable-chain.js +66 -0
  21. package/dist/disposable-chain.js.map +1 -0
  22. package/dist/events.d.ts +64 -0
  23. package/dist/events.d.ts.map +1 -0
  24. package/dist/events.js +145 -0
  25. package/dist/events.js.map +1 -0
  26. package/dist/hooks.d.ts +49 -0
  27. package/dist/hooks.d.ts.map +1 -0
  28. package/dist/hooks.js +102 -0
  29. package/dist/hooks.js.map +1 -0
  30. package/dist/i18n.d.ts +6 -0
  31. package/dist/i18n.d.ts.map +1 -0
  32. package/dist/i18n.js +26 -0
  33. package/dist/i18n.js.map +1 -0
  34. package/dist/identity.d.ts +26 -0
  35. package/dist/identity.d.ts.map +1 -0
  36. package/dist/identity.js +36 -0
  37. package/dist/identity.js.map +1 -0
  38. package/dist/index.d.ts +17 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +29 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/init.d.ts +20 -0
  43. package/dist/init.d.ts.map +1 -0
  44. package/dist/init.js +455 -0
  45. package/dist/init.js.map +1 -0
  46. package/dist/llm-router.d.ts.map +1 -0
  47. package/dist/llm-router.js +123 -0
  48. package/dist/llm-router.js.map +1 -0
  49. package/dist/logger.d.ts +76 -0
  50. package/dist/logger.d.ts.map +1 -0
  51. package/dist/logger.js +187 -0
  52. package/dist/logger.js.map +1 -0
  53. package/dist/marketplace-bootstrap.d.ts +54 -0
  54. package/dist/marketplace-bootstrap.d.ts.map +1 -0
  55. package/dist/marketplace-bootstrap.js +132 -0
  56. package/dist/marketplace-bootstrap.js.map +1 -0
  57. package/dist/mixin-registry.d.ts +34 -0
  58. package/dist/mixin-registry.d.ts.map +1 -0
  59. package/dist/mixin-registry.js +60 -0
  60. package/dist/mixin-registry.js.map +1 -0
  61. package/dist/model-ref.d.ts +22 -0
  62. package/dist/model-ref.d.ts.map +1 -0
  63. package/dist/model-ref.js +46 -0
  64. package/dist/model-ref.js.map +1 -0
  65. package/dist/pending-buffer.d.ts +46 -0
  66. package/dist/pending-buffer.d.ts.map +1 -0
  67. package/dist/pending-buffer.js +131 -0
  68. package/dist/pending-buffer.js.map +1 -0
  69. package/dist/platform-registry.d.ts +40 -0
  70. package/dist/platform-registry.d.ts.map +1 -0
  71. package/dist/platform-registry.js +64 -0
  72. package/dist/platform-registry.js.map +1 -0
  73. package/dist/plugin-activation.d.ts +43 -0
  74. package/dist/plugin-activation.d.ts.map +1 -0
  75. package/dist/plugin-activation.js +172 -0
  76. package/dist/plugin-activation.js.map +1 -0
  77. package/dist/plugin-topology.d.ts +40 -0
  78. package/dist/plugin-topology.d.ts.map +1 -0
  79. package/dist/plugin-topology.js +126 -0
  80. package/dist/plugin-topology.js.map +1 -0
  81. package/dist/plugin.d.ts +184 -0
  82. package/dist/plugin.d.ts.map +1 -0
  83. package/dist/plugin.js +549 -0
  84. package/dist/plugin.js.map +1 -0
  85. package/dist/providers.d.ts +85 -0
  86. package/dist/providers.d.ts.map +1 -0
  87. package/dist/providers.js +2 -0
  88. package/dist/providers.js.map +1 -0
  89. package/dist/semver-mini.d.ts +20 -0
  90. package/dist/semver-mini.d.ts.map +1 -0
  91. package/dist/semver-mini.js +94 -0
  92. package/dist/semver-mini.js.map +1 -0
  93. package/dist/service-helpers.d.ts +34 -0
  94. package/dist/service-helpers.d.ts.map +1 -0
  95. package/dist/service-helpers.js +68 -0
  96. package/dist/service-helpers.js.map +1 -0
  97. package/dist/service.d.ts +145 -0
  98. package/dist/service.d.ts.map +1 -0
  99. package/dist/service.js +279 -0
  100. package/dist/service.js.map +1 -0
  101. package/dist/types/agent.d.ts +51 -0
  102. package/dist/types/agent.d.ts.map +1 -0
  103. package/dist/types/agent.js +3 -0
  104. package/dist/types/agent.js.map +1 -0
  105. package/dist/types/app.d.ts +74 -0
  106. package/dist/types/app.d.ts.map +1 -0
  107. package/dist/types/app.js +3 -0
  108. package/dist/types/app.js.map +1 -0
  109. package/dist/types/archive.d.ts +59 -0
  110. package/dist/types/archive.d.ts.map +1 -0
  111. package/dist/types/archive.js +16 -0
  112. package/dist/types/archive.js.map +1 -0
  113. package/dist/types/authority.d.ts +63 -0
  114. package/dist/types/authority.d.ts.map +1 -0
  115. package/dist/types/authority.js +3 -0
  116. package/dist/types/authority.js.map +1 -0
  117. package/dist/types/capabilities.d.ts +53 -0
  118. package/dist/types/capabilities.d.ts.map +1 -0
  119. package/dist/types/capabilities.js +87 -0
  120. package/dist/types/capabilities.js.map +1 -0
  121. package/dist/types/cli.d.ts +14 -0
  122. package/dist/types/cli.d.ts.map +1 -0
  123. package/dist/types/cli.js +3 -0
  124. package/dist/types/cli.js.map +1 -0
  125. package/dist/types/commands.d.ts +98 -0
  126. package/dist/types/commands.d.ts.map +1 -0
  127. package/dist/types/commands.js +3 -0
  128. package/dist/types/commands.js.map +1 -0
  129. package/dist/types/core.d.ts +117 -0
  130. package/dist/types/core.d.ts.map +1 -0
  131. package/dist/types/core.js +6 -0
  132. package/dist/types/core.js.map +1 -0
  133. package/dist/types/disposable-service.d.ts +31 -0
  134. package/dist/types/disposable-service.d.ts.map +1 -0
  135. package/dist/types/disposable-service.js +3 -0
  136. package/dist/types/disposable-service.js.map +1 -0
  137. package/dist/types/embedding.d.ts +7 -0
  138. package/dist/types/embedding.d.ts.map +1 -0
  139. package/dist/types/embedding.js +3 -0
  140. package/dist/types/embedding.js.map +1 -0
  141. package/dist/types/flow-control.d.ts +51 -0
  142. package/dist/types/flow-control.d.ts.map +1 -0
  143. package/dist/types/flow-control.js +12 -0
  144. package/dist/types/flow-control.js.map +1 -0
  145. package/dist/types/gateway.d.ts +24 -0
  146. package/dist/types/gateway.d.ts.map +1 -0
  147. package/dist/types/gateway.js +15 -0
  148. package/dist/types/gateway.js.map +1 -0
  149. package/dist/types/hooks.d.ts +3 -0
  150. package/dist/types/hooks.d.ts.map +1 -0
  151. package/dist/types/hooks.js +18 -0
  152. package/dist/types/hooks.js.map +1 -0
  153. package/dist/types/image-recognition.d.ts +123 -0
  154. package/dist/types/image-recognition.d.ts.map +1 -0
  155. package/dist/types/image-recognition.js +31 -0
  156. package/dist/types/image-recognition.js.map +1 -0
  157. package/dist/types/index.d.ts +8 -0
  158. package/dist/types/index.d.ts.map +1 -0
  159. package/dist/types/index.js +17 -0
  160. package/dist/types/index.js.map +1 -0
  161. package/dist/types/llm.d.ts +146 -0
  162. package/dist/types/llm.d.ts.map +1 -0
  163. package/dist/types/llm.js +27 -0
  164. package/dist/types/llm.js.map +1 -0
  165. package/dist/types/memory.d.ts +62 -0
  166. package/dist/types/memory.d.ts.map +1 -0
  167. package/dist/types/memory.js +22 -0
  168. package/dist/types/memory.js.map +1 -0
  169. package/dist/types/persona.d.ts +45 -0
  170. package/dist/types/persona.d.ts.map +1 -0
  171. package/dist/types/persona.js +3 -0
  172. package/dist/types/persona.js.map +1 -0
  173. package/dist/types/platform.d.ts +126 -0
  174. package/dist/types/platform.d.ts.map +1 -0
  175. package/dist/types/platform.js +5 -0
  176. package/dist/types/platform.js.map +1 -0
  177. package/dist/types/plugin.d.ts +84 -0
  178. package/dist/types/plugin.d.ts.map +1 -0
  179. package/dist/types/plugin.js +24 -0
  180. package/dist/types/plugin.js.map +1 -0
  181. package/dist/types/service.d.ts +43 -0
  182. package/dist/types/service.d.ts.map +1 -0
  183. package/dist/types/service.js +38 -0
  184. package/dist/types/service.js.map +1 -0
  185. package/dist/types/services.d.ts +17 -0
  186. package/dist/types/services.d.ts.map +1 -0
  187. package/dist/types/services.js +41 -0
  188. package/dist/types/services.js.map +1 -0
  189. package/dist/types/session.d.ts +153 -0
  190. package/dist/types/session.d.ts.map +1 -0
  191. package/dist/types/session.js +19 -0
  192. package/dist/types/session.js.map +1 -0
  193. package/dist/types/storage.d.ts +100 -0
  194. package/dist/types/storage.d.ts.map +1 -0
  195. package/dist/types/storage.js +29 -0
  196. package/dist/types/storage.js.map +1 -0
  197. package/dist/types/tools.d.ts +39 -0
  198. package/dist/types/tools.d.ts.map +1 -0
  199. package/dist/types/tools.js +3 -0
  200. package/dist/types/tools.js.map +1 -0
  201. package/dist/types/trigger-policy.d.ts +16 -0
  202. package/dist/types/trigger-policy.d.ts.map +1 -0
  203. package/dist/types/trigger-policy.js +6 -0
  204. package/dist/types/trigger-policy.js.map +1 -0
  205. package/dist/types/vectorstore.d.ts +23 -0
  206. package/dist/types/vectorstore.d.ts.map +1 -0
  207. package/dist/types/vectorstore.js +3 -0
  208. package/dist/types/vectorstore.js.map +1 -0
  209. package/dist/types/web-search.d.ts +88 -0
  210. package/dist/types/web-search.d.ts.map +1 -0
  211. package/dist/types/web-search.js +23 -0
  212. package/dist/types/web-search.js.map +1 -0
  213. package/dist/types/webui.d.ts +137 -0
  214. package/dist/types/webui.d.ts.map +1 -0
  215. package/dist/types/webui.js +3 -0
  216. package/dist/types/webui.js.map +1 -0
  217. package/package.json +22 -0
@@ -0,0 +1,146 @@
1
+ import type { Message, ToolDefinition, ToolCall } from './core.js';
2
+ export interface ChatRequest {
3
+ messages: Message[];
4
+ tools?: ToolDefinition[];
5
+ temperature?: number;
6
+ maxTokens?: number;
7
+ /** 覆盖模型(不指定则使用服务默认模型) */
8
+ model?: string;
9
+ /**
10
+ * 精确指定 provider(contextId / instanceId,如 `@aalis/plugin-openai`)。
11
+ *
12
+ * - 指定时 LLMRouter 直接路由到该 provider,不再依赖 model id 的全局唯一性
13
+ * - 未指定时 router 退化为"在所有 provider 的 listModels 中查找该 model id",
14
+ * 命中多个 / 零个均会抛错
15
+ * - 这是解决"多个 provider 都声称支持同名 model"歧义的唯一正确手段
16
+ *
17
+ * 推荐通过 `parseModelRef("<provider>::<model>")` 从配置/UI 取值。
18
+ */
19
+ provider?: string;
20
+ /** 中止信号,用于取消正在进行的 LLM 调用 */
21
+ signal?: AbortSignal;
22
+ /** 是否启用扩展思考。设为 false 可显式关闭提供者默认的 think 模式 */
23
+ think?: boolean;
24
+ }
25
+ export interface ChatResponse {
26
+ content: string | null;
27
+ toolCalls?: ToolCall[];
28
+ reasoningContent?: string | null;
29
+ usage?: {
30
+ promptTokens: number;
31
+ completionTokens: number;
32
+ totalTokens: number;
33
+ };
34
+ }
35
+ /** 流式响应的单个 chunk */
36
+ export interface ChatStreamChunk {
37
+ /** 增量内容片段 */
38
+ contentDelta?: string;
39
+ /** 增量思考内容片段 */
40
+ reasoningDelta?: string;
41
+ /** 工具调用(仅在流结束时出现) */
42
+ toolCalls?: ToolCall[];
43
+ /** 是否结束 */
44
+ done?: boolean;
45
+ /** 用量统计(仅在最后一个 chunk 可能包含) */
46
+ usage?: {
47
+ promptTokens: number;
48
+ completionTokens: number;
49
+ totalTokens: number;
50
+ };
51
+ }
52
+ /** 模型信息(含能力声明)。router 聚合后的条目会携带 provider/contextId 归属。 */
53
+ export interface ModelInfo {
54
+ id: string;
55
+ capabilities: LLMCapability[];
56
+ /** router 聚合时填充(展示用 label 或 instanceId) */
57
+ provider?: string;
58
+ /** router 聚合时填充(用于精确定位提供者) */
59
+ contextId?: string;
60
+ /**
61
+ * 模型上下文窗口大小(token)。provider 在 listModels() 中填入该模型的真实窗口,
62
+ * 调用方(如 memory-summary)可据此为不同模型计算合适的 token 预算。
63
+ * 未提供时调用方应回退到 LLMService.getContextLength()。
64
+ */
65
+ contextLength?: number;
66
+ }
67
+ export interface LLMService {
68
+ chat(request: ChatRequest): Promise<ChatResponse>;
69
+ chatStream(request: ChatRequest): AsyncIterable<ChatStreamChunk>;
70
+ getTemperature(): number;
71
+ getMaxTokens(): number;
72
+ /** 模型上下文窗口大小(token 数) */
73
+ getContextLength(): number;
74
+ /**
75
+ * 列出该 provider 推荐展示给用户的模型集合。
76
+ *
77
+ * - WebUI 下拉框、各插件 dynamicOptions:'llm' 的候选来源
78
+ * - 同时也是 LLMRouter 在仅指定 model 不指定 provider 时的定位依据
79
+ * (在哪个 provider 的 listModels 里 → 归该 provider)
80
+ * - 如果 provider 希望支持“任意 model id 直通”(OpenAI 兼容 endpoint 通配),
81
+ * 用户需显式指定 `request.provider`;Router 不会仅凭 model id 猜测。
82
+ */
83
+ listModels?(): Promise<ModelInfo[]>;
84
+ /**
85
+ * 提供者自报默认模型 ID。
86
+ * LLMRouter 在用户未指定 `model` 时可参考此值。
87
+ */
88
+ getDefaultModelId?(): string | undefined;
89
+ }
90
+ /**
91
+ * LLM 服务能力注册表
92
+ *
93
+ * 第三方插件可通过 declaration merging 追加新能力:
94
+ *
95
+ * ```ts
96
+ * declare module '@aalis/core' {
97
+ * interface LLMCapabilityRegistry {
98
+ * AudioInput: 'audio_input';
99
+ * FimCompletion: 'fim_completion';
100
+ * }
101
+ * }
102
+ * ```
103
+ *
104
+ * 然后在自己的 LLM 服务里:
105
+ * ```ts
106
+ * ctx.provide('llm', service, { capabilities: ['chat', 'audio_input'] });
107
+ * ```
108
+ */
109
+ export interface LLMCapabilityRegistry {
110
+ /** 基础对话能力(必备) */
111
+ Chat: 'chat';
112
+ /** 支持工具调用 / function calling */
113
+ ToolCalling: 'tool_calling';
114
+ /** 支持流式输出 */
115
+ Streaming: 'streaming';
116
+ /** 支持图像输入(多模态) */
117
+ Vision: 'vision';
118
+ /** 支持扩展思考 / reasoning */
119
+ Thinking: 'thinking';
120
+ /** 路由器 facade(按 model id 查找提供者,不提供 chat) */
121
+ Router: 'router';
122
+ }
123
+ /** LLM 能力字符串 union(自动包含第三方扩展) */
124
+ export type LLMCapability = LLMCapabilityRegistry[keyof LLMCapabilityRegistry];
125
+ /**
126
+ * LLM 内置能力常量
127
+ *
128
+ * 用于注册时引用,避免 magic string 拼写错误:
129
+ * ```ts
130
+ * ctx.provide('llm', service, { capabilities: [LLMCapabilities.Chat, LLMCapabilities.Streaming] });
131
+ * ```
132
+ */
133
+ export declare const LLMCapabilities: {
134
+ readonly Chat: "chat";
135
+ readonly ToolCalling: "tool_calling";
136
+ readonly Streaming: "streaming";
137
+ readonly Vision: "vision";
138
+ readonly Thinking: "thinking";
139
+ readonly Router: "router";
140
+ };
141
+ declare module './capabilities.js' {
142
+ interface ServiceCapabilityMap {
143
+ llm: LLMCapability;
144
+ }
145
+ }
146
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/types/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ // ----- LLM 服务接口 -----
2
+ /**
3
+ * LLM 内置能力常量
4
+ *
5
+ * 用于注册时引用,避免 magic string 拼写错误:
6
+ * ```ts
7
+ * ctx.provide('llm', service, { capabilities: [LLMCapabilities.Chat, LLMCapabilities.Streaming] });
8
+ * ```
9
+ */
10
+ export const LLMCapabilities = {
11
+ Chat: 'chat',
12
+ ToolCalling: 'tool_calling',
13
+ Streaming: 'streaming',
14
+ Vision: 'vision',
15
+ Thinking: 'thinking',
16
+ Router: 'router',
17
+ };
18
+ // 注册能力↔方法探测器(dev 模式下在 ctx.provide 时校验)
19
+ import { registerCapabilityProbe } from './capabilities.js';
20
+ registerCapabilityProbe('llm', LLMCapabilities.Chat, inst => typeof inst.chat === 'function'
21
+ ? true
22
+ : 'LLMService.chat() is required for capability "chat"');
23
+ registerCapabilityProbe('llm', LLMCapabilities.Streaming, inst => typeof inst.chatStream === 'function'
24
+ ? true
25
+ : 'LLMService.chatStream() is required for capability "streaming"');
26
+ // ToolCalling / Vision / Thinking 为参数层能力,由调用方按请求传参判定,不做方法探测。
27
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/types/llm.ts"],"names":[],"mappings":"AAAA,uBAAuB;AAwIvB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;CACwB,CAAC;AAS3C,uCAAuC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,uBAAuB,CAAC,KAAK,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAC1D,OAAQ,IAA2B,CAAC,IAAI,KAAK,UAAU;IACrD,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,qDAAqD,CAAC,CAAC;AAE7D,uBAAuB,CAAC,KAAK,EAAE,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAC/D,OAAQ,IAAiC,CAAC,UAAU,KAAK,UAAU;IACjE,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,gEAAgE,CAAC,CAAC;AAExE,6DAA6D"}
@@ -0,0 +1,62 @@
1
+ import type { Message } from './core.js';
2
+ export interface MemoryService {
3
+ saveMessage(sessionId: string, message: Message): Promise<void>;
4
+ getHistory(sessionId: string, limit?: number): Promise<Message[]>;
5
+ clearSession(sessionId: string): Promise<void>;
6
+ /** 清空所有会话的所有消息和归档 */
7
+ clearAll?(): Promise<void>;
8
+ /** 归档旧消息,仅保留最近 keepRecent 条为活跃状态,返回被归档的条数 */
9
+ trimHistory?(sessionId: string, keepRecent: number): Promise<number>;
10
+ /** 获取完整历史(含已归档消息),用于 UI 展示 */
11
+ getFullHistory?(sessionId: string, limit?: number): Promise<Message[]>;
12
+ /** 范围查询:取指定会话内 [fromTs, toTs] 区间的消息(按时间升序,可按 role 过滤) */
13
+ getMessagesBySessionRange?(sessionId: string, fromTs: number, toTs: number, roles?: Array<Message['role']>): Promise<Message[]>;
14
+ /** 保存结构化元数据(namespace 隔离,key 唯一) */
15
+ saveMetadata?(namespace: string, key: string, data: Record<string, unknown>): Promise<void>;
16
+ /** 读取元数据 */
17
+ getMetadata?(namespace: string, key: string): Promise<Record<string, unknown> | undefined>;
18
+ /** 列出指定 namespace 下所有元数据条目 */
19
+ listMetadata?(namespace: string): Promise<Array<{
20
+ key: string;
21
+ data: Record<string, unknown>;
22
+ }>>;
23
+ /** 删除元数据条目 */
24
+ deleteMetadata?(namespace: string, key: string): Promise<void>;
25
+ /** 在指定会话的最近 N 条消息中,将 content 里的 oldText 替换为 newText,返回受影响的条数 */
26
+ updateMessageContent?(sessionId: string, oldText: string, newText: string, recentLimit?: number): Promise<number>;
27
+ /** 按时间戳批量删除指定会话的消息(用于回滚整轮对话),返回实际删除条数 */
28
+ deleteMessagesByTimestamps?(sessionId: string, timestamps: number[]): Promise<number>;
29
+ }
30
+ /**
31
+ * 记忆服务能力注册表
32
+ *
33
+ * 第三方可扩展:
34
+ * ```ts
35
+ * declare module '@aalis/core' {
36
+ * interface MemoryCapabilityRegistry { Persistent: 'persistent'; Encrypted: 'encrypted'; }
37
+ * }
38
+ * ```
39
+ */
40
+ export interface MemoryCapabilityRegistry {
41
+ /** 基础的消息历史保存/读取 */
42
+ History: 'history';
43
+ /** 支持结构化元数据存储(saveMetadata 等) */
44
+ Metadata: 'metadata';
45
+ /** 支持消息内容更新(updateMessageContent) */
46
+ ContentUpdate: 'content-update';
47
+ /** 支持按时间戳批量删除消息(deleteMessagesByTimestamps) */
48
+ MessageDelete: 'message-delete';
49
+ }
50
+ export type MemoryCapability = MemoryCapabilityRegistry[keyof MemoryCapabilityRegistry];
51
+ export declare const MemoryCapabilities: {
52
+ readonly History: "history";
53
+ readonly Metadata: "metadata";
54
+ readonly ContentUpdate: "content-update";
55
+ readonly MessageDelete: "message-delete";
56
+ };
57
+ declare module './capabilities.js' {
58
+ interface ServiceCapabilityMap {
59
+ memory: MemoryCapability;
60
+ }
61
+ }
62
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/types/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,qBAAqB;IACrB,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,6CAA6C;IAC7C,WAAW,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE,8BAA8B;IAC9B,cAAc,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAIvE,yDAAyD;IACzD,yBAAyB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAIhI,oCAAoC;IACpC,YAAY,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,YAAY;IACZ,WAAW,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IAC3F,8BAA8B;IAC9B,YAAY,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;IACjG,cAAc;IACd,cAAc,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D,gEAAgE;IAChE,oBAAoB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAElH,yCAAyC;IACzC,0BAA0B,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvF;AAID;;;;;;;;;GASG;AACH,MAAM,WAAW,wBAAwB;IACvC,mBAAmB;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,iCAAiC;IACjC,QAAQ,EAAE,UAAU,CAAC;IACrB,qCAAqC;IACrC,aAAa,EAAE,gBAAgB,CAAC;IAChC,+CAA+C;IAC/C,aAAa,EAAE,gBAAgB,CAAC;CACjC;AAED,MAAM,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,wBAAwB,CAAC,CAAC;AAExF,eAAO,MAAM,kBAAkB;;;;;CAKc,CAAC;AAE9C,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,oBAAoB;QAC5B,MAAM,EAAE,gBAAgB,CAAC;KAC1B;CACF"}
@@ -0,0 +1,22 @@
1
+ // ----- 记忆服务接口 -----
2
+ export const MemoryCapabilities = {
3
+ History: 'history',
4
+ Metadata: 'metadata',
5
+ ContentUpdate: 'content-update',
6
+ MessageDelete: 'message-delete',
7
+ };
8
+ import { registerCapabilityProbe } from './capabilities.js';
9
+ registerCapabilityProbe('memory', MemoryCapabilities.History, inst => typeof inst.getHistory === 'function'
10
+ && typeof inst.saveMessage === 'function'
11
+ ? true
12
+ : 'MemoryService.saveMessage()/getHistory() are required for capability "history"');
13
+ registerCapabilityProbe('memory', MemoryCapabilities.Metadata, inst => typeof inst.saveMetadata === 'function'
14
+ ? true
15
+ : 'MemoryService.saveMetadata() is required for capability "metadata"');
16
+ registerCapabilityProbe('memory', MemoryCapabilities.ContentUpdate, inst => typeof inst.updateMessageContent === 'function'
17
+ ? true
18
+ : 'MemoryService.updateMessageContent() is required for capability "content-update"');
19
+ registerCapabilityProbe('memory', MemoryCapabilities.MessageDelete, inst => typeof inst.deleteMessagesByTimestamps === 'function'
20
+ ? true
21
+ : 'MemoryService.deleteMessagesByTimestamps() is required for capability "message-delete"');
22
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/types/memory.ts"],"names":[],"mappings":"AAAA,qBAAqB;AA+DrB,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,gBAAgB;IAC/B,aAAa,EAAE,gBAAgB;CACY,CAAC;AAQ9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CACnE,OAAQ,IAAiC,CAAC,UAAU,KAAK,UAAU;OAC9D,OAAQ,IAAkC,CAAC,WAAW,KAAK,UAAU;IACxE,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,gFAAgF,CAAC,CAAC;AAExF,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CACpE,OAAQ,IAAmC,CAAC,YAAY,KAAK,UAAU;IACrE,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,oEAAoE,CAAC,CAAC;AAE5E,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CACzE,OAAQ,IAA2C,CAAC,oBAAoB,KAAK,UAAU;IACrF,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,kFAAkF,CAAC,CAAC;AAE1F,uBAAuB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CACzE,OAAQ,IAAiD,CAAC,0BAA0B,KAAK,UAAU;IACjG,CAAC,CAAC,IAAI;IACN,CAAC,CAAC,wFAAwF,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ /** 输出格式中单个字段的定义 */
2
+ export interface OutputFormatField {
3
+ /** 字段用途描述(写入 system prompt 供 LLM 理解) */
4
+ description: string;
5
+ /** 字段类型(影响 system prompt 占位符和输出后的类型强制) */
6
+ type?: 'string' | 'number' | 'boolean';
7
+ /** 是否为发送给用户的回复字段(有且仅有一个) */
8
+ reply?: boolean;
9
+ }
10
+ /** 角色卡定义的结构化输出格式 */
11
+ export interface OutputFormat {
12
+ /** 字段定义表:key = JSON 字段名 */
13
+ fields: Record<string, OutputFormatField>;
14
+ /** 回复字段名(自动推断,取 reply: true 的那个 key) */
15
+ replyField: string;
16
+ }
17
+ /**
18
+ * 会话级选项,由调用方(如 agent-default)从 SessionConfig 构造后传入。
19
+ * PersonaService 本身不关心 session-manager,只根据传入的选项调整行为。
20
+ */
21
+ export interface PersonaSessionOptions {
22
+ /** 覆盖角色卡名称 */
23
+ persona?: string;
24
+ /** 禁用结构化输出格式 */
25
+ disableOutputFormat?: boolean;
26
+ /** 客户端渲染 JSON 覆盖 */
27
+ clientSideJsonRendering?: boolean;
28
+ }
29
+ export interface PersonaService {
30
+ getSystemPrompt(options?: PersonaSessionOptions): string;
31
+ getPersonaName(): string;
32
+ /** 获取角色卡定义的结构化输出格式,无定义时返回 undefined */
33
+ getOutputFormat?(options?: PersonaSessionOptions): OutputFormat | undefined;
34
+ /** 该角色卡是否配置为客户端渲染 JSON */
35
+ isClientSideJsonRendering?(options?: PersonaSessionOptions): boolean;
36
+ /** 列出可用的人设卡(用于前端下拉框) */
37
+ listModels?(): Promise<string[]>;
38
+ /** 获取角色卡定义的昵称列表(用于触发检测) */
39
+ getNickNames?(): string[];
40
+ /** 获取角色卡定义的禁言关键词列表 */
41
+ getMuteKeywords?(): string[];
42
+ /** 是否启用了时间注入(供其他插件判断是否需要注册时间相关工具) */
43
+ isTimeInjectionEnabled?(): boolean;
44
+ }
45
+ //# sourceMappingURL=persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../src/types/persona.ts"],"names":[],"mappings":"AAEA,mBAAmB;AACnB,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,4BAA4B;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,oBAAoB;AACpB,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC;IACzD,cAAc,IAAI,MAAM,CAAC;IACzB,uCAAuC;IACvC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,YAAY,GAAG,SAAS,CAAC;IAC5E,0BAA0B;IAC1B,yBAAyB,CAAC,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACrE,wBAAwB;IACxB,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,2BAA2B;IAC3B,YAAY,CAAC,IAAI,MAAM,EAAE,CAAC;IAC1B,sBAAsB;IACtB,eAAe,CAAC,IAAI,MAAM,EAAE,CAAC;IAC7B,qCAAqC;IACrC,sBAAsB,CAAC,IAAI,OAAO,CAAC;CACpC"}
@@ -0,0 +1,3 @@
1
+ // ----- 人格服务接口 -----
2
+ export {};
3
+ //# sourceMappingURL=persona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.js","sourceRoot":"","sources":["../../src/types/persona.ts"],"names":[],"mappings":"AAAA,qBAAqB"}
@@ -0,0 +1,126 @@
1
+ /** 单个平台连接的状态 */
2
+ export interface PlatformConnection {
3
+ /** 连接唯一标识 */
4
+ id: string;
5
+ /** 平台名称 (如 'cli', 'webui', 'onebot') */
6
+ platform: string;
7
+ /** 机器人自身 ID(仅协议平台使用) */
8
+ selfId?: string;
9
+ /** 机器人自身昵称/显示名(仅协议平台使用) */
10
+ selfNickname?: string;
11
+ /** 连接状态 */
12
+ status: 'online' | 'offline' | 'connecting';
13
+ /** 额外信息 (如 OneBot 的实现名称、版本等) */
14
+ detail?: Record<string, unknown>;
15
+ }
16
+ /** 平台自身身份(机器人/账号),用于 prompt 注入和历史消息归档 */
17
+ export interface PlatformSelfIdentity {
18
+ /** 平台名称 (如 'onebot', 'cli', 'webui') */
19
+ platform: string;
20
+ /** 平台账号 ID(协议平台通常可用) */
21
+ selfId?: string;
22
+ /** 平台账号昵称/显示名 */
23
+ nickname?: string;
24
+ }
25
+ /**
26
+ * 平台适配器 —— 每个平台插件实现此接口
27
+ *
28
+ * 提供统一的平台抽象,使核心可以查询所有已接入平台的连接状态,
29
+ * 也使其他插件可以向指定平台发送消息。
30
+ *
31
+ * 第三方平台接入只需实现此接口并通过 `ctx.provide('platform', adapter)` 注册即可。
32
+ */
33
+ export interface PlatformAdapter {
34
+ /** 适配器显示名称 */
35
+ adapterName: string;
36
+ /** 平台标识 (如 'cli', 'webui', 'onebot', 'telegram', 'discord') */
37
+ platform: string;
38
+ /**
39
+ * 平台可能发出的 IncomingMessage.sessionType 枚举。
40
+ *
41
+ * 消费者(如 plugin-flow-control / plugin-trigger-policy)可以从中汇总出
42
+ * 真实可选作用域,避免在 UI 上臆造不存在的选项。
43
+ *
44
+ * 未声明表示适配器不区分 sessionType(如 cli / webui 都是单会话)。
45
+ */
46
+ sessionTypes?: readonly string[];
47
+ /** 获取当前所有连接 */
48
+ getConnections(): PlatformConnection[];
49
+ /** 向指定 sessionId 发送纯文本消息 */
50
+ sendMessage(sessionId: string, content: string, options?: {
51
+ skipSplit?: boolean;
52
+ }): Promise<void>;
53
+ /**
54
+ * 判断该 adapter 是否能处理给定 sessionId(**路由用**)。
55
+ *
56
+ * - PlatformRouter 按 sessionId 路由时枚举所有 adapter 调此方法定位归属
57
+ * - 未实现时 router 默认 fallback 为 `sessionId.startsWith(this.platform + ':')`
58
+ * —— 适合 sessionId 形如 `<platform>:<...>` 的协议平台(如 onebot)
59
+ * - sessionId 不携带 platform 前缀的 adapter(如 cli 的自定义 sessionId)
60
+ * **必须**显式实现此方法
61
+ *
62
+ * 与 LLMService.supportsModel 的设计意图对称:每个 provider 自报"我接不接这个 key",
63
+ * router 不假设 key 的格式约定。
64
+ */
65
+ canHandle?(sessionId: string): boolean | Promise<boolean>;
66
+ /** 获取当前平台账号自身身份;多连接平台可用 sessionId 定位具体连接 */
67
+ getSelfIdentity?(sessionId?: string): PlatformSelfIdentity | undefined;
68
+ /**
69
+ * 适配器是否至少有一个可用连接
70
+ * 默认实现:检查 getConnections() 中是否有 status === 'online'
71
+ */
72
+ isReady?(): boolean;
73
+ /**
74
+ * 调用平台原生 API(可选,由具体适配器实现)
75
+ *
76
+ * 例如 OneBot 适配器通过此接口调用 set_group_ban 等 Action。
77
+ * @param sessionId 用于定位连接的 sessionId
78
+ * @param action API 名称
79
+ * @param params API 参数
80
+ */
81
+ callAction?(sessionId: string, action: string, params: Record<string, unknown>): Promise<unknown>;
82
+ }
83
+ import type { PluginGroupInfo } from './core.js';
84
+ /**
85
+ * 平台聚合服务 —— 同名 facade,对外暴露为 `'platform'`
86
+ *
87
+ * 与 storage-router / llm-router 同模式:以 `capability:['router']`
88
+ * 注册到 `'platform'` 服务名下,consumer 通过 `ctx.getService('platform')`
89
+ * 拿到聚合层;如需访问具体某个 adapter,可用
90
+ * `ctx.getService<PlatformAdapter>('platform', ['<platform-name>'])`。
91
+ *
92
+ * 默认由 plugin-platform 提供。
93
+ */
94
+ export interface PlatformService {
95
+ /** 获取平台子系统的插件分组(基于 provides ∩ inject 自动计算) */
96
+ getPluginGroups(): PluginGroupInfo[];
97
+ /** 获取所有平台的聚合连接列表 */
98
+ getConnections(): PlatformConnection[];
99
+ /** 获取所有已注册的平台名称 */
100
+ getPlatformNames(): string[];
101
+ /** 获取所有合规的平台适配器实例(不含 router 自身) */
102
+ getAdapters(): PlatformAdapter[];
103
+ /** 获取所有平台适配器及其连接详情 */
104
+ getDetails(): Array<{
105
+ adapterName: string;
106
+ platform: string;
107
+ contextId: string;
108
+ capabilities: string[];
109
+ connections: PlatformConnection[];
110
+ }>;
111
+ /** 获取指定平台在当前会话中的自身身份 */
112
+ getSelfIdentity?(platform: string, sessionId?: string): PlatformSelfIdentity | undefined;
113
+ }
114
+ export interface PlatformCapabilityRegistry {
115
+ Router: 'router';
116
+ }
117
+ export type PlatformCapability = PlatformCapabilityRegistry[keyof PlatformCapabilityRegistry];
118
+ export declare const PlatformCapabilities: {
119
+ readonly Router: "router";
120
+ };
121
+ declare module './capabilities.js' {
122
+ interface ServiceCapabilityMap {
123
+ platform: PlatformCapability | string;
124
+ }
125
+ }
126
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/types/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ // ----- 平台适配器接口 -----
2
+ export const PlatformCapabilities = {
3
+ Router: 'router',
4
+ };
5
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/types/platform.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAgItB,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,QAAQ;CAC6B,CAAC"}
@@ -0,0 +1,84 @@
1
+ import type { Context } from '../context.js';
2
+ import type { ConfigSchema, InjectDeclaration } from './core.js';
3
+ import type { NormalizedDependency } from './service.js';
4
+ export interface PluginModule {
5
+ name: string;
6
+ /** 插件的显示名称,用于前端展示 */
7
+ displayName?: string;
8
+ inject?: InjectDeclaration;
9
+ provides?: string[];
10
+ /** 标记为 core 的插件不能被用户禁用 */
11
+ core?: boolean;
12
+ /**
13
+ * 是否允许同一插件以不同配置多次加载(多实例)
14
+ *
15
+ * 默认 false:同一 module 只能注册一次(防止重复注册命令等副作用)。
16
+ * 设为 true 后,可通过 `name:suffix` 格式注册多个实例,
17
+ * 每个实例拥有独立的 Context、配置和 contextId。
18
+ *
19
+ * 适合多实例的插件:LLM adapters、embedding adapters、platform adapters、memory backends。
20
+ */
21
+ reusable?: boolean;
22
+ /** 配置 Schema,用于前端自动生成配置表单 */
23
+ configSchema?: ConfigSchema;
24
+ /** 插件默认配置,当主配置文件中无此插件配置时使用 */
25
+ defaultConfig?: Record<string, unknown>;
26
+ /**
27
+ * 逃生舱:声明本插件在依赖的 provider 发生变化(被 dispose / 替换)时
28
+ * 必须由 core 主动级联 dispose + reapply 才能恢复正确状态。
29
+ *
30
+ * 默认 `false`:core **不会**主动级联 bounce 下游。绝大多数插件应让
31
+ * `ctx.getService(...)` 在 handler/方法体内每次惰性查询,从而天然跟随
32
+ * provider 切换,无需 bounce。
33
+ *
34
+ * 仅当插件无法响应式处理状态(如必须在启动期一次性把 provider 引用
35
+ * 缓存到第三方 SDK 内部、或必须在 apply 时跑昂贵的同步初始化)时设为
36
+ * `true`。第三方插件开发者迁移成本太高时也可以临时打开。
37
+ */
38
+ requiresBounceOnDepChange?: boolean;
39
+ apply(ctx: Context, config: Record<string, unknown>): void | Promise<void>;
40
+ }
41
+ export type PluginState = 'pending' | 'activating' | 'active' | 'disabled' | 'disposed' | 'error';
42
+ /**
43
+ * recompute() 的触发原因。所有导致插件库状态需重新计算的事件
44
+ * 都收拢到这个判别联合上,让 PluginManager 只有一条状态转移路径。
45
+ *
46
+ * - service-up:某服务刚被 provide —— 可能让 pending 插件能激活
47
+ * - service-down:某服务刚被 unregister —— required 依赖其的要停用,
48
+ * optional 依赖其的要 bounce(重新 apply 以对接可能的新实例)
49
+ * - plugin-state-changed:插件被显式禁用/启用/重载/改配置后调用
50
+ * - shutdown:App.stop() 调用,按拓扑逆序 dispose 所有插件
51
+ */
52
+ export type RecomputeReason = {
53
+ type: 'service-up';
54
+ service: string;
55
+ } | {
56
+ type: 'service-down';
57
+ service: string;
58
+ } | {
59
+ type: 'plugin-state-changed';
60
+ } | {
61
+ type: 'shutdown';
62
+ };
63
+ export interface PluginEntry {
64
+ module: PluginModule;
65
+ /** 实例 ID:单实例时与 module.name 相同,多实例时为 `name:suffix` */
66
+ instanceId: string;
67
+ config: Record<string, unknown>;
68
+ state: PluginState;
69
+ error?: string;
70
+ context?: Context;
71
+ requiredDeps: NormalizedDependency[];
72
+ optionalDeps: NormalizedDependency[];
73
+ }
74
+ /**
75
+ * 解析插件实例 ID
76
+ *
77
+ * 格式:`@scope/plugin-name:suffix` → { moduleName: '@scope/plugin-name', suffix: 'suffix' }
78
+ * 无 suffix 时返回 { moduleName, suffix: undefined }
79
+ */
80
+ export declare function parseInstanceId(instanceId: string): {
81
+ moduleName: string;
82
+ suffix?: string;
83
+ };
84
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAIjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIzD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC;;;;;;;;;;;OAWG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAK5E;AAID,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAElG;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAW3F"}
@@ -0,0 +1,24 @@
1
+ // ----- 插件系统类型与纯辅助函数 -----
2
+ //
3
+ // 与运行时实现 (PluginManager) 分离,避免下游消费者只为类型而拉入 class。
4
+ // 实现详见 ../plugin.ts。
5
+ /**
6
+ * 解析插件实例 ID
7
+ *
8
+ * 格式:`@scope/plugin-name:suffix` → { moduleName: '@scope/plugin-name', suffix: 'suffix' }
9
+ * 无 suffix 时返回 { moduleName, suffix: undefined }
10
+ */
11
+ export function parseInstanceId(instanceId) {
12
+ // 从右侧找最后一个冒号,但跳过 scope 中的冒号
13
+ // 格式: @scope/name:suffix 或 name:suffix
14
+ const slashIdx = instanceId.indexOf('/');
15
+ const searchFrom = slashIdx >= 0 ? slashIdx + 1 : 0;
16
+ const colonIdx = instanceId.indexOf(':', searchFrom);
17
+ if (colonIdx < 0)
18
+ return { moduleName: instanceId };
19
+ return {
20
+ moduleName: instanceId.slice(0, colonIdx),
21
+ suffix: instanceId.slice(colonIdx + 1),
22
+ };
23
+ }
24
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,EAAE;AACF,kDAAkD;AAClD,qBAAqB;AAqFrB;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,4BAA4B;IAC5B,uCAAuC;IACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACrD,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpD,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;QACzC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;KACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { DependencyDeclaration } from './core.js';
2
+ /**
3
+ * 服务优先级约定(数字越大越优先)
4
+ *
5
+ * 用于 `ctx.provide(name, instance, { priority })`。
6
+ * 同优先级时,先注册的胜出(稳定降序排序)。
7
+ *
8
+ * 设计目的:把『谁是默认胜者』变成静态、可预测的契约,
9
+ * 替代旧版 preferService 那种「需要用户手动激活」的运行时偏好。
10
+ *
11
+ * 推荐用法:
12
+ * - `Backend = 0`:普通后端实现(如 plugin-openai / plugin-deepseek)。
13
+ * - `Override = 50`:用户级覆盖;同名服务希望默认胜过普通后端时使用。
14
+ * - `System = 200`:保留给核心系统级覆盖。
15
+ *
16
+ * 注:feat/service-granularity 之后已不再有 router/facade 层级——LLM / storage / platform
17
+ * 均改为按 model / root / sessionId 直接注册多 entry,跨 entry 的聚合与路由由各自
18
+ * `*-api` 的 helper 函数承担(`createStorageGateway` / `resolvePlatformBySession` / ...),
19
+ * 没有同名 facade entry,因此曾经的 `Router = 100` 槽位整体废弃。
20
+ */
21
+ export declare const ServicePriority: {
22
+ readonly Backend: 0;
23
+ readonly Override: 50;
24
+ readonly System: 200;
25
+ };
26
+ export type ServicePriorityValue = (typeof ServicePriority)[keyof typeof ServicePriority];
27
+ export interface ServiceEntry {
28
+ instance: unknown;
29
+ capabilities: Set<string>;
30
+ priority: number;
31
+ contextId: string;
32
+ /** 可选的展示标签(如 "OpenAI / gpt-4o") */
33
+ label?: string;
34
+ }
35
+ export interface NormalizedDependency {
36
+ service: string;
37
+ capabilities: string[];
38
+ }
39
+ /**
40
+ * 将 string | ServiceDependency 统一为 NormalizedDependency
41
+ */
42
+ export declare function normalizeDependency(dep: DependencyDeclaration): NormalizedDependency;
43
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/types/service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AACX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAE1F,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,qBAAqB,GAAG,oBAAoB,CAKpF"}