opencode-bridge 2.9.0-beta

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 (237) hide show
  1. package/.env.example +131 -0
  2. package/LICENSE +674 -0
  3. package/README.md +1195 -0
  4. package/bin/opencode-bridge.js +31 -0
  5. package/dist/commands/effort.d.ts +9 -0
  6. package/dist/commands/effort.d.ts.map +1 -0
  7. package/dist/commands/effort.js +56 -0
  8. package/dist/commands/effort.js.map +1 -0
  9. package/dist/commands/parser.d.ts +37 -0
  10. package/dist/commands/parser.d.ts.map +1 -0
  11. package/dist/commands/parser.js +355 -0
  12. package/dist/commands/parser.js.map +1 -0
  13. package/dist/config.d.ts +91 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +340 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/feishu/cards-stream.d.ts +65 -0
  18. package/dist/feishu/cards-stream.d.ts.map +1 -0
  19. package/dist/feishu/cards-stream.js +448 -0
  20. package/dist/feishu/cards-stream.js.map +1 -0
  21. package/dist/feishu/cards.d.ts +81 -0
  22. package/dist/feishu/cards.d.ts.map +1 -0
  23. package/dist/feishu/cards.js +560 -0
  24. package/dist/feishu/cards.js.map +1 -0
  25. package/dist/feishu/client.d.ts +132 -0
  26. package/dist/feishu/client.d.ts.map +1 -0
  27. package/dist/feishu/client.js +952 -0
  28. package/dist/feishu/client.js.map +1 -0
  29. package/dist/feishu/streamer.d.ts +30 -0
  30. package/dist/feishu/streamer.d.ts.map +1 -0
  31. package/dist/feishu/streamer.js +95 -0
  32. package/dist/feishu/streamer.js.map +1 -0
  33. package/dist/handlers/card-action.d.ts +12 -0
  34. package/dist/handlers/card-action.d.ts.map +1 -0
  35. package/dist/handlers/card-action.js +154 -0
  36. package/dist/handlers/card-action.js.map +1 -0
  37. package/dist/handlers/command.d.ts +76 -0
  38. package/dist/handlers/command.d.ts.map +1 -0
  39. package/dist/handlers/command.js +1773 -0
  40. package/dist/handlers/command.js.map +1 -0
  41. package/dist/handlers/discord.d.ts +78 -0
  42. package/dist/handlers/discord.d.ts.map +1 -0
  43. package/dist/handlers/discord.js +1832 -0
  44. package/dist/handlers/discord.js.map +1 -0
  45. package/dist/handlers/file-sender.d.ts +22 -0
  46. package/dist/handlers/file-sender.d.ts.map +1 -0
  47. package/dist/handlers/file-sender.js +183 -0
  48. package/dist/handlers/file-sender.js.map +1 -0
  49. package/dist/handlers/group.d.ts +21 -0
  50. package/dist/handlers/group.d.ts.map +1 -0
  51. package/dist/handlers/group.js +414 -0
  52. package/dist/handlers/group.js.map +1 -0
  53. package/dist/handlers/lifecycle.d.ts +17 -0
  54. package/dist/handlers/lifecycle.d.ts.map +1 -0
  55. package/dist/handlers/lifecycle.js +129 -0
  56. package/dist/handlers/lifecycle.js.map +1 -0
  57. package/dist/handlers/p2p.d.ts +44 -0
  58. package/dist/handlers/p2p.d.ts.map +1 -0
  59. package/dist/handlers/p2p.js +625 -0
  60. package/dist/handlers/p2p.js.map +1 -0
  61. package/dist/index.d.ts +33 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +1562 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/opencode/client.d.ts +176 -0
  66. package/dist/opencode/client.d.ts.map +1 -0
  67. package/dist/opencode/client.js +1126 -0
  68. package/dist/opencode/client.js.map +1 -0
  69. package/dist/opencode/delayed-handler.d.ts +33 -0
  70. package/dist/opencode/delayed-handler.d.ts.map +1 -0
  71. package/dist/opencode/delayed-handler.js +74 -0
  72. package/dist/opencode/delayed-handler.js.map +1 -0
  73. package/dist/opencode/output-buffer.d.ts +56 -0
  74. package/dist/opencode/output-buffer.d.ts.map +1 -0
  75. package/dist/opencode/output-buffer.js +202 -0
  76. package/dist/opencode/output-buffer.js.map +1 -0
  77. package/dist/opencode/question-handler.d.ts +61 -0
  78. package/dist/opencode/question-handler.d.ts.map +1 -0
  79. package/dist/opencode/question-handler.js +183 -0
  80. package/dist/opencode/question-handler.js.map +1 -0
  81. package/dist/opencode/question-parser.d.ts +9 -0
  82. package/dist/opencode/question-parser.d.ts.map +1 -0
  83. package/dist/opencode/question-parser.js +69 -0
  84. package/dist/opencode/question-parser.js.map +1 -0
  85. package/dist/opencode/session-queue.d.ts +16 -0
  86. package/dist/opencode/session-queue.d.ts.map +1 -0
  87. package/dist/opencode/session-queue.js +41 -0
  88. package/dist/opencode/session-queue.js.map +1 -0
  89. package/dist/permissions/handler.d.ts +36 -0
  90. package/dist/permissions/handler.d.ts.map +1 -0
  91. package/dist/permissions/handler.js +141 -0
  92. package/dist/permissions/handler.js.map +1 -0
  93. package/dist/platform/adapters/discord-adapter.d.ts +45 -0
  94. package/dist/platform/adapters/discord-adapter.d.ts.map +1 -0
  95. package/dist/platform/adapters/discord-adapter.js +497 -0
  96. package/dist/platform/adapters/discord-adapter.js.map +1 -0
  97. package/dist/platform/adapters/feishu-adapter.d.ts +29 -0
  98. package/dist/platform/adapters/feishu-adapter.d.ts.map +1 -0
  99. package/dist/platform/adapters/feishu-adapter.js +150 -0
  100. package/dist/platform/adapters/feishu-adapter.js.map +1 -0
  101. package/dist/platform/registry.d.ts +41 -0
  102. package/dist/platform/registry.d.ts.map +1 -0
  103. package/dist/platform/registry.js +87 -0
  104. package/dist/platform/registry.js.map +1 -0
  105. package/dist/platform/types.d.ts +92 -0
  106. package/dist/platform/types.d.ts.map +1 -0
  107. package/dist/platform/types.js +4 -0
  108. package/dist/platform/types.js.map +1 -0
  109. package/dist/reliability/audit-log.d.ts +93 -0
  110. package/dist/reliability/audit-log.d.ts.map +1 -0
  111. package/dist/reliability/audit-log.js +248 -0
  112. package/dist/reliability/audit-log.js.map +1 -0
  113. package/dist/reliability/config-guard.d.ts +42 -0
  114. package/dist/reliability/config-guard.d.ts.map +1 -0
  115. package/dist/reliability/config-guard.js +264 -0
  116. package/dist/reliability/config-guard.js.map +1 -0
  117. package/dist/reliability/conversation-heartbeat.d.ts +37 -0
  118. package/dist/reliability/conversation-heartbeat.d.ts.map +1 -0
  119. package/dist/reliability/conversation-heartbeat.js +179 -0
  120. package/dist/reliability/conversation-heartbeat.js.map +1 -0
  121. package/dist/reliability/cron-api-server.d.ts +13 -0
  122. package/dist/reliability/cron-api-server.d.ts.map +1 -0
  123. package/dist/reliability/cron-api-server.js +247 -0
  124. package/dist/reliability/cron-api-server.js.map +1 -0
  125. package/dist/reliability/cron-control.d.ts +34 -0
  126. package/dist/reliability/cron-control.d.ts.map +1 -0
  127. package/dist/reliability/cron-control.js +864 -0
  128. package/dist/reliability/cron-control.js.map +1 -0
  129. package/dist/reliability/cron-semantic.d.ts +9 -0
  130. package/dist/reliability/cron-semantic.d.ts.map +1 -0
  131. package/dist/reliability/cron-semantic.js +208 -0
  132. package/dist/reliability/cron-semantic.js.map +1 -0
  133. package/dist/reliability/environment-doctor.d.ts +56 -0
  134. package/dist/reliability/environment-doctor.d.ts.map +1 -0
  135. package/dist/reliability/environment-doctor.js +213 -0
  136. package/dist/reliability/environment-doctor.js.map +1 -0
  137. package/dist/reliability/job-registry.d.ts +26 -0
  138. package/dist/reliability/job-registry.d.ts.map +1 -0
  139. package/dist/reliability/job-registry.js +77 -0
  140. package/dist/reliability/job-registry.js.map +1 -0
  141. package/dist/reliability/opencode-probe.d.ts +37 -0
  142. package/dist/reliability/opencode-probe.d.ts.map +1 -0
  143. package/dist/reliability/opencode-probe.js +195 -0
  144. package/dist/reliability/opencode-probe.js.map +1 -0
  145. package/dist/reliability/opencode-restart.d.ts +42 -0
  146. package/dist/reliability/opencode-restart.d.ts.map +1 -0
  147. package/dist/reliability/opencode-restart.js +155 -0
  148. package/dist/reliability/opencode-restart.js.map +1 -0
  149. package/dist/reliability/proactive-heartbeat.d.ts +39 -0
  150. package/dist/reliability/proactive-heartbeat.d.ts.map +1 -0
  151. package/dist/reliability/proactive-heartbeat.js +147 -0
  152. package/dist/reliability/proactive-heartbeat.js.map +1 -0
  153. package/dist/reliability/process-check-job.d.ts +73 -0
  154. package/dist/reliability/process-check-job.d.ts.map +1 -0
  155. package/dist/reliability/process-check-job.js +254 -0
  156. package/dist/reliability/process-check-job.js.map +1 -0
  157. package/dist/reliability/process-guard.d.ts +53 -0
  158. package/dist/reliability/process-guard.d.ts.map +1 -0
  159. package/dist/reliability/process-guard.js +344 -0
  160. package/dist/reliability/process-guard.js.map +1 -0
  161. package/dist/reliability/recovery-reporter.d.ts +37 -0
  162. package/dist/reliability/recovery-reporter.d.ts.map +1 -0
  163. package/dist/reliability/recovery-reporter.js +161 -0
  164. package/dist/reliability/recovery-reporter.js.map +1 -0
  165. package/dist/reliability/rescue-executor.d.ts +52 -0
  166. package/dist/reliability/rescue-executor.d.ts.map +1 -0
  167. package/dist/reliability/rescue-executor.js +244 -0
  168. package/dist/reliability/rescue-executor.js.map +1 -0
  169. package/dist/reliability/rescue-policy.d.ts +39 -0
  170. package/dist/reliability/rescue-policy.d.ts.map +1 -0
  171. package/dist/reliability/rescue-policy.js +85 -0
  172. package/dist/reliability/rescue-policy.js.map +1 -0
  173. package/dist/reliability/runtime-cron-dispatcher.d.ts +30 -0
  174. package/dist/reliability/runtime-cron-dispatcher.d.ts.map +1 -0
  175. package/dist/reliability/runtime-cron-dispatcher.js +100 -0
  176. package/dist/reliability/runtime-cron-dispatcher.js.map +1 -0
  177. package/dist/reliability/runtime-cron-orphan.d.ts +18 -0
  178. package/dist/reliability/runtime-cron-orphan.d.ts.map +1 -0
  179. package/dist/reliability/runtime-cron-orphan.js +87 -0
  180. package/dist/reliability/runtime-cron-orphan.js.map +1 -0
  181. package/dist/reliability/runtime-cron-registry.d.ts +4 -0
  182. package/dist/reliability/runtime-cron-registry.d.ts.map +1 -0
  183. package/dist/reliability/runtime-cron-registry.js +8 -0
  184. package/dist/reliability/runtime-cron-registry.js.map +1 -0
  185. package/dist/reliability/runtime-cron.d.ts +75 -0
  186. package/dist/reliability/runtime-cron.d.ts.map +1 -0
  187. package/dist/reliability/runtime-cron.js +309 -0
  188. package/dist/reliability/runtime-cron.js.map +1 -0
  189. package/dist/reliability/scheduler.d.ts +38 -0
  190. package/dist/reliability/scheduler.d.ts.map +1 -0
  191. package/dist/reliability/scheduler.js +174 -0
  192. package/dist/reliability/scheduler.js.map +1 -0
  193. package/dist/reliability/types.d.ts +151 -0
  194. package/dist/reliability/types.d.ts.map +1 -0
  195. package/dist/reliability/types.js +178 -0
  196. package/dist/reliability/types.js.map +1 -0
  197. package/dist/router/action-handlers.d.ts +27 -0
  198. package/dist/router/action-handlers.d.ts.map +1 -0
  199. package/dist/router/action-handlers.js +226 -0
  200. package/dist/router/action-handlers.js.map +1 -0
  201. package/dist/router/opencode-event-hub.d.ts +159 -0
  202. package/dist/router/opencode-event-hub.d.ts.map +1 -0
  203. package/dist/router/opencode-event-hub.js +589 -0
  204. package/dist/router/opencode-event-hub.js.map +1 -0
  205. package/dist/router/root-router.d.ts +94 -0
  206. package/dist/router/root-router.d.ts.map +1 -0
  207. package/dist/router/root-router.js +214 -0
  208. package/dist/router/root-router.js.map +1 -0
  209. package/dist/store/chat-session.d.ts +150 -0
  210. package/dist/store/chat-session.d.ts.map +1 -0
  211. package/dist/store/chat-session.js +640 -0
  212. package/dist/store/chat-session.js.map +1 -0
  213. package/dist/store/session-directory.d.ts +12 -0
  214. package/dist/store/session-directory.d.ts.map +1 -0
  215. package/dist/store/session-directory.js +47 -0
  216. package/dist/store/session-directory.js.map +1 -0
  217. package/dist/store/session-group.d.ts +19 -0
  218. package/dist/store/session-group.d.ts.map +1 -0
  219. package/dist/store/session-group.js +92 -0
  220. package/dist/store/session-group.js.map +1 -0
  221. package/dist/store/user-session.d.ts +19 -0
  222. package/dist/store/user-session.d.ts.map +1 -0
  223. package/dist/store/user-session.js +112 -0
  224. package/dist/store/user-session.js.map +1 -0
  225. package/dist/utils/async-queue.d.ts +12 -0
  226. package/dist/utils/async-queue.d.ts.map +1 -0
  227. package/dist/utils/async-queue.js +51 -0
  228. package/dist/utils/async-queue.js.map +1 -0
  229. package/dist/utils/directory-policy.d.ts +50 -0
  230. package/dist/utils/directory-policy.d.ts.map +1 -0
  231. package/dist/utils/directory-policy.js +379 -0
  232. package/dist/utils/directory-policy.js.map +1 -0
  233. package/dist/utils/session-title.d.ts +2 -0
  234. package/dist/utils/session-title.d.ts.map +1 -0
  235. package/dist/utils/session-title.js +10 -0
  236. package/dist/utils/session-title.js.map +1 -0
  237. package/package.json +73 -0
