@zhin.js/agent 0.0.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 (142) hide show
  1. package/LICENSE +21 -0
  2. package/lib/agent.d.ts +130 -0
  3. package/lib/agent.d.ts.map +1 -0
  4. package/lib/agent.js +702 -0
  5. package/lib/agent.js.map +1 -0
  6. package/lib/bootstrap.d.ts +91 -0
  7. package/lib/bootstrap.d.ts.map +1 -0
  8. package/lib/bootstrap.js +243 -0
  9. package/lib/bootstrap.js.map +1 -0
  10. package/lib/builtin-tools.d.ts +59 -0
  11. package/lib/builtin-tools.d.ts.map +1 -0
  12. package/lib/builtin-tools.js +777 -0
  13. package/lib/builtin-tools.js.map +1 -0
  14. package/lib/compaction.d.ts +132 -0
  15. package/lib/compaction.d.ts.map +1 -0
  16. package/lib/compaction.js +370 -0
  17. package/lib/compaction.js.map +1 -0
  18. package/lib/context-manager.d.ts +213 -0
  19. package/lib/context-manager.d.ts.map +1 -0
  20. package/lib/context-manager.js +313 -0
  21. package/lib/context-manager.js.map +1 -0
  22. package/lib/conversation-memory.d.ts +181 -0
  23. package/lib/conversation-memory.d.ts.map +1 -0
  24. package/lib/conversation-memory.js +581 -0
  25. package/lib/conversation-memory.js.map +1 -0
  26. package/lib/cron-engine.d.ts +91 -0
  27. package/lib/cron-engine.d.ts.map +1 -0
  28. package/lib/cron-engine.js +277 -0
  29. package/lib/cron-engine.js.map +1 -0
  30. package/lib/follow-up.d.ts +131 -0
  31. package/lib/follow-up.d.ts.map +1 -0
  32. package/lib/follow-up.js +265 -0
  33. package/lib/follow-up.js.map +1 -0
  34. package/lib/hooks.d.ts +143 -0
  35. package/lib/hooks.d.ts.map +1 -0
  36. package/lib/hooks.js +108 -0
  37. package/lib/hooks.js.map +1 -0
  38. package/lib/index.d.ts +43 -0
  39. package/lib/index.d.ts.map +1 -0
  40. package/lib/index.js +28 -0
  41. package/lib/index.js.map +1 -0
  42. package/lib/init.d.ts +30 -0
  43. package/lib/init.d.ts.map +1 -0
  44. package/lib/init.js +684 -0
  45. package/lib/init.js.map +1 -0
  46. package/lib/output.d.ts +93 -0
  47. package/lib/output.d.ts.map +1 -0
  48. package/lib/output.js +176 -0
  49. package/lib/output.js.map +1 -0
  50. package/lib/rate-limiter.d.ts +38 -0
  51. package/lib/rate-limiter.d.ts.map +1 -0
  52. package/lib/rate-limiter.js +86 -0
  53. package/lib/rate-limiter.js.map +1 -0
  54. package/lib/service.d.ts +86 -0
  55. package/lib/service.d.ts.map +1 -0
  56. package/lib/service.js +285 -0
  57. package/lib/service.js.map +1 -0
  58. package/lib/session.d.ts +186 -0
  59. package/lib/session.d.ts.map +1 -0
  60. package/lib/session.js +443 -0
  61. package/lib/session.js.map +1 -0
  62. package/lib/subagent.d.ts +50 -0
  63. package/lib/subagent.d.ts.map +1 -0
  64. package/lib/subagent.js +144 -0
  65. package/lib/subagent.js.map +1 -0
  66. package/lib/tone-detector.d.ts +19 -0
  67. package/lib/tone-detector.d.ts.map +1 -0
  68. package/lib/tone-detector.js +72 -0
  69. package/lib/tone-detector.js.map +1 -0
  70. package/lib/tools.d.ts +45 -0
  71. package/lib/tools.d.ts.map +1 -0
  72. package/lib/tools.js +206 -0
  73. package/lib/tools.js.map +1 -0
  74. package/lib/user-profile.d.ts +56 -0
  75. package/lib/user-profile.d.ts.map +1 -0
  76. package/lib/user-profile.js +130 -0
  77. package/lib/user-profile.js.map +1 -0
  78. package/lib/zhin-agent/builtin-tools.d.ts +17 -0
  79. package/lib/zhin-agent/builtin-tools.d.ts.map +1 -0
  80. package/lib/zhin-agent/builtin-tools.js +220 -0
  81. package/lib/zhin-agent/builtin-tools.js.map +1 -0
  82. package/lib/zhin-agent/config.d.ts +54 -0
  83. package/lib/zhin-agent/config.d.ts.map +1 -0
  84. package/lib/zhin-agent/config.js +76 -0
  85. package/lib/zhin-agent/config.js.map +1 -0
  86. package/lib/zhin-agent/exec-policy.d.ts +20 -0
  87. package/lib/zhin-agent/exec-policy.d.ts.map +1 -0
  88. package/lib/zhin-agent/exec-policy.js +71 -0
  89. package/lib/zhin-agent/exec-policy.js.map +1 -0
  90. package/lib/zhin-agent/index.d.ts +68 -0
  91. package/lib/zhin-agent/index.d.ts.map +1 -0
  92. package/lib/zhin-agent/index.js +404 -0
  93. package/lib/zhin-agent/index.js.map +1 -0
  94. package/lib/zhin-agent/prompt.d.ts +21 -0
  95. package/lib/zhin-agent/prompt.d.ts.map +1 -0
  96. package/lib/zhin-agent/prompt.js +111 -0
  97. package/lib/zhin-agent/prompt.js.map +1 -0
  98. package/lib/zhin-agent/tool-collector.d.ts +21 -0
  99. package/lib/zhin-agent/tool-collector.d.ts.map +1 -0
  100. package/lib/zhin-agent/tool-collector.js +218 -0
  101. package/lib/zhin-agent/tool-collector.js.map +1 -0
  102. package/package.json +37 -0
  103. package/src/agent.ts +831 -0
  104. package/src/bootstrap.ts +309 -0
  105. package/src/builtin-tools.ts +849 -0
  106. package/src/compaction.ts +529 -0
  107. package/src/context-manager.ts +440 -0
  108. package/src/conversation-memory.ts +774 -0
  109. package/src/cron-engine.ts +336 -0
  110. package/src/follow-up.ts +357 -0
  111. package/src/hooks.ts +223 -0
  112. package/src/index.ts +169 -0
  113. package/src/init.ts +750 -0
  114. package/src/output.ts +261 -0
  115. package/src/rate-limiter.ts +129 -0
  116. package/src/service.ts +329 -0
  117. package/src/session.ts +544 -0
  118. package/src/subagent.ts +209 -0
  119. package/src/tone-detector.ts +89 -0
  120. package/src/tools.ts +217 -0
  121. package/src/user-profile.ts +181 -0
  122. package/src/zhin-agent/builtin-tools.ts +247 -0
  123. package/src/zhin-agent/config.ts +113 -0
  124. package/src/zhin-agent/exec-policy.ts +78 -0
  125. package/src/zhin-agent/index.ts +505 -0
  126. package/src/zhin-agent/prompt.ts +131 -0
  127. package/src/zhin-agent/tool-collector.ts +242 -0
  128. package/tests/ai/agent.test.ts +565 -0
  129. package/tests/ai/context-manager.test.ts +413 -0
  130. package/tests/ai/conversation-memory.test.ts +128 -0
  131. package/tests/ai/follow-up.test.ts +175 -0
  132. package/tests/ai/integration.test.ts +582 -0
  133. package/tests/ai/output.test.ts +128 -0
  134. package/tests/ai/rate-limiter.test.ts +108 -0
  135. package/tests/ai/session.test.ts +334 -0
  136. package/tests/ai/setup.ts +250 -0
  137. package/tests/ai/subagent.test.ts +270 -0
  138. package/tests/ai/tone-detector.test.ts +80 -0
  139. package/tests/ai/tools-builtin.test.ts +310 -0
  140. package/tests/ai/user-profile.test.ts +73 -0
  141. package/tests/ai/zhin-agent.test.ts +177 -0
  142. package/tsconfig.json +22 -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 '@zhin.js/core';
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/conversation-memory.ts"],"names":[],"mappings":"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"}