@lih-x-x/kmr 1.0.40 → 1.0.42
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-2IG4NXRZ.js +60 -0
- package/dist/cli.js +54 -3
- package/dist/index.js +31 -74
- package/dist/userResolver-DTWOTVP6.js +6 -0
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// src/lark/userResolver.ts
|
|
2
|
+
var UserResolver = class {
|
|
3
|
+
constructor(client) {
|
|
4
|
+
this.client = client;
|
|
5
|
+
}
|
|
6
|
+
client;
|
|
7
|
+
// name -> openId 映射(支持多个群的成员合并)
|
|
8
|
+
nameMap = /* @__PURE__ */ new Map();
|
|
9
|
+
loadedChats = /* @__PURE__ */ new Set();
|
|
10
|
+
/**
|
|
11
|
+
* 根据姓名解析 open_id
|
|
12
|
+
* 如果缓存中没有,返回 undefined
|
|
13
|
+
*/
|
|
14
|
+
resolve(name) {
|
|
15
|
+
if (this.nameMap.has(name)) return this.nameMap.get(name);
|
|
16
|
+
for (const [key, value] of this.nameMap) {
|
|
17
|
+
if (key.includes(name) || name.includes(key)) return value;
|
|
18
|
+
}
|
|
19
|
+
return void 0;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 加载某个群的成员列表到缓存
|
|
23
|
+
*/
|
|
24
|
+
async loadChatMembers(chatId) {
|
|
25
|
+
if (this.loadedChats.has(chatId)) return;
|
|
26
|
+
try {
|
|
27
|
+
let pageToken;
|
|
28
|
+
do {
|
|
29
|
+
const response = await this.client.im.chatMembers.get({
|
|
30
|
+
path: { chat_id: chatId },
|
|
31
|
+
params: {
|
|
32
|
+
member_id_type: "open_id",
|
|
33
|
+
page_size: 100,
|
|
34
|
+
...pageToken ? { page_token: pageToken } : {}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
const items = response.data?.items || [];
|
|
38
|
+
for (const item of items) {
|
|
39
|
+
if (item.name && item.member_id) {
|
|
40
|
+
this.nameMap.set(item.name, item.member_id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
pageToken = response.data?.has_more ? response.data?.page_token : void 0;
|
|
44
|
+
} while (pageToken);
|
|
45
|
+
this.loadedChats.add(chatId);
|
|
46
|
+
} catch (err) {
|
|
47
|
+
console.error(`[user-resolver] \u52A0\u8F7D\u7FA4\u6210\u5458\u5931\u8D25:`, err.message);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 获取当前所有已缓存的映射
|
|
52
|
+
*/
|
|
53
|
+
getAll() {
|
|
54
|
+
return new Map(this.nameMap);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export {
|
|
59
|
+
UserResolver
|
|
60
|
+
};
|
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.42") {
|
|
10
10
|
console.log(`
|
|
11
|
-
\u2B06\uFE0F \u65B0\u7248\u672C\u53EF\u7528: ${"1.0.
|
|
11
|
+
\u2B06\uFE0F \u65B0\u7248\u672C\u53EF\u7528: ${"1.0.42"} \u2192 ${data.version}`);
|
|
12
12
|
console.log(` \u8FD0\u884C npm install -g ${"@lih-x-x/kmr"} \u66F4\u65B0
|
|
13
13
|
`);
|
|
14
14
|
}
|
|
@@ -52,10 +52,11 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
52
52
|
kmr task \u67E5\u770B\u6240\u6709\u4EFB\u52A1
|
|
53
53
|
kmr del <id> \u5220\u9664\u8BB0\u5F55
|
|
54
54
|
kmr find <q> \u641C\u7D22\u4F1A\u8BAE\u8BB0\u5F55
|
|
55
|
+
kmr create-task <\u6807\u9898> [--due YYYY-MM-DD] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0] \u521B\u5EFA\u98DE\u4E66\u4EFB\u52A1
|
|
55
56
|
kmr --help \u663E\u793A\u5E2E\u52A9
|
|
56
57
|
`);
|
|
57
58
|
} else if (command === "--version" || command === "-v") {
|
|
58
|
-
console.log("1.0.
|
|
59
|
+
console.log("1.0.42");
|
|
59
60
|
} else if (command === "list") {
|
|
60
61
|
const { loadConfig } = await import("./config-L2SVVMAR.js");
|
|
61
62
|
const { JsonStore } = await import("./jsonStore-AL73KEUG.js");
|
|
@@ -133,6 +134,55 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
133
134
|
const store = new JsonStore(loadConfig().storage.dataDir);
|
|
134
135
|
const ok = await store.delete(id);
|
|
135
136
|
console.log(ok ? `\u2705 \u5DF2\u5220\u9664: ${id}` : `\u274C \u672A\u627E\u5230: ${id}`);
|
|
137
|
+
} else if (command === "create-task") {
|
|
138
|
+
const args = argv.slice(3);
|
|
139
|
+
let summary = "";
|
|
140
|
+
let due;
|
|
141
|
+
let assignee;
|
|
142
|
+
let desc;
|
|
143
|
+
const positional = [];
|
|
144
|
+
for (let i = 0; i < args.length; i++) {
|
|
145
|
+
if (args[i] === "--due" && args[i + 1]) {
|
|
146
|
+
due = args[++i];
|
|
147
|
+
} else if (args[i] === "--assignee" && args[i + 1]) {
|
|
148
|
+
assignee = args[++i];
|
|
149
|
+
} else if (args[i] === "--desc" && args[i + 1]) {
|
|
150
|
+
desc = args[++i];
|
|
151
|
+
} else {
|
|
152
|
+
positional.push(args[i]);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
summary = positional.join(" ");
|
|
156
|
+
if (!summary) {
|
|
157
|
+
console.error("\u7528\u6CD5: kmr create-task <\u4EFB\u52A1\u6807\u9898> [--due YYYY-MM-DD] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0]");
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
const { loadConfig } = await import("./config-L2SVVMAR.js");
|
|
161
|
+
const { createLarkClient } = await import("./client-DFBBDD77.js");
|
|
162
|
+
const { TaskCreator } = await import("./taskCreator-TCI3VB5D.js");
|
|
163
|
+
const { UserResolver } = await import("./userResolver-DTWOTVP6.js");
|
|
164
|
+
const config = loadConfig();
|
|
165
|
+
const client = createLarkClient(config);
|
|
166
|
+
const taskCreator = new TaskCreator(client);
|
|
167
|
+
let assigneeOpenId;
|
|
168
|
+
if (assignee) {
|
|
169
|
+
const userResolver = new UserResolver(client);
|
|
170
|
+
try {
|
|
171
|
+
const chatListRes = await client.im.chat.list({ params: { page_size: 50 } });
|
|
172
|
+
const chats = chatListRes.data?.items || [];
|
|
173
|
+
for (const chat of chats) {
|
|
174
|
+
await userResolver.loadChatMembers(chat.chat_id);
|
|
175
|
+
}
|
|
176
|
+
} catch {
|
|
177
|
+
}
|
|
178
|
+
assigneeOpenId = userResolver.resolve(assignee);
|
|
179
|
+
if (!assigneeOpenId) {
|
|
180
|
+
console.error(`\u26A0\uFE0F \u672A\u627E\u5230\u7528\u6237 "${assignee}"\uFF0C\u5C06\u521B\u5EFA\u65E0\u8D1F\u8D23\u4EBA\u7684\u4EFB\u52A1`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const result = await taskCreator.createTask({ summary, due, description: desc, assigneeOpenId });
|
|
184
|
+
console.log(`\u2705 \u4EFB\u52A1\u5DF2\u521B\u5EFA: ${result.taskId}`);
|
|
185
|
+
if (result.url) console.log(` ${result.url}`);
|
|
136
186
|
} else if (command === "find") {
|
|
137
187
|
const query = argv.slice(3).join(" ");
|
|
138
188
|
if (!query) {
|
|
@@ -170,6 +220,7 @@ KMR\uFF08Key Meetings Record\uFF09\u2014 \u4F1A\u8BAE\u6316\u6398\u673A
|
|
|
170
220
|
kmr task \u67E5\u770B\u6240\u6709\u4EFB\u52A1
|
|
171
221
|
kmr del <id> \u5220\u9664\u8BB0\u5F55
|
|
172
222
|
kmr find <q> \u641C\u7D22\u4F1A\u8BAE\u8BB0\u5F55
|
|
223
|
+
kmr create-task <\u6807\u9898> [--due DATE] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0] \u521B\u5EFA\u4EFB\u52A1
|
|
173
224
|
kmr --help \u663E\u793A\u5B8C\u6574\u5E2E\u52A9
|
|
174
225
|
`);
|
|
175
226
|
await import("./index.js");
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ClaudeCodeProvider,
|
|
3
|
+
getExecEnv
|
|
4
|
+
} from "./chunk-WMK5MYOU.js";
|
|
1
5
|
import {
|
|
2
6
|
QueryHandler
|
|
3
7
|
} from "./chunk-SGTENG37.js";
|
|
8
|
+
import {
|
|
9
|
+
KMR_DIR,
|
|
10
|
+
getAgentProvider,
|
|
11
|
+
loadConfig
|
|
12
|
+
} from "./chunk-ZXGVA5QX.js";
|
|
4
13
|
import {
|
|
5
14
|
JsonStore
|
|
6
15
|
} from "./chunk-TUCCS6QJ.js";
|
|
@@ -17,14 +26,8 @@ import {
|
|
|
17
26
|
syncTaskStatuses
|
|
18
27
|
} from "./chunk-XQVLJTP4.js";
|
|
19
28
|
import {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
} from "./chunk-WMK5MYOU.js";
|
|
23
|
-
import {
|
|
24
|
-
KMR_DIR,
|
|
25
|
-
getAgentProvider,
|
|
26
|
-
loadConfig
|
|
27
|
-
} from "./chunk-ZXGVA5QX.js";
|
|
29
|
+
UserResolver
|
|
30
|
+
} from "./chunk-2IG4NXRZ.js";
|
|
28
31
|
|
|
29
32
|
// src/index.ts
|
|
30
33
|
import fs3 from "fs";
|
|
@@ -570,28 +573,39 @@ import fs2 from "fs";
|
|
|
570
573
|
import path2 from "path";
|
|
571
574
|
|
|
572
575
|
// src/session/skill.ts
|
|
573
|
-
var SESSION_SKILL = `\u4F60\u662F KMR\uFF08Key Meetings Record\uFF09\u7684\u667A\u80FD\u52A9\u624B\u3002
|
|
576
|
+
var SESSION_SKILL = `\u4F60\u662F KMR\uFF08Key Meetings Record\uFF09\u7684\u667A\u80FD\u52A9\u624B\uFF0C\u8FD0\u884C\u5728\u98DE\u4E66\u673A\u5668\u4EBA\u4E2D\u3002
|
|
574
577
|
|
|
575
578
|
\u4F60\u7684\u804C\u8D23\uFF1A
|
|
576
579
|
1. \u5E2E\u52A9\u7528\u6237\u7406\u89E3\u548C\u7BA1\u7406\u4F1A\u8BAE\u8BB0\u5F55
|
|
577
580
|
2. \u56DE\u7B54\u5173\u4E8E\u5386\u53F2\u4F1A\u8BAE\u5185\u5BB9\u7684\u95EE\u9898
|
|
578
581
|
3. \u5E2E\u52A9\u7528\u6237\u6574\u7406\u3001\u603B\u7ED3\u5DE5\u4F5C\u4E2D\u7684\u4FE1\u606F
|
|
579
|
-
4. \
|
|
582
|
+
4. \u521B\u5EFA\u98DE\u4E66\u4EFB\u52A1\u3001\u53D1\u9001\u98DE\u4E66\u6D88\u606F\u7B49\u64CD\u4F5C
|
|
580
583
|
|
|
581
584
|
\u80CC\u666F\u4FE1\u606F\uFF1A
|
|
582
585
|
- KMR \u662F\u4E00\u4E2A\u4ECE\u98DE\u4E66\u4F1A\u8BAE\u7EAA\u8981\u4E2D\u63D0\u53D6\u5173\u952E\u4FE1\u606F\u5E76\u6316\u6398\u51FA\u5171\u8BC6\u3001\u627F\u8BFA\u3001\u98CE\u9669\u3001\u5F85\u529E\u3001\u77E5\u8BC6\u7684\u670D\u52A1
|
|
583
586
|
- \u6838\u5FC3\u63D0\u53D6\u7EF4\u5EA6\uFF1A\u5173\u952E\u5171\u8BC6\u4E0E\u627F\u8BFA\uFF08\u6EAF\u6E90\u8FFD\u8D23\uFF09\u3001\u53EF\u590D\u7528\u77E5\u8BC6\uFF08\u5DE5\u5177/\u65B9\u6CD5/\u7ECF\u9A8C\uFF09\u3001\u98CE\u9669\u4E0E\u5F85\u529E\uFF08\u98CE\u9669\u9884\u8B66/\u4EFB\u52A1\u8DDF\u8E2A\uFF09
|
|
584
587
|
|
|
585
|
-
\
|
|
586
|
-
- \
|
|
587
|
-
- \
|
|
588
|
-
- \u4F60\
|
|
589
|
-
|
|
590
|
-
|
|
588
|
+
\u8FD0\u884C\u73AF\u5883\uFF1A
|
|
589
|
+
- \u4F60\u8FD0\u884C\u5728\u98DE\u4E66\u673A\u5668\u4EBA\u4E2D\uFF0C\u4F60\u7684\u56DE\u590D\u4F1A\u76F4\u63A5\u4F5C\u4E3A\u98DE\u4E66\u6D88\u606F\u53D1\u9001\u5230\u7528\u6237\u6240\u5728\u7684\u5BF9\u8BDD\u4E2D
|
|
590
|
+
- \u4E0D\u8981\u8BF4"\u6211\u6CA1\u6709\u53D1\u6D88\u606F/\u521B\u5EFA\u4EFB\u52A1\u7684\u80FD\u529B"\u2014\u2014\u4F60\u53EF\u4EE5\u901A\u8FC7 kmr \u547D\u4EE4\u6765\u5B8C\u6210\u8FD9\u4E9B\u64CD\u4F5C
|
|
591
|
+
- \u4F60\u6709\u80FD\u529B\u901A\u8FC7 kmr \u547D\u4EE4\u67E5\u8BE2\u6570\u636E\u3001\u521B\u5EFA\u4EFB\u52A1\u3001\u53D1\u9001\u6D88\u606F
|
|
592
|
+
|
|
593
|
+
\u53EF\u7528\u7684 kmr \u547D\u4EE4\uFF08\u901A\u8FC7 bash \u6267\u884C\uFF09\uFF1A
|
|
594
|
+
- kmr list \u2014 \u5217\u51FA\u6240\u6709\u4F1A\u8BAE\u8BB0\u5F55
|
|
595
|
+
- kmr show <id> \u2014 \u67E5\u770B\u4F1A\u8BAE\u8BB0\u5F55\u8BE6\u60C5
|
|
596
|
+
- kmr find <query> \u2014 \u641C\u7D22\u4F1A\u8BAE\u8BB0\u5F55
|
|
597
|
+
- kmr task \u2014 \u67E5\u770B\u6240\u6709\u4EFB\u52A1
|
|
598
|
+
- kmr del <id> \u2014 \u5220\u9664\u8BB0\u5F55
|
|
599
|
+
- kmr create-task <\u4EFB\u52A1\u6807\u9898> [--due YYYY-MM-DD] [--assignee \u59D3\u540D] [--desc \u63CF\u8FF0] \u2014 \u521B\u5EFA\u98DE\u4E66\u4EFB\u52A1
|
|
600
|
+
|
|
601
|
+
\u64CD\u4F5C\u6307\u5357\uFF1A
|
|
602
|
+
- \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
|
|
603
|
+
- \u5F53\u7528\u6237\u95EE\u5230\u4F1A\u8BAE/\u4EFB\u52A1\u76F8\u5173\u7684\u95EE\u9898\u65F6\uFF0C\u5148\u6267\u884C kmr \u547D\u4EE4\u83B7\u53D6\u6570\u636E\u518D\u56DE\u7B54
|
|
604
|
+
- \u63D0\u793A\u7528\u6237\u5728\u98DE\u4E66\u5BF9\u8BDD\u4E2D\u4E5F\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528\uFF1A/find \u641C\u7D22\u3001/list \u5217\u51FA\u5168\u90E8\u3001/show <id> \u67E5\u770B\u8BE6\u60C5\u3001/del <id> \u5220\u9664\u3001/task \u67E5\u770B\u4EFB\u52A1
|
|
591
605
|
|
|
592
606
|
\u5BF9\u8BDD\u8981\u6C42\uFF1A
|
|
593
607
|
- \u7B80\u6D01\u3001\u4E13\u4E1A\u3001\u6709\u5E2E\u52A9
|
|
594
|
-
- \u4F18\u5148\u901A\u8FC7 kmr \u547D\u4EE4\u83B7\u53D6\u6570\u636E\
|
|
608
|
+
- \u4F18\u5148\u901A\u8FC7 kmr \u547D\u4EE4\u83B7\u53D6\u6570\u636E\u548C\u6267\u884C\u64CD\u4F5C\uFF1B\u5982\u679C\u7528\u6237\u660E\u786E\u60F3\u81EA\u5DF1\u64CD\u4F5C\uFF0C\u4E5F\u53EF\u4EE5\u544A\u77E5\u5BF9\u5E94\u547D\u4EE4
|
|
595
609
|
- \u6BCF\u6B21\u56DE\u590D\u63A7\u5236\u5728\u5408\u7406\u957F\u5EA6\uFF0C\u9002\u5408\u98DE\u4E66\u6D88\u606F\u9605\u8BFB
|
|
596
610
|
|
|
597
611
|
\u3010\u91CD\u8981\u3011\u76F4\u63A5\u8F93\u51FA\u7EAF\u6587\u672C\u56DE\u590D\uFF0C\u4E0D\u8981\u8F93\u51FA JSON\u3001markdown \u4EE3\u7801\u5757\u7B49\u683C\u5F0F\u3002`;
|
|
@@ -727,63 +741,6 @@ var SessionManager = class {
|
|
|
727
741
|
}
|
|
728
742
|
};
|
|
729
743
|
|
|
730
|
-
// src/lark/userResolver.ts
|
|
731
|
-
var UserResolver = class {
|
|
732
|
-
constructor(client) {
|
|
733
|
-
this.client = client;
|
|
734
|
-
}
|
|
735
|
-
client;
|
|
736
|
-
// name -> openId 映射(支持多个群的成员合并)
|
|
737
|
-
nameMap = /* @__PURE__ */ new Map();
|
|
738
|
-
loadedChats = /* @__PURE__ */ new Set();
|
|
739
|
-
/**
|
|
740
|
-
* 根据姓名解析 open_id
|
|
741
|
-
* 如果缓存中没有,返回 undefined
|
|
742
|
-
*/
|
|
743
|
-
resolve(name) {
|
|
744
|
-
if (this.nameMap.has(name)) return this.nameMap.get(name);
|
|
745
|
-
for (const [key, value] of this.nameMap) {
|
|
746
|
-
if (key.includes(name) || name.includes(key)) return value;
|
|
747
|
-
}
|
|
748
|
-
return void 0;
|
|
749
|
-
}
|
|
750
|
-
/**
|
|
751
|
-
* 加载某个群的成员列表到缓存
|
|
752
|
-
*/
|
|
753
|
-
async loadChatMembers(chatId) {
|
|
754
|
-
if (this.loadedChats.has(chatId)) return;
|
|
755
|
-
try {
|
|
756
|
-
let pageToken;
|
|
757
|
-
do {
|
|
758
|
-
const response = await this.client.im.chatMembers.get({
|
|
759
|
-
path: { chat_id: chatId },
|
|
760
|
-
params: {
|
|
761
|
-
member_id_type: "open_id",
|
|
762
|
-
page_size: 100,
|
|
763
|
-
...pageToken ? { page_token: pageToken } : {}
|
|
764
|
-
}
|
|
765
|
-
});
|
|
766
|
-
const items = response.data?.items || [];
|
|
767
|
-
for (const item of items) {
|
|
768
|
-
if (item.name && item.member_id) {
|
|
769
|
-
this.nameMap.set(item.name, item.member_id);
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
pageToken = response.data?.has_more ? response.data?.page_token : void 0;
|
|
773
|
-
} while (pageToken);
|
|
774
|
-
this.loadedChats.add(chatId);
|
|
775
|
-
} catch (err) {
|
|
776
|
-
console.error(`[user-resolver] \u52A0\u8F7D\u7FA4\u6210\u5458\u5931\u8D25:`, err.message);
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
/**
|
|
780
|
-
* 获取当前所有已缓存的映射
|
|
781
|
-
*/
|
|
782
|
-
getAll() {
|
|
783
|
-
return new Map(this.nameMap);
|
|
784
|
-
}
|
|
785
|
-
};
|
|
786
|
-
|
|
787
744
|
// src/index.ts
|
|
788
745
|
async function main() {
|
|
789
746
|
const config = loadConfig();
|