@lih-x-x/kmr 1.0.62 → 1.0.64
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/dist/{chunk-23UVH7BV.js → chunk-GRHQV2FL.js} +20 -0
- package/dist/{chunk-KAWJNGXR.js → chunk-IZKYPG5M.js} +32 -0
- package/dist/cli.js +72 -9
- package/dist/index.js +6 -3
- package/dist/{taskCreator-TCI3VB5D.js → taskCreator-LQ75UCNQ.js} +1 -1
- package/dist/{userResolver-SDRJIVT2.js → userResolver-F76R3ZMT.js} +1 -1
- package/package.json +1 -1
|
@@ -56,6 +56,26 @@ var UserResolver = class {
|
|
|
56
56
|
}
|
|
57
57
|
return void 0;
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* 根据 open_id 反查姓名,缓存中没有则调飞书接口查询
|
|
61
|
+
*/
|
|
62
|
+
async resolveNameById(openId) {
|
|
63
|
+
const cached = this.resolveName(openId);
|
|
64
|
+
if (cached) return cached;
|
|
65
|
+
try {
|
|
66
|
+
const res = await this.client.contact.user.get({
|
|
67
|
+
path: { user_id: openId },
|
|
68
|
+
params: { user_id_type: "open_id" }
|
|
69
|
+
});
|
|
70
|
+
const name = res.data?.user?.name;
|
|
71
|
+
if (name) {
|
|
72
|
+
this.nameMap.set(name, openId);
|
|
73
|
+
return name;
|
|
74
|
+
}
|
|
75
|
+
} catch {
|
|
76
|
+
}
|
|
77
|
+
return void 0;
|
|
78
|
+
}
|
|
59
79
|
/**
|
|
60
80
|
* 获取当前所有已缓存的映射
|
|
61
81
|
*/
|
|
@@ -37,6 +37,38 @@ var TaskCreator = class {
|
|
|
37
37
|
console.log(`[task] \u4EFB\u52A1\u521B\u5EFA\u6210\u529F: taskId=${taskId}`);
|
|
38
38
|
return { taskId, url };
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* 更新飞书任务(标题、截止日期、负责人)
|
|
42
|
+
*/
|
|
43
|
+
async updateTask(taskId, params) {
|
|
44
|
+
const updateFields = [];
|
|
45
|
+
const taskBody = {};
|
|
46
|
+
if (params.summary) {
|
|
47
|
+
taskBody.summary = params.summary;
|
|
48
|
+
updateFields.push("summary");
|
|
49
|
+
}
|
|
50
|
+
if (params.due) {
|
|
51
|
+
const dueDate = /* @__PURE__ */ new Date(params.due + "T23:59:59+08:00");
|
|
52
|
+
taskBody.due = { timestamp: dueDate.getTime().toString(), is_all_day: true };
|
|
53
|
+
updateFields.push("due");
|
|
54
|
+
}
|
|
55
|
+
console.log(`[task] \u66F4\u65B0\u98DE\u4E66\u4EFB\u52A1: taskId=${taskId}`);
|
|
56
|
+
await this.client.task.v2.task.patch({
|
|
57
|
+
path: { task_guid: taskId },
|
|
58
|
+
params: { user_id_type: "open_id" },
|
|
59
|
+
data: { task: taskBody, update_fields: updateFields }
|
|
60
|
+
});
|
|
61
|
+
if (params.assigneeOpenId) {
|
|
62
|
+
await this.client.task.v2.task.addMembers({
|
|
63
|
+
path: { task_guid: taskId },
|
|
64
|
+
params: { user_id_type: "open_id" },
|
|
65
|
+
data: {
|
|
66
|
+
members: [{ id: params.assigneeOpenId, type: "user", role: "assignee" }]
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
console.log(`[task] \u4EFB\u52A1\u66F4\u65B0\u6210\u529F: taskId=${taskId}`);
|
|
71
|
+
}
|
|
40
72
|
/**
|
|
41
73
|
* 查询飞书任务的最新状态
|
|
42
74
|
*/
|
package/dist/cli.js
CHANGED
|
@@ -6,9 +6,9 @@ async function checkUpdate() {
|
|
|
6
6
|
try {
|
|
7
7
|
const res = await fetch(`https://registry.npmjs.org/${"@lih-x-x/kmr"}/latest`, { signal: AbortSignal.timeout(3e3) });
|
|
8
8
|
const data = await res.json();
|
|
9
|
-
if (data.version && data.version !== "1.0.
|
|
9
|
+
if (data.version && data.version !== "1.0.64") {
|
|
10
10
|
console.log(`
|
|
11
|
-
\u2B06\uFE0F \u65B0\u7248\u672C\u53EF\u7528: ${"1.0.
|
|
11
|
+
\u2B06\uFE0F \u65B0\u7248\u672C\u53EF\u7528: ${"1.0.64"} \u2192 ${data.version}`);
|
|
12
12
|
console.log(` \u8FD0\u884C npm install -g ${"@lih-x-x/kmr"} \u66F4\u65B0
|
|
13
13
|
`);
|
|
14
14
|
}
|
|
@@ -56,12 +56,12 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
56
56
|
kmr --help \u663E\u793A\u5E2E\u52A9
|
|
57
57
|
`);
|
|
58
58
|
} else if (command === "--version" || command === "-v") {
|
|
59
|
-
console.log("1.0.
|
|
59
|
+
console.log("1.0.64");
|
|
60
60
|
} else if (command === "list") {
|
|
61
61
|
const { loadConfig } = await import("./config-WIQGW5OC.js");
|
|
62
62
|
const { JsonStore } = await import("./jsonStore-AL73KEUG.js");
|
|
63
63
|
const { createLarkClient } = await import("./client-DFBBDD77.js");
|
|
64
|
-
const { TaskCreator } = await import("./taskCreator-
|
|
64
|
+
const { TaskCreator } = await import("./taskCreator-LQ75UCNQ.js");
|
|
65
65
|
const { syncTaskStatuses } = await import("./sync-FJA2I3HE.js");
|
|
66
66
|
const config = loadConfig();
|
|
67
67
|
const store = new JsonStore(config.storage.dataDir);
|
|
@@ -84,7 +84,7 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
84
84
|
const { loadConfig } = await import("./config-WIQGW5OC.js");
|
|
85
85
|
const { JsonStore } = await import("./jsonStore-AL73KEUG.js");
|
|
86
86
|
const { createLarkClient } = await import("./client-DFBBDD77.js");
|
|
87
|
-
const { TaskCreator } = await import("./taskCreator-
|
|
87
|
+
const { TaskCreator } = await import("./taskCreator-LQ75UCNQ.js");
|
|
88
88
|
const { syncTaskStatuses } = await import("./sync-FJA2I3HE.js");
|
|
89
89
|
const config = loadConfig();
|
|
90
90
|
const store = new JsonStore(config.storage.dataDir);
|
|
@@ -101,7 +101,7 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
101
101
|
const { loadConfig } = await import("./config-WIQGW5OC.js");
|
|
102
102
|
const { JsonStore } = await import("./jsonStore-AL73KEUG.js");
|
|
103
103
|
const { createLarkClient } = await import("./client-DFBBDD77.js");
|
|
104
|
-
const { TaskCreator } = await import("./taskCreator-
|
|
104
|
+
const { TaskCreator } = await import("./taskCreator-LQ75UCNQ.js");
|
|
105
105
|
const { syncTaskStatuses } = await import("./sync-FJA2I3HE.js");
|
|
106
106
|
const config = loadConfig();
|
|
107
107
|
const store = new JsonStore(config.storage.dataDir);
|
|
@@ -162,8 +162,8 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
162
162
|
}
|
|
163
163
|
const { loadConfig } = await import("./config-WIQGW5OC.js");
|
|
164
164
|
const { createLarkClient } = await import("./client-DFBBDD77.js");
|
|
165
|
-
const { TaskCreator } = await import("./taskCreator-
|
|
166
|
-
const { UserResolver } = await import("./userResolver-
|
|
165
|
+
const { TaskCreator } = await import("./taskCreator-LQ75UCNQ.js");
|
|
166
|
+
const { UserResolver } = await import("./userResolver-F76R3ZMT.js");
|
|
167
167
|
const { JsonStore } = await import("./jsonStore-AL73KEUG.js");
|
|
168
168
|
const config = loadConfig();
|
|
169
169
|
const client = createLarkClient(config);
|
|
@@ -226,6 +226,69 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
226
226
|
await store.save(standalone);
|
|
227
227
|
console.log(` \u5DF2\u4FDD\u5B58\u5230\u72EC\u7ACB\u4EFB\u52A1\u8BB0\u5F55`);
|
|
228
228
|
}
|
|
229
|
+
} else if (command === "update-task") {
|
|
230
|
+
const args = argv.slice(3);
|
|
231
|
+
const taskId = args[0];
|
|
232
|
+
if (!taskId || taskId.startsWith("--")) {
|
|
233
|
+
console.error("\u7528\u6CD5: kmr update-task <taskId> [--summary \u65B0\u6807\u9898] [--due YYYY-MM-DD] [--assignee \u59D3\u540D]");
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
let summary;
|
|
237
|
+
let due;
|
|
238
|
+
let assignee;
|
|
239
|
+
for (let i = 1; i < args.length; i++) {
|
|
240
|
+
if (args[i] === "--summary" && args[i + 1]) {
|
|
241
|
+
summary = args[++i];
|
|
242
|
+
} else if (args[i] === "--due" && args[i + 1]) {
|
|
243
|
+
due = args[++i];
|
|
244
|
+
} else if (args[i] === "--assignee" && args[i + 1]) {
|
|
245
|
+
assignee = args[++i];
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (!summary && !due && !assignee) {
|
|
249
|
+
console.error("\u8BF7\u81F3\u5C11\u6307\u5B9A\u4E00\u4E2A\u8981\u66F4\u65B0\u7684\u5B57\u6BB5\uFF1A--summary\u3001--due\u3001--assignee");
|
|
250
|
+
process.exit(1);
|
|
251
|
+
}
|
|
252
|
+
const { loadConfig } = await import("./config-WIQGW5OC.js");
|
|
253
|
+
const { createLarkClient } = await import("./client-DFBBDD77.js");
|
|
254
|
+
const { TaskCreator } = await import("./taskCreator-LQ75UCNQ.js");
|
|
255
|
+
const { UserResolver } = await import("./userResolver-F76R3ZMT.js");
|
|
256
|
+
const { JsonStore } = await import("./jsonStore-AL73KEUG.js");
|
|
257
|
+
const config = loadConfig();
|
|
258
|
+
const client = createLarkClient(config);
|
|
259
|
+
const taskCreator = new TaskCreator(client);
|
|
260
|
+
const store = new JsonStore(config.storage.dataDir);
|
|
261
|
+
let assigneeOpenId;
|
|
262
|
+
if (assignee) {
|
|
263
|
+
const userResolver = new UserResolver(client);
|
|
264
|
+
try {
|
|
265
|
+
const chatListRes = await client.im.chat.list({ params: { page_size: 50 } });
|
|
266
|
+
const chats = chatListRes.data?.items || [];
|
|
267
|
+
for (const chat of chats) {
|
|
268
|
+
await userResolver.loadChatMembers(chat.chat_id);
|
|
269
|
+
}
|
|
270
|
+
} catch {
|
|
271
|
+
}
|
|
272
|
+
assigneeOpenId = userResolver.resolve(assignee);
|
|
273
|
+
if (!assigneeOpenId) {
|
|
274
|
+
console.error(`\u26A0\uFE0F \u672A\u627E\u5230\u7528\u6237 "${assignee}"\uFF0C\u8D1F\u8D23\u4EBA\u4E0D\u4F1A\u66F4\u65B0`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
await taskCreator.updateTask(taskId, { summary, due, assigneeOpenId });
|
|
278
|
+
console.log(`\u2705 \u4EFB\u52A1\u5DF2\u66F4\u65B0: ${taskId}`);
|
|
279
|
+
if (summary) {
|
|
280
|
+
const all = await store.list();
|
|
281
|
+
for (const record of all) {
|
|
282
|
+
if (!record.createdTasks) continue;
|
|
283
|
+
const task = record.createdTasks.find((t) => t.taskId === taskId);
|
|
284
|
+
if (task) {
|
|
285
|
+
task.summary = summary;
|
|
286
|
+
await store.save(record);
|
|
287
|
+
console.log(` \u672C\u5730\u8BB0\u5F55\u5DF2\u540C\u6B65\u66F4\u65B0`);
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
229
292
|
} else if (command === "find") {
|
|
230
293
|
const query = argv.slice(3).join(" ");
|
|
231
294
|
if (!query) {
|
|
@@ -237,7 +300,7 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
237
300
|
const { QueryHandler } = await import("./handler-46CQQIA2.js");
|
|
238
301
|
const { JsonStore } = await import("./jsonStore-AL73KEUG.js");
|
|
239
302
|
const { createLarkClient } = await import("./client-DFBBDD77.js");
|
|
240
|
-
const { TaskCreator } = await import("./taskCreator-
|
|
303
|
+
const { TaskCreator } = await import("./taskCreator-LQ75UCNQ.js");
|
|
241
304
|
const { syncTaskStatuses } = await import("./sync-FJA2I3HE.js");
|
|
242
305
|
const config = loadConfig();
|
|
243
306
|
const store = new JsonStore(config.storage.dataDir);
|
package/dist/index.js
CHANGED
|
@@ -22,13 +22,13 @@ import {
|
|
|
22
22
|
} from "./chunk-3F3LSPSA.js";
|
|
23
23
|
import {
|
|
24
24
|
TaskCreator
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-IZKYPG5M.js";
|
|
26
26
|
import {
|
|
27
27
|
syncTaskStatuses
|
|
28
28
|
} from "./chunk-XQVLJTP4.js";
|
|
29
29
|
import {
|
|
30
30
|
UserResolver
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-GRHQV2FL.js";
|
|
32
32
|
|
|
33
33
|
// src/index.ts
|
|
34
34
|
import fs3 from "fs";
|
|
@@ -599,6 +599,7 @@ var SESSION_SKILL = `\u4F60\u662F KMR\uFF08Key Meetings Record\uFF09\u7684\u667A
|
|
|
599
599
|
- kmr task \u2014 \u67E5\u770B\u6240\u6709\u4EFB\u52A1
|
|
600
600
|
- kmr del <id> \u2014 \u5220\u9664\u8BB0\u5F55
|
|
601
601
|
- kmr create-task <\u4EFB\u52A1\u6807\u9898> [--due YYYY-MM-DD] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0] [--meeting <id>] \u2014 \u521B\u5EFA\u98DE\u4E66\u4EFB\u52A1\u5E76\u4FDD\u5B58\u5230\u672C\u5730\uFF08--meeting \u53EF\u5173\u8054\u5230\u6307\u5B9A\u4F1A\u8BAE\u8BB0\u5F55\uFF0C\u82E5\u6709\uFF0C\u53EF\u9009\uFF09
|
|
602
|
+
- kmr update-task <taskId> [--summary \u65B0\u6807\u9898] [--due YYYY-MM-DD] [--assignee \u59D3\u540D] \u2014 \u66F4\u65B0\u98DE\u4E66\u4EFB\u52A1\uFF08\u4FEE\u6539\u6807\u9898\u3001\u622A\u6B62\u65E5\u671F\u3001\u8D1F\u8D23\u4EBA\uFF09
|
|
602
603
|
|
|
603
604
|
\u64CD\u4F5C\u6307\u5357\uFF1A
|
|
604
605
|
- \u5F53\u7528\u6237\u8981\u6C42\u521B\u5EFA\u4EFB\u52A1\u65F6\uFF0C\u76F4\u63A5\u6267\u884C kmr create-task \u547D\u4EE4\uFF0C\u4F8B\u5982\uFF1Akmr create-task "\u5B8C\u6210\u65B9\u6848\u8BBE\u8BA1" --due 2026-05-15 --assignee \u5F20\u4E09\uFF1B\u5982\u679C\u80FD\u5173\u8054\u5230\u67D0\u6761\u4F1A\u8BAE\u8BB0\u5F55\uFF0C\u52A0\u4E0A --meeting <id>
|
|
@@ -875,6 +876,8 @@ async function main() {
|
|
|
875
876
|
const dispatcher = createEventDispatcher(botOpenId, async (messageId, text, chatId, senderId, meta) => {
|
|
876
877
|
const parsed = parseMessage(text);
|
|
877
878
|
console.log(`[message] \u6536\u5230\u6D88\u606F: "${text}" (chatId=${chatId}, senderId=${senderId})`);
|
|
879
|
+
userResolver.loadChatMembers(chatId).catch(() => {
|
|
880
|
+
});
|
|
878
881
|
if (meta.isGroup && !meta.isMentioned && parsed.type === "document_link" /* DOCUMENT_LINK */) {
|
|
879
882
|
const title = await docReader.getDocumentTitle(parsed.documentId);
|
|
880
883
|
const isMeetingNote = /纪要|会议记录|meeting/i.test(title) || /from=vc_assistant/.test(text);
|
|
@@ -1060,7 +1063,7 @@ async function main() {
|
|
|
1060
1063
|
}
|
|
1061
1064
|
console.log(`[process] \u81EA\u7531\u5BF9\u8BDD, userId=${senderId}`);
|
|
1062
1065
|
const reactionId = await messenger.addReaction(messageId, "OnIt");
|
|
1063
|
-
const senderName = userResolver.
|
|
1066
|
+
const senderName = await userResolver.resolveNameById(senderId);
|
|
1064
1067
|
const reply = await sessionManager.handleMessage(senderId, text, { isGroup: meta.isGroup, senderName });
|
|
1065
1068
|
await messenger.removeReaction(messageId, reactionId);
|
|
1066
1069
|
await messenger.replyText(messageId, reply);
|