botmux 1.4.3 → 1.5.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 (104) hide show
  1. package/.env.example +5 -0
  2. package/README.en.md +56 -2
  3. package/README.md +56 -2
  4. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  5. package/dist/adapters/backend/tmux-backend.js +31 -0
  6. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  7. package/dist/adapters/cli/aiden.d.ts.map +1 -1
  8. package/dist/adapters/cli/aiden.js +11 -1
  9. package/dist/adapters/cli/aiden.js.map +1 -1
  10. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  11. package/dist/adapters/cli/claude-code.js +12 -1
  12. package/dist/adapters/cli/claude-code.js.map +1 -1
  13. package/dist/bot-registry.d.ts +31 -0
  14. package/dist/bot-registry.d.ts.map +1 -0
  15. package/dist/bot-registry.js +125 -0
  16. package/dist/bot-registry.js.map +1 -0
  17. package/dist/cli.js +198 -52
  18. package/dist/cli.js.map +1 -1
  19. package/dist/core/command-handler.d.ts +2 -2
  20. package/dist/core/command-handler.d.ts.map +1 -1
  21. package/dist/core/command-handler.js +18 -13
  22. package/dist/core/command-handler.js.map +1 -1
  23. package/dist/core/session-manager.d.ts +4 -3
  24. package/dist/core/session-manager.d.ts.map +1 -1
  25. package/dist/core/session-manager.js +45 -12
  26. package/dist/core/session-manager.js.map +1 -1
  27. package/dist/core/types.d.ts +3 -0
  28. package/dist/core/types.d.ts.map +1 -1
  29. package/dist/core/types.js +4 -1
  30. package/dist/core/types.js.map +1 -1
  31. package/dist/core/worker-pool.d.ts +4 -3
  32. package/dist/core/worker-pool.d.ts.map +1 -1
  33. package/dist/core/worker-pool.js +43 -30
  34. package/dist/core/worker-pool.js.map +1 -1
  35. package/dist/daemon.d.ts.map +1 -1
  36. package/dist/daemon.js +140 -70
  37. package/dist/daemon.js.map +1 -1
  38. package/dist/im/lark/card-handler.d.ts +2 -2
  39. package/dist/im/lark/card-handler.d.ts.map +1 -1
  40. package/dist/im/lark/card-handler.js +45 -19
  41. package/dist/im/lark/card-handler.js.map +1 -1
  42. package/dist/im/lark/client.d.ts +11 -13
  43. package/dist/im/lark/client.d.ts.map +1 -1
  44. package/dist/im/lark/client.js +23 -45
  45. package/dist/im/lark/client.js.map +1 -1
  46. package/dist/im/lark/event-dispatcher.d.ts +12 -10
  47. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  48. package/dist/im/lark/event-dispatcher.js +54 -42
  49. package/dist/im/lark/event-dispatcher.js.map +1 -1
  50. package/dist/server.d.ts.map +1 -1
  51. package/dist/server.js +10 -1
  52. package/dist/server.js.map +1 -1
  53. package/dist/tools/get-thread-messages.d.ts.map +1 -1
  54. package/dist/tools/get-thread-messages.js +3 -1
  55. package/dist/tools/get-thread-messages.js.map +1 -1
  56. package/dist/tools/react-to-message.d.ts +3 -0
  57. package/dist/tools/react-to-message.d.ts.map +1 -1
  58. package/dist/tools/react-to-message.js +8 -3
  59. package/dist/tools/react-to-message.js.map +1 -1
  60. package/dist/tools/send-to-thread.d.ts.map +1 -1
  61. package/dist/tools/send-to-thread.js +2 -1
  62. package/dist/tools/send-to-thread.js.map +1 -1
  63. package/dist/types.d.ts +3 -0
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js.map +1 -1
  66. package/dist/worker.js +10 -2
  67. package/dist/worker.js.map +1 -1
  68. package/package.json +1 -1
  69. package/dist/scheduler.d.ts +0 -38
  70. package/dist/scheduler.d.ts.map +0 -1
  71. package/dist/scheduler.js +0 -221
  72. package/dist/scheduler.js.map +0 -1
  73. package/dist/services/lark-client.d.ts +0 -22
  74. package/dist/services/lark-client.d.ts.map +0 -1
  75. package/dist/services/lark-client.js +0 -238
  76. package/dist/services/lark-client.js.map +0 -1
  77. package/dist/services/lark-ws.d.ts +0 -5
  78. package/dist/services/lark-ws.d.ts.map +0 -1
  79. package/dist/services/lark-ws.js +0 -79
  80. package/dist/services/lark-ws.js.map +0 -1
  81. package/dist/services/message-router.d.ts +0 -8
  82. package/dist/services/message-router.d.ts.map +0 -1
  83. package/dist/services/message-router.js +0 -73
  84. package/dist/services/message-router.js.map +0 -1
  85. package/dist/tools/close-session.d.ts +0 -22
  86. package/dist/tools/close-session.d.ts.map +0 -1
  87. package/dist/tools/close-session.js +0 -38
  88. package/dist/tools/close-session.js.map +0 -1
  89. package/dist/tools/create-session.d.ts +0 -28
  90. package/dist/tools/create-session.d.ts.map +0 -1
  91. package/dist/tools/create-session.js +0 -40
  92. package/dist/tools/create-session.js.map +0 -1
  93. package/dist/tools/wait-for-reply.d.ts +0 -17
  94. package/dist/tools/wait-for-reply.d.ts.map +0 -1
  95. package/dist/tools/wait-for-reply.js +0 -65
  96. package/dist/tools/wait-for-reply.js.map +0 -1
  97. package/dist/utils/card-builder.d.ts +0 -16
  98. package/dist/utils/card-builder.d.ts.map +0 -1
  99. package/dist/utils/card-builder.js +0 -183
  100. package/dist/utils/card-builder.js.map +0 -1
  101. package/dist/utils/message-parser.d.ts +0 -45
  102. package/dist/utils/message-parser.d.ts.map +0 -1
  103. package/dist/utils/message-parser.js +0 -132
  104. package/dist/utils/message-parser.js.map +0 -1
