@lih-x-x/kmr 1.0.13 → 1.0.15

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.
@@ -12,7 +12,7 @@ var DEFAULT_CONFIG = {
12
12
  appSecret: ""
13
13
  },
14
14
  agent: {
15
- provider: "claude-code",
15
+ provider: "claude",
16
16
  timeout: 12e4
17
17
  },
18
18
  storage: {
@@ -41,9 +41,9 @@ function loadConfig() {
41
41
  function getAgentProvider() {
42
42
  try {
43
43
  const config = loadConfig();
44
- return config.agent.provider || "claude-code";
44
+ return config.agent.provider || "claude";
45
45
  } catch {
46
- return "claude-code";
46
+ return "claude";
47
47
  }
48
48
  }
49
49
 
package/dist/cli.js CHANGED
@@ -20,7 +20,7 @@ async function checkUpdate() {
20
20
  }
21
21
  var command = argv[2];
22
22
  if (command === "init") {
23
- const { initConfig, getKmrDir } = await import("./config-RQEJ5HZN.js");
23
+ const { initConfig, getKmrDir } = await import("./config-L2SVVMAR.js");
24
24
  const path = await import("path");
25
25
  const kmrDir = getKmrDir();
26
26
  console.log(`\u521D\u59CB\u5316 KMR \u914D\u7F6E\u76EE\u5F55: ${kmrDir}`);
@@ -4,7 +4,7 @@ import {
4
4
  getKmrDir,
5
5
  initConfig,
6
6
  loadConfig
7
- } from "./chunk-HN3ZXS6B.js";
7
+ } from "./chunk-ZXGVA5QX.js";
8
8
  export {
9
9
  KMR_DIR,
10
10
  getAgentProvider,
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  KMR_DIR,
3
3
  getAgentProvider,
4
4
  loadConfig
5
- } from "./chunk-HN3ZXS6B.js";
5
+ } from "./chunk-ZXGVA5QX.js";
6
6
 
7
7
  // src/lark/client.ts
8
8
  import * as lark from "@larksuiteoapi/node-sdk";
@@ -446,7 +446,7 @@ var ClaudeCodeProvider = class {
446
446
  this.timeout = timeout;
447
447
  }
448
448
  timeout;
449
- name = "claude-code";
449
+ name = "claude";
450
450
  async extract(content) {
451
451
  const prompt = EXTRACT_PROMPT + content;
452
452
  console.log(`[ClaudeCodeProvider] \u63D0\u53D6\u4FE1\u606F\u7684 prompt:
@@ -487,7 +487,7 @@ ${prompt}
487
487
  }
488
488
  async callAcpx(prompt) {
489
489
  const provider = getAgentProvider();
490
- const agentCmd = provider === "codex" ? "codex" : "claude";
490
+ const agentCmd = provider === "codex" ? "codex" : provider;
491
491
  console.log(`[agent] \u4F7F\u7528 ${agentCmd} \u6267\u884C\u63D0\u53D6`);
492
492
  try {
493
493
  const { stdout } = await execFileAsync("acpx", ["--allowed-tools", "", agentCmd, "exec", prompt], {
@@ -874,7 +874,7 @@ var SessionManager = class {
874
874
  }
875
875
  getAgentCmd() {
876
876
  const provider = getAgentProvider();
877
- return provider === "codex" ? "codex" : "claude";
877
+ return provider === "codex" ? "codex" : provider;
878
878
  }
879
879
  async ensureSession(userId) {
880
880
  const existing = this.activeSessions.get(userId);
@@ -1030,6 +1030,65 @@ var TaskCreator = class {
1030
1030
  }
1031
1031
  };
1032
1032
 
1033
+ // src/lark/userResolver.ts
1034
+ var UserResolver = class {
1035
+ constructor(client) {
1036
+ this.client = client;
1037
+ }
1038
+ client;
1039
+ // name -> openId 映射(支持多个群的成员合并)
1040
+ nameMap = /* @__PURE__ */ new Map();
1041
+ loadedChats = /* @__PURE__ */ new Set();
1042
+ /**
1043
+ * 根据姓名解析 open_id
1044
+ * 如果缓存中没有,返回 undefined
1045
+ */
1046
+ resolve(name) {
1047
+ if (this.nameMap.has(name)) return this.nameMap.get(name);
1048
+ for (const [key, value] of this.nameMap) {
1049
+ if (key.includes(name) || name.includes(key)) return value;
1050
+ }
1051
+ return void 0;
1052
+ }
1053
+ /**
1054
+ * 加载某个群的成员列表到缓存
1055
+ */
1056
+ async loadChatMembers(chatId) {
1057
+ if (this.loadedChats.has(chatId)) return;
1058
+ console.log(`[user-resolver] \u52A0\u8F7D\u7FA4\u6210\u5458: chatId=${chatId}`);
1059
+ try {
1060
+ let pageToken;
1061
+ do {
1062
+ const response = await this.client.im.chatMembers.get({
1063
+ path: { chat_id: chatId },
1064
+ params: {
1065
+ member_id_type: "open_id",
1066
+ page_size: 100,
1067
+ ...pageToken ? { page_token: pageToken } : {}
1068
+ }
1069
+ });
1070
+ const items = response.data?.items || [];
1071
+ for (const item of items) {
1072
+ if (item.name && item.member_id) {
1073
+ this.nameMap.set(item.name, item.member_id);
1074
+ }
1075
+ }
1076
+ pageToken = response.data?.has_more ? response.data?.page_token : void 0;
1077
+ } while (pageToken);
1078
+ this.loadedChats.add(chatId);
1079
+ console.log(`[user-resolver] \u7FA4\u6210\u5458\u52A0\u8F7D\u5B8C\u6210, \u5F53\u524D\u6620\u5C04\u6570: ${this.nameMap.size}`);
1080
+ } catch (err) {
1081
+ console.error(`[user-resolver] \u52A0\u8F7D\u7FA4\u6210\u5458\u5931\u8D25:`, err.message);
1082
+ }
1083
+ }
1084
+ /**
1085
+ * 获取当前所有已缓存的映射
1086
+ */
1087
+ getAll() {
1088
+ return new Map(this.nameMap);
1089
+ }
1090
+ };
1091
+
1033
1092
  // src/index.ts
1034
1093
  async function main() {
1035
1094
  const config = loadConfig();
@@ -1041,8 +1100,9 @@ async function main() {
1041
1100
  const queryHandler = new QueryHandler(agent, config.storage.dataDir);
1042
1101
  const sessionManager = new SessionManager(KMR_DIR, config.agent.timeout);
1043
1102
  const taskCreator = new TaskCreator(client);
1103
+ const userResolver = new UserResolver(client);
1044
1104
  const pendingConfirmations = /* @__PURE__ */ new Map();
1045
- const dispatcher = createEventDispatcher(async (messageId, text, _chatId, senderId, meta) => {
1105
+ const dispatcher = createEventDispatcher(async (messageId, text, chatId, senderId, meta) => {
1046
1106
  const parsed = parseMessage(text);
1047
1107
  console.log(`[route] \u6D88\u606F\u8DEF\u7531: type=${parsed.type}, messageId=${messageId}, isGroup=${meta.isGroup}, isMentioned=${meta.isMentioned}`);
1048
1108
  if (meta.isGroup && !meta.isMentioned && parsed.type === "document_link" /* DOCUMENT_LINK */) {
@@ -1073,6 +1133,7 @@ async function main() {
1073
1133
  await messenger.replyMeetingSummary(messageId, record);
1074
1134
  console.log(`[reply] \u5DF2\u53D1\u9001\u4F1A\u8BAE\u6458\u8981\u56DE\u590D`);
1075
1135
  if (record.todos.length > 0) {
1136
+ await userResolver.loadChatMembers(chatId);
1076
1137
  const oldPending = pendingConfirmations.get(senderId);
1077
1138
  if (oldPending) clearTimeout(oldPending.timer);
1078
1139
  const timer = setTimeout(() => {
@@ -1086,6 +1147,7 @@ async function main() {
1086
1147
  meetingId: record.id,
1087
1148
  todos: record.todos,
1088
1149
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
1150
+ chatId,
1089
1151
  timer
1090
1152
  });
1091
1153
  await messenger.replyTodoConfirmation(messageId, record.todos);
@@ -1149,12 +1211,16 @@ async function main() {
1149
1211
  const results = [];
1150
1212
  for (const todo of selectedTodos) {
1151
1213
  try {
1214
+ const ownerOpenId = userResolver.resolve(todo.owner) || senderId;
1215
+ if (ownerOpenId !== senderId) {
1216
+ console.log(`[task] \u8D1F\u8D23\u4EBA "${todo.owner}" -> ${ownerOpenId}`);
1217
+ }
1152
1218
  const result = await taskCreator.createTask({
1153
1219
  summary: `${todo.content}\uFF08${todo.owner}\uFF09`,
1154
1220
  due: todo.deadline,
1155
1221
  description: `\u6765\u6E90\u4F1A\u8BAE: ${pending.meetingId}
1156
1222
  \u8D1F\u8D23\u4EBA: ${todo.owner}`,
1157
- assigneeOpenId: senderId
1223
+ assigneeOpenId: ownerOpenId
1158
1224
  });
1159
1225
  results.push({ summary: todo.content, success: true, taskId: result.taskId, url: result.url });
1160
1226
  console.log(`\u2705 \u4EFB\u52A1\u521B\u5EFA\u6210\u529F: ${todo.content}`);
@@ -284,8 +284,8 @@ async function renderSettings() {
284
284
  '<div class="form-field">' +
285
285
  '<label class="form-label">Provider</label>' +
286
286
  '<select class="form-select" id="cfg-provider">' +
287
- '<option value="claude-code"' + (config.agent.provider === 'claude-code' ? ' selected' : '') + '>Claude Code</option>' +
288
- '<option value="codex"' + (config.agent.provider === 'codex' ? ' selected' : '') + '>Codex</option>' +
287
+ '<option value="claude"' + (config.agent.provider === 'claude' ? ' selected' : '') + '>claude</option>' +
288
+ '<option value="codex"' + (config.agent.provider === 'codex' ? ' selected' : '') + '>codex</option>' +
289
289
  '</select>' +
290
290
  '</div>' +
291
291
  '<div class="form-field">' +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lih-x-x/kmr",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {