@zhin.js/core 1.0.25 → 1.0.26

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 (200) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +84 -342
  3. package/lib/adapter.d.ts +17 -0
  4. package/lib/adapter.d.ts.map +1 -1
  5. package/lib/adapter.js +84 -2
  6. package/lib/adapter.js.map +1 -1
  7. package/lib/ai/agent.d.ts +126 -0
  8. package/lib/ai/agent.d.ts.map +1 -0
  9. package/lib/ai/agent.js +645 -0
  10. package/lib/ai/agent.js.map +1 -0
  11. package/lib/ai/context-manager.d.ts +213 -0
  12. package/lib/ai/context-manager.d.ts.map +1 -0
  13. package/lib/ai/context-manager.js +313 -0
  14. package/lib/ai/context-manager.js.map +1 -0
  15. package/lib/ai/conversation-memory.d.ts +181 -0
  16. package/lib/ai/conversation-memory.d.ts.map +1 -0
  17. package/lib/ai/conversation-memory.js +581 -0
  18. package/lib/ai/conversation-memory.js.map +1 -0
  19. package/lib/ai/follow-up.d.ts +131 -0
  20. package/lib/ai/follow-up.d.ts.map +1 -0
  21. package/lib/ai/follow-up.js +265 -0
  22. package/lib/ai/follow-up.js.map +1 -0
  23. package/lib/ai/index.d.ts +29 -0
  24. package/lib/ai/index.d.ts.map +1 -0
  25. package/lib/ai/index.js +34 -0
  26. package/lib/ai/index.js.map +1 -0
  27. package/lib/ai/init.d.ts +30 -0
  28. package/lib/ai/init.d.ts.map +1 -0
  29. package/lib/ai/init.js +424 -0
  30. package/lib/ai/init.js.map +1 -0
  31. package/lib/ai/output.d.ts +93 -0
  32. package/lib/ai/output.d.ts.map +1 -0
  33. package/lib/ai/output.js +176 -0
  34. package/lib/ai/output.js.map +1 -0
  35. package/lib/ai/providers/anthropic.d.ts +23 -0
  36. package/lib/ai/providers/anthropic.d.ts.map +1 -0
  37. package/lib/ai/providers/anthropic.js +322 -0
  38. package/lib/ai/providers/anthropic.js.map +1 -0
  39. package/lib/ai/providers/base.d.ts +43 -0
  40. package/lib/ai/providers/base.d.ts.map +1 -0
  41. package/lib/ai/providers/base.js +135 -0
  42. package/lib/ai/providers/base.js.map +1 -0
  43. package/lib/ai/providers/index.d.ts +12 -0
  44. package/lib/ai/providers/index.d.ts.map +1 -0
  45. package/lib/ai/providers/index.js +9 -0
  46. package/lib/ai/providers/index.js.map +1 -0
  47. package/lib/ai/providers/ollama.d.ts +25 -0
  48. package/lib/ai/providers/ollama.d.ts.map +1 -0
  49. package/lib/ai/providers/ollama.js +243 -0
  50. package/lib/ai/providers/ollama.js.map +1 -0
  51. package/lib/ai/providers/openai.d.ts +46 -0
  52. package/lib/ai/providers/openai.d.ts.map +1 -0
  53. package/lib/ai/providers/openai.js +132 -0
  54. package/lib/ai/providers/openai.js.map +1 -0
  55. package/lib/ai/rate-limiter.d.ts +38 -0
  56. package/lib/ai/rate-limiter.d.ts.map +1 -0
  57. package/lib/ai/rate-limiter.js +86 -0
  58. package/lib/ai/rate-limiter.js.map +1 -0
  59. package/lib/ai/service.d.ts +81 -0
  60. package/lib/ai/service.d.ts.map +1 -0
  61. package/lib/ai/service.js +274 -0
  62. package/lib/ai/service.js.map +1 -0
  63. package/lib/ai/session.d.ts +186 -0
  64. package/lib/ai/session.d.ts.map +1 -0
  65. package/lib/ai/session.js +443 -0
  66. package/lib/ai/session.js.map +1 -0
  67. package/lib/ai/tone-detector.d.ts +19 -0
  68. package/lib/ai/tone-detector.d.ts.map +1 -0
  69. package/lib/ai/tone-detector.js +72 -0
  70. package/lib/ai/tone-detector.js.map +1 -0
  71. package/lib/ai/tools.d.ts +45 -0
  72. package/lib/ai/tools.d.ts.map +1 -0
  73. package/lib/ai/tools.js +206 -0
  74. package/lib/ai/tools.js.map +1 -0
  75. package/lib/ai/types.d.ts +264 -0
  76. package/lib/ai/types.d.ts.map +1 -0
  77. package/lib/ai/types.js +6 -0
  78. package/lib/ai/types.js.map +1 -0
  79. package/lib/ai/user-profile.d.ts +56 -0
  80. package/lib/ai/user-profile.d.ts.map +1 -0
  81. package/lib/ai/user-profile.js +130 -0
  82. package/lib/ai/user-profile.js.map +1 -0
  83. package/lib/ai/zhin-agent.d.ts +165 -0
  84. package/lib/ai/zhin-agent.d.ts.map +1 -0
  85. package/lib/ai/zhin-agent.js +707 -0
  86. package/lib/ai/zhin-agent.js.map +1 -0
  87. package/lib/built/ai-trigger.d.ts.map +1 -1
  88. package/lib/built/ai-trigger.js +7 -3
  89. package/lib/built/ai-trigger.js.map +1 -1
  90. package/lib/built/command.d.ts +33 -17
  91. package/lib/built/command.d.ts.map +1 -1
  92. package/lib/built/command.js +71 -44
  93. package/lib/built/command.js.map +1 -1
  94. package/lib/built/component.d.ts +42 -15
  95. package/lib/built/component.d.ts.map +1 -1
  96. package/lib/built/component.js +84 -52
  97. package/lib/built/component.js.map +1 -1
  98. package/lib/built/config.d.ts +54 -5
  99. package/lib/built/config.d.ts.map +1 -1
  100. package/lib/built/config.js +76 -10
  101. package/lib/built/config.js.map +1 -1
  102. package/lib/built/cron.d.ts +41 -18
  103. package/lib/built/cron.d.ts.map +1 -1
  104. package/lib/built/cron.js +106 -63
  105. package/lib/built/cron.js.map +1 -1
  106. package/lib/built/database.d.ts +55 -6
  107. package/lib/built/database.d.ts.map +1 -1
  108. package/lib/built/database.js +93 -22
  109. package/lib/built/database.js.map +1 -1
  110. package/lib/built/dispatcher.d.ts +118 -0
  111. package/lib/built/dispatcher.d.ts.map +1 -0
  112. package/lib/built/dispatcher.js +196 -0
  113. package/lib/built/dispatcher.js.map +1 -0
  114. package/lib/built/permission.d.ts +45 -5
  115. package/lib/built/permission.d.ts.map +1 -1
  116. package/lib/built/permission.js +56 -11
  117. package/lib/built/permission.js.map +1 -1
  118. package/lib/built/skill.d.ts +117 -0
  119. package/lib/built/skill.d.ts.map +1 -0
  120. package/lib/built/skill.js +191 -0
  121. package/lib/built/skill.js.map +1 -0
  122. package/lib/built/tool.d.ts +71 -164
  123. package/lib/built/tool.d.ts.map +1 -1
  124. package/lib/built/tool.js +212 -297
  125. package/lib/built/tool.js.map +1 -1
  126. package/lib/feature.d.ts +75 -0
  127. package/lib/feature.d.ts.map +1 -0
  128. package/lib/feature.js +69 -0
  129. package/lib/feature.js.map +1 -0
  130. package/lib/index.d.ts +4 -0
  131. package/lib/index.d.ts.map +1 -1
  132. package/lib/index.js +7 -0
  133. package/lib/index.js.map +1 -1
  134. package/lib/plugin.d.ts +25 -17
  135. package/lib/plugin.d.ts.map +1 -1
  136. package/lib/plugin.js +180 -20
  137. package/lib/plugin.js.map +1 -1
  138. package/lib/types.d.ts +4 -9
  139. package/lib/types.d.ts.map +1 -1
  140. package/package.json +4 -4
  141. package/src/adapter.ts +101 -2
  142. package/src/ai/agent.ts +772 -0
  143. package/src/ai/context-manager.ts +440 -0
  144. package/src/ai/conversation-memory.ts +774 -0
  145. package/src/ai/follow-up.ts +357 -0
  146. package/src/ai/index.ts +128 -0
  147. package/src/ai/init.ts +502 -0
  148. package/src/ai/output.ts +261 -0
  149. package/src/ai/providers/anthropic.ts +375 -0
  150. package/src/ai/providers/base.ts +173 -0
  151. package/src/ai/providers/index.ts +13 -0
  152. package/src/ai/providers/ollama.ts +292 -0
  153. package/src/ai/providers/openai.ts +167 -0
  154. package/src/ai/rate-limiter.ts +129 -0
  155. package/src/ai/service.ts +319 -0
  156. package/src/ai/session.ts +544 -0
  157. package/src/ai/tone-detector.ts +89 -0
  158. package/src/ai/tools.ts +218 -0
  159. package/src/ai/types.ts +296 -0
  160. package/src/ai/user-profile.ts +181 -0
  161. package/src/ai/zhin-agent.ts +845 -0
  162. package/src/built/ai-trigger.ts +6 -3
  163. package/src/built/command.ts +75 -69
  164. package/src/built/component.ts +94 -76
  165. package/src/built/config.ts +238 -128
  166. package/src/built/cron.ts +117 -101
  167. package/src/built/database.ts +128 -33
  168. package/src/built/dispatcher.ts +332 -0
  169. package/src/built/permission.ts +146 -54
  170. package/src/built/skill.ts +280 -0
  171. package/src/built/tool.ts +245 -366
  172. package/src/feature.ts +113 -0
  173. package/src/index.ts +7 -0
  174. package/src/plugin.ts +198 -33
  175. package/src/types.ts +6 -10
  176. package/tests/adapter.test.ts +153 -1
  177. package/tests/ai/agent.test.ts +614 -0
  178. package/tests/ai/ai-trigger.test.ts +368 -0
  179. package/tests/ai/context-manager.test.ts +413 -0
  180. package/tests/ai/conversation-memory.test.ts +128 -0
  181. package/tests/ai/follow-up.test.ts +175 -0
  182. package/tests/ai/integration.test.ts +584 -0
  183. package/tests/ai/output.test.ts +128 -0
  184. package/tests/ai/providers.integration.test.ts +227 -0
  185. package/tests/ai/rate-limiter.test.ts +108 -0
  186. package/tests/ai/session.test.ts +375 -0
  187. package/tests/ai/setup.ts +308 -0
  188. package/tests/ai/tone-detector.test.ts +80 -0
  189. package/tests/ai/tool.test.ts +800 -0
  190. package/tests/ai/tools-builtin.test.ts +346 -0
  191. package/tests/ai/user-profile.test.ts +73 -0
  192. package/tests/ai/zhin-agent.test.ts +177 -0
  193. package/tests/config.test.ts +46 -0
  194. package/tests/cron.test.ts +94 -5
  195. package/tests/dispatcher.test.ts +146 -0
  196. package/tests/feature.test.ts +145 -0
  197. package/tests/features-builtin.test.ts +191 -0
  198. package/tests/plugin.test.ts +88 -14
  199. package/tests/skill-feature.test.ts +179 -0
  200. package/tests/tool-feature.test.ts +254 -0
