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,221 @@
1
+ import { Cron } from 'croner';
2
+ import * as scheduleStore from '../services/schedule-store.js';
3
+ import { logger } from '../utils/logger.js';
4
+ // ─── Active cron instances ──────────────────────────────────────────────────
5
+ const cronJobs = new Map();
6
+ // Callback set by daemon to execute a scheduled task
7
+ let executeCallback = null;
8
+ export function setExecuteCallback(cb) {
9
+ executeCallback = cb;
10
+ }
11
+ // ─── Natural language → cron parser ─────────────────────────────────────────
12
+ const WEEKDAY_MAP = {
13
+ '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '日': 0, '天': 0,
14
+ '周一': 1, '周二': 2, '周三': 3, '周四': 4, '周五': 5, '周六': 6, '周日': 0,
15
+ };
16
+ /**
17
+ * Parse natural language schedule expression into cron + prompt.
18
+ *
19
+ * Examples:
20
+ * "每日17:50给我帮我看看AI新闻" → { cron: "50 17 * * *", prompt: "帮我看看AI新闻" }
21
+ * "每天9:00 检查服务状态" → { cron: "0 9 * * *", prompt: "检查服务状态" }
22
+ * "每周一10:30 生成周报" → { cron: "30 10 * * 1", prompt: "生成周报" }
23
+ * "工作日每天9:00 检查邮件" → { cron: "0 9 * * 1-5", prompt: "检查邮件" }
24
+ * "每小时 检查服务" → { cron: "0 * * * *", prompt: "检查服务" }
25
+ * "每30分钟 ping" → { cron: "*\/30 * * * *", prompt: "ping" }
26
+ * "每月1号9:00 生成月报" → { cron: "0 9 1 * *", prompt: "生成月报" }
27
+ */
28
+ export function parseNaturalSchedule(input) {
29
+ let rest = input.trim();
30
+ let cron = '';
31
+ let type = 'cron';
32
+ // Helper: parse time like "17:50", "17:50", "9点", "9点30", "17点30分"
33
+ function parseTime(s) {
34
+ // HH:MM or HH:MM
35
+ let tm = s.match(/^(\d{1,2})[:::](\d{2})\s*(.*)/s);
36
+ if (tm)
37
+ return { hour: parseInt(tm[1]), minute: parseInt(tm[2]), rest: tm[3] };
38
+ // X点Y分 or X点Y
39
+ tm = s.match(/^(\d{1,2})点(\d{1,2})分?\s*(.*)/s);
40
+ if (tm)
41
+ return { hour: parseInt(tm[1]), minute: parseInt(tm[2]), rest: tm[3] };
42
+ // X点 (whole hour)
43
+ tm = s.match(/^(\d{1,2})点\s*(.*)/s);
44
+ if (tm)
45
+ return { hour: parseInt(tm[1]), minute: 0, rest: tm[2] };
46
+ return null;
47
+ }
48
+ // Pattern: 工作日/每个工作日 HH:MM
49
+ let m = rest.match(/^(?:每个?工作日|工作日每[天日])\s*(.*)/);
50
+ if (m) {
51
+ const t = parseTime(m[1]);
52
+ if (t) {
53
+ cron = `${t.minute} ${t.hour} * * 1-5`;
54
+ rest = t.rest;
55
+ }
56
+ }
57
+ // Pattern: 每日/每天 HH:MM
58
+ if (!cron) {
59
+ m = rest.match(/^每[天日]\s*(.*)/);
60
+ if (m) {
61
+ const t = parseTime(m[1]);
62
+ if (t) {
63
+ cron = `${t.minute} ${t.hour} * * *`;
64
+ rest = t.rest;
65
+ }
66
+ }
67
+ }
68
+ // Pattern: 每周X HH:MM
69
+ if (!cron) {
70
+ m = rest.match(/^每周([一二三四五六日天])\s*(.*)/);
71
+ if (m) {
72
+ const day = WEEKDAY_MAP[m[1]] ?? 1;
73
+ const t = parseTime(m[2]);
74
+ if (t) {
75
+ cron = `${t.minute} ${t.hour} * * ${day}`;
76
+ rest = t.rest;
77
+ }
78
+ }
79
+ }
80
+ // Pattern: 每月X号 HH:MM
81
+ if (!cron) {
82
+ m = rest.match(/^每月(\d{1,2})[号日]\s*(.*)/);
83
+ if (m) {
84
+ const dayOfMonth = parseInt(m[1]);
85
+ const t = parseTime(m[2]);
86
+ if (t) {
87
+ cron = `${t.minute} ${t.hour} ${dayOfMonth} * *`;
88
+ rest = t.rest;
89
+ }
90
+ }
91
+ }
92
+ // Pattern: 每N小时
93
+ if (!cron) {
94
+ m = rest.match(/^每(\d+)小时\s*(.*)/);
95
+ if (m) {
96
+ const hours = parseInt(m[1]);
97
+ cron = hours === 1 ? '0 * * * *' : `0 */${hours} * * *`;
98
+ rest = m[2];
99
+ }
100
+ }
101
+ // Pattern: 每小时
102
+ if (!cron) {
103
+ m = rest.match(/^每小时\s*(.*)/);
104
+ if (m) {
105
+ cron = '0 * * * *';
106
+ rest = m[1];
107
+ }
108
+ }
109
+ // Pattern: 每N分钟
110
+ if (!cron) {
111
+ m = rest.match(/^每(\d+)分钟\s*(.*)/);
112
+ if (m) {
113
+ cron = `*/${parseInt(m[1])} * * * *`;
114
+ rest = m[2];
115
+ }
116
+ }
117
+ if (!cron)
118
+ return null;
119
+ // Clean prompt: remove leading connectors like "给我" "帮我" etc.
120
+ let prompt = rest.replace(/^[给帮]我\s*/, '').trim();
121
+ // Remove surrounding quotes
122
+ prompt = prompt.replace(/^["'"「](.+?)["'"」]$/, '$1').trim();
123
+ if (!prompt)
124
+ return null;
125
+ // Auto-generate name from prompt (first 20 chars)
126
+ const name = prompt.length > 20 ? prompt.substring(0, 20) + '...' : prompt;
127
+ return { cron, type, prompt, name };
128
+ }
129
+ // ─── Cron management ────────────────────────────────────────────────────────
130
+ function scheduleCronJob(task) {
131
+ // Stop existing job if any
132
+ stopCronJob(task.id);
133
+ if (!task.enabled)
134
+ return;
135
+ try {
136
+ const job = new Cron(task.schedule, { timezone: 'Asia/Shanghai' }, async () => {
137
+ logger.info(`[scheduler] Task "${task.name}" (${task.id}) triggered`);
138
+ scheduleStore.updateTask(task.id, { lastRunAt: new Date().toISOString() });
139
+ if (executeCallback) {
140
+ try {
141
+ await executeCallback(task);
142
+ }
143
+ catch (err) {
144
+ logger.error(`[scheduler] Failed to execute task "${task.name}": ${err.message}`);
145
+ }
146
+ }
147
+ });
148
+ cronJobs.set(task.id, job);
149
+ const next = job.nextRun();
150
+ logger.info(`[scheduler] Scheduled "${task.name}" (${task.id}): ${task.schedule}, next run: ${next?.toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) ?? 'N/A'}`);
151
+ }
152
+ catch (err) {
153
+ logger.error(`[scheduler] Invalid cron expression for task "${task.name}": ${task.schedule} — ${err.message}`);
154
+ }
155
+ }
156
+ function stopCronJob(taskId) {
157
+ const job = cronJobs.get(taskId);
158
+ if (job) {
159
+ job.stop();
160
+ cronJobs.delete(taskId);
161
+ }
162
+ }
163
+ // ─── Public API ─────────────────────────────────────────────────────────────
164
+ export function startScheduler() {
165
+ const tasks = scheduleStore.listTasks();
166
+ const enabled = tasks.filter(t => t.enabled);
167
+ logger.info(`[scheduler] Starting with ${enabled.length}/${tasks.length} enabled tasks`);
168
+ for (const task of enabled) {
169
+ scheduleCronJob(task);
170
+ }
171
+ }
172
+ export function stopScheduler() {
173
+ for (const [id] of cronJobs) {
174
+ stopCronJob(id);
175
+ }
176
+ logger.info('[scheduler] All cron jobs stopped');
177
+ }
178
+ export function addTask(params) {
179
+ const task = scheduleStore.createTask(params);
180
+ scheduleCronJob(task);
181
+ return task;
182
+ }
183
+ export function removeTask(id) {
184
+ stopCronJob(id);
185
+ return scheduleStore.removeTask(id);
186
+ }
187
+ export function enableTask(id) {
188
+ const task = scheduleStore.getTask(id);
189
+ if (!task)
190
+ return false;
191
+ scheduleStore.updateTask(id, { enabled: true });
192
+ task.enabled = true;
193
+ scheduleCronJob(task);
194
+ return true;
195
+ }
196
+ export function disableTask(id) {
197
+ const task = scheduleStore.getTask(id);
198
+ if (!task)
199
+ return false;
200
+ scheduleStore.updateTask(id, { enabled: false });
201
+ stopCronJob(id);
202
+ return true;
203
+ }
204
+ export function runTaskNow(id) {
205
+ const task = scheduleStore.getTask(id);
206
+ if (!task)
207
+ return false;
208
+ logger.info(`[scheduler] Manual run of task "${task.name}" (${task.id})`);
209
+ scheduleStore.updateTask(id, { lastRunAt: new Date().toISOString() });
210
+ if (executeCallback) {
211
+ executeCallback(task).catch(err => {
212
+ logger.error(`[scheduler] Manual run failed for "${task.name}": ${err.message}`);
213
+ });
214
+ }
215
+ return true;
216
+ }
217
+ export function getNextRun(id) {
218
+ const job = cronJobs.get(id);
219
+ return job?.nextRun() ?? null;
220
+ }
221
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/core/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,aAAa,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,+EAA+E;AAE/E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAC;AAEzC,qDAAqD;AACrD,IAAI,eAAe,GAAoD,IAAI,CAAC;AAE5E,MAAM,UAAU,kBAAkB,CAAC,EAA0C;IAC3E,eAAe,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,+EAA+E;AAE/E,MAAM,WAAW,GAA2B;IAC1C,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAC9D,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;CAC9D,CAAC;AASF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,IAAI,GAA0B,MAAM,CAAC;IAEzC,mEAAmE;IACnE,SAAS,SAAS,CAAC,CAAS;QAC1B,iBAAiB;QACjB,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACnD,IAAI,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,cAAc;QACd,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC/C,IAAI,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,kBAAkB;QAClB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACpC,IAAI,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC;YACN,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;YACvC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,EAAE,CAAC;gBACN,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC;gBACrC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,EAAE,CAAC;gBACN,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;gBAC1C,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,EAAE,CAAC;gBACN,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,UAAU,MAAM,CAAC;gBACjD,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC;YACxD,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,eAAe;IACf,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC;YACN,IAAI,GAAG,WAAW,CAAC;YACnB,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC;YACN,IAAI,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YACrC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,8DAA8D;IAC9D,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,4BAA4B;IAC5B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5D,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,kDAAkD;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,+EAA+E;AAE/E,SAAS,eAAe,CAAC,IAAmB;IAC1C,2BAA2B;IAC3B,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAErB,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO;IAE1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;YACtE,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAE3E,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,MAAM,CAAC,KAAK,CAAC,uCAAuC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,QAAQ,eAAe,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACzK,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,iDAAiD,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,QAAQ,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACjH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC,6BAA6B,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAEzF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,eAAe,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC5B,WAAW,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAOvB;IACC,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9C,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,WAAW,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACpB,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,CAAC,IAAI,CAAC,mCAAmC,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1E,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAEtE,IAAI,eAAe,EAAE,CAAC;QACpB,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAChC,MAAM,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC;AAChC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { LarkAttachment, ScheduledTask } from '../types.js';
2
+ import type { MessageResource } from '../im/lark/message-parser.js';
3
+ import type { DaemonSession } from './types.js';
4
+ export declare function expandHome(p: string): string;
5
+ export declare function getSessionWorkingDir(ds?: DaemonSession): string;
6
+ export declare function getProjectScanDir(ds?: DaemonSession): string;
7
+ export declare function getAttachmentsDir(messageId: string): string;
8
+ export declare function downloadResources(messageId: string, resources: MessageResource[]): Promise<LarkAttachment[]>;
9
+ export declare function formatAttachmentsHint(attachments?: LarkAttachment[]): string;
10
+ export declare function buildNewTopicPrompt(userMessage: string, sessionId: string, attachments?: LarkAttachment[]): string;
11
+ export declare function restoreActiveSessions(activeSessions: Map<string, DaemonSession>): void;
12
+ export declare function executeScheduledTask(task: ScheduledTask, activeSessions: Map<string, DaemonSession>, refreshClaudeVersion: () => boolean): Promise<void>;
13
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,oBAAoB,CAAC,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAE/D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,aAAa,GAAG,MAAM,CAO5D;AAID,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAiBlH;AAID,wBAAgB,qBAAqB,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,CAI5E;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,CAelH;AAID,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,IAAI,CAmCtF;AAID,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,aAAa,EACnB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1C,oBAAoB,EAAE,MAAM,OAAO,GAClC,OAAO,CAAC,IAAI,CAAC,CAiCf"}
@@ -0,0 +1,125 @@
1
+ import { join, resolve } from 'node:path';
2
+ import { homedir } from 'node:os';
3
+ import { config } from '../config.js';
4
+ import * as sessionStore from '../services/session-store.js';
5
+ import * as messageQueue from '../services/message-queue.js';
6
+ import { downloadMessageResource } from '../im/lark/client.js';
7
+ import { logger } from '../utils/logger.js';
8
+ import { forkWorker, killStalePids, getCurrentClaudeVersion } from './worker-pool.js';
9
+ // ─── Path helpers ────────────────────────────────────────────────────────────
10
+ export function expandHome(p) {
11
+ return p.startsWith('~') ? join(homedir(), p.slice(1)) : p;
12
+ }
13
+ export function getSessionWorkingDir(ds) {
14
+ return expandHome(ds?.workingDir ?? config.daemon.workingDir);
15
+ }
16
+ export function getProjectScanDir(ds) {
17
+ // Priority: PROJECT_SCAN_DIR env > parent of current working dir
18
+ if (config.daemon.projectScanDir) {
19
+ return expandHome(config.daemon.projectScanDir);
20
+ }
21
+ const cwd = getSessionWorkingDir(ds);
22
+ return resolve(cwd, '..');
23
+ }
24
+ // ─── Attachment download ─────────────────────────────────────────────────────
25
+ export function getAttachmentsDir(messageId) {
26
+ return join(resolve(config.session.dataDir), 'attachments', messageId);
27
+ }
28
+ export async function downloadResources(messageId, resources) {
29
+ if (resources.length === 0)
30
+ return [];
31
+ const attachments = [];
32
+ const dir = getAttachmentsDir(messageId);
33
+ for (const res of resources) {
34
+ const savePath = join(dir, res.name);
35
+ try {
36
+ await downloadMessageResource(messageId, res.key, res.type, savePath);
37
+ attachments.push({ type: res.type, path: savePath, name: res.name });
38
+ }
39
+ catch (err) {
40
+ logger.warn(`Failed to download ${res.type} ${res.key}: ${err.message}`);
41
+ }
42
+ }
43
+ return attachments;
44
+ }
45
+ // ─── Prompts ─────────────────────────────────────────────────────────────────
46
+ export function formatAttachmentsHint(attachments) {
47
+ if (!attachments || attachments.length === 0)
48
+ return '';
49
+ const lines = attachments.map(a => `- ${a.path}`);
50
+ return `\n\n附件(使用 Read 工具查看):\n${lines.join('\n')}`;
51
+ }
52
+ export function buildNewTopicPrompt(userMessage, sessionId, attachments) {
53
+ return `你已连接到飞书话题,用户发送了:
54
+ ---
55
+ ${userMessage}${formatAttachmentsHint(attachments)}
56
+ ---
57
+
58
+ Session ID: ${sessionId}
59
+
60
+ 请处理用户的请求,通过 send_to_thread 回复用户(session_id: "${sessionId}")。
61
+
62
+ 注意:
63
+ - 回复使用 send_to_thread(重要结论、方案确认、最终结果)
64
+ - 对于代码修改任务,先通过 send_to_thread 发送执行方案给用户确认后再执行
65
+ - 消息可能包含 attachments,每个有 path 字段,用 Read 工具查看
66
+ - 不要使用 EnterPlanMode / ExitPlanMode 工具`;
67
+ }
68
+ // ─── Session restore ─────────────────────────────────────────────────────────
69
+ export function restoreActiveSessions(activeSessions) {
70
+ const sessions = sessionStore.listSessions();
71
+ const active = sessions.filter(s => s.status === 'active');
72
+ if (active.length === 0) {
73
+ logger.info('No active sessions to restore');
74
+ return;
75
+ }
76
+ // Kill any stale Claude processes from previous daemon run
77
+ killStalePids(active);
78
+ logger.info(`Registering ${active.length} active session(s) (no Claude spawn until new messages arrive)...`);
79
+ for (const session of active) {
80
+ messageQueue.ensureQueue(session.rootMessageId);
81
+ activeSessions.set(session.rootMessageId, {
82
+ session,
83
+ worker: null,
84
+ workerPort: null,
85
+ workerToken: null,
86
+ chatId: session.chatId,
87
+ chatType: session.chatType ?? 'group',
88
+ spawnedAt: Date.now(),
89
+ claudeVersion: getCurrentClaudeVersion(),
90
+ lastMessageAt: Date.now(),
91
+ hasHistory: true, // restored sessions have prior Claude history
92
+ workingDir: session.workingDir,
93
+ });
94
+ logger.debug(`Registered session ${session.sessionId} (thread: ${session.rootMessageId})`);
95
+ }
96
+ logger.info(`Restored ${active.length} session(s), waiting for messages to resume`);
97
+ }
98
+ // ─── Scheduled task execution ────────────────────────────────────────────────
99
+ export async function executeScheduledTask(task, activeSessions, refreshClaudeVersion) {
100
+ const { sendMessage } = await import('../im/lark/client.js');
101
+ // Send a top-level message to create a thread
102
+ const rootMessageId = await sendMessage(task.chatId, `🕐 定时任务「${task.name}」开始执行`);
103
+ // Create a session for this thread
104
+ refreshClaudeVersion();
105
+ const session = sessionStore.createSession(task.chatId, rootMessageId, `[定时] ${task.name}`);
106
+ messageQueue.ensureQueue(rootMessageId);
107
+ const prompt = buildNewTopicPrompt(task.prompt, session.sessionId);
108
+ const ds = {
109
+ session,
110
+ worker: null,
111
+ workerPort: null,
112
+ workerToken: null,
113
+ chatId: task.chatId,
114
+ chatType: 'group',
115
+ spawnedAt: Date.now(),
116
+ claudeVersion: getCurrentClaudeVersion(),
117
+ lastMessageAt: Date.now(),
118
+ hasHistory: false,
119
+ workingDir: task.workingDir,
120
+ };
121
+ activeSessions.set(rootMessageId, ds);
122
+ forkWorker(ds, prompt);
123
+ logger.info(`[scheduler] Task "${task.name}" spawned (session: ${session.sessionId})`);
124
+ }
125
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ import type { Session, DaemonToWorker, LarkAttachment } from '../types.js';
3
+ /** Core session state — IM-agnostic.
4
+ * IM-specific rendering state (ImRenderState) is stored separately
5
+ * in the ImAdapter implementation (e.g. Map<string, ImRenderState>
6
+ * inside LarkImAdapter), NOT on this type. */
7
+ export interface DaemonSession {
8
+ session: Session;
9
+ worker: ChildProcess | null;
10
+ workerPort: number | null;
11
+ workerToken: string | null;
12
+ chatId: string;
13
+ chatType: 'group' | 'p2p';
14
+ spawnedAt: number;
15
+ claudeVersion: string;
16
+ lastMessageAt: number;
17
+ hasHistory: boolean;
18
+ workingDir?: string;
19
+ initConfig?: DaemonToWorker;
20
+ pendingRepo?: boolean;
21
+ pendingPrompt?: string;
22
+ pendingAttachments?: LarkAttachment[];
23
+ ownerOpenId?: string;
24
+ streamCardId?: string;
25
+ streamCardPending?: boolean;
26
+ lastScreenContent?: string;
27
+ currentTurnTitle?: string;
28
+ }
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE3E;;;+CAG+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,cAAc,EAAE,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { Session } from '../types.js';
2
+ import type { DaemonSession } from './types.js';
3
+ export interface WorkerPoolCallbacks {
4
+ sessionReply: (rootId: string, content: string, msgType?: string) => Promise<string>;
5
+ getSessionWorkingDir: (ds?: DaemonSession) => string;
6
+ getActiveCount: () => number;
7
+ }
8
+ /**
9
+ * Initialise worker-pool callbacks. Must be called once before forkWorker().
10
+ */
11
+ export declare function initWorkerPool(cb: WorkerPoolCallbacks): void;
12
+ export declare const restartCounts: Map<string, {
13
+ count: number;
14
+ lastAt: number;
15
+ }>;
16
+ /**
17
+ * Ensure the botmux MCP server is registered globally.
18
+ * Delegates to the CLI adapter which knows the correct config file location.
19
+ */
20
+ export declare function ensureMcpConfig(): void;
21
+ export declare function killWorker(ds: DaemonSession): void;
22
+ export declare function forkWorker(ds: DaemonSession, prompt: string, resume?: boolean): void;
23
+ export declare function killStalePids(activeSessions_: Session[]): void;
24
+ export declare function setCurrentClaudeVersion(v: string): void;
25
+ export declare function getCurrentClaudeVersion(): string;
26
+ //# sourceMappingURL=worker-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../src/core/worker-pool.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAkC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhD,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrF,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,KAAK,MAAM,CAAC;IACrD,cAAc,EAAE,MAAM,MAAM,CAAC;CAC9B;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI,CAE5D;AAeD,eAAO,MAAM,aAAa;WAA4B,MAAM;YAAU,MAAM;EAAK,CAAC;AAOlF;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAiBtC;AAID,wBAAgB,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAWlD;AAID,wBAAgB,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,IAAI,CAqLlF;AAID,wBAAgB,aAAa,CAAC,eAAe,EAAE,OAAO,EAAE,GAAG,IAAI,CAiB9D;AAOD,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}