mozi-bot 1.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 (259) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +467 -0
  3. package/dist/agents/agent.d.ts +118 -0
  4. package/dist/agents/agent.d.ts.map +1 -0
  5. package/dist/agents/agent.js +686 -0
  6. package/dist/agents/agent.js.map +1 -0
  7. package/dist/agents/compaction.d.ts +78 -0
  8. package/dist/agents/compaction.d.ts.map +1 -0
  9. package/dist/agents/compaction.js +350 -0
  10. package/dist/agents/compaction.js.map +1 -0
  11. package/dist/agents/failover-error.d.ts +42 -0
  12. package/dist/agents/failover-error.d.ts.map +1 -0
  13. package/dist/agents/failover-error.js +171 -0
  14. package/dist/agents/failover-error.js.map +1 -0
  15. package/dist/agents/index.d.ts +10 -0
  16. package/dist/agents/index.d.ts.map +1 -0
  17. package/dist/agents/index.js +10 -0
  18. package/dist/agents/index.js.map +1 -0
  19. package/dist/agents/model-fallback.d.ts +54 -0
  20. package/dist/agents/model-fallback.d.ts.map +1 -0
  21. package/dist/agents/model-fallback.js +227 -0
  22. package/dist/agents/model-fallback.js.map +1 -0
  23. package/dist/agents/session-store.d.ts +53 -0
  24. package/dist/agents/session-store.d.ts.map +1 -0
  25. package/dist/agents/session-store.js +217 -0
  26. package/dist/agents/session-store.js.map +1 -0
  27. package/dist/agents/system-prompt.d.ts +29 -0
  28. package/dist/agents/system-prompt.d.ts.map +1 -0
  29. package/dist/agents/system-prompt.js +299 -0
  30. package/dist/agents/system-prompt.js.map +1 -0
  31. package/dist/channels/common/base.d.ts +40 -0
  32. package/dist/channels/common/base.d.ts.map +1 -0
  33. package/dist/channels/common/base.js +23 -0
  34. package/dist/channels/common/base.js.map +1 -0
  35. package/dist/channels/common/index.d.ts +21 -0
  36. package/dist/channels/common/index.d.ts.map +1 -0
  37. package/dist/channels/common/index.js +66 -0
  38. package/dist/channels/common/index.js.map +1 -0
  39. package/dist/channels/dingtalk/api.d.ts +30 -0
  40. package/dist/channels/dingtalk/api.d.ts.map +1 -0
  41. package/dist/channels/dingtalk/api.js +149 -0
  42. package/dist/channels/dingtalk/api.js.map +1 -0
  43. package/dist/channels/dingtalk/events.d.ts +80 -0
  44. package/dist/channels/dingtalk/events.d.ts.map +1 -0
  45. package/dist/channels/dingtalk/events.js +92 -0
  46. package/dist/channels/dingtalk/events.js.map +1 -0
  47. package/dist/channels/dingtalk/index.d.ts +51 -0
  48. package/dist/channels/dingtalk/index.d.ts.map +1 -0
  49. package/dist/channels/dingtalk/index.js +231 -0
  50. package/dist/channels/dingtalk/index.js.map +1 -0
  51. package/dist/channels/dingtalk/stream.d.ts +31 -0
  52. package/dist/channels/dingtalk/stream.d.ts.map +1 -0
  53. package/dist/channels/dingtalk/stream.js +116 -0
  54. package/dist/channels/dingtalk/stream.js.map +1 -0
  55. package/dist/channels/feishu/api.d.ts +33 -0
  56. package/dist/channels/feishu/api.d.ts.map +1 -0
  57. package/dist/channels/feishu/api.js +120 -0
  58. package/dist/channels/feishu/api.js.map +1 -0
  59. package/dist/channels/feishu/events.d.ts +87 -0
  60. package/dist/channels/feishu/events.d.ts.map +1 -0
  61. package/dist/channels/feishu/events.js +163 -0
  62. package/dist/channels/feishu/events.js.map +1 -0
  63. package/dist/channels/feishu/index.d.ts +46 -0
  64. package/dist/channels/feishu/index.d.ts.map +1 -0
  65. package/dist/channels/feishu/index.js +207 -0
  66. package/dist/channels/feishu/index.js.map +1 -0
  67. package/dist/channels/feishu/websocket.d.ts +32 -0
  68. package/dist/channels/feishu/websocket.d.ts.map +1 -0
  69. package/dist/channels/feishu/websocket.js +121 -0
  70. package/dist/channels/feishu/websocket.js.map +1 -0
  71. package/dist/channels/index.d.ts +9 -0
  72. package/dist/channels/index.d.ts.map +1 -0
  73. package/dist/channels/index.js +9 -0
  74. package/dist/channels/index.js.map +1 -0
  75. package/dist/cli/index.d.ts +6 -0
  76. package/dist/cli/index.d.ts.map +1 -0
  77. package/dist/cli/index.js +468 -0
  78. package/dist/cli/index.js.map +1 -0
  79. package/dist/commands/index.d.ts +54 -0
  80. package/dist/commands/index.d.ts.map +1 -0
  81. package/dist/commands/index.js +171 -0
  82. package/dist/commands/index.js.map +1 -0
  83. package/dist/config/index.d.ts +201 -0
  84. package/dist/config/index.d.ts.map +1 -0
  85. package/dist/config/index.js +261 -0
  86. package/dist/config/index.js.map +1 -0
  87. package/dist/gateway/index.d.ts +5 -0
  88. package/dist/gateway/index.d.ts.map +1 -0
  89. package/dist/gateway/index.js +5 -0
  90. package/dist/gateway/index.js.map +1 -0
  91. package/dist/gateway/server.d.ts +42 -0
  92. package/dist/gateway/server.d.ts.map +1 -0
  93. package/dist/gateway/server.js +235 -0
  94. package/dist/gateway/server.js.map +1 -0
  95. package/dist/hooks/index.d.ts +168 -0
  96. package/dist/hooks/index.d.ts.map +1 -0
  97. package/dist/hooks/index.js +148 -0
  98. package/dist/hooks/index.js.map +1 -0
  99. package/dist/index.d.ts +18 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +29 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/memory/index.d.ts +94 -0
  104. package/dist/memory/index.d.ts.map +1 -0
  105. package/dist/memory/index.js +282 -0
  106. package/dist/memory/index.js.map +1 -0
  107. package/dist/plugins/index.d.ts +57 -0
  108. package/dist/plugins/index.d.ts.map +1 -0
  109. package/dist/plugins/index.js +103 -0
  110. package/dist/plugins/index.js.map +1 -0
  111. package/dist/providers/anthropic-compatible.d.ts +48 -0
  112. package/dist/providers/anthropic-compatible.d.ts.map +1 -0
  113. package/dist/providers/anthropic-compatible.js +380 -0
  114. package/dist/providers/anthropic-compatible.js.map +1 -0
  115. package/dist/providers/base.d.ts +26 -0
  116. package/dist/providers/base.d.ts.map +1 -0
  117. package/dist/providers/base.js +58 -0
  118. package/dist/providers/base.js.map +1 -0
  119. package/dist/providers/custom-openai.d.ts +66 -0
  120. package/dist/providers/custom-openai.d.ts.map +1 -0
  121. package/dist/providers/custom-openai.js +255 -0
  122. package/dist/providers/custom-openai.js.map +1 -0
  123. package/dist/providers/dashscope.d.ts +15 -0
  124. package/dist/providers/dashscope.d.ts.map +1 -0
  125. package/dist/providers/dashscope.js +237 -0
  126. package/dist/providers/dashscope.js.map +1 -0
  127. package/dist/providers/deepseek.d.ts +10 -0
  128. package/dist/providers/deepseek.d.ts.map +1 -0
  129. package/dist/providers/deepseek.js +57 -0
  130. package/dist/providers/deepseek.js.map +1 -0
  131. package/dist/providers/index.d.ts +33 -0
  132. package/dist/providers/index.d.ts.map +1 -0
  133. package/dist/providers/index.js +142 -0
  134. package/dist/providers/index.js.map +1 -0
  135. package/dist/providers/kimi.d.ts +10 -0
  136. package/dist/providers/kimi.d.ts.map +1 -0
  137. package/dist/providers/kimi.js +83 -0
  138. package/dist/providers/kimi.js.map +1 -0
  139. package/dist/providers/minimax.d.ts +20 -0
  140. package/dist/providers/minimax.d.ts.map +1 -0
  141. package/dist/providers/minimax.js +252 -0
  142. package/dist/providers/minimax.js.map +1 -0
  143. package/dist/providers/modelscope.d.ts +15 -0
  144. package/dist/providers/modelscope.d.ts.map +1 -0
  145. package/dist/providers/modelscope.js +237 -0
  146. package/dist/providers/modelscope.js.map +1 -0
  147. package/dist/providers/openai-compatible.d.ts +57 -0
  148. package/dist/providers/openai-compatible.d.ts.map +1 -0
  149. package/dist/providers/openai-compatible.js +193 -0
  150. package/dist/providers/openai-compatible.js.map +1 -0
  151. package/dist/providers/stepfun.d.ts +10 -0
  152. package/dist/providers/stepfun.d.ts.map +1 -0
  153. package/dist/providers/stepfun.js +125 -0
  154. package/dist/providers/stepfun.js.map +1 -0
  155. package/dist/providers/zhipu.d.ts +15 -0
  156. package/dist/providers/zhipu.d.ts.map +1 -0
  157. package/dist/providers/zhipu.js +247 -0
  158. package/dist/providers/zhipu.js.map +1 -0
  159. package/dist/sessions/index.d.ts +6 -0
  160. package/dist/sessions/index.d.ts.map +1 -0
  161. package/dist/sessions/index.js +6 -0
  162. package/dist/sessions/index.js.map +1 -0
  163. package/dist/sessions/store.d.ts +45 -0
  164. package/dist/sessions/store.d.ts.map +1 -0
  165. package/dist/sessions/store.js +268 -0
  166. package/dist/sessions/store.js.map +1 -0
  167. package/dist/sessions/types.d.ts +110 -0
  168. package/dist/sessions/types.d.ts.map +1 -0
  169. package/dist/sessions/types.js +6 -0
  170. package/dist/sessions/types.js.map +1 -0
  171. package/dist/tools/builtin/apply-patch.d.ts +8 -0
  172. package/dist/tools/builtin/apply-patch.d.ts.map +1 -0
  173. package/dist/tools/builtin/apply-patch.js +272 -0
  174. package/dist/tools/builtin/apply-patch.js.map +1 -0
  175. package/dist/tools/builtin/bash.d.ts +25 -0
  176. package/dist/tools/builtin/bash.d.ts.map +1 -0
  177. package/dist/tools/builtin/bash.js +212 -0
  178. package/dist/tools/builtin/bash.js.map +1 -0
  179. package/dist/tools/builtin/browser.d.ts +12 -0
  180. package/dist/tools/builtin/browser.d.ts.map +1 -0
  181. package/dist/tools/builtin/browser.js +693 -0
  182. package/dist/tools/builtin/browser.js.map +1 -0
  183. package/dist/tools/builtin/filesystem.d.ts +29 -0
  184. package/dist/tools/builtin/filesystem.d.ts.map +1 -0
  185. package/dist/tools/builtin/filesystem.js +484 -0
  186. package/dist/tools/builtin/filesystem.js.map +1 -0
  187. package/dist/tools/builtin/image.d.ts +13 -0
  188. package/dist/tools/builtin/image.d.ts.map +1 -0
  189. package/dist/tools/builtin/image.js +126 -0
  190. package/dist/tools/builtin/image.js.map +1 -0
  191. package/dist/tools/builtin/index.d.ts +30 -0
  192. package/dist/tools/builtin/index.d.ts.map +1 -0
  193. package/dist/tools/builtin/index.js +55 -0
  194. package/dist/tools/builtin/index.js.map +1 -0
  195. package/dist/tools/builtin/process-registry.d.ts +71 -0
  196. package/dist/tools/builtin/process-registry.d.ts.map +1 -0
  197. package/dist/tools/builtin/process-registry.js +172 -0
  198. package/dist/tools/builtin/process-registry.js.map +1 -0
  199. package/dist/tools/builtin/process-tool.d.ts +8 -0
  200. package/dist/tools/builtin/process-tool.d.ts.map +1 -0
  201. package/dist/tools/builtin/process-tool.js +279 -0
  202. package/dist/tools/builtin/process-tool.js.map +1 -0
  203. package/dist/tools/builtin/subagent.d.ts +33 -0
  204. package/dist/tools/builtin/subagent.d.ts.map +1 -0
  205. package/dist/tools/builtin/subagent.js +185 -0
  206. package/dist/tools/builtin/subagent.js.map +1 -0
  207. package/dist/tools/builtin/system.d.ts +11 -0
  208. package/dist/tools/builtin/system.d.ts.map +1 -0
  209. package/dist/tools/builtin/system.js +144 -0
  210. package/dist/tools/builtin/system.js.map +1 -0
  211. package/dist/tools/builtin/web.d.ts +9 -0
  212. package/dist/tools/builtin/web.d.ts.map +1 -0
  213. package/dist/tools/builtin/web.js +87 -0
  214. package/dist/tools/builtin/web.js.map +1 -0
  215. package/dist/tools/common.d.ts +45 -0
  216. package/dist/tools/common.d.ts.map +1 -0
  217. package/dist/tools/common.js +129 -0
  218. package/dist/tools/common.js.map +1 -0
  219. package/dist/tools/index.d.ts +8 -0
  220. package/dist/tools/index.d.ts.map +1 -0
  221. package/dist/tools/index.js +8 -0
  222. package/dist/tools/index.js.map +1 -0
  223. package/dist/tools/registry.d.ts +33 -0
  224. package/dist/tools/registry.d.ts.map +1 -0
  225. package/dist/tools/registry.js +174 -0
  226. package/dist/tools/registry.js.map +1 -0
  227. package/dist/tools/types.d.ts +58 -0
  228. package/dist/tools/types.d.ts.map +1 -0
  229. package/dist/tools/types.js +11 -0
  230. package/dist/tools/types.js.map +1 -0
  231. package/dist/types/index.d.ts +280 -0
  232. package/dist/types/index.d.ts.map +1 -0
  233. package/dist/types/index.js +34 -0
  234. package/dist/types/index.js.map +1 -0
  235. package/dist/utils/index.d.ts +35 -0
  236. package/dist/utils/index.d.ts.map +1 -0
  237. package/dist/utils/index.js +114 -0
  238. package/dist/utils/index.js.map +1 -0
  239. package/dist/utils/logger.d.ts +24 -0
  240. package/dist/utils/logger.d.ts.map +1 -0
  241. package/dist/utils/logger.js +94 -0
  242. package/dist/utils/logger.js.map +1 -0
  243. package/dist/web/index.d.ts +7 -0
  244. package/dist/web/index.d.ts.map +1 -0
  245. package/dist/web/index.js +7 -0
  246. package/dist/web/index.js.map +1 -0
  247. package/dist/web/static.d.ts +12 -0
  248. package/dist/web/static.d.ts.map +1 -0
  249. package/dist/web/static.js +1260 -0
  250. package/dist/web/static.js.map +1 -0
  251. package/dist/web/types.d.ts +95 -0
  252. package/dist/web/types.d.ts.map +1 -0
  253. package/dist/web/types.js +5 -0
  254. package/dist/web/types.js.map +1 -0
  255. package/dist/web/websocket.d.ts +58 -0
  256. package/dist/web/websocket.d.ts.map +1 -0
  257. package/dist/web/websocket.js +371 -0
  258. package/dist/web/websocket.js.map +1 -0
  259. package/package.json +89 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * 会话管理类型定义