@@ -0,0 +1,181 @@
1
+ /**
2
+ * ConversationMemory — 基于数据库的会话记忆(话题感知 + 链式摘要)
3
+ *
4
+ * 两张表分离存储:
5
+ *
6
+ * ai_messages 表(逐条记录):
7
+ * ┌──────────────────────────────────────────────────────────┐
8
+ * │ session_id | role | content | round | time │
9
+ * │ s1 | user | 你好 | 1 | ... │
10
+ * │ s1 | assistant | 你好呀! | 1 | ... │
11
+ * │ ... | ... | ... | ... | ... │
12
+ * └──────────────────────────────────────────────────────────┘
13
+ *
14
+ * ai_summaries 表(链式摘要):
15
+ * ┌────────────────────────────────────────────────────────────────────┐
16
+ * │ id | session_id | parent_id | from_round | to_round | summary │
17
+ * │ 1 | s1 | null | 1 | 7 | 用户讨论了… │
18
+ * │ 2 | s1 | 1 | 8 | 15 | 之前...又… │
19
+ * └────────────────────────────────────────────────────────────────────┘
20
+ *
21
+ * 摘要触发规则:
22
+ * 1. 检测到话题切换(当前消息与最近消息的关键词重合度低)
23
+ * 2. 且上一个话题持续 ≥ minTopicRounds 轮
24
+ * → 异步生成摘要,覆盖上一话题的全部消息
25
+ *
26
+ * 上下文构建规则:
27
+ * 1. 取最新 summary + 最近 slidingWindowSize 轮消息(滑动窗口)
28
+ * 2. 检查连续性:summary.to_round === window第一条round - 1
29
+ * → 连续:[summary] + [window]
30
+ * → 不连续:丢弃 summary,仅用 [window]
31
+ */
32
+ import type { AIProvider, ChatMessage } from './types.js';
33
+ /** ai_messages 表结构 */
34
+ export declare const AI_MESSAGE_MODEL: {
35
+ session_id: {
36
+ type: "text";
37
+ nullable: boolean;
38
+ };
39
+ role: {
40
+ type: "text";
41
+ nullable: boolean;
42
+ };
43
+ content: {
44
+ type: "text";
45
+ nullable: boolean;
46
+ };
47
+ round: {
48
+ type: "integer";
49
+ nullable: boolean;
50
+ };
51
+ created_at: {
52
+ type: "integer";
53
+ default: number;
54
+ };
55
+ };
56
+ /** ai_summaries 表结构(链式) */
57
+ export declare const AI_SUMMARY_MODEL: {
58
+ session_id: {
59
+ type: "text";
60
+ nullable: boolean;
61
+ };
62
+ parent_id: {
63
+ type: "integer";
64
+ nullable: boolean;
65
+ };
66
+ from_round: {
67
+ type: "integer";
68
+ nullable: boolean;
69
+ };
70
+ to_round: {
71
+ type: "integer";
72
+ nullable: boolean;
73
+ };
74
+ summary: {
75
+ type: "text";
76
+ nullable: boolean;
77
+ };
78
+ created_at: {
79
+ type: "integer";
80
+ default: number;
81
+ };
82
+ };
83
+ /**
84
+ * 数据库模型接口(与 RelatedModel 的链式查询 API 对齐)
85
+ *
86
+ * select(...fields) → Selection (thenable, 支持 .where().orderBy().limit())
87
+ * create(data) → Promise<any>
88
+ */
89
+ interface DbModel {
90
+ select(...fields: string[]): any;
91
+ create(data: Record<string, any>): Promise<any>;
92
+ }
93
+ export interface ConversationMemoryConfig {
94
+ /** 一个话题至少持续多少轮才触发摘要(默认 5) */
95
+ minTopicRounds?: number;
96
+ /** 滑动窗口大小:最近 N 轮消息(默认 5) */
97
+ slidingWindowSize?: number;
98
+ /** 话题切换检测阈值(0-1,值越低越敏感,默认 0.15) */
99
+ topicChangeThreshold?: number;
100
+ }
101
+ export declare class ConversationMemory {
102
+ private store;
103
+ private provider;
104
+ private config;
105
+ private summarizing;
106
+ /** per-session 话题跟踪 */
107
+ private topicStates;
108
+ /** per-session 轮次缓存(避免每次查数据库) */
109
+ private roundCache;
110
+ constructor(config?: ConversationMemoryConfig);
111
+ setProvider(provider: AIProvider): void;
112
+ upgradeToDatabase(msgModel: DbModel, sumModel: DbModel): void;
113
+ /**
114
+ * 保存一轮对话,并检测话题切换来触发摘要
115
+ */
116
+ saveRound(sessionId: string, userContent: string, assistantContent: string): Promise<void>;
117
+ /**
118
+ * 话题检测流程(全程异步,不阻塞对话):
119
+ *
120
+ * 1. 短消息(token ≤ 3)→ 跳过检测,视为延续话题
121
+ * 2. Jaccard 快检 → 高相似(≥ 0.5) → 肯定同话题,跳过 LLM
122
+ * 3. Jaccard 不确定(< 0.5) → 调 LLM 裁决
123
+ * 4. LLM 判定切换 + 旧话题 ≥ minTopicRounds → 触发摘要
124
+ */
125
+ private handleTopicAndSummary;
126
+ /** 更新话题状态(同话题情况) */
127
+ private updateTopicState;
128
+ /**
129
+ * 调用 LLM 判断话题是否切换
130
+ *
131
+ * 输入: 最近几条用户消息 + 当前用户消息
132
+ * 输出: true = 话题切换, false = 同话题
133
+ */
134
+ private detectTopicChangeByLLM;
135
+ /**
136
+ * 异步生成链式摘要(不阻塞对话)
137
+ */
138
+ private generateSummaryAsync;
139
+ /**
140
+ * 构建 LLM 上下文消息列表
141
+ *
142
+ * 规则:
143
+ * 1. 取滑动窗口(最近 slidingWindowSize 轮)
144
+ * 2. 取最新 summary
145
+ * 3. 检查连续性:summary.to_round === window第一轮 - 1
146
+ * → 连续:[summary] + [window 消息]
147
+ * → 不连续:仅 [window 消息]
148
+ */
149
+ buildContext(sessionId: string): Promise<ChatMessage[]>;
150
+ private callLLMSummarize;
151
+ searchMessages(sessionId: string, keyword: string, limit?: number): Promise<{
152
+ round: number;
153
+ role: string;
154
+ content: string;
155
+ time: number;
156
+ }[]>;
157
+ getMessagesByRound(sessionId: string, fromRound: number, toRound: number): Promise<{
158
+ round: number;
159
+ role: string;
160
+ content: string;
161
+ time: number;
162
+ }[]>;
163
+ getCurrentRound(sessionId: string): Promise<number>;
164
+ traceByKeyword(sessionId: string, keyword: string, limit?: number): Promise<{
165
+ summary: {
166
+ id: number;
167
+ fromRound: number;
168
+ toRound: number;
169
+ summary: string;
170
+ } | null;
171
+ messages: {
172
+ round: number;
173
+ role: string;
174
+ content: string;
175
+ time: number;
176
+ }[];
177
+ }>;
178
+ dispose(): void;
179
+ }
180
+ export {};
181
+ //# sourceMappingURL=conversation-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-memory.d.ts","sourceRoot":"","sources":["../../src/ai/conversation-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ1D,sBAAsB;AACtB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;CAM5B,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;CAO5B,CAAC;AAyBF;;;;;GAKG;AACH,UAAU,OAAO;IACf,MAAM,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACjC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IACvC,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAgND,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,WAAW,CAA0B;IAC7C,uBAAuB;IACvB,OAAO,CAAC,WAAW,CAAsC;IACzD,iCAAiC;IACjC,OAAO,CAAC,UAAU,CAAkC;gBAExC,MAAM,CAAC,EAAE,wBAAwB;IAO7C,WAAW,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI;IAIvC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAS7D;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;IAiChB;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IA6E7B,oBAAoB;IACpB,OAAO,CAAC,gBAAgB;IAOxB;;;;;OAKG;YACW,sBAAsB;IA8BpC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2D5B;;;;;;;;;OASG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAwD/C,gBAAgB;IAiDxB,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,SAAK,GACT,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAQtE,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAOtE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,SAAK,GACT,OAAO,CAAC;QACT,OAAO,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACpF,QAAQ,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC5E,CAAC;IAgDF,OAAO,IAAI,IAAI;CAMhB"}