botmux 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 (202) hide show
  1. package/.env.example +24 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +267 -0
  4. package/README.md +267 -0
  5. package/dist/adapters/backend/pty-backend.d.ts +13 -0
  6. package/dist/adapters/backend/pty-backend.d.ts.map +1 -0
  7. package/dist/adapters/backend/pty-backend.js +39 -0
  8. package/dist/adapters/backend/pty-backend.js.map +1 -0
  9. package/dist/adapters/backend/tmux-backend.d.ts +20 -0
  10. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -0
  11. package/dist/adapters/backend/tmux-backend.js +30 -0
  12. package/dist/adapters/backend/tmux-backend.js.map +1 -0
  13. package/dist/adapters/backend/types.d.ts +19 -0
  14. package/dist/adapters/backend/types.d.ts.map +1 -0
  15. package/dist/adapters/backend/types.js +2 -0
  16. package/dist/adapters/backend/types.js.map +1 -0
  17. package/dist/adapters/cli/aiden.d.ts +4 -0
  18. package/dist/adapters/cli/aiden.d.ts.map +1 -0
  19. package/dist/adapters/cli/aiden.js +63 -0
  20. package/dist/adapters/cli/aiden.js.map +1 -0
  21. package/dist/adapters/cli/claude-code.d.ts +4 -0
  22. package/dist/adapters/cli/claude-code.d.ts.map +1 -0
  23. package/dist/adapters/cli/claude-code.js +59 -0
  24. package/dist/adapters/cli/claude-code.js.map +1 -0
  25. package/dist/adapters/cli/coco.d.ts +4 -0
  26. package/dist/adapters/cli/coco.d.ts.map +1 -0
  27. package/dist/adapters/cli/coco.js +46 -0
  28. package/dist/adapters/cli/coco.js.map +1 -0
  29. package/dist/adapters/cli/codex.d.ts +4 -0
  30. package/dist/adapters/cli/codex.d.ts.map +1 -0
  31. package/dist/adapters/cli/codex.js +47 -0
  32. package/dist/adapters/cli/codex.js.map +1 -0
  33. package/dist/adapters/cli/registry.d.ts +13 -0
  34. package/dist/adapters/cli/registry.d.ts.map +1 -0
  35. package/dist/adapters/cli/registry.js +42 -0
  36. package/dist/adapters/cli/registry.js.map +1 -0
  37. package/dist/adapters/cli/types.d.ts +39 -0
  38. package/dist/adapters/cli/types.d.ts.map +1 -0
  39. package/dist/adapters/cli/types.js +2 -0
  40. package/dist/adapters/cli/types.js.map +1 -0
  41. package/dist/cli.d.ts +3 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +245 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/config.d.ts +24 -0
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +39 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/core/command-handler.d.ts +11 -0
  50. package/dist/core/command-handler.d.ts.map +1 -0
  51. package/dist/core/command-handler.js +322 -0
  52. package/dist/core/command-handler.js.map +1 -0
  53. package/dist/core/cost-calculator.d.ts +12 -0
  54. package/dist/core/cost-calculator.d.ts.map +1 -0
  55. package/dist/core/cost-calculator.js +61 -0
  56. package/dist/core/cost-calculator.js.map +1 -0
  57. package/dist/core/scheduler.d.ts +38 -0
  58. package/dist/core/scheduler.d.ts.map +1 -0
  59. package/dist/core/scheduler.js +221 -0
  60. package/dist/core/scheduler.js.map +1 -0
  61. package/dist/core/session-manager.d.ts +13 -0
  62. package/dist/core/session-manager.d.ts.map +1 -0
  63. package/dist/core/session-manager.js +125 -0
  64. package/dist/core/session-manager.js.map +1 -0
  65. package/dist/core/types.d.ts +29 -0
  66. package/dist/core/types.d.ts.map +1 -0
  67. package/dist/core/types.js +2 -0
  68. package/dist/core/types.js.map +1 -0
  69. package/dist/core/worker-pool.d.ts +26 -0
  70. package/dist/core/worker-pool.d.ts.map +1 -0
  71. package/dist/core/worker-pool.js +261 -0
  72. package/dist/core/worker-pool.js.map +1 -0
  73. package/dist/daemon.d.ts +3 -0
  74. package/dist/daemon.d.ts.map +1 -0
  75. package/dist/daemon.js +344 -0
  76. package/dist/daemon.js.map +1 -0
  77. package/dist/im/lark/card-builder.d.ts +18 -0
  78. package/dist/im/lark/card-builder.d.ts.map +1 -0
  79. package/dist/im/lark/card-builder.js +194 -0
  80. package/dist/im/lark/card-builder.js.map +1 -0
  81. package/dist/im/lark/card-handler.d.ts +9 -0
  82. package/dist/im/lark/card-handler.d.ts.map +1 -0
  83. package/dist/im/lark/card-handler.js +131 -0
  84. package/dist/im/lark/card-handler.js.map +1 -0
  85. package/dist/im/lark/client.d.ts +23 -0
  86. package/dist/im/lark/client.d.ts.map +1 -0
  87. package/dist/im/lark/client.js +259 -0
  88. package/dist/im/lark/client.js.map +1 -0
  89. package/dist/im/lark/event-dispatcher.d.ts +34 -0
  90. package/dist/im/lark/event-dispatcher.d.ts.map +1 -0
  91. package/dist/im/lark/event-dispatcher.js +195 -0
  92. package/dist/im/lark/event-dispatcher.js.map +1 -0
  93. package/dist/im/lark/message-parser.d.ts +45 -0
  94. package/dist/im/lark/message-parser.d.ts.map +1 -0
  95. package/dist/im/lark/message-parser.js +132 -0
  96. package/dist/im/lark/message-parser.js.map +1 -0
  97. package/dist/im/types.d.ts +78 -0
  98. package/dist/im/types.d.ts.map +1 -0
  99. package/dist/im/types.js +2 -0
  100. package/dist/im/types.js.map +1 -0
  101. package/dist/index-daemon.d.ts +3 -0
  102. package/dist/index-daemon.d.ts.map +1 -0
  103. package/dist/index-daemon.js +21 -0
  104. package/dist/index-daemon.js.map +1 -0
  105. package/dist/index.d.ts +3 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +16 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/scheduler.d.ts +38 -0
  110. package/dist/scheduler.d.ts.map +1 -0
  111. package/dist/scheduler.js +221 -0
  112. package/dist/scheduler.js.map +1 -0
  113. package/dist/server.d.ts +3 -0
  114. package/dist/server.d.ts.map +1 -0
  115. package/dist/server.js +23 -0
  116. package/dist/server.js.map +1 -0
  117. package/dist/services/lark-client.d.ts +22 -0
  118. package/dist/services/lark-client.d.ts.map +1 -0
  119. package/dist/services/lark-client.js +238 -0
  120. package/dist/services/lark-client.js.map +1 -0
  121. package/dist/services/lark-ws.d.ts +5 -0
  122. package/dist/services/lark-ws.d.ts.map +1 -0
  123. package/dist/services/lark-ws.js +79 -0
  124. package/dist/services/lark-ws.js.map +1 -0
  125. package/dist/services/message-queue.d.ts +9 -0
  126. package/dist/services/message-queue.d.ts.map +1 -0
  127. package/dist/services/message-queue.js +77 -0
  128. package/dist/services/message-queue.js.map +1 -0
  129. package/dist/services/message-router.d.ts +8 -0
  130. package/dist/services/message-router.d.ts.map +1 -0
  131. package/dist/services/message-router.js +73 -0
  132. package/dist/services/message-router.js.map +1 -0
  133. package/dist/services/project-scanner.d.ts +12 -0
  134. package/dist/services/project-scanner.d.ts.map +1 -0
  135. package/dist/services/project-scanner.js +109 -0
  136. package/dist/services/project-scanner.js.map +1 -0
  137. package/dist/services/schedule-store.d.ts +14 -0
  138. package/dist/services/schedule-store.d.ts.map +1 -0
  139. package/dist/services/schedule-store.js +89 -0
  140. package/dist/services/schedule-store.js.map +1 -0
  141. package/dist/services/session-store.d.ts +8 -0
  142. package/dist/services/session-store.d.ts.map +1 -0
  143. package/dist/services/session-store.js +93 -0
  144. package/dist/services/session-store.js.map +1 -0
  145. package/dist/tools/close-session.d.ts +22 -0
  146. package/dist/tools/close-session.d.ts.map +1 -0
  147. package/dist/tools/close-session.js +38 -0
  148. package/dist/tools/close-session.js.map +1 -0
  149. package/dist/tools/create-session.d.ts +28 -0
  150. package/dist/tools/create-session.d.ts.map +1 -0
  151. package/dist/tools/create-session.js +40 -0
  152. package/dist/tools/create-session.js.map +1 -0
  153. package/dist/tools/get-thread-messages.d.ts +26 -0
  154. package/dist/tools/get-thread-messages.d.ts.map +1 -0
  155. package/dist/tools/get-thread-messages.js +33 -0
  156. package/dist/tools/get-thread-messages.js.map +1 -0
  157. package/dist/tools/index.d.ts +9 -0
  158. package/dist/tools/index.d.ts.map +1 -0
  159. package/dist/tools/index.js +10 -0
  160. package/dist/tools/index.js.map +1 -0
  161. package/dist/tools/react-to-message.d.ts +41 -0
  162. package/dist/tools/react-to-message.d.ts.map +1 -0
  163. package/dist/tools/react-to-message.js +30 -0
  164. package/dist/tools/react-to-message.js.map +1 -0
  165. package/dist/tools/send-to-thread.d.ts +24 -0
  166. package/dist/tools/send-to-thread.d.ts.map +1 -0
  167. package/dist/tools/send-to-thread.js +83 -0
  168. package/dist/tools/send-to-thread.js.map +1 -0
  169. package/dist/tools/wait-for-reply.d.ts +17 -0
  170. package/dist/tools/wait-for-reply.d.ts.map +1 -0
  171. package/dist/tools/wait-for-reply.js +65 -0
  172. package/dist/tools/wait-for-reply.js.map +1 -0
  173. package/dist/types.d.ts +85 -0
  174. package/dist/types.d.ts.map +1 -0
  175. package/dist/types.js +6 -0
  176. package/dist/types.js.map +1 -0
  177. package/dist/utils/card-builder.d.ts +16 -0
  178. package/dist/utils/card-builder.d.ts.map +1 -0
  179. package/dist/utils/card-builder.js +183 -0
  180. package/dist/utils/card-builder.js.map +1 -0
  181. package/dist/utils/idle-detector.d.ts +21 -0
  182. package/dist/utils/idle-detector.d.ts.map +1 -0
  183. package/dist/utils/idle-detector.js +95 -0
  184. package/dist/utils/idle-detector.js.map +1 -0
  185. package/dist/utils/logger.d.ts +7 -0
  186. package/dist/utils/logger.d.ts.map +1 -0
  187. package/dist/utils/logger.js +22 -0
  188. package/dist/utils/logger.js.map +1 -0
  189. package/dist/utils/message-parser.d.ts +45 -0
  190. package/dist/utils/message-parser.d.ts.map +1 -0
  191. package/dist/utils/message-parser.js +132 -0
  192. package/dist/utils/message-parser.js.map +1 -0
  193. package/dist/utils/terminal-renderer.d.ts +39 -0
  194. package/dist/utils/terminal-renderer.d.ts.map +1 -0
  195. package/dist/utils/terminal-renderer.js +186 -0
  196. package/dist/utils/terminal-renderer.js.map +1 -0
  197. package/dist/worker.d.ts +3 -0
  198. package/dist/worker.d.ts.map +1 -0
  199. package/dist/worker.js +411 -0
  200. package/dist/worker.js.map +1 -0
  201. package/ecosystem.config.cjs +15 -0
  202. package/package.json +60 -0