@@ -0,0 +1,589 @@
1
+ /**
2
+ * OpenCode 事件分发中心
3
+ *
4
+ * 职责:
5
+ * - 统一管理 OpenCode 事件监听(保持单监听器模式)
6
+ * - 通过上下文注入接收 index.ts 中的闭包状态
7
+ * - 事件分发到内部处理器
8
+ *
9
+ * 设计原则:
10
+ * - 单一入口:每种事件类型仅注册一次监听器
11
+ * - 依赖注入:所有状态通过上下文对象传入
12
+ * - 最小修改:保持语义和行为不变
13
+ */
14
+ import { opencodeClient } from '../opencode/client.js';
15
+ import { chatSessionStore } from '../store/chat-session.js';
16
+ import { permissionHandler } from '../permissions/handler.js';
17
+ import { questionHandler } from '../opencode/question-handler.js';
18
+ import { outputBuffer } from '../opencode/output-buffer.js';
19
+ import { feishuClient } from '../feishu/client.js';
20
+ /**
21
+ * OpenCode 事件中心
22
+ */
23
+ export class OpenCodeEventHub {
24
+ context = null;
25
+ registered = false;
26
+ userMessageIdsBySession = new Map();
27
+ resolveConversationRoute(sessionId, fallbackConversationId) {
28
+ const conversation = chatSessionStore.getConversationBySessionId(sessionId);
29
+ const platform = conversation?.platform ?? 'feishu';
30
+ const conversationId = conversation?.conversationId ?? fallbackConversationId;
31
+ const bufferKey = platform === 'feishu'
32
+ ? `chat:${conversationId}`
33
+ : `chat:${platform}:${conversationId}`;
34
+ const permissionChatKey = platform === 'feishu'
35
+ ? conversationId
36
+ : `${platform}:${conversationId}`;
37
+ return {
38
+ platform,
39
+ conversationId,
40
+ bufferKey,
41
+ permissionChatKey,
42
+ };
43
+ }
44
+ rememberUserMessageId(sessionId, messageId) {
45
+ const normalizedMessageId = messageId.trim();
46
+ if (!normalizedMessageId) {
47
+ return;
48
+ }
49
+ const existing = this.userMessageIdsBySession.get(sessionId) || new Set();
50
+ existing.add(normalizedMessageId);
51
+ if (existing.size > 20) {
52
+ const oldest = existing.values().next().value;
53
+ if (typeof oldest === 'string') {
54
+ existing.delete(oldest);
55
+ }
56
+ }
57
+ this.userMessageIdsBySession.set(sessionId, existing);
58
+ }
59
+ isUserMessagePart(sessionId, messageId) {
60
+ const existing = this.userMessageIdsBySession.get(sessionId);
61
+ if (!existing) {
62
+ return false;
63
+ }
64
+ return existing.has(messageId);
65
+ }
66
+ clearUserMessageIds(sessionId) {
67
+ this.userMessageIdsBySession.delete(sessionId);
68
+ }
69
+ /**
70
+ * 注入事件处理上下文
71
+ */
72
+ setContext(context) {
73
+ this.context = context;
74
+ }
75
+ /**
76
+ * 注册所有 OpenCode 事件监听器
77
+ * 确保每种事件类型仅注册一次
78
+ */
79
+ register() {
80
+ if (this.registered || !this.context) {
81
+ return;
82
+ }
83
+ this.registered = true;
84
+ // 权限请求
85
+ opencodeClient.on('permissionRequest', (event) => this.handlePermissionRequest(event));
86
+ // 会话状态变化
87
+ opencodeClient.on('sessionStatus', (event) => this.handleSessionStatus(event));
88
+ // 会话空闲
89
+ opencodeClient.on('sessionIdle', (event) => this.handleSessionIdle(event));
90
+ // 消息更新
91
+ opencodeClient.on('messageUpdated', (event) => this.handleMessageUpdated(event));
92
+ // 会话错误
93
+ opencodeClient.on('sessionError', (event) => this.handleSessionError(event));
94
+ // 消息部分更新(流式输出)
95
+ opencodeClient.on('messagePartUpdated', (event) => this.handleMessagePartUpdated(event));
96
+ // AI 提问
97
+ opencodeClient.on('questionAsked', (event) => this.handleQuestionAsked(event));
98
+ }
99
+ // ==================== 私有事件处理器 ====================
100
+ async handlePermissionRequest(event) {
101
+ if (!this.context)
102
+ return;
103
+ const { resolvePermissionChat, chatSessionStore, permissionHandler, opencodeClient, outputBuffer, CORRELATION_CACHE_TTL_MS, setCorrelationChatRef, toolCallChatMap, messageChatMap, upsertTimelineNote, } = this.injectedDependencies();
104
+ const resolution = resolvePermissionChat(event);
105
+ const chatId = resolution.chatId;
106
+ const route = chatId ? this.resolveConversationRoute(event.sessionId, chatId) : null;
107
+ const routeSession = route
108
+ ? chatSessionStore.getSessionByConversation(route.platform, route.conversationId)
109
+ : undefined;
110
+ const permissionDirectory = routeSession?.resolvedDirectory || routeSession?.defaultDirectory;
111
+ const permissionFallbackDirectories = Array.from(new Set([
112
+ routeSession?.resolvedDirectory,
113
+ routeSession?.defaultDirectory,
114
+ ...chatSessionStore.getKnownDirectories(),
115
+ ].filter((value) => typeof value === 'string' && value.trim().length > 0)));
116
+ const candidateSessionIds = Array.from(new Set([event.sessionId, event.parentSessionId, event.relatedSessionId]
117
+ .filter((value) => typeof value === 'string' && value.trim().length > 0)));
118
+ const enqueuePermissionRequest = () => {
119
+ if (!chatId || !route) {
120
+ return;
121
+ }
122
+ const bufferKey = route.bufferKey;
123
+ if (!outputBuffer.get(bufferKey)) {
124
+ outputBuffer.getOrCreate(bufferKey, route.conversationId, event.sessionId, null);
125
+ }
126
+ const permissionInfo = {
127
+ sessionId: event.sessionId,
128
+ permissionId: event.permissionId,
129
+ tool: event.tool,
130
+ description: event.description || event.tool,
131
+ risk: event.risk,
132
+ };
133
+ permissionHandler.enqueueForChat(route.permissionChatKey, {
134
+ sessionId: permissionInfo.sessionId,
135
+ permissionId: permissionInfo.permissionId,
136
+ tool: permissionInfo.tool,
137
+ description: permissionInfo.description,
138
+ risk: permissionInfo.risk,
139
+ userId: '',
140
+ });
141
+ console.log(`[权限] 已入队: chat=${route.permissionChatKey}, permission=${event.permissionId}, pending=${permissionHandler.getQueueSizeForChat(route.permissionChatKey)}`);
142
+ upsertTimelineNote(bufferKey, `permission:${event.sessionId}:${event.permissionId}`, `🔐 权限请求:${event.tool}`, 'permission');
143
+ outputBuffer.touch(bufferKey);
144
+ };
145
+ console.log(`[权限] 收到请求: ${event.tool}, ID: ${event.permissionId}, Session: ${event.sessionId}, source=${resolution.source}`);
146
+ if (chatId) {
147
+ chatSessionStore.rememberSessionAlias(event.sessionId, chatId, CORRELATION_CACHE_TTL_MS);
148
+ if (event.parentSessionId) {
149
+ chatSessionStore.rememberSessionAlias(event.parentSessionId, chatId, CORRELATION_CACHE_TTL_MS);
150
+ }
151
+ if (event.relatedSessionId) {
152
+ chatSessionStore.rememberSessionAlias(event.relatedSessionId, chatId, CORRELATION_CACHE_TTL_MS);
153
+ }
154
+ setCorrelationChatRef(toolCallChatMap, event.callId, chatId);
155
+ setCorrelationChatRef(messageChatMap, event.messageId, chatId);
156
+ }
157
+ // 1. 检查白名单
158
+ if (permissionHandler.isToolWhitelisted(event.tool)) {
159
+ console.log(`[权限] 工具 ${event.tool} 在白名单中,自动允许`);
160
+ let responded = false;
161
+ let respondedSessionId = event.sessionId;
162
+ for (const sessionId of candidateSessionIds) {
163
+ const ok = await opencodeClient.respondToPermission(sessionId, event.permissionId, true, false, {
164
+ ...(permissionDirectory ? { directory: permissionDirectory } : {}),
165
+ ...(permissionFallbackDirectories.length > 0
166
+ ? { fallbackDirectories: permissionFallbackDirectories }
167
+ : {}),
168
+ });
169
+ if (ok) {
170
+ responded = true;
171
+ respondedSessionId = sessionId;
172
+ break;
173
+ }
174
+ }
175
+ if (responded) {
176
+ if (chatId && route) {
177
+ permissionHandler.resolveForChat(route.permissionChatKey, event.permissionId);
178
+ }
179
+ console.log(`[权限] 自动允许成功: permission=${event.permissionId}, session=${respondedSessionId}`);
180
+ return;
181
+ }
182
+ console.error(`[权限] 自动允许失败: permission=${event.permissionId}, triedSessions=${candidateSessionIds.join(',') || event.sessionId}`);
183
+ if (chatId && route) {
184
+ enqueuePermissionRequest();
185
+ upsertTimelineNote(route.bufferKey, `permission-auto-allow-failed:${event.sessionId}:${event.permissionId}`, '⚠️ 自动允许失败,请回复“允许/拒绝”手动确认权限。', 'permission');
186
+ outputBuffer.touch(route.bufferKey);
187
+ }
188
+ return;
189
+ }
190
+ // 2. 查找聊天 ID
191
+ if (chatId && route) {
192
+ enqueuePermissionRequest();
193
+ }
194
+ else {
195
+ console.warn(`[权限] ⚠️ 未找到关联的群聊 (Session: ${event.sessionId}, parent=${event.parentSessionId || '-'}, related=${event.relatedSessionId || '-'}, call=${event.callId || '-'}, message=${event.messageId || '-'}),无法展示权限交互`);
196
+ }
197
+ }
198
+ handleSessionStatus(event) {
199
+ if (!this.context)
200
+ return;
201
+ const { toSessionId, chatSessionStore, outputBuffer, retryNoticeMap, upsertTimelineNote, markActiveToolsCompleted } = this.injectedDependencies();
202
+ const eventObj = event;
203
+ const sessionID = toSessionId(eventObj?.sessionID || eventObj?.sessionId);
204
+ const status = eventObj?.status;
205
+ if (!sessionID || !status || typeof status !== 'object')
206
+ return;
207
+ const chatId = chatSessionStore.getChatId(sessionID);
208
+ if (!chatId)
209
+ return;
210
+ const route = this.resolveConversationRoute(sessionID, chatId);
211
+ const bufferKey = route.bufferKey;
212
+ if (!outputBuffer.get(bufferKey)) {
213
+ outputBuffer.getOrCreate(bufferKey, route.conversationId, sessionID, null);
214
+ }
215
+ if (status.type === 'retry') {
216
+ const attempt = typeof status.attempt === 'number' ? status.attempt : 0;
217
+ const message = typeof status.message === 'string' ? status.message : '上游模型请求失败,正在重试';
218
+ const signature = `${attempt}:${message}`;
219
+ if (retryNoticeMap.get(sessionID) !== signature) {
220
+ retryNoticeMap.set(sessionID, signature);
221
+ upsertTimelineNote(bufferKey, `status-retry:${sessionID}:${signature}`, `⚠️ 模型重试(第 ${attempt} 次):${message}`, 'retry');
222
+ outputBuffer.touch(bufferKey);
223
+ }
224
+ return;
225
+ }
226
+ if (status.type === 'idle') {
227
+ markActiveToolsCompleted(bufferKey);
228
+ const buffer = outputBuffer.get(bufferKey);
229
+ if (buffer && buffer.status === 'running') {
230
+ outputBuffer.setStatus(bufferKey, 'completed');
231
+ }
232
+ }
233
+ }
234
+ handleSessionIdle(event) {
235
+ if (!this.context)
236
+ return;
237
+ const { toSessionId, chatSessionStore, outputBuffer, markActiveToolsCompleted } = this.injectedDependencies();
238
+ const eventObj = event;
239
+ const sessionID = toSessionId(eventObj?.sessionID || eventObj?.sessionId);
240
+ if (!sessionID)
241
+ return;
242
+ const chatId = chatSessionStore.getChatId(sessionID);
243
+ if (!chatId)
244
+ return;
245
+ const route = this.resolveConversationRoute(sessionID, chatId);
246
+ const bufferKey = route.bufferKey;
247
+ markActiveToolsCompleted(bufferKey);
248
+ const buffer = outputBuffer.get(bufferKey);
249
+ if (buffer && buffer.status === 'running') {
250
+ outputBuffer.setStatus(bufferKey, 'completed');
251
+ }
252
+ this.clearUserMessageIds(sessionID);
253
+ }
254
+ async handleMessageUpdated(event) {
255
+ if (!this.context)
256
+ return;
257
+ const { toSessionId, chatSessionStore, outputBuffer, CORRELATION_CACHE_TTL_MS, setCorrelationChatRef, messageChatMap, formatProviderError, applyFailureToSession } = this.injectedDependencies();
258
+ const eventObj = event;
259
+ const info = eventObj?.info;
260
+ if (!info || typeof info !== 'object')
261
+ return;
262
+ const sessionID = toSessionId(info.sessionID);
263
+ if (!sessionID)
264
+ return;
265
+ const role = typeof info.role === 'string' ? info.role : '';
266
+ if (role === 'user') {
267
+ if (typeof info.id === 'string' && info.id) {
268
+ this.rememberUserMessageId(sessionID, info.id);
269
+ }
270
+ return;
271
+ }
272
+ if (role !== 'assistant')
273
+ return;
274
+ const chatId = chatSessionStore.getChatId(sessionID);
275
+ if (!chatId)
276
+ return;
277
+ const route = this.resolveConversationRoute(sessionID, chatId);
278
+ const bufferKey = route.bufferKey;
279
+ if (!outputBuffer.get(bufferKey)) {
280
+ outputBuffer.getOrCreate(bufferKey, route.conversationId, sessionID, null);
281
+ }
282
+ chatSessionStore.rememberSessionAlias(sessionID, chatId, CORRELATION_CACHE_TTL_MS);
283
+ if (typeof info.id === 'string' && info.id) {
284
+ outputBuffer.setOpenCodeMsgId(bufferKey, info.id);
285
+ setCorrelationChatRef(messageChatMap, info.id, chatId);
286
+ }
287
+ if (info.error) {
288
+ const text = formatProviderError(info.error);
289
+ await applyFailureToSession(sessionID, text);
290
+ }
291
+ }
292
+ async handleSessionError(event) {
293
+ if (!this.context)
294
+ return;
295
+ const { toSessionId, formatProviderError, applyFailureToSession } = this.injectedDependencies();
296
+ const eventObj = event;
297
+ const sessionID = toSessionId(eventObj?.sessionID || eventObj?.sessionId);
298
+ if (!sessionID)
299
+ return;
300
+ const text = formatProviderError(eventObj?.error);
301
+ await applyFailureToSession(sessionID, text);
302
+ this.clearUserMessageIds(sessionID);
303
+ }
304
+ handleMessagePartUpdated(event) {
305
+ if (!this.context)
306
+ return;
307
+ const deps = this.injectedDependencies();
308
+ const { toSessionId, chatSessionStore, outputBuffer, CORRELATION_CACHE_TTL_MS, setCorrelationChatRef, toolCallChatMap, messageChatMap, asRecord, normalizeToolStatus, buildToolTraceOutput, upsertToolState, getOrCreateToolStateBucket, upsertTimelineNote, appendTimelineText, setTimelineText, reasoningSnapshotMap, textSnapshotMap, appendTextFromPart, appendReasoningFromPart, stringifyToolOutput, getToolStatusText, pickFirstDefined, } = deps;
309
+ const eventObj = event;
310
+ const part = eventObj?.part;
311
+ const sessionID = toSessionId(eventObj?.sessionID || part?.sessionID);
312
+ const delta = eventObj?.delta;
313
+ if (!sessionID)
314
+ return;
315
+ const partMessageId = typeof part?.messageID === 'string' ? part.messageID : '';
316
+ if (partMessageId && this.isUserMessagePart(sessionID, partMessageId)) {
317
+ return;
318
+ }
319
+ const chatId = chatSessionStore.getChatId(sessionID);
320
+ if (!chatId)
321
+ return;
322
+ const route = this.resolveConversationRoute(sessionID, chatId);
323
+ const bufferKey = route.bufferKey;
324
+ if (!outputBuffer.get(bufferKey)) {
325
+ outputBuffer.getOrCreate(bufferKey, route.conversationId, sessionID, null);
326
+ }
327
+ chatSessionStore.rememberSessionAlias(sessionID, chatId, CORRELATION_CACHE_TTL_MS);
328
+ // Tool 处理
329
+ if (part?.type === 'tool' && typeof part === 'object') {
330
+ const toolPart = part;
331
+ const rawToolName = toolPart.tool;
332
+ const toolObj = asRecord(rawToolName);
333
+ const toolName = typeof rawToolName === 'string' && rawToolName.trim()
334
+ ? rawToolName.trim()
335
+ : toolObj && typeof toolObj.name === 'string' && toolObj.name.trim()
336
+ ? toolObj.name.trim()
337
+ : 'tool';
338
+ const state = asRecord(toolPart.state);
339
+ const status = normalizeToolStatus(state?.status);
340
+ const toolKey = typeof toolPart.callID === 'string' && toolPart.callID
341
+ ? toolPart.callID
342
+ : typeof toolPart.id === 'string' && toolPart.id
343
+ ? toolPart.id
344
+ : `${toolName}:${Date.now()}`;
345
+ setCorrelationChatRef(toolCallChatMap, toolPart.callID, chatId);
346
+ setCorrelationChatRef(toolCallChatMap, toolPart.callId, chatId);
347
+ setCorrelationChatRef(toolCallChatMap, toolPart.toolCallID, chatId);
348
+ setCorrelationChatRef(toolCallChatMap, toolPart.toolCallId, chatId);
349
+ setCorrelationChatRef(messageChatMap, toolPart.messageID, chatId);
350
+ setCorrelationChatRef(messageChatMap, toolPart.messageId, chatId);
351
+ const previous = getOrCreateToolStateBucket(bufferKey).get(toolKey);
352
+ const output = buildToolTraceOutput(toolPart, status, !previous || !previous.output);
353
+ upsertToolState(bufferKey, toolKey, {
354
+ name: toolName,
355
+ status,
356
+ ...(output ? { output } : {}),
357
+ kind: 'tool',
358
+ }, 'tool');
359
+ }
360
+ // Subtask 处理
361
+ if (part?.type === 'subtask' && typeof part === 'object') {
362
+ const subtaskPart = part;
363
+ const taskName = typeof subtaskPart.description === 'string' && subtaskPart.description.trim()
364
+ ? subtaskPart.description.trim()
365
+ : 'Subtask';
366
+ const state = asRecord(subtaskPart.state);
367
+ const status = normalizeToolStatus(state?.status);
368
+ const toolKey = typeof subtaskPart.id === 'string' && subtaskPart.id
369
+ ? `subtask:${subtaskPart.id}`
370
+ : `subtask:${Date.now()}`;
371
+ const previous = getOrCreateToolStateBucket(bufferKey).get(toolKey);
372
+ const outputParts = [];
373
+ if (!previous) {
374
+ if (typeof subtaskPart.agent === 'string' && subtaskPart.agent.trim()) {
375
+ outputParts.push(`agent=${subtaskPart.agent.trim()}`);
376
+ }
377
+ if (typeof subtaskPart.prompt === 'string' && subtaskPart.prompt.trim()) {
378
+ const normalizedPrompt = subtaskPart.prompt.trim().replace(/\s+/g, ' ');
379
+ outputParts.push(`prompt=${normalizedPrompt.slice(0, 200)}`);
380
+ }
381
+ }
382
+ const stateOutput = status === 'failed'
383
+ ? stringifyToolOutput(pickFirstDefined(state?.error, state?.output))
384
+ : stringifyToolOutput(pickFirstDefined(state?.output, state?.result, state?.message));
385
+ if (stateOutput && stateOutput.trim()) {
386
+ outputParts.push(stateOutput.trim());
387
+ }
388
+ else {
389
+ outputParts.push(`状态更新:${getToolStatusText(status)}`);
390
+ }
391
+ const output = outputParts.join('\n\n');
392
+ upsertToolState(bufferKey, toolKey, {
393
+ name: taskName,
394
+ status,
395
+ ...(output ? { output } : {}),
396
+ kind: 'subtask',
397
+ }, 'subtask');
398
+ }
399
+ // Retry 处理
400
+ if (part?.type === 'retry') {
401
+ const errorObj = part.error;
402
+ const errorData = errorObj?.data;
403
+ const retryMessage = errorData?.message;
404
+ if (typeof retryMessage === 'string' && retryMessage.trim()) {
405
+ const retryKey = typeof part.id === 'string' && part.id
406
+ ? part.id
407
+ : retryMessage.trim().slice(0, 80);
408
+ upsertTimelineNote(bufferKey, `part-retry:${sessionID}:${retryKey}`, `⚠️ 模型请求重试:${retryMessage.trim()}`, 'retry');
409
+ outputBuffer.touch(bufferKey);
410
+ }
411
+ }
412
+ // Compaction 处理
413
+ if (part?.type === 'compaction') {
414
+ const compactionKey = typeof part.id === 'string' && part.id
415
+ ? part.id
416
+ : `${Date.now()}`;
417
+ upsertTimelineNote(bufferKey, `compaction:${sessionID}:${compactionKey}`, '🗜️ 会话上下文已压缩', 'compaction');
418
+ outputBuffer.touch(bufferKey);
419
+ }
420
+ // Delta 字符串处理
421
+ if (typeof delta === 'string') {
422
+ if (delta.length > 0) {
423
+ if (part?.type === 'reasoning') {
424
+ outputBuffer.appendThinking(bufferKey, delta);
425
+ if (typeof part?.id === 'string') {
426
+ const key = `${sessionID}:${part.id}`;
427
+ const prev = reasoningSnapshotMap.get(key) || '';
428
+ const next = `${prev}${delta}`;
429
+ reasoningSnapshotMap.set(key, next);
430
+ setTimelineText(bufferKey, `reasoning:${key}`, 'reasoning', next);
431
+ }
432
+ else {
433
+ appendTimelineText(bufferKey, `reasoning:${sessionID}:anonymous`, 'reasoning', delta);
434
+ }
435
+ return;
436
+ }
437
+ if (part?.type === 'text') {
438
+ if (typeof part?.id === 'string' && part.id) {
439
+ const key = `${sessionID}:${part.id}`;
440
+ const prev = textSnapshotMap.get(key) || '';
441
+ const next = `${prev}${delta}`;
442
+ textSnapshotMap.set(key, next);
443
+ setTimelineText(bufferKey, `text:${key}`, 'text', next);
444
+ }
445
+ else {
446
+ appendTimelineText(bufferKey, `text:${sessionID}:anonymous`, 'text', delta);
447
+ }
448
+ outputBuffer.append(bufferKey, delta);
449
+ return;
450
+ }
451
+ outputBuffer.append(bufferKey, delta);
452
+ return;
453
+ }
454
+ if (part?.type === 'reasoning') {
455
+ appendReasoningFromPart(sessionID, part, bufferKey);
456
+ return;
457
+ }
458
+ if (part?.type === 'text') {
459
+ appendTextFromPart(sessionID, part, bufferKey);
460
+ return;
461
+ }
462
+ }
463
+ // Delta 对象处理
464
+ if (delta && typeof delta === 'object') {
465
+ const deltaObj = delta;
466
+ if (deltaObj.type === 'reasoning') {
467
+ const reasoningText = typeof deltaObj.text === 'string'
468
+ ? deltaObj.text
469
+ : typeof deltaObj.reasoning === 'string'
470
+ ? deltaObj.reasoning
471
+ : '';
472
+ if (reasoningText) {
473
+ outputBuffer.appendThinking(bufferKey, reasoningText);
474
+ if (typeof part?.id === 'string' && part.id) {
475
+ const key = `${sessionID}:${part.id}`;
476
+ const prev = reasoningSnapshotMap.get(key) || '';
477
+ const next = `${prev}${reasoningText}`;
478
+ reasoningSnapshotMap.set(key, next);
479
+ setTimelineText(bufferKey, `reasoning:${key}`, 'reasoning', next);
480
+ }
481
+ else {
482
+ appendTimelineText(bufferKey, `reasoning:${sessionID}:anonymous`, 'reasoning', reasoningText);
483
+ }
484
+ }
485
+ }
486
+ else if (deltaObj.type === 'thinking' && typeof deltaObj.thinking === 'string') {
487
+ outputBuffer.appendThinking(bufferKey, deltaObj.thinking);
488
+ if (typeof part?.id === 'string' && part.id) {
489
+ const key = `${sessionID}:${part.id}`;
490
+ const prev = reasoningSnapshotMap.get(key) || '';
491
+ const next = `${prev}${deltaObj.thinking}`;
492
+ reasoningSnapshotMap.set(key, next);
493
+ setTimelineText(bufferKey, `reasoning:${key}`, 'reasoning', next);
494
+ }
495
+ else {
496
+ appendTimelineText(bufferKey, `reasoning:${sessionID}:anonymous`, 'reasoning', deltaObj.thinking);
497
+ }
498
+ }
499
+ else if (deltaObj.type === 'text' && typeof deltaObj.text === 'string' && deltaObj.text.length > 0) {
500
+ outputBuffer.append(bufferKey, deltaObj.text);
501
+ if (typeof part?.id === 'string' && part.id) {
502
+ const key = `${sessionID}:${part.id}`;
503
+ const prev = textSnapshotMap.get(key) || '';
504
+ const next = `${prev}${deltaObj.text}`;
505
+ textSnapshotMap.set(key, next);
506
+ setTimelineText(bufferKey, `text:${key}`, 'text', next);
507
+ }
508
+ else {
509
+ appendTimelineText(bufferKey, `text:${sessionID}:anonymous`, 'text', deltaObj.text);
510
+ }
511
+ }
512
+ else if (typeof deltaObj.text === 'string' && deltaObj.text.length > 0) {
513
+ outputBuffer.append(bufferKey, deltaObj.text);
514
+ if (part?.type === 'reasoning') {
515
+ if (typeof part?.id === 'string' && part.id) {
516
+ const key = `${sessionID}:${part.id}`;
517
+ const prev = reasoningSnapshotMap.get(key) || '';
518
+ const next = `${prev}${deltaObj.text}`;
519
+ reasoningSnapshotMap.set(key, next);
520
+ setTimelineText(bufferKey, `reasoning:${key}`, 'reasoning', next);
521
+ }
522
+ else {
523
+ appendTimelineText(bufferKey, `reasoning:${sessionID}:anonymous`, 'reasoning', deltaObj.text);
524
+ }
525
+ }
526
+ else if (part?.type === 'text') {
527
+ if (typeof part?.id === 'string' && part.id) {
528
+ const key = `${sessionID}:${part.id}`;
529
+ const prev = textSnapshotMap.get(key) || '';
530
+ const next = `${prev}${deltaObj.text}`;
531
+ textSnapshotMap.set(key, next);
532
+ setTimelineText(bufferKey, `text:${key}`, 'text', next);
533
+ }
534
+ else {
535
+ appendTimelineText(bufferKey, `text:${sessionID}:anonymous`, 'text', deltaObj.text);
536
+ }
537
+ }
538
+ }
539
+ return;
540
+ }
541
+ // 兜底处理
542
+ if (part?.type === 'reasoning' && typeof part.text === 'string') {
543
+ appendReasoningFromPart(sessionID, part, bufferKey);
544
+ }
545
+ else if (part?.type === 'text' && typeof part.text === 'string') {
546
+ appendTextFromPart(sessionID, part, bufferKey);
547
+ }
548
+ }
549
+ handleQuestionAsked(event) {
550
+ if (!this.context)
551
+ return;
552
+ const { chatSessionStore, questionHandler, outputBuffer, upsertTimelineNote } = this.injectedDependencies();
553
+ const request = event;
554
+ const chatId = chatSessionStore.getChatId(request.sessionID);
555
+ if (chatId) {
556
+ const route = this.resolveConversationRoute(request.sessionID, chatId);
557
+ console.log(`[问题] 收到提问: ${request.id} (Chat: ${chatId})`);
558
+ const bufferKey = route.bufferKey;
559
+ if (!outputBuffer.get(bufferKey)) {
560
+ outputBuffer.getOrCreate(bufferKey, route.conversationId, request.sessionID, null);
561
+ }
562
+ questionHandler.register(request, bufferKey, route.conversationId);
563
+ upsertTimelineNote(bufferKey, `question:${request.sessionID}:${request.id}`, '🤝 问答交互(请在当前流式卡片中作答)', 'question');
564
+ outputBuffer.touch(bufferKey);
565
+ }
566
+ }
567
+ // ==================== 依赖注入辅助 ====================
568
+ /**
569
+ * 获取注入的外部依赖
570
+ * 这些依赖不通过 context 传递,因为它们是模块级别的单例
571
+ */
572
+ injectedDependencies() {
573
+ if (!this.context) {
574
+ throw new Error('OpenCodeEventHub context not set');
575
+ }
576
+ return {
577
+ chatSessionStore,
578
+ permissionHandler,
579
+ questionHandler,
580
+ opencodeClient,
581
+ outputBuffer,
582
+ feishuClient,
583
+ ...this.context,
584
+ };
585
+ }
586
+ }
587
+ // 单例导出
588
+ export const openCodeEventHub = new OpenCodeEventHub();
589
+ //# sourceMappingURL=opencode-event-hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-event-hub.js","sourceRoot":"","sources":["../../src/router/opencode-event-hub.ts"],"names":[],"mappings":"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"}