larkcc 0.7.3 → 0.8.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.
@@ -0,0 +1,155 @@
1
+ /**
2
+ * 多 Agent 任务面板控制器
3
+ *
4
+ * 当 Claude 通过 Agent 工具派发子 agent 时,
5
+ * 为每个子 agent 创建独立的飞书任务面板卡片,
6
+ * 实时显示进度摘要、状态和耗时。
7
+ */
8
+ import { sendTaskCard, updateTaskCard } from "./feishu.js";
9
+ import { logger } from "./logger.js";
10
+ export class TaskPanelController {
11
+ client;
12
+ chatId;
13
+ rootMsgId;
14
+ cardTitle;
15
+ tasks = new Map();
16
+ constructor(options) {
17
+ this.client = options.client;
18
+ this.chatId = options.chatId;
19
+ this.rootMsgId = options.rootMsgId;
20
+ this.cardTitle = options.cardTitle;
21
+ }
22
+ /** 子 agent 启动:创建任务面板卡片 */
23
+ async onTaskStarted(event) {
24
+ if (this.tasks.has(event.task_id))
25
+ return;
26
+ try {
27
+ const msgId = await sendTaskCard(this.client, this.chatId, this.rootMsgId, event.description.slice(0, 80), this.cardTitle);
28
+ this.tasks.set(event.task_id, {
29
+ msgId,
30
+ description: event.description,
31
+ status: "running",
32
+ startTime: Date.now(),
33
+ });
34
+ logger.dim(`[task-panel] started: ${event.description.slice(0, 40)}`);
35
+ }
36
+ catch (err) {
37
+ console.error("[task-panel] failed to create card:", err);
38
+ }
39
+ }
40
+ /** 子 agent 进度更新 */
41
+ async onTaskProgress(event) {
42
+ const task = this.tasks.get(event.task_id);
43
+ if (!task || task.status !== "running")
44
+ return;
45
+ // 更新本地状态
46
+ if (event.summary)
47
+ task.summary = event.summary;
48
+ if (event.last_tool_name)
49
+ task.lastToolName = event.last_tool_name;
50
+ if (event.usage) {
51
+ task.tokens = event.usage.total_tokens;
52
+ }
53
+ try {
54
+ await updateTaskCard(this.client, task.msgId, {
55
+ description: task.description,
56
+ status: "running",
57
+ summary: task.summary,
58
+ lastToolName: task.lastToolName,
59
+ elapsedSeconds: (Date.now() - task.startTime) / 1000,
60
+ tokens: task.tokens,
61
+ cardTitle: this.cardTitle,
62
+ });
63
+ }
64
+ catch (err) {
65
+ console.error("[task-panel] failed to update progress:", err);
66
+ }
67
+ }
68
+ /** 子 agent 完成/失败/停止 */
69
+ async onTaskNotification(event) {
70
+ const task = this.tasks.get(event.task_id);
71
+ if (!task)
72
+ return;
73
+ task.status = event.status;
74
+ task.summary = event.summary;
75
+ if (event.usage)
76
+ task.tokens = event.usage.total_tokens;
77
+ const elapsedSeconds = event.usage?.duration_ms
78
+ ? event.usage.duration_ms / 1000
79
+ : (Date.now() - task.startTime) / 1000;
80
+ try {
81
+ await updateTaskCard(this.client, task.msgId, {
82
+ description: task.description,
83
+ status: event.status,
84
+ summary: event.summary,
85
+ elapsedSeconds,
86
+ tokens: task.tokens,
87
+ cardTitle: this.cardTitle,
88
+ });
89
+ logger.dim(`[task-panel] ${event.status}: ${task.description.slice(0, 40)}`);
90
+ }
91
+ catch (err) {
92
+ console.error("[task-panel] failed to update notification:", err);
93
+ }
94
+ }
95
+ /** 主 agent abort 时标记所有运行中的面板为 stopped */
96
+ async abortAll() {
97
+ const running = [...this.tasks.values()].filter(t => t.status === "running");
98
+ for (const task of running) {
99
+ task.status = "stopped";
100
+ try {
101
+ await updateTaskCard(this.client, task.msgId, {
102
+ description: task.description,
103
+ status: "stopped",
104
+ summary: task.summary ?? "Aborted",
105
+ elapsedSeconds: (Date.now() - task.startTime) / 1000,
106
+ tokens: task.tokens,
107
+ cardTitle: this.cardTitle,
108
+ });
109
+ }
110
+ catch (err) {
111
+ console.error("[task-panel] failed to abort card:", err);
112
+ }
113
+ }
114
+ }
115
+ /** 主 agent 完成时汇总 */
116
+ async completeAll() {
117
+ const running = [...this.tasks.values()].filter(t => t.status === "running");
118
+ for (const task of running) {
119
+ task.status = "completed";
120
+ try {
121
+ await updateTaskCard(this.client, task.msgId, {
122
+ description: task.description,
123
+ status: "completed",
124
+ summary: task.summary ?? "Done",
125
+ elapsedSeconds: (Date.now() - task.startTime) / 1000,
126
+ tokens: task.tokens,
127
+ cardTitle: this.cardTitle,
128
+ });
129
+ }
130
+ catch (err) {
131
+ console.error("[task-panel] failed to complete card:", err);
132
+ }
133
+ }
134
+ }
135
+ /** 获取当前运行中的任务数量 */
136
+ get runningCount() {
137
+ return [...this.tasks.values()].filter(t => t.status === "running").length;
138
+ }
139
+ /** 获取所有任务的状态摘要(用于主卡片状态栏) */
140
+ getStatusSummary() {
141
+ const tasks = [...this.tasks.values()];
142
+ if (tasks.length === 0)
143
+ return "";
144
+ const running = tasks.filter(t => t.status === "running");
145
+ if (running.length === 0)
146
+ return "";
147
+ const parts = running.map(t => {
148
+ const name = t.description.slice(0, 20);
149
+ const tool = t.lastToolName ? ` (${t.lastToolName})` : "";
150
+ return `${name}${tool}`;
151
+ });
152
+ return `🤖 ${running.length} agent${running.length > 1 ? "s" : ""}: ${parts.join(", ")}`;
153
+ }
154
+ }
155
+ //# sourceMappingURL=task-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-panel.js","sourceRoot":"","sources":["../src/task-panel.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "0.7.3";
1
+ export declare const VERSION = "0.8.0";
package/dist/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // 自动生成,请勿手动修改
2
2
  // 由 scripts/generate-version.js 从 package.json 生成
3
- export const VERSION = "0.7.3";
3
+ export const VERSION = "0.8.0";
4
4
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larkcc",
3
- "version": "0.7.3",
3
+ "version": "0.8.0",
4
4
  "description": "Claude Code in Feishu/Lark - AI coding assistant bot",
5
5
  "author": "sujie <13156660820@163.com>",
6
6
  "license": "MIT",
@@ -45,18 +45,17 @@
45
45
  "prepublishOnly": "pnpm build"
46
46
  },
47
47
  "dependencies": {
48
- "@anthropic-ai/claude-agent-sdk": "latest",
48
+ "@anthropic-ai/claude-agent-sdk": "^0.2.91",
49
49
  "@larksuiteoapi/node-sdk": "^1.60",
50
50
  "chalk": "^5",
51
- "commander": "^12",
52
- "js-yaml": "^4",
53
- "ora": "^8"
51
+ "commander": "^14",
52
+ "js-yaml": "^4"
54
53
  },
55
54
  "devDependencies": {
56
55
  "@types/js-yaml": "^4",
57
56
  "@types/node": "^22",
58
57
  "semver": "^7.7.4",
59
58
  "tsx": "^4",
60
- "typescript": "^5"
59
+ "typescript": "^6"
61
60
  }
62
61
  }