@@ -0,0 +1,18 @@
1
+ import type { ProjectInfo } from '../../services/project-scanner.js';
2
+ import type { CliId } from '../../adapters/cli/types.js';
3
+ export declare function getCliDisplayName(cliId: CliId): string;
4
+ /**
5
+ * Build a Feishu interactive card with terminal link + restart/close buttons.
6
+ */
7
+ export declare function buildSessionCard(sessionId: string, rootId: string, terminalUrl: string, title: string, cliId?: CliId): string;
8
+ /**
9
+ * Build a Feishu streaming card that shows live terminal output + controls.
10
+ * This card is PATCHed in-place as Claude works.
11
+ */
12
+ export declare function buildStreamingCard(sessionId: string, rootId: string, terminalUrl: string, title: string, screenContent: string, status: 'starting' | 'working' | 'idle', cliId?: CliId): string;
13
+ /**
14
+ * Build a Feishu interactive card with a dropdown selector for projects.
15
+ * Returns a JSON string suitable for msg_type: 'interactive'.
16
+ */
17
+ export declare function buildRepoSelectCard(projects: ProjectInfo[], currentPath?: string, rootMessageId?: string): string;
18
+ //# sourceMappingURL=card-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../../src/im/lark/card-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AASzD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEtD;AAOD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,KAAK,GACZ,MAAM,CAqDR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,EACvC,KAAK,CAAC,EAAE,KAAK,GACZ,MAAM,CA4DR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAyDjH"}
@@ -0,0 +1,194 @@
1
+ const cliDisplayNames = {
2
+ 'claude-code': 'Claude',
3
+ 'aiden': 'Aiden',
4
+ 'coco': 'CoCo',
5
+ 'codex': 'Codex',
6
+ };
7
+ export function getCliDisplayName(cliId) {
8
+ return cliDisplayNames[cliId] ?? cliId;
9
+ }
10
+ /** Escape Lark markdown special characters in user-controlled strings. */
11
+ function escapeMd(s) {
12
+ return s.replace(/[*_~`\[\]\\]/g, c => `\\${c}`);
13
+ }
14
+ /**
15
+ * Build a Feishu interactive card with terminal link + restart/close buttons.
16
+ */
17
+ export function buildSessionCard(sessionId, rootId, terminalUrl, title, cliId) {
18
+ const cliName = getCliDisplayName(cliId ?? 'claude-code');
19
+ const card = {
20
+ config: { wide_screen_mode: true },
21
+ header: {
22
+ title: { tag: 'plain_text', content: `🖥️ ${escapeMd(title)}` },
23
+ template: 'blue',
24
+ },
25
+ elements: [
26
+ {
27
+ tag: 'div',
28
+ text: {
29
+ tag: 'lark_md',
30
+ content: `**终端地址:** [${terminalUrl}](${terminalUrl})`,
31
+ },
32
+ },
33
+ {
34
+ tag: 'action',
35
+ actions: [
36
+ {
37
+ tag: 'button',
38
+ text: { tag: 'plain_text', content: '🖥️ 打开终端' },
39
+ type: 'primary',
40
+ multi_url: {
41
+ url: terminalUrl,
42
+ pc_url: terminalUrl,
43
+ android_url: terminalUrl,
44
+ ios_url: terminalUrl,
45
+ },
46
+ },
47
+ {
48
+ tag: 'button',
49
+ text: { tag: 'plain_text', content: '🔑 获取操作链接' },
50
+ type: 'default',
51
+ value: { action: 'get_write_link', root_id: rootId, session_id: sessionId },
52
+ },
53
+ {
54
+ tag: 'button',
55
+ text: { tag: 'plain_text', content: `🔄 重启 ${cliName}` },
56
+ type: 'default',
57
+ value: { action: 'restart', root_id: rootId, session_id: sessionId },
58
+ },
59
+ {
60
+ tag: 'button',
61
+ text: { tag: 'plain_text', content: '❌ 关闭会话' },
62
+ type: 'danger',
63
+ value: { action: 'close', root_id: rootId, session_id: sessionId },
64
+ },
65
+ ],
66
+ },
67
+ ],
68
+ };
69
+ return JSON.stringify(card);
70
+ }
71
+ /**
72
+ * Build a Feishu streaming card that shows live terminal output + controls.
73
+ * This card is PATCHed in-place as Claude works.
74
+ */
75
+ export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screenContent, status, cliId) {
76
+ const cliName = getCliDisplayName(cliId ?? 'claude-code');
77
+ const templateMap = { starting: 'yellow', working: 'blue', idle: 'green' };
78
+ const statusMap = { starting: '启动中…', working: '工作中', idle: '就绪' };
79
+ const displayContent = screenContent || '(等待输出…)';
80
+ const card = {
81
+ config: { wide_screen_mode: true },
82
+ header: {
83
+ title: { tag: 'plain_text', content: `🖥️ ${escapeMd(title)} — ${statusMap[status]}` },
84
+ template: templateMap[status],
85
+ },
86
+ elements: [
87
+ {
88
+ tag: 'markdown',
89
+ content: displayContent,
90
+ },
91
+ { tag: 'hr' },
92
+ {
93
+ tag: 'markdown',
94
+ content: `**终端:** [${terminalUrl}](${terminalUrl})`,
95
+ },
96
+ {
97
+ tag: 'action',
98
+ actions: [
99
+ {
100
+ tag: 'button',
101
+ text: { tag: 'plain_text', content: '🖥️ 打开终端' },
102
+ type: 'primary',
103
+ multi_url: {
104
+ url: terminalUrl,
105
+ pc_url: terminalUrl,
106
+ android_url: terminalUrl,
107
+ ios_url: terminalUrl,
108
+ },
109
+ },
110
+ {
111
+ tag: 'button',
112
+ text: { tag: 'plain_text', content: '🔑 获取操作链接' },
113
+ type: 'default',
114
+ value: { action: 'get_write_link', root_id: rootId, session_id: sessionId },
115
+ },
116
+ {
117
+ tag: 'button',
118
+ text: { tag: 'plain_text', content: `🔄 重启 ${cliName}` },
119
+ type: 'default',
120
+ value: { action: 'restart', root_id: rootId, session_id: sessionId },
121
+ },
122
+ {
123
+ tag: 'button',
124
+ text: { tag: 'plain_text', content: '❌ 关闭会话' },
125
+ type: 'danger',
126
+ value: { action: 'close', root_id: rootId, session_id: sessionId },
127
+ },
128
+ ],
129
+ },
130
+ ],
131
+ };
132
+ return JSON.stringify(card);
133
+ }
134
+ /**
135
+ * Build a Feishu interactive card with a dropdown selector for projects.
136
+ * Returns a JSON string suitable for msg_type: 'interactive'.
137
+ */
138
+ export function buildRepoSelectCard(projects, currentPath, rootMessageId) {
139
+ const options = projects.map((p, i) => {
140
+ const currentTag = p.path === currentPath ? ' ← 当前' : '';
141
+ const typeTag = p.type === 'worktree' ? ' [worktree]' : '';
142
+ return {
143
+ text: { tag: 'plain_text', content: `${i + 1}. ${p.name} (${p.branch})${typeTag}${currentTag}` },
144
+ value: p.path,
145
+ };
146
+ });
147
+ const card = {
148
+ config: { wide_screen_mode: true },
149
+ header: {
150
+ template: 'blue',
151
+ title: { tag: 'plain_text', content: '📁 项目仓库管理' },
152
+ },
153
+ elements: [
154
+ {
155
+ tag: 'div',
156
+ text: {
157
+ tag: 'lark_md',
158
+ content: `当前活跃项目:**${escapeMd(currentPath ?? 'N/A')}**`,
159
+ },
160
+ },
161
+ {
162
+ tag: 'hr',
163
+ },
164
+ {
165
+ tag: 'action',
166
+ actions: [
167
+ {
168
+ tag: 'select_static',
169
+ placeholder: { tag: 'plain_text', content: '选择仓库并切换' },
170
+ options,
171
+ value: { key: 'repo_switch', root_id: rootMessageId ?? '' },
172
+ },
173
+ {
174
+ tag: 'button',
175
+ text: { tag: 'plain_text', content: '▶️ 直接开启会话' },
176
+ type: 'primary',
177
+ value: { action: 'skip_repo', root_id: rootMessageId ?? '' },
178
+ },
179
+ ],
180
+ },
181
+ {
182
+ tag: 'note',
183
+ elements: [
184
+ {
185
+ tag: 'lark_md',
186
+ content: '也可以回复 `/repo <编号>` 切换,例如:`/repo 1`',
187
+ },
188
+ ],
189
+ },
190
+ ],
191
+ };
192
+ return JSON.stringify(card);
193
+ }
194
+ //# sourceMappingURL=card-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../../src/im/lark/card-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { DaemonSession } from '../../core/types.js';
2
+ import type { ProjectInfo } from '../../services/project-scanner.js';
3
+ export interface CardHandlerDeps {
4
+ activeSessions: Map<string, DaemonSession>;
5
+ sessionReply: (rootId: string, content: string, msgType?: string) => Promise<string>;
6
+ lastRepoScan: Map<string, ProjectInfo[]>;
7
+ }
8
+ export declare function handleCardAction(data: any, deps: CardHandlerDeps): Promise<void>;
9
+ //# sourceMappingURL=card-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-handler.d.ts","sourceRoot":"","sources":["../../../src/im/lark/card-handler.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAIrE,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrF,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;CAC1C;AAUD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ItF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Lark card action handler — processes button clicks and dropdown selections
3
+ * from Feishu interactive cards.
4
+ * Extracted from daemon.ts for modularity.
5
+ */
6
+ import { config } from '../../config.js';
7
+ import { sendUserMessage } from './client.js';
8
+ import { buildSessionCard, getCliDisplayName } from './card-builder.js';
9
+ import { logger } from '../../utils/logger.js';
10
+ import * as sessionStore from '../../services/session-store.js';
11
+ import { forkWorker, killWorker } from '../../core/worker-pool.js';
12
+ import { getSessionWorkingDir, buildNewTopicPrompt } from '../../core/session-manager.js';
13
+ // ─── Helpers ──────────────────────────────────────────────────────────────
14
+ function tag(ds) {
15
+ return ds.session.sessionId.substring(0, 8);
16
+ }
17
+ // ─── Main handler ─────────────────────────────────────────────────────────
18
+ export async function handleCardAction(data, deps) {
19
+ const { activeSessions, sessionReply, lastRepoScan } = deps;
20
+ const action = data?.action;
21
+ const value = action?.value;
22
+ // Check ALLOWED_USERS for sensitive actions
23
+ const operatorOpenId = data?.operator?.open_id;
24
+ const allowedUsers = config.daemon.allowedUsers;
25
+ const isSensitive = value?.action && ['restart', 'close', 'skip_repo', 'get_write_link'].includes(value.action);
26
+ if (isSensitive && allowedUsers.length > 0) {
27
+ if (!operatorOpenId || !allowedUsers.includes(operatorOpenId)) {
28
+ logger.info(`Card action "${value.action}" blocked for non-allowed user: ${operatorOpenId}`);
29
+ return;
30
+ }
31
+ }
32
+ // Handle session card button actions (restart/close)
33
+ if (value?.action) {
34
+ const { action: actionType, root_id: rootId } = value;
35
+ const ds = activeSessions.get(rootId);
36
+ if (actionType === 'restart' && ds) {
37
+ if (ds.worker) {
38
+ // Worker alive — tell it to restart Claude
39
+ logger.info(`[${tag(ds)}] Restart via card button`);
40
+ ds.worker.send({ type: 'restart' });
41
+ const cliName = getCliDisplayName(config.daemon.cliId);
42
+ await sessionReply(rootId, `🔄 已重启 ${cliName}`);
43
+ }
44
+ else {
45
+ // Worker gone (e.g. after daemon restart) — re-fork
46
+ logger.info(`[${tag(ds)}] Re-forking worker via card button`);
47
+ forkWorker(ds, '', ds.hasHistory);
48
+ const cliName = getCliDisplayName(config.daemon.cliId);
49
+ await sessionReply(rootId, `🔄 已重新启动 ${cliName}`);
50
+ // DM card will be sent by the ready handler when worker starts
51
+ }
52
+ }
53
+ if (actionType === 'close' && ds) {
54
+ killWorker(ds);
55
+ sessionStore.closeSession(ds.session.sessionId);
56
+ activeSessions.delete(rootId);
57
+ await sessionReply(rootId, '✅ 会话已关闭');
58
+ logger.info(`[${tag(ds)}] Closed via card button`);
59
+ }
60
+ if (actionType === 'get_write_link' && ds && operatorOpenId) {
61
+ if (ds.workerPort && ds.workerToken) {
62
+ const writeUrl = `http://${config.web.externalHost}:${ds.workerPort}?token=${ds.workerToken}`;
63
+ const dmCardJson = buildSessionCard(ds.session.sessionId, ds.session.rootMessageId, writeUrl, ds.session.title || 'Claude Code', config.daemon.cliId);
64
+ sendUserMessage(operatorOpenId, dmCardJson, 'interactive').catch(err => logger.warn(`[${tag(ds)}] Failed to DM write link: ${err}`));
65
+ logger.info(`[${tag(ds)}] Sent write link via DM to ${operatorOpenId}`);
66
+ }
67
+ else {
68
+ await sessionReply(rootId, '⚠️ 终端尚未就绪,请稍后再试。');
69
+ }
70
+ }
71
+ if (actionType === 'skip_repo' && ds && ds.pendingRepo) {
72
+ // Skip repo selection — spawn Claude with default working dir
73
+ ds.pendingRepo = false;
74
+ const prompt = buildNewTopicPrompt(ds.pendingPrompt ?? '', ds.session.sessionId, ds.pendingAttachments);
75
+ ds.pendingPrompt = undefined;
76
+ ds.pendingAttachments = undefined;
77
+ forkWorker(ds, prompt);
78
+ const cwd = getSessionWorkingDir(ds);
79
+ await sessionReply(rootId, `▶️ 已直接开启会话(工作目录:${cwd})`);
80
+ logger.info(`[${tag(ds)}] Skip repo, spawning Claude in ${cwd}`);
81
+ }
82
+ return;
83
+ }
84
+ // Handle repo select card (option-based dropdown)
85
+ const option = action?.option;
86
+ if (!option) {
87
+ logger.warn('Card action received but no option or action value');
88
+ return;
89
+ }
90
+ const selectedPath = option;
91
+ const rootId = action?.value?.root_id;
92
+ logger.info(`Card action: repo switch to ${selectedPath} (root_id: ${rootId})`);
93
+ if (!rootId) {
94
+ logger.warn('Card action: no root_id in action value');
95
+ return;
96
+ }
97
+ const targetDs = activeSessions.get(rootId);
98
+ if (!targetDs) {
99
+ logger.warn(`Card action: no active session found for root ${rootId}`);
100
+ return;
101
+ }
102
+ // Resolve the project name from cached scan
103
+ const cached = lastRepoScan.get(targetDs.chatId);
104
+ const project = cached?.find(p => p.path === selectedPath);
105
+ const displayName = project ? `${project.name} (${project.branch})` : selectedPath;
106
+ targetDs.workingDir = selectedPath;
107
+ targetDs.session.workingDir = selectedPath;
108
+ sessionStore.updateSession(targetDs.session);
109
+ if (targetDs.pendingRepo) {
110
+ // First-time repo selection — now spawn Claude with the original prompt
111
+ targetDs.pendingRepo = false;
112
+ const prompt = buildNewTopicPrompt(targetDs.pendingPrompt ?? '', targetDs.session.sessionId, targetDs.pendingAttachments);
113
+ targetDs.pendingPrompt = undefined;
114
+ targetDs.pendingAttachments = undefined;
115
+ forkWorker(targetDs, prompt);
116
+ await sessionReply(rootId, `✅ 已选择 ${displayName}`);
117
+ logger.info(`[${tag(targetDs)}] Repo selected: ${selectedPath}, spawning Claude`);
118
+ }
119
+ else {
120
+ // Mid-session repo switch — close old session, start fresh
121
+ killWorker(targetDs);
122
+ sessionStore.closeSession(targetDs.session.sessionId);
123
+ const session = sessionStore.createSession(targetDs.chatId, rootId, displayName, targetDs.chatType);
124
+ targetDs.session = session;
125
+ targetDs.hasHistory = false;
126
+ forkWorker(targetDs, '', false);
127
+ await sessionReply(rootId, `🔄 已切换到 ${displayName}\n旧会话已关闭,新会话已创建。`);
128
+ logger.info(`[${tag(targetDs)}] Repo switched to ${selectedPath}, new session created`);
129
+ }
130
+ }
131
+ //# sourceMappingURL=card-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-handler.js","sourceRoot":"","sources":["../../../src/im/lark/card-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import * as Lark from '@larksuiteoapi/node-sdk';
2
+ export declare function getLarkClient(): Lark.Client;
3
+ export declare function sendMessage(chatId: string, content: string, msgType?: string): Promise<string>;
4
+ export declare function replyMessage(messageId: string, content: string, msgType?: string, replyInThread?: boolean): Promise<string>;
5
+ export declare function addReaction(messageId: string, emojiType: string): Promise<string>;
6
+ export declare function removeReaction(messageId: string, reactionId: string): Promise<void>;
7
+ export declare function sendUserMessage(openId: string, content: string, msgType?: string): Promise<string>;
8
+ export declare function getChatInfo(chatId: string): Promise<{
9
+ userCount: number;
10
+ }>;
11
+ export declare function updateMessage(messageId: string, cardJson: string): Promise<void>;
12
+ export declare function getMessageDetail(messageId: string): Promise<any>;
13
+ export declare function downloadMessageResource(messageId: string, fileKey: string, type: 'image' | 'file', savePath: string): Promise<void>;
14
+ /**
15
+ * Resolve email prefixes (e.g. "john.doe") to Lark open_ids via batch user lookup.
16
+ * Accepts mixed input: items starting with "ou_" are kept as-is; everything else
17
+ * is treated as an email and looked up. If no "@" is present, `LARK_EMAIL_DOMAIN`
18
+ * env var is used as the default domain (e.g. `john.doe` → `john.doe@example.com`).
19
+ * Returns an array of open_ids (unresolvable entries are dropped with a warning).
20
+ */
21
+ export declare function resolveAllowedUsers(raw: string[]): Promise<string[]>;
22
+ export declare function listThreadMessages(chatId: string, rootMessageId: string, pageSize?: number): Promise<any[]>;
23
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/im/lark/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAQhD,wBAAgB,aAAa,IAAI,IAAI,CAAC,MAAM,CAmB3C;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB5G;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAe,EAAE,aAAa,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBhJ;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYvF;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASzF;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBhH;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAUhF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStF;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAStE;AAED,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BzI;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4C1E;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAuCrH"}