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.
- package/.env.example +24 -0
- package/LICENSE +21 -0
- package/README.en.md +267 -0
- package/README.md +267 -0
- package/dist/adapters/backend/pty-backend.d.ts +13 -0
- package/dist/adapters/backend/pty-backend.d.ts.map +1 -0
- package/dist/adapters/backend/pty-backend.js +39 -0
- package/dist/adapters/backend/pty-backend.js.map +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts +20 -0
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -0
- package/dist/adapters/backend/tmux-backend.js +30 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -0
- package/dist/adapters/backend/types.d.ts +19 -0
- package/dist/adapters/backend/types.d.ts.map +1 -0
- package/dist/adapters/backend/types.js +2 -0
- package/dist/adapters/backend/types.js.map +1 -0
- package/dist/adapters/cli/aiden.d.ts +4 -0
- package/dist/adapters/cli/aiden.d.ts.map +1 -0
- package/dist/adapters/cli/aiden.js +63 -0
- package/dist/adapters/cli/aiden.js.map +1 -0
- package/dist/adapters/cli/claude-code.d.ts +4 -0
- package/dist/adapters/cli/claude-code.d.ts.map +1 -0
- package/dist/adapters/cli/claude-code.js +59 -0
- package/dist/adapters/cli/claude-code.js.map +1 -0
- package/dist/adapters/cli/coco.d.ts +4 -0
- package/dist/adapters/cli/coco.d.ts.map +1 -0
- package/dist/adapters/cli/coco.js +46 -0
- package/dist/adapters/cli/coco.js.map +1 -0
- package/dist/adapters/cli/codex.d.ts +4 -0
- package/dist/adapters/cli/codex.d.ts.map +1 -0
- package/dist/adapters/cli/codex.js +47 -0
- package/dist/adapters/cli/codex.js.map +1 -0
- package/dist/adapters/cli/registry.d.ts +13 -0
- package/dist/adapters/cli/registry.d.ts.map +1 -0
- package/dist/adapters/cli/registry.js +42 -0
- package/dist/adapters/cli/registry.js.map +1 -0
- package/dist/adapters/cli/types.d.ts +39 -0
- package/dist/adapters/cli/types.d.ts.map +1 -0
- package/dist/adapters/cli/types.js +2 -0
- package/dist/adapters/cli/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +245 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -0
- package/dist/core/command-handler.d.ts +11 -0
- package/dist/core/command-handler.d.ts.map +1 -0
- package/dist/core/command-handler.js +322 -0
- package/dist/core/command-handler.js.map +1 -0
- package/dist/core/cost-calculator.d.ts +12 -0
- package/dist/core/cost-calculator.d.ts.map +1 -0
- package/dist/core/cost-calculator.js +61 -0
- package/dist/core/cost-calculator.js.map +1 -0
- package/dist/core/scheduler.d.ts +38 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +221 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/session-manager.d.ts +13 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +125 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/types.d.ts +29 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/worker-pool.d.ts +26 -0
- package/dist/core/worker-pool.d.ts.map +1 -0
- package/dist/core/worker-pool.js +261 -0
- package/dist/core/worker-pool.js.map +1 -0
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +344 -0
- package/dist/daemon.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +18 -0
- package/dist/im/lark/card-builder.d.ts.map +1 -0
- package/dist/im/lark/card-builder.js +194 -0
- package/dist/im/lark/card-builder.js.map +1 -0
- package/dist/im/lark/card-handler.d.ts +9 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -0
- package/dist/im/lark/card-handler.js +131 -0
- package/dist/im/lark/card-handler.js.map +1 -0
- package/dist/im/lark/client.d.ts +23 -0
- package/dist/im/lark/client.d.ts.map +1 -0
- package/dist/im/lark/client.js +259 -0
- package/dist/im/lark/client.js.map +1 -0
- package/dist/im/lark/event-dispatcher.d.ts +34 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -0
- package/dist/im/lark/event-dispatcher.js +195 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -0
- package/dist/im/lark/message-parser.d.ts +45 -0
- package/dist/im/lark/message-parser.d.ts.map +1 -0
- package/dist/im/lark/message-parser.js +132 -0
- package/dist/im/lark/message-parser.js.map +1 -0
- package/dist/im/types.d.ts +78 -0
- package/dist/im/types.d.ts.map +1 -0
- package/dist/im/types.js +2 -0
- package/dist/im/types.js.map +1 -0
- package/dist/index-daemon.d.ts +3 -0
- package/dist/index-daemon.d.ts.map +1 -0
- package/dist/index-daemon.js +21 -0
- package/dist/index-daemon.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/scheduler.d.ts +38 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +221 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +23 -0
- package/dist/server.js.map +1 -0
- package/dist/services/lark-client.d.ts +22 -0
- package/dist/services/lark-client.d.ts.map +1 -0
- package/dist/services/lark-client.js +238 -0
- package/dist/services/lark-client.js.map +1 -0
- package/dist/services/lark-ws.d.ts +5 -0
- package/dist/services/lark-ws.d.ts.map +1 -0
- package/dist/services/lark-ws.js +79 -0
- package/dist/services/lark-ws.js.map +1 -0
- package/dist/services/message-queue.d.ts +9 -0
- package/dist/services/message-queue.d.ts.map +1 -0
- package/dist/services/message-queue.js +77 -0
- package/dist/services/message-queue.js.map +1 -0
- package/dist/services/message-router.d.ts +8 -0
- package/dist/services/message-router.d.ts.map +1 -0
- package/dist/services/message-router.js +73 -0
- package/dist/services/message-router.js.map +1 -0
- package/dist/services/project-scanner.d.ts +12 -0
- package/dist/services/project-scanner.d.ts.map +1 -0
- package/dist/services/project-scanner.js +109 -0
- package/dist/services/project-scanner.js.map +1 -0
- package/dist/services/schedule-store.d.ts +14 -0
- package/dist/services/schedule-store.d.ts.map +1 -0
- package/dist/services/schedule-store.js +89 -0
- package/dist/services/schedule-store.js.map +1 -0
- package/dist/services/session-store.d.ts +8 -0
- package/dist/services/session-store.d.ts.map +1 -0
- package/dist/services/session-store.js +93 -0
- package/dist/services/session-store.js.map +1 -0
- package/dist/tools/close-session.d.ts +22 -0
- package/dist/tools/close-session.d.ts.map +1 -0
- package/dist/tools/close-session.js +38 -0
- package/dist/tools/close-session.js.map +1 -0
- package/dist/tools/create-session.d.ts +28 -0
- package/dist/tools/create-session.d.ts.map +1 -0
- package/dist/tools/create-session.js +40 -0
- package/dist/tools/create-session.js.map +1 -0
- package/dist/tools/get-thread-messages.d.ts +26 -0
- package/dist/tools/get-thread-messages.d.ts.map +1 -0
- package/dist/tools/get-thread-messages.js +33 -0
- package/dist/tools/get-thread-messages.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/react-to-message.d.ts +41 -0
- package/dist/tools/react-to-message.d.ts.map +1 -0
- package/dist/tools/react-to-message.js +30 -0
- package/dist/tools/react-to-message.js.map +1 -0
- package/dist/tools/send-to-thread.d.ts +24 -0
- package/dist/tools/send-to-thread.d.ts.map +1 -0
- package/dist/tools/send-to-thread.js +83 -0
- package/dist/tools/send-to-thread.js.map +1 -0
- package/dist/tools/wait-for-reply.d.ts +17 -0
- package/dist/tools/wait-for-reply.d.ts.map +1 -0
- package/dist/tools/wait-for-reply.js +65 -0
- package/dist/tools/wait-for-reply.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/card-builder.d.ts +16 -0
- package/dist/utils/card-builder.d.ts.map +1 -0
- package/dist/utils/card-builder.js +183 -0
- package/dist/utils/card-builder.js.map +1 -0
- package/dist/utils/idle-detector.d.ts +21 -0
- package/dist/utils/idle-detector.d.ts.map +1 -0
- package/dist/utils/idle-detector.js +95 -0
- package/dist/utils/idle-detector.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/message-parser.d.ts +45 -0
- package/dist/utils/message-parser.d.ts.map +1 -0
- package/dist/utils/message-parser.js +132 -0
- package/dist/utils/message-parser.js.map +1 -0
- package/dist/utils/terminal-renderer.d.ts +39 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -0
- package/dist/utils/terminal-renderer.js +186 -0
- package/dist/utils/terminal-renderer.js.map +1 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +411 -0
- package/dist/worker.js.map +1 -0
- package/ecosystem.config.cjs +15 -0
- package/package.json +60 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { addReaction, removeReaction } from '../im/lark/client.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
export const schema = z.object({
|
|
5
|
+
message_id: z.string().describe('Message ID to react to'),
|
|
6
|
+
emoji_type: z.string().default('OnIt').describe('Emoji type, e.g. OnIt, THUMBSUP, DONE,�ять'),
|
|
7
|
+
action: z.enum(['add', 'remove']).default('add').describe('Add or remove a reaction'),
|
|
8
|
+
reaction_id: z.string().optional().describe('Reaction ID (required for remove)'),
|
|
9
|
+
});
|
|
10
|
+
export const description = 'Add or remove an emoji reaction on a message. Use "add" with OnIt when starting to process, then "remove" after responding.';
|
|
11
|
+
export async function execute(args) {
|
|
12
|
+
try {
|
|
13
|
+
if (args.action === 'add') {
|
|
14
|
+
const reactionId = await addReaction(args.message_id, args.emoji_type);
|
|
15
|
+
return { success: true, reactionId, messageId: args.message_id, emoji: args.emoji_type };
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
if (!args.reaction_id) {
|
|
19
|
+
return { error: 'reaction_id is required for remove action' };
|
|
20
|
+
}
|
|
21
|
+
await removeReaction(args.message_id, args.reaction_id);
|
|
22
|
+
return { success: true, messageId: args.message_id, removed: args.reaction_id };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
logger.error(`Failed to ${args.action} reaction: ${err.message}`);
|
|
27
|
+
return { error: `Failed to ${args.action} reaction: ${err.message}` };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=react-to-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-to-message.js","sourceRoot":"","sources":["../../src/tools/react-to-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnE,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,wBAAwB,CAAC;IACzD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC7F,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACrF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CACjF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,6HAA6H,CAAC;AAEzJ,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA4B;IACxD,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACvE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtB,OAAO,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;YAChE,CAAC;YACD,MAAM,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAClF,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO,EAAE,KAAK,EAAE,aAAa,IAAI,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACxE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const schema: z.ZodObject<{
|
|
3
|
+
session_id: z.ZodString;
|
|
4
|
+
content: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
content: string;
|
|
7
|
+
session_id: string;
|
|
8
|
+
}, {
|
|
9
|
+
content: string;
|
|
10
|
+
session_id: string;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const description = "Send a plain text message to the Lark thread associated with a session. Just send plain text \u2014 formatting is handled automatically.";
|
|
13
|
+
export declare function execute(args: z.infer<typeof schema>): Promise<{
|
|
14
|
+
error: string;
|
|
15
|
+
success?: undefined;
|
|
16
|
+
messageId?: undefined;
|
|
17
|
+
sessionId?: undefined;
|
|
18
|
+
} | {
|
|
19
|
+
success: boolean;
|
|
20
|
+
messageId: string;
|
|
21
|
+
sessionId: string;
|
|
22
|
+
error?: undefined;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=send-to-thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-to-thread.d.ts","sourceRoot":"","sources":["../../src/tools/send-to-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,MAAM;;;;;;;;;EAGjB,CAAC;AAEH,eAAO,MAAM,WAAW,6IAAwI,CAAC;AA+BjK,wBAAsB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC;;;;;;;;;;GA8CzD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { replyMessage } from '../im/lark/client.js';
|
|
3
|
+
import { config } from '../config.js';
|
|
4
|
+
import * as sessionStore from '../services/session-store.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
|
+
content: z.string().describe('Message content to send (plain text)'),
|
|
9
|
+
});
|
|
10
|
+
export const description = 'Send a plain text message to the Lark thread associated with a session. Just send plain text — formatting is handled automatically.';
|
|
11
|
+
/** Build a post content block from plain text, splitting by newlines into paragraphs */
|
|
12
|
+
function textToPostContent(text) {
|
|
13
|
+
return text.split('\n').map(line => [{ tag: 'text', text: line }]);
|
|
14
|
+
}
|
|
15
|
+
/** Try to extract plain text from post JSON that Claude sometimes generates */
|
|
16
|
+
function extractTextFromPostJson(raw) {
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
const inner = parsed.zh_cn ?? parsed.en_us ?? parsed;
|
|
20
|
+
if (!Array.isArray(inner.content))
|
|
21
|
+
return null;
|
|
22
|
+
// Flatten post blocks back to plain text
|
|
23
|
+
const lines = [];
|
|
24
|
+
for (const paragraph of inner.content) {
|
|
25
|
+
if (!Array.isArray(paragraph))
|
|
26
|
+
continue;
|
|
27
|
+
const parts = [];
|
|
28
|
+
for (const node of paragraph) {
|
|
29
|
+
if (node.tag === 'text' && typeof node.text === 'string') {
|
|
30
|
+
parts.push(node.text);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
lines.push(parts.join(''));
|
|
34
|
+
}
|
|
35
|
+
return lines.join('\n').trim();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function execute(args) {
|
|
42
|
+
const session = sessionStore.getSession(args.session_id);
|
|
43
|
+
if (!session) {
|
|
44
|
+
return { error: `Session ${args.session_id} not found` };
|
|
45
|
+
}
|
|
46
|
+
if (session.status === 'closed') {
|
|
47
|
+
return { error: `Session ${args.session_id} is closed` };
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
// Prefer the session owner's open_id (set by worker from init message),
|
|
51
|
+
// fall back to first configured allowed user if it looks like an open_id.
|
|
52
|
+
const mentionUser = process.env.__OWNER_OPEN_ID
|
|
53
|
+
|| (config.daemon.allowedUsers[0]?.startsWith('ou_') ? config.daemon.allowedUsers[0] : undefined);
|
|
54
|
+
// If Claude sent post JSON as content, extract the plain text from it
|
|
55
|
+
let text = args.content;
|
|
56
|
+
const extracted = extractTextFromPostJson(text);
|
|
57
|
+
if (extracted) {
|
|
58
|
+
text = extracted;
|
|
59
|
+
}
|
|
60
|
+
const postContent = textToPostContent(text);
|
|
61
|
+
// Append @mention if we have a user to mention
|
|
62
|
+
if (mentionUser) {
|
|
63
|
+
if (postContent.length === 0)
|
|
64
|
+
postContent.push([]);
|
|
65
|
+
postContent[postContent.length - 1].push({ tag: 'at', user_id: mentionUser });
|
|
66
|
+
}
|
|
67
|
+
const content = JSON.stringify({
|
|
68
|
+
zh_cn: { title: '', content: postContent },
|
|
69
|
+
});
|
|
70
|
+
const replyInThread = session.chatType === 'p2p';
|
|
71
|
+
const messageId = await replyMessage(session.rootMessageId, content, 'post', replyInThread);
|
|
72
|
+
return {
|
|
73
|
+
success: true,
|
|
74
|
+
messageId,
|
|
75
|
+
sessionId: args.session_id,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
logger.error(`Failed to send to thread: ${err.message}`);
|
|
80
|
+
return { error: `Failed to send message: ${err.message}` };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=send-to-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-to-thread.js","sourceRoot":"","sources":["../../src/tools/send-to-thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-for-reply.js","sourceRoot":"","sources":["../../src/tools/wait-for-reply.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export interface Session {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
chatId: string;
|
|
4
|
+
chatType?: 'group' | 'p2p';
|
|
5
|
+
rootMessageId: string;
|
|
6
|
+
title: string;
|
|
7
|
+
status: 'active' | 'closed';
|
|
8
|
+
createdAt: string;
|
|
9
|
+
closedAt?: string;
|
|
10
|
+
pid?: number;
|
|
11
|
+
workingDir?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface LarkAttachment {
|
|
14
|
+
type: 'image' | 'file';
|
|
15
|
+
path: string;
|
|
16
|
+
name: string;
|
|
17
|
+
}
|
|
18
|
+
export interface LarkMessage {
|
|
19
|
+
messageId: string;
|
|
20
|
+
rootId: string;
|
|
21
|
+
senderId: string;
|
|
22
|
+
senderType: string;
|
|
23
|
+
msgType: string;
|
|
24
|
+
content: string;
|
|
25
|
+
createTime: string;
|
|
26
|
+
attachments?: LarkAttachment[];
|
|
27
|
+
}
|
|
28
|
+
export interface ScheduledTask {
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
type: 'cron' | 'interval' | 'once';
|
|
32
|
+
schedule: string;
|
|
33
|
+
prompt: string;
|
|
34
|
+
workingDir: string;
|
|
35
|
+
chatId: string;
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
createdAt: string;
|
|
38
|
+
lastRunAt?: string;
|
|
39
|
+
}
|
|
40
|
+
/** Messages sent from Daemon to Worker */
|
|
41
|
+
export type DaemonToWorker = {
|
|
42
|
+
type: 'init';
|
|
43
|
+
sessionId: string;
|
|
44
|
+
chatId: string;
|
|
45
|
+
rootMessageId: string;
|
|
46
|
+
workingDir: string;
|
|
47
|
+
cliId: string;
|
|
48
|
+
cliPathOverride?: string;
|
|
49
|
+
backendType: 'pty' | 'tmux';
|
|
50
|
+
prompt: string;
|
|
51
|
+
resume?: boolean;
|
|
52
|
+
ownerOpenId?: string;
|
|
53
|
+
} | {
|
|
54
|
+
type: 'message';
|
|
55
|
+
content: string;
|
|
56
|
+
} | {
|
|
57
|
+
type: 'close';
|
|
58
|
+
} | {
|
|
59
|
+
type: 'restart';
|
|
60
|
+
};
|
|
61
|
+
/** Messages sent from Worker to Daemon */
|
|
62
|
+
export type WorkerToDaemon = {
|
|
63
|
+
type: 'ready';
|
|
64
|
+
port: number;
|
|
65
|
+
token: string;
|
|
66
|
+
} | {
|
|
67
|
+
type: 'claude_exit';
|
|
68
|
+
code: number | null;
|
|
69
|
+
signal: string | null;
|
|
70
|
+
} | {
|
|
71
|
+
type: 'prompt_ready';
|
|
72
|
+
} | {
|
|
73
|
+
type: 'screen_update';
|
|
74
|
+
content: string;
|
|
75
|
+
status: 'working' | 'idle';
|
|
76
|
+
} | {
|
|
77
|
+
type: 'error';
|
|
78
|
+
message: string;
|
|
79
|
+
};
|
|
80
|
+
export declare const TOOL_NAMES: {
|
|
81
|
+
readonly SEND_TO_THREAD: "send_to_thread";
|
|
82
|
+
readonly GET_THREAD_MESSAGES: "get_thread_messages";
|
|
83
|
+
readonly REACT_TO_MESSAGE: "react_to_message";
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5N;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,eAAO,MAAM,UAAU;;;;CAIb,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4DA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,cAAc,EAAE,gBAAgB;IAChC,mBAAmB,EAAE,qBAAqB;IAC1C,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../src/utils/card-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CliAdapter } from '../adapters/cli/types.js';
|
|
2
|
+
export declare class IdleDetector {
|
|
3
|
+
private outputTail;
|
|
4
|
+
private lastSpinnerAt;
|
|
5
|
+
private quiescenceTimer;
|
|
6
|
+
private isIdle;
|
|
7
|
+
private idleCallback;
|
|
8
|
+
private completionPattern;
|
|
9
|
+
private readyPattern;
|
|
10
|
+
private readySeen;
|
|
11
|
+
constructor(cli: CliAdapter);
|
|
12
|
+
onIdle(cb: () => void): void;
|
|
13
|
+
feed(data: string): void;
|
|
14
|
+
reset(): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
private quiescenceCheck;
|
|
17
|
+
private markIdle;
|
|
18
|
+
private clearTimer;
|
|
19
|
+
private stripAnsi;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=idle-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle-detector.d.ts","sourceRoot":"","sources":["../../src/utils/idle-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAU3D,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;gBAEd,GAAG,EAAE,UAAU;IAK3B,MAAM,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAI5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAoCxB,KAAK,IAAI,IAAI;IAQb,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;CAKlB"}
|