3
+ * 参考 moltbot 的会话管理系统
4
+ */
5
+ import type { ChatMessage } from "../types/index.js";
6
+ /** 会话条目 */
7
+ export interface SessionEntry {
8
+ /** 会话 ID */
9
+ sessionId: string;
10
+ /** 会话 Key(用于索引) */
11
+ sessionKey: string;
12
+ /** 标签名称 */
13
+ label?: string;
14
+ /** 创建时间 */
15
+ createdAt: number;
16
+ /** 最后更新时间 */
17
+ updatedAt: number;
18
+ /** 转录文件路径 */
19
+ transcriptFile?: string;
20
+ /** 来源渠道 */
21
+ channel?: string;
22
+ /** 消息数量 */
23
+ messageCount?: number;
24
+ /** 输入 token 统计 */
25
+ inputTokens?: number;
26
+ /** 输出 token 统计 */
27
+ outputTokens?: number;
28
+ /** 总 token 统计 */
29
+ totalTokens?: number;
30
+ /** 使用的模型 */
31
+ model?: string;
32
+ /** 使用的提供商 */
33
+ provider?: string;
34
+ }
35
+ /** 会话列表项(用于前端展示) */
36
+ export interface SessionListItem {
37
+ sessionKey: string;
38
+ sessionId: string;
39
+ label?: string;
40
+ updatedAt: number;
41
+ messageCount?: number;
42
+ totalTokens?: number;
43
+ model?: string;
44
+ }
45
+ /** 转录消息条目 */
46
+ export interface TranscriptMessage {
47
+ /** 消息 ID */
48
+ id?: string;
49
+ /** 角色 */
50
+ role: "user" | "assistant" | "system" | "tool";
51
+ /** 内容 */
52
+ content: string | ChatMessage["content"];
53
+ /** 时间戳 */
54
+ timestamp: number;
55
+ /** 工具调用 */
56
+ tool_calls?: ChatMessage["tool_calls"];
57
+ /** 工具调用 ID */
58
+ tool_call_id?: string;
59
+ /** Token 使用量 */
60
+ usage?: {
61
+ promptTokens?: number;
62
+ completionTokens?: number;
63
+ totalTokens?: number;
64
+ };
65
+ /** 模型 */
66
+ model?: string;
67
+ /** 提供商 */
68
+ provider?: string;
69
+ }
70
+ /** 转录文件头 */
71
+ export interface TranscriptHeader {
72
+ type: "session";
73
+ version: number;
74
+ sessionId: string;
75
+ sessionKey: string;
76
+ timestamp: string;
77
+ cwd?: string;
78
+ }
79
+ /** 会话存储接口 */
80
+ export interface SessionStore {
81
+ /** 列出所有会话 */
82
+ list(options?: SessionListOptions): Promise<SessionListItem[]>;
83
+ /** 获取会话 */
84
+ get(sessionKey: string): Promise<SessionEntry | null>;
85
+ /** 创建或更新会话 */
86
+ upsert(entry: SessionEntry): Promise<void>;
87
+ /** 删除会话 */
88
+ delete(sessionKey: string): Promise<void>;
89
+ /** 重置会话 */
90
+ reset(sessionKey: string): Promise<SessionEntry>;
91
+ }
92
+ /** 会话列表选项 */
93
+ export interface SessionListOptions {
94
+ /** 限制返回数量 */
95
+ limit?: number;
96
+ /** 按活跃时间过滤(分钟) */
97
+ activeMinutes?: number;
98
+ /** 搜索关键词 */
99
+ search?: string;
100
+ }
101
+ /** 转录管理器接口 */
102
+ export interface TranscriptManager {
103
+ /** 加载转录记录 */
104
+ load(sessionId: string): Promise<TranscriptMessage[]>;
105
+ /** 追加消息 */
106
+ append(sessionId: string, message: TranscriptMessage): Promise<void>;
107
+ /** 清空转录 */
108
+ clear(sessionId: string): Promise<void>;
109
+ }
110
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,oBAAoB;AACpB,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,aAAa;AACb,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS;IACT,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,SAAS;IACT,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,UAAU;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,UAAU,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IACvC,cAAc;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,SAAS;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,YAAY;AACZ,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC/D,WAAW;IACX,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACtD,cAAc;IACd,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,WAAW;IACX,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW;IACX,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAClD;AAED,aAAa;AACb,MAAM,WAAW,kBAAkB;IACjC,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,cAAc;AACd,MAAM,WAAW,iBAAiB;IAChC,aAAa;IACb,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtD,WAAW;IACX,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,WAAW;IACX,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 会话管理类型定义
3
+ * 参考 moltbot 的会话管理系统
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 内置工具 - apply_patch 差异修补工具
3
+ * 对齐 OpenAI apply_patch 格式
4
+ */
5
+ import type { Tool } from "../types.js";
6
+ /** 创建 apply_patch 工具 */
7
+ export declare function createApplyPatchTool(allowedPaths?: string[]): Tool;
8
+ //# sourceMappingURL=apply-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../../src/tools/builtin/apply-patch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAyKxC,wBAAwB;AACxB,wBAAgB,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAkJlE"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * 内置工具 - apply_patch 差异修补工具
3
+ * 对齐 OpenAI apply_patch 格式
4
+ */
5
+ import { Type } from "@sinclair/typebox";
6
+ import { readFile, writeFile, mkdir } from "fs/promises";
7
+ import { existsSync } from "fs";
8
+ import { resolve, dirname } from "path";
9
+ import { jsonResult, readStringParam } from "../common.js";
10
+ /** 解析 patch 字符串 */
11
+ function parsePatch(patchText) {
12
+ const patches = [];
13
+ const lines = patchText.split("\n");
14
+ let i = 0;
15
+ while (i < lines.length) {
16
+ // 查找 --- 行
17
+ if (!lines[i]?.startsWith("---")) {
18
+ i++;
19
+ continue;
20
+ }
21
+ const oldPathLine = lines[i];
22
+ i++;
23
+ if (i >= lines.length || !lines[i]?.startsWith("+++")) {
24
+ continue;
25
+ }
26
+ const newPathLine = lines[i];
27
+ i++;
28
+ // 提取路径
29
+ const oldPath = oldPathLine.replace(/^---\s+/, "").replace(/^a\//, "").replace(/\t.*$/, "");
30
+ const newPath = newPathLine.replace(/^\+\+\+\s+/, "").replace(/^b\//, "").replace(/\t.*$/, "");
31
+ const isNew = oldPath === "/dev/null";
32
+ const isDelete = newPath === "/dev/null";
33
+ const hunks = [];
34
+ // 解析 hunks
35
+ while (i < lines.length && lines[i]?.startsWith("@@")) {
36
+ const hunkHeader = lines[i];
37
+ const match = hunkHeader.match(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
38
+ if (!match) {
39
+ i++;
40
+ continue;
41
+ }
42
+ const hunk = {
43
+ oldStart: parseInt(match[1], 10),
44
+ oldCount: match[2] !== undefined ? parseInt(match[2], 10) : 1,
45
+ newStart: parseInt(match[3], 10),
46
+ newCount: match[4] !== undefined ? parseInt(match[4], 10) : 1,
47
+ lines: [],
48
+ };
49
+ i++;
50
+ // 收集 hunk 行
51
+ while (i < lines.length) {
52
+ const line = lines[i];
53
+ if (line.startsWith("@@") || line.startsWith("---") || line.startsWith("+++")) {
54
+ break;
55
+ }
56
+ if (line.startsWith("+") || line.startsWith("-") || line.startsWith(" ") || line === "") {
57
+ hunk.lines.push(line);
58
+ i++;
59
+ }
60
+ else {
61
+ // 可能是 diff 之间的分隔 (如 "diff --git" 行)
62
+ break;
63
+ }
64
+ }
65
+ hunks.push(hunk);
66
+ }
67
+ patches.push({ oldPath, newPath, hunks, isNew, isDelete });
68
+ }
69
+ return patches;
70
+ }
71
+ /** 应用单个 hunk */
72
+ function applyHunk(lines, hunk) {
73
+ const result = [...lines];
74
+ let offset = hunk.oldStart - 1; // 转换为 0-indexed
75
+ // 查找匹配位置 (允许一定的偏移)
76
+ const contextLines = hunk.lines
77
+ .filter((l) => l.startsWith(" ") || l.startsWith("-"))
78
+ .map((l) => l.slice(1));
79
+ let matchOffset = -1;
80
+ const searchRange = 50; // 在附近搜索
81
+ for (let delta = 0; delta <= searchRange; delta++) {
82
+ for (const sign of [0, -1, 1]) {
83
+ const tryOffset = offset + delta * (sign === 0 ? 0 : sign);
84
+ if (tryOffset < 0 || tryOffset > result.length)
85
+ continue;
86
+ let matches = true;
87
+ let ci = 0;
88
+ for (const contextLine of contextLines) {
89
+ if (tryOffset + ci >= result.length) {
90
+ matches = false;
91
+ break;
92
+ }
93
+ if (result[tryOffset + ci] !== contextLine) {
94
+ matches = false;
95
+ break;
96
+ }
97
+ ci++;
98
+ }
99
+ if (matches) {
100
+ matchOffset = tryOffset;
101
+ break;
102
+ }
103
+ }
104
+ if (matchOffset >= 0)
105
+ break;
106
+ }
107
+ if (matchOffset < 0) {
108
+ return null; // 无法匹配
109
+ }
110
+ // 应用变更
111
+ const newLines = [];
112
+ let srcIdx = matchOffset;
113
+ for (const line of hunk.lines) {
114
+ if (line.startsWith(" ")) {
115
+ // 上下文行 - 保留
116
+ newLines.push(result[srcIdx]);
117
+ srcIdx++;
118
+ }
119
+ else if (line.startsWith("-")) {
120
+ // 删除行 - 跳过
121
+ srcIdx++;
122
+ }
123
+ else if (line.startsWith("+")) {
124
+ // 添加行
125
+ newLines.push(line.slice(1));
126
+ }
127
+ // 空行视为上下文
128
+ else if (line === "") {
129
+ if (srcIdx < result.length) {
130
+ newLines.push(result[srcIdx]);
131
+ srcIdx++;
132
+ }
133
+ }
134
+ }
135
+ // 拼接: before + new + after
136
+ const before = result.slice(0, matchOffset);
137
+ const after = result.slice(srcIdx);
138
+ return [...before, ...newLines, ...after];
139
+ }
140
+ /** 创建 apply_patch 工具 */
141
+ export function createApplyPatchTool(allowedPaths) {
142
+ const allowed = allowedPaths ?? [process.cwd()];
143
+ function isPathAllowed(filePath) {
144
+ const resolved = resolve(filePath);
145
+ return allowed.some((a) => {
146
+ const ra = resolve(a);
147
+ return resolved === ra || resolved.startsWith(ra + "/");
148
+ });
149
+ }
150
+ return {
151
+ name: "apply_patch",
152
+ label: "Apply Patch",
153
+ description: `Apply a unified diff patch to one or more files. Use standard unified diff format:
154
+ --- a/path/to/file
155
+ +++ b/path/to/file
156
+ @@ -start,count +start,count @@
157
+ context line
158
+ -removed line
159
+ +added line
160
+
161
+ For new files, use --- /dev/null as old path.
162
+ For deleting files, use +++ /dev/null as new path.`,
163
+ parameters: Type.Object({
164
+ patch: Type.String({ description: "The unified diff patch to apply" }),
165
+ }),
166
+ execute: async (_toolCallId, args) => {
167
+ const params = args;
168
+ const patchText = readStringParam(params, "patch", { required: true });
169
+ try {
170
+ const patches = parsePatch(patchText);
171
+ if (patches.length === 0) {
172
+ return jsonResult({
173
+ status: "error",
174
+ error: "No valid patches found in input",
175
+ }, true);
176
+ }
177
+ const results = [];
178
+ for (const patch of patches) {
179
+ const targetPath = patch.isNew ? patch.newPath : patch.oldPath;
180
+ const resolvedPath = resolve(targetPath);
181
+ // 安全检查
182
+ if (!isPathAllowed(resolvedPath)) {
183
+ results.push({
184
+ file: targetPath,
185
+ status: "error",
186
+ error: `Access denied: ${targetPath}`,
187
+ });
188
+ continue;
189
+ }
190
+ try {
191
+ if (patch.isDelete) {
192
+ // 删除文件
193
+ if (existsSync(resolvedPath)) {
194
+ const { unlink } = await import("fs/promises");
195
+ await unlink(resolvedPath);
196
+ results.push({ file: targetPath, status: "deleted" });
197
+ }
198
+ else {
199
+ results.push({ file: targetPath, status: "skipped", error: "File not found" });
200
+ }
201
+ continue;
202
+ }
203
+ if (patch.isNew) {
204
+ // 创建新文件
205
+ const dir = dirname(resolvedPath);
206
+ if (!existsSync(dir)) {
207
+ await mkdir(dir, { recursive: true });
208
+ }
209
+ const newContent = patch.hunks
210
+ .flatMap((h) => h.lines
211
+ .filter((l) => l.startsWith("+") || l.startsWith(" "))
212
+ .map((l) => l.slice(1)))
213
+ .join("\n");
214
+ await writeFile(resolvedPath, newContent, "utf-8");
215
+ results.push({ file: targetPath, status: "created" });
216
+ continue;
217
+ }
218
+ // 修改现有文件
219
+ if (!existsSync(resolvedPath)) {
220
+ results.push({ file: targetPath, status: "error", error: "File not found" });
221
+ continue;
222
+ }
223
+ const content = await readFile(resolvedPath, "utf-8");
224
+ let lines = content.split("\n");
225
+ // 从后往前应用 hunks (避免行号偏移)
226
+ const sortedHunks = [...patch.hunks].sort((a, b) => b.oldStart - a.oldStart);
227
+ let allApplied = true;
228
+ for (const hunk of sortedHunks) {
229
+ const result = applyHunk(lines, hunk);
230
+ if (result === null) {
231
+ allApplied = false;
232
+ results.push({
233
+ file: targetPath,
234
+ status: "error",
235
+ error: `Failed to apply hunk at line ${hunk.oldStart}`,
236
+ });
237
+ break;
238
+ }
239
+ lines = result;
240
+ }
241
+ if (allApplied) {
242
+ await writeFile(resolvedPath, lines.join("\n"), "utf-8");
243
+ results.push({
244
+ file: targetPath,
245
+ status: "applied",
246
+ });
247
+ }
248
+ }
249
+ catch (error) {
250
+ results.push({
251
+ file: targetPath,
252
+ status: "error",
253
+ error: error instanceof Error ? error.message : String(error),
254
+ });
255
+ }
256
+ }
257
+ const hasErrors = results.some((r) => r.status === "error");
258
+ return jsonResult({
259
+ status: hasErrors ? "partial" : "success",
260
+ patches: results,
261
+ }, hasErrors);
262
+ }
263
+ catch (error) {
264
+ return jsonResult({
265
+ status: "error",
266
+ error: error instanceof Error ? error.message : String(error),
267
+ }, true);
268
+ }
269
+ },
270
+ };
271
+ }
272
+ //# sourceMappingURL=apply-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-patch.js","sourceRoot":"","sources":["../../../src/tools/builtin/apply-patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 内置工具 - Bash 命令执行工具 (增强版)
3
+ * 对齐 Claude Code 的 Bash 执行能力,支持后台执行和进程管理
4
+ */
5
+ import type { Tool } from "../types.js";
6
+ /** Bash 工具选项 */
7
+ export interface BashToolOptions {
8
+ /** 允许执行命令的目录列表 */
9
+ allowedPaths?: string[];
10
+ /** 默认超时时间 (毫秒) */
11
+ defaultTimeout?: number;
12
+ /** 最大超时时间 (毫秒) */
13
+ maxTimeout?: number;
14
+ /** 最大输出大小 (字符数) */
15
+ maxOutputSize?: number;
16
+ /** 禁止的命令模式 */
17
+ blockedCommands?: RegExp[];
18
+ /** 是否启用 (默认 true) */
19
+ enabled?: boolean;
20
+ }
21
+ /** 创建 Bash 执行工具 */
22
+ export declare function createBashTool(options?: BashToolOptions): Tool;
23
+ /** 创建所有 Bash 相关工具 */
24
+ export declare function createBashTools(options?: BashToolOptions): Tool[];
25
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtin/bash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAexC,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,kBAAkB;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc;IACd,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiCD,mBAAmB;AACnB,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAkM9D;AAED,qBAAqB;AACrB,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,EAAE,CAEjE"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * 内置工具 - Bash 命令执行工具 (增强版)
3
+ * 对齐 Claude Code 的 Bash 执行能力,支持后台执行和进程管理
4
+ */
5
+ import { Type } from "@sinclair/typebox";
6
+ import { spawn } from "child_process";
7
+ import { resolve } from "path";
8
+ import { jsonResult, textResult, readStringParam, readNumberParam, readBooleanParam } from "../common.js";
9
+ import { createSessionId, addSession, markBackgrounded, markExited, appendOutput, drainSession, deriveSessionName, formatDuration, truncateMiddle, } from "./process-registry.js";
10
+ const DEFAULT_OPTIONS = {
11
+ allowedPaths: [process.cwd()],
12
+ defaultTimeout: 120000, // 2 分钟
13
+ maxTimeout: 600000, // 10 分钟
14
+ maxOutputSize: 100000, // 100KB
15
+ blockedCommands: [
16
+ /\brm\s+-rf\s+[\/~]/i, // rm -rf /
17
+ /\bmkfs\b/i,
18
+ /\bdd\s+.*of=\/dev/i,
19
+ /\bformat\b.*[a-z]:/i,
20
+ /\b(poweroff|reboot|shutdown|halt)\b/i,
21
+ /\bkill\s+-9\s+(-1|1)\b/,
22
+ />\s*\/dev\/(sda|hda|nvme)/i,
23
+ ],
24
+ enabled: true,
25
+ };
26
+ /** 检查路径是否在允许范围内 */
27
+ function isPathAllowed(path, allowedPaths) {
28
+ const resolved = resolve(path);
29
+ return allowedPaths.some((allowed) => {
30
+ const resolvedAllowed = resolve(allowed);
31
+ return resolved === resolvedAllowed || resolved.startsWith(resolvedAllowed + "/");
32
+ });
33
+ }
34
+ /** 检查命令是否被禁止 */
35
+ function isCommandBlocked(command, blockedPatterns) {
36
+ return blockedPatterns.some((pattern) => pattern.test(command));
37
+ }
38
+ /** 创建 Bash 执行工具 */
39
+ export function createBashTool(options) {
40
+ const opts = { ...DEFAULT_OPTIONS, ...options };
41
+ return {
42
+ name: "bash",
43
+ label: "Bash",
44
+ description: `Execute a bash command with optional background execution.
45
+
46
+ Use this for:
47
+ - System operations (git, npm, docker, etc.)
48
+ - Running builds and tests
49
+ - Long-running processes (use run_in_background: true)
50
+
51
+ Parameters:
52
+ - command: The bash command to execute
53
+ - cwd: Working directory (optional)
54
+ - timeout: Timeout in ms, max 600000 (optional)
55
+ - run_in_background: Run in background and return immediately (optional)
56
+ - description: Brief description of what the command does (optional)`,
57
+ parameters: Type.Object({
58
+ command: Type.String({ description: "The bash command to execute" }),
59
+ cwd: Type.Optional(Type.String({ description: "Working directory for the command" })),
60
+ timeout: Type.Optional(Type.Number({ description: "Timeout in milliseconds (max 600000)" })),
61
+ run_in_background: Type.Optional(Type.Boolean({ description: "Run in background and return session ID" })),
62
+ description: Type.Optional(Type.String({ description: "Brief description of what the command does" })),
63
+ }),
64
+ execute: async (_toolCallId, args, signal) => {
65
+ if (!opts.enabled) {
66
+ return jsonResult({
67
+ status: "error",
68
+ error: "Bash tool is disabled",
69
+ }, true);
70
+ }
71
+ const params = args;
72
+ const command = readStringParam(params, "command", { required: true });
73
+ const cwd = readStringParam(params, "cwd") ?? process.cwd();
74
+ const timeout = Math.min(readNumberParam(params, "timeout") ?? opts.defaultTimeout, opts.maxTimeout);
75
+ const runInBackground = readBooleanParam(params, "run_in_background");
76
+ const description = readStringParam(params, "description");
77
+ // 安全检查: 工作目录
78
+ if (!isPathAllowed(cwd, opts.allowedPaths)) {
79
+ return jsonResult({
80
+ status: "error",
81
+ error: `Access denied: working directory '${cwd}' is not allowed`,
82
+ }, true);
83
+ }
84
+ // 安全检查: 禁止的命令
85
+ if (isCommandBlocked(command, opts.blockedCommands)) {
86
+ return jsonResult({
87
+ status: "error",
88
+ error: "Command blocked for security reasons",
89
+ }, true);
90
+ }
91
+ // 创建会话
92
+ const sessionId = createSessionId();
93
+ const session = {
94
+ id: sessionId,
95
+ command: truncateMiddle(command, 200),
96
+ startedAt: Date.now(),
97
+ cwd,
98
+ status: "running",
99
+ stdout: "",
100
+ stderr: "",
101
+ aggregated: "",
102
+ tail: "",
103
+ truncated: false,
104
+ backgrounded: runInBackground ?? false,
105
+ maxOutputChars: opts.maxOutputSize,
106
+ };
107
+ // 启动进程
108
+ const proc = spawn("bash", ["-c", command], {
109
+ cwd,
110
+ env: { ...process.env },
111
+ stdio: ["pipe", "pipe", "pipe"],
112
+ });
113
+ session.child = proc;
114
+ session.pid = proc.pid;
115
+ addSession(session);
116
+ // 输出处理
117
+ proc.stdout?.on("data", (data) => {
118
+ appendOutput(session, "stdout", data.toString());
119
+ });
120
+ proc.stderr?.on("data", (data) => {
121
+ appendOutput(session, "stderr", data.toString());
122
+ });
123
+ // 进程结束处理
124
+ proc.on("close", (code, sig) => {
125
+ markExited(session, code, sig, code === 0 ? "completed" : "failed");
126
+ });
127
+ proc.on("error", (error) => {
128
+ appendOutput(session, "stderr", `Process error: ${error.message}`);
129
+ markExited(session, null, null, "failed");
130
+ });
131
+ // 后台执行模式
132
+ if (runInBackground) {
133
+ markBackgrounded(session);
134
+ return jsonResult({
135
+ status: "backgrounded",
136
+ session_id: sessionId,
137
+ pid: proc.pid,
138
+ command: session.command,
139
+ description: description ?? deriveSessionName(command),
140
+ message: `Process started in background. Use process tool with session_id "${sessionId}" to check status.`,
141
+ });
142
+ }
143
+ // 前台执行模式 - 等待完成
144
+ return new Promise((resolvePromise) => {
145
+ let killed = false;
146
+ // 超时处理
147
+ const timeoutId = setTimeout(() => {
148
+ killed = true;
149
+ proc.kill("SIGTERM");
150
+ setTimeout(() => {
151
+ if (!proc.killed)
152
+ proc.kill("SIGKILL");
153
+ }, 5000);
154
+ }, timeout);
155
+ // 中止信号处理
156
+ signal?.addEventListener("abort", () => {
157
+ killed = true;
158
+ proc.kill("SIGTERM");
159
+ });
160
+ proc.on("close", (code) => {
161
+ clearTimeout(timeoutId);
162
+ // 获取输出
163
+ const { stdout, stderr } = drainSession(session);
164
+ if (killed) {
165
+ resolvePromise(jsonResult({
166
+ status: "killed",
167
+ reason: signal?.aborted ? "aborted" : "timeout",
168
+ session_id: sessionId,
169
+ stdout: stdout.trim(),
170
+ stderr: stderr.trim(),
171
+ duration: formatDuration(Date.now() - session.startedAt),
172
+ }, true));
173
+ return;
174
+ }
175
+ // 合并输出
176
+ let output = "";
177
+ if (stdout.trim()) {
178
+ output += stdout.trim();
179
+ }
180
+ if (stderr.trim()) {
181
+ if (output)
182
+ output += "\n\n[stderr]\n";
183
+ output += stderr.trim();
184
+ }
185
+ if (code === 0) {
186
+ resolvePromise(textResult(output || "(no output)", {
187
+ exitCode: code,
188
+ command: session.command,
189
+ session_id: sessionId,
190
+ duration: formatDuration(Date.now() - session.startedAt),
191
+ }));
192
+ }
193
+ else {
194
+ resolvePromise(jsonResult({
195
+ status: "error",
196
+ exitCode: code,
197
+ session_id: sessionId,
198
+ stdout: stdout.trim(),
199
+ stderr: stderr.trim(),
200
+ duration: formatDuration(Date.now() - session.startedAt),
201
+ }, true));
202
+ }
203
+ });
204
+ });
205
+ },
206
+ };
207
+ }
208
+ /** 创建所有 Bash 相关工具 */
209
+ export function createBashTools(options) {
210
+ return [createBashTool(options)];
211
+ }
212
+ //# sourceMappingURL=bash.js.map