@@ -1,73 +0,0 @@
1
- import { logger } from '../utils/logger.js';
2
- const threads = new Map();
3
- export function register(rootMessageId) {
4
- if (!threads.has(rootMessageId)) {
5
- threads.set(rootMessageId, { queue: [], waiters: [] });
6
- logger.info(`MessageRouter: registered thread ${rootMessageId}`);
7
- }
8
- }
9
- export function unregister(rootMessageId) {
10
- const state = threads.get(rootMessageId);
11
- if (state) {
12
- // Resolve all pending waiters with empty result
13
- for (const waiter of state.waiters) {
14
- clearTimeout(waiter.timer);
15
- waiter.resolve([]);
16
- }
17
- threads.delete(rootMessageId);
18
- logger.info(`MessageRouter: unregistered thread ${rootMessageId}`);
19
- }
20
- }
21
- export function dispatch(rootMessageId, message) {
22
- const state = threads.get(rootMessageId);
23
- if (!state) {
24
- logger.debug(`MessageRouter: no listener for thread ${rootMessageId}, ignoring`);
25
- return;
26
- }
27
- // If someone is waiting, resolve immediately
28
- if (state.waiters.length > 0) {
29
- const waiter = state.waiters.shift();
30
- clearTimeout(waiter.timer);
31
- waiter.resolve([message]);
32
- logger.debug(`MessageRouter: resolved waiter for thread ${rootMessageId}`);
33
- return;
34
- }
35
- // Otherwise queue the message
36
- state.queue.push(message);
37
- logger.debug(`MessageRouter: queued message for thread ${rootMessageId}, queue size: ${state.queue.length}`);
38
- }
39
- export function getPendingMessages(rootMessageId) {
40
- const state = threads.get(rootMessageId);
41
- if (!state)
42
- return [];
43
- const messages = [...state.queue];
44
- state.queue = [];
45
- return messages;
46
- }
47
- export function waitForNext(rootMessageId, timeoutMs) {
48
- const state = threads.get(rootMessageId);
49
- if (!state) {
50
- return Promise.resolve([]);
51
- }
52
- // Check queue first
53
- if (state.queue.length > 0) {
54
- const messages = [...state.queue];
55
- state.queue = [];
56
- return Promise.resolve(messages);
57
- }
58
- // Create a promise that resolves when a message arrives or timeout
59
- return new Promise((resolve) => {
60
- const timer = setTimeout(() => {
61
- // Remove this waiter on timeout
62
- const idx = state.waiters.findIndex(w => w.resolve === resolve);
63
- if (idx !== -1)
64
- state.waiters.splice(idx, 1);
65
- resolve([]);
66
- }, timeoutMs);
67
- state.waiters.push({ resolve, timer });
68
- });
69
- }
70
- export function isRegistered(rootMessageId) {
71
- return threads.has(rootMessageId);
72
- }
73
- //# sourceMappingURL=message-router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/services/message-router.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { z } from 'zod';
2
- export declare const schema: z.ZodObject<{
3
- session_id: z.ZodString;
4
- closing_message: z.ZodOptional<z.ZodString>;
5
- }, "strip", z.ZodTypeAny, {
6
- session_id: string;
7
- closing_message?: string | undefined;
8
- }, {
9
- session_id: string;
10
- closing_message?: string | undefined;
11
- }>;
12
- export declare const description = "Close a session and stop listening for messages in the associated thread.";
13
- export declare function execute(args: z.infer<typeof schema>): Promise<{
14
- error: string;
15
- success?: undefined;
16
- sessionId?: undefined;
17
- } | {
18
- success: boolean;
19
- sessionId: string;
20
- error?: undefined;
21
- }>;
22
- //# sourceMappingURL=close-session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"close-session.d.ts","sourceRoot":"","sources":["../../src/tools/close-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,MAAM;;;;;;;;;EAGjB,CAAC;AAEH,eAAO,MAAM,WAAW,8EAA8E,CAAC;AAEvG,wBAAsB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC;;;;;;;;GA6BzD"}
@@ -1,38 +0,0 @@
1
- import { z } from 'zod';
2
- import { replyMessage } from '../services/lark-client.js';
3
- import * as sessionStore from '../services/session-store.js';
4
- import * as messageRouter from '../services/message-router.js';
5
- import { logger } from '../utils/logger.js';
6
- export const schema = z.object({
7
- session_id: z.string().describe('Session ID for the active session'),
8
- closing_message: z.string().optional().describe('Optional closing message to send before closing'),
9
- });
10
- export const description = 'Close a session and stop listening for messages in the associated thread.';
11
- export async function execute(args) {
12
- const session = sessionStore.getSession(args.session_id);
13
- if (!session) {
14
- return { error: `Session ${args.session_id} not found` };
15
- }
16
- if (session.status === 'closed') {
17
- return { error: `Session ${args.session_id} is already closed` };
18
- }
19
- try {
20
- // Send closing message if provided
21
- const closingMsg = args.closing_message ?? '🔚 Session closed.';
22
- await replyMessage(session.rootMessageId, closingMsg);
23
- // Unregister from message router
24
- messageRouter.unregister(session.rootMessageId);
25
- // Mark session as closed
26
- sessionStore.closeSession(args.session_id);
27
- logger.info(`Session ${args.session_id} closed`);
28
- return {
29
- success: true,
30
- sessionId: args.session_id,
31
- };
32
- }
33
- catch (err) {
34
- logger.error(`Failed to close session: ${err.message}`);
35
- return { error: `Failed to close session: ${err.message}` };
36
- }
37
- }
38
- //# sourceMappingURL=close-session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"close-session.js","sourceRoot":"","sources":["../../src/tools/close-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACpE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;CACnG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,2EAA2E,CAAC;AAEvG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA4B;IACxD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,WAAW,IAAI,CAAC,UAAU,YAAY,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,WAAW,IAAI,CAAC,UAAU,oBAAoB,EAAE,CAAC;IACnE,CAAC;IAED,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,IAAI,oBAAoB,CAAC;QAChE,MAAM,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAEtD,iCAAiC;QACjC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAEhD,yBAAyB;QACzB,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,SAAS,CAAC,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,KAAK,EAAE,4BAA4B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC"}
@@ -1,28 +0,0 @@
1
- import { z } from 'zod';
2
- export declare const schema: z.ZodObject<{
3
- title: z.ZodString;
4
- chat_id: z.ZodOptional<z.ZodString>;
5
- }, "strip", z.ZodTypeAny, {
6
- title: string;
7
- chat_id?: string | undefined;
8
- }, {
9
- title: string;
10
- chat_id?: string | undefined;
11
- }>;
12
- export declare const description = "Create a new session by starting a thread in the Lark topic group. Returns session ID and thread info.";
13
- export declare function execute(args: z.infer<typeof schema>): Promise<{
14
- error: string;
15
- sessionId?: undefined;
16
- threadId?: undefined;
17
- chatId?: undefined;
18
- title?: undefined;
19
- status?: undefined;
20
- } | {
21
- sessionId: string;
22
- threadId: string;
23
- chatId: string;
24
- title: string;
25
- status: string;
26
- error?: undefined;
27
- }>;
28
- //# sourceMappingURL=create-session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../src/tools/create-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,MAAM;;;;;;;;;EAGjB,CAAC;AAEH,eAAO,MAAM,WAAW,2GAA2G,CAAC;AAEpI,wBAAsB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC;;;;;;;;;;;;;;GAgCzD"}
@@ -1,40 +0,0 @@
1
- import { z } from 'zod';
2
- import { config } from '../config.js';
3
- import { sendMessage, replyMessage } from '../services/lark-client.js';
4
- import * as sessionStore from '../services/session-store.js';
5
- import * as messageRouter from '../services/message-router.js';
6
- import { logger } from '../utils/logger.js';
7
- export const schema = z.object({
8
- title: z.string().describe('Title for the thread/session'),
9
- chat_id: z.string().optional().describe('Chat ID of the topic group. Defaults to LARK_DEFAULT_CHAT_ID'),
10
- });
11
- export const description = 'Create a new session by starting a thread in the Lark topic group. Returns session ID and thread info.';
12
- export async function execute(args) {
13
- const chatId = args.chat_id || config.lark.defaultChatId;
14
- if (!chatId) {
15
- return { error: 'No chat_id provided and LARK_DEFAULT_CHAT_ID not set' };
16
- }
17
- try {
18
- // Send root message to create the thread
19
- const rootMessageId = await sendMessage(chatId, `🤖 ${args.title}`);
20
- // Reply to root message to initialize the thread
21
- await replyMessage(rootMessageId, `Session started. Claude Code is connected.`);
22
- // Register in message router for real-time message reception
23
- messageRouter.register(rootMessageId);
24
- // Persist session
25
- const session = sessionStore.createSession(chatId, rootMessageId, args.title);
26
- logger.info(`Session created: ${session.sessionId}, thread root: ${rootMessageId}`);
27
- return {
28
- sessionId: session.sessionId,
29
- threadId: rootMessageId,
30
- chatId,
31
- title: args.title,
32
- status: 'active',
33
- };
34
- }
35
- catch (err) {
36
- logger.error(`Failed to create session: ${err.message}`);
37
- return { error: `Failed to create session: ${err.message}` };
38
- }
39
- }
40
- //# sourceMappingURL=create-session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../src/tools/create-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,YAAY,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IAC1D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;CACxG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,wGAAwG,CAAC;AAEpI,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA4B;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC;QACH,yCAAyC;QACzC,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAEpE,iDAAiD;QACjD,MAAM,YAAY,CAAC,aAAa,EAAE,4CAA4C,CAAC,CAAC;QAEhF,6DAA6D;QAC7D,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAEtC,kBAAkB;QAClB,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9E,MAAM,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,SAAS,kBAAkB,aAAa,EAAE,CAAC,CAAC;QAEpF,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,aAAa;YACvB,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,6BAA6B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -1,17 +0,0 @@
1
- import { z } from 'zod';
2
- import type { WaitResult } from '../types.js';
3
- export declare const schema: z.ZodObject<{
4
- session_id: z.ZodString;
5
- timeout_ms: z.ZodOptional<z.ZodNumber>;
6
- }, "strip", z.ZodTypeAny, {
7
- session_id: string;
8
- timeout_ms?: number | undefined;
9
- }, {
10
- session_id: string;
11
- timeout_ms?: number | undefined;
12
- }>;
13
- export declare const description = "Wait for user reply in the Lark thread. Event-driven (no polling). Returns immediately if there are pending messages, otherwise waits until a message arrives or timeout.";
14
- export declare function execute(args: z.infer<typeof schema>): Promise<WaitResult | {
15
- error: string;
16
- }>;
17
- //# sourceMappingURL=wait-for-reply.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait-for-reply.d.ts","sourceRoot":"","sources":["../../src/tools/wait-for-reply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,MAAM;;;;;;;;;EAGjB,CAAC;AAEH,eAAO,MAAM,WAAW,8KAA8K,CAAC;AAEvM,wBAAsB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBnG"}
@@ -1,65 +0,0 @@
1
- import { z } from 'zod';
2
- import { config } from '../config.js';
3
- import { isDaemonMode } from '../server.js';
4
- import * as sessionStore from '../services/session-store.js';
5
- import * as messageRouter from '../services/message-router.js';
6
- import * as messageQueue from '../services/message-queue.js';
7
- import { logger } from '../utils/logger.js';
8
- export const schema = z.object({
9
- session_id: z.string().describe('Session ID for the active session'),
10
- timeout_ms: z.number().optional().describe(`Timeout in milliseconds. Default: ${120_000}, max: ${300_000}`),
11
- });
12
- export const description = 'Wait for user reply in the Lark thread. Event-driven (no polling). Returns immediately if there are pending messages, otherwise waits until a message arrives or timeout.';
13
- export async function execute(args) {
14
- const session = sessionStore.getSession(args.session_id);
15
- if (!session) {
16
- return { error: `Session ${args.session_id} not found` };
17
- }
18
- if (session.status === 'closed') {
19
- return { error: `Session ${args.session_id} is closed` };
20
- }
21
- const timeoutMs = Math.min(args.timeout_ms ?? config.waitReply.defaultTimeoutMs, config.waitReply.maxTimeoutMs);
22
- try {
23
- if (isDaemonMode()) {
24
- return await waitFromQueue(session.rootMessageId, args.session_id, timeoutMs);
25
- }
26
- return await waitFromRouter(session.rootMessageId, args.session_id, timeoutMs);
27
- }
28
- catch (err) {
29
- logger.error(`Error waiting for reply: ${err.message}`);
30
- return { error: `Error waiting for reply: ${err.message}` };
31
- }
32
- }
33
- async function waitFromQueue(rootMessageId, sessionId, timeoutMs) {
34
- // Daemon mode: read from file-based message queue
35
- const pending = messageQueue.readUnread(rootMessageId);
36
- if (pending.length > 0) {
37
- logger.info(`[daemon] Returning ${pending.length} pending messages for session ${sessionId}`);
38
- return { timeout: false, messages: pending };
39
- }
40
- logger.info(`[daemon] Waiting for reply in session ${sessionId} (timeout: ${timeoutMs}ms)`);
41
- const messages = await messageQueue.waitForMessage(rootMessageId, timeoutMs);
42
- if (messages.length === 0) {
43
- logger.info(`[daemon] Timeout waiting for reply in session ${sessionId}`);
44
- return { timeout: true, messages: [] };
45
- }
46
- logger.info(`[daemon] Received ${messages.length} messages for session ${sessionId}`);
47
- return { timeout: false, messages };
48
- }
49
- async function waitFromRouter(rootMessageId, sessionId, timeoutMs) {
50
- // Standalone mode: use in-memory message router
51
- const pending = messageRouter.getPendingMessages(rootMessageId);
52
- if (pending.length > 0) {
53
- logger.info(`Returning ${pending.length} pending messages for session ${sessionId}`);
54
- return { timeout: false, messages: pending };
55
- }
56
- logger.info(`Waiting for reply in session ${sessionId} (timeout: ${timeoutMs}ms)`);
57
- const messages = await messageRouter.waitForNext(rootMessageId, timeoutMs);
58
- if (messages.length === 0) {
59
- logger.info(`Timeout waiting for reply in session ${sessionId}`);
60
- return { timeout: true, messages: [] };
61
- }
62
- logger.info(`Received ${messages.length} messages for session ${sessionId}`);
63
- return { timeout: false, messages };
64
- }
65
- //# sourceMappingURL=wait-for-reply.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wait-for-reply.js","sourceRoot":"","sources":["../../src/tools/wait-for-reply.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import type { ProjectInfo } from '../services/project-scanner.js';
2
- /**
3
- * Build a Feishu interactive card with terminal link + restart/close buttons.
4
- */
5
- export declare function buildSessionCard(sessionId: string, rootId: string, terminalUrl: string, title: string): string;
6
- /**
7
- * Build a Feishu streaming card that shows live terminal output + controls.
8
- * This card is PATCHed in-place as Claude works.
9
- */
10
- export declare function buildStreamingCard(sessionId: string, rootId: string, terminalUrl: string, title: string, screenContent: string, status: 'starting' | 'working' | 'idle'): string;
11
- /**
12
- * Build a Feishu interactive card with a dropdown selector for projects.
13
- * Returns a JSON string suitable for msg_type: 'interactive'.
14
- */
15
- export declare function buildRepoSelectCard(projects: ProjectInfo[], currentPath?: string, rootMessageId?: string): string;
16
- //# sourceMappingURL=card-builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../src/utils/card-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAOlE;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,CAoDR;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,GACtC,MAAM,CA2DR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAyDjH"}
@@ -1,183 +0,0 @@
1
- /** Escape Lark markdown special characters in user-controlled strings. */
2
- function escapeMd(s) {
3
- return s.replace(/[*_~`\[\]\\]/g, c => `\\${c}`);
4
- }
5
- /**
6
- * Build a Feishu interactive card with terminal link + restart/close buttons.
7
- */
8
- export function buildSessionCard(sessionId, rootId, terminalUrl, title) {
9
- const card = {
10
- config: { wide_screen_mode: true },
11
- header: {
12
- title: { tag: 'plain_text', content: `🖥️ ${escapeMd(title)}` },
13
- template: 'blue',
14
- },
15
- elements: [
16
- {
17
- tag: 'div',
18
- text: {
19
- tag: 'lark_md',
20
- content: `**终端地址:** [${terminalUrl}](${terminalUrl})\nSession: \`${sessionId.substring(0, 8)}\``,
21
- },
22
- },
23
- {
24
- tag: 'action',
25
- actions: [
26
- {
27
- tag: 'button',
28
- text: { tag: 'plain_text', content: '🖥️ 打开终端' },
29
- type: 'primary',
30
- multi_url: {
31
- url: terminalUrl,
32
- pc_url: terminalUrl,
33
- android_url: terminalUrl,
34
- ios_url: terminalUrl,
35
- },
36
- },
37
- {
38
- tag: 'button',
39
- text: { tag: 'plain_text', content: '🔑 获取操作链接' },
40
- type: 'default',
41
- value: { action: 'get_write_link', root_id: rootId, session_id: sessionId },
42
- },
43
- {
44
- tag: 'button',
45
- text: { tag: 'plain_text', content: '🔄 重启 Claude' },
46
- type: 'default',
47
- value: { action: 'restart', root_id: rootId, session_id: sessionId },
48
- },
49
- {
50
- tag: 'button',
51
- text: { tag: 'plain_text', content: '❌ 关闭会话' },
52
- type: 'danger',
53
- value: { action: 'close', root_id: rootId, session_id: sessionId },
54
- },
55
- ],
56
- },
57
- ],
58
- };
59
- return JSON.stringify(card);
60
- }
61
- /**
62
- * Build a Feishu streaming card that shows live terminal output + controls.
63
- * This card is PATCHed in-place as Claude works.
64
- */
65
- export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screenContent, status) {
66
- const templateMap = { starting: 'yellow', working: 'blue', idle: 'green' };
67
- const statusMap = { starting: '启动中…', working: '工作中', idle: '就绪' };
68
- const displayContent = screenContent || '(等待输出…)';
69
- const card = {
70
- config: { wide_screen_mode: true },
71
- header: {
72
- title: { tag: 'plain_text', content: `🖥️ ${escapeMd(title)} — ${statusMap[status]}` },
73
- template: templateMap[status],
74
- },
75
- elements: [
76
- {
77
- tag: 'markdown',
78
- content: displayContent,
79
- },
80
- { tag: 'hr' },
81
- {
82
- tag: 'markdown',
83
- content: `**终端:** [${terminalUrl}](${terminalUrl}) | Session: \`${sessionId.substring(0, 8)}\``,
84
- },
85
- {
86
- tag: 'action',
87
- actions: [
88
- {
89
- tag: 'button',
90
- text: { tag: 'plain_text', content: '🖥️ 打开终端' },
91
- type: 'primary',
92
- multi_url: {
93
- url: terminalUrl,
94
- pc_url: terminalUrl,
95
- android_url: terminalUrl,
96
- ios_url: terminalUrl,
97
- },
98
- },
99
- {
100
- tag: 'button',
101
- text: { tag: 'plain_text', content: '🔑 获取操作链接' },
102
- type: 'default',
103
- value: { action: 'get_write_link', root_id: rootId, session_id: sessionId },
104
- },
105
- {
106
- tag: 'button',
107
- text: { tag: 'plain_text', content: '🔄 重启 Claude' },
108
- type: 'default',
109
- value: { action: 'restart', root_id: rootId, session_id: sessionId },
110
- },
111
- {
112
- tag: 'button',
113
- text: { tag: 'plain_text', content: '❌ 关闭会话' },
114
- type: 'danger',
115
- value: { action: 'close', root_id: rootId, session_id: sessionId },
116
- },
117
- ],
118
- },
119
- ],
120
- };
121
- return JSON.stringify(card);
122
- }
123
- /**
124
- * Build a Feishu interactive card with a dropdown selector for projects.
125
- * Returns a JSON string suitable for msg_type: 'interactive'.
126
- */
127
- export function buildRepoSelectCard(projects, currentPath, rootMessageId) {
128
- const options = projects.map((p, i) => {
129
- const currentTag = p.path === currentPath ? ' ← 当前' : '';
130
- const typeTag = p.type === 'worktree' ? ' [worktree]' : '';
131
- return {
132
- text: { tag: 'plain_text', content: `${i + 1}. ${p.name} (${p.branch})${typeTag}${currentTag}` },
133
- value: p.path,
134
- };
135
- });
136
- const card = {
137
- config: { wide_screen_mode: true },
138
- header: {
139
- template: 'blue',
140
- title: { tag: 'plain_text', content: '📁 项目仓库管理' },
141
- },
142
- elements: [
143
- {
144
- tag: 'div',
145
- text: {
146
- tag: 'lark_md',
147
- content: `当前活跃项目:**${escapeMd(currentPath ?? 'N/A')}**`,
148
- },
149
- },
150
- {
151
- tag: 'hr',
152
- },
153
- {
154
- tag: 'action',
155
- actions: [
156
- {
157
- tag: 'select_static',
158
- placeholder: { tag: 'plain_text', content: '选择仓库并切换' },
159
- options,
160
- value: { key: 'repo_switch', root_id: rootMessageId ?? '' },
161
- },
162
- {
163
- tag: 'button',
164
- text: { tag: 'plain_text', content: '▶️ 直接开启会话' },
165
- type: 'primary',
166
- value: { action: 'skip_repo', root_id: rootMessageId ?? '' },
167
- },
168
- ],
169
- },
170
- {
171
- tag: 'note',
172
- elements: [
173
- {
174
- tag: 'lark_md',
175
- content: '也可以回复 `/repo <编号>` 切换,例如:`/repo 1`',
176
- },
177
- ],
178
- },
179
- ],
180
- };
181
- return JSON.stringify(card);
182
- }
183
- //# sourceMappingURL=card-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../src/utils/card-builder.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import type { LarkMessage } from '../types.js';
2
- interface RawEventData {
3
- sender: {
4
- sender_id: {
5
- open_id?: string;
6
- user_id?: string;
7
- union_id?: string;
8
- };
9
- sender_type: string;
10
- tenant_key?: string;
11
- };
12
- message: {
13
- message_id: string;
14
- root_id?: string;
15
- parent_id?: string;
16
- message_type: string;
17
- content: string;
18
- chat_id: string;
19
- chat_type: string;
20
- create_time: string;
21
- mentions?: Array<{
22
- key: string;
23
- name: string;
24
- id?: {
25
- open_id?: string;
26
- user_id?: string;
27
- union_id?: string;
28
- };
29
- tenant_key?: string;
30
- }>;
31
- };
32
- }
33
- export interface MessageResource {
34
- type: 'image' | 'file';
35
- key: string;
36
- name: string;
37
- }
38
- export declare function extractResources(msgType: string, rawContent: string): MessageResource[];
39
- export declare function parseEventMessage(data: RawEventData): {
40
- parsed: LarkMessage;
41
- resources: MessageResource[];
42
- };
43
- export declare function parseApiMessage(msg: any): LarkMessage;
44
- export {};
45
- //# sourceMappingURL=message-parser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-parser.d.ts","sourceRoot":"","sources":["../../src/utils/message-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,UAAU,YAAY;IACpB,MAAM,EAAE;QACN,SAAS,EAAE;YACT,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE,CAmCvF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,eAAe,EAAE,CAAA;CAAE,CAmB3G;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAUrD"}