chattercatcher 0.1.11 → 0.1.12

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/cli.js CHANGED
@@ -8,7 +8,7 @@ import fs13 from "fs/promises";
8
8
  // package.json
9
9
  var package_default = {
10
10
  name: "chattercatcher",
11
- version: "0.1.11",
11
+ version: "0.1.12",
12
12
  description: "\u672C\u5730\u4F18\u5148\u7684\u98DE\u4E66/Lark \u5BB6\u5EAD\u7FA4\u77E5\u8BC6\u5E93\u673A\u5668\u4EBA",
13
13
  type: "module",
14
14
  main: "dist/index.js",
@@ -88,6 +88,7 @@ var appConfigSchema = z.object({
88
88
  feishu: z.object({
89
89
  domain: z.enum(["feishu", "lark"]).default("feishu"),
90
90
  appId: z.string().default(""),
91
+ botOpenId: z.string().default(""),
91
92
  groupPolicy: z.enum(["open", "allowlist", "disabled"]).default("open"),
92
93
  requireMention: z.boolean().default(true)
93
94
  }),
@@ -2106,12 +2107,22 @@ function stripMentions(text, mentions) {
2106
2107
  }
2107
2108
  return result.replace(/@/g, " ").replace(/\s+/g, " ").trim();
2108
2109
  }
2109
- function isFeishuMessageAddressedToBot(payload) {
2110
+ function isMentionForBot(mention, config) {
2111
+ if (!config.feishu.botOpenId) {
2112
+ return false;
2113
+ }
2114
+ return mention.id?.open_id === config.feishu.botOpenId;
2115
+ }
2116
+ function getBotMentions(payload, config) {
2117
+ const message = payload.event?.message;
2118
+ return (message?.mentions ?? []).filter((mention) => isMentionForBot(mention, config));
2119
+ }
2120
+ function isFeishuMessageAddressedToBot(payload, config) {
2110
2121
  const message = payload.event?.message;
2111
2122
  if (!message || message.message_type !== "text") {
2112
2123
  return false;
2113
2124
  }
2114
- return (message.mentions ?? []).length > 0;
2125
+ return getBotMentions(payload, config).length > 0;
2115
2126
  }
2116
2127
  function getFeishuQuestionDecision(payload, config) {
2117
2128
  const message = payload.event?.message;
@@ -2121,9 +2132,9 @@ function getFeishuQuestionDecision(payload, config) {
2121
2132
  reason: "\u4E0D\u662F\u53EF\u56DE\u7B54\u7684\u6587\u672C\u6D88\u606F\u3002"
2122
2133
  };
2123
2134
  }
2124
- const mentions = message.mentions ?? [];
2135
+ const mentions = getBotMentions(payload, config);
2125
2136
  const text = parseTextContent(message.content);
2126
- const hasMention = isFeishuMessageAddressedToBot(payload);
2137
+ const hasMention = isFeishuMessageAddressedToBot(payload, config);
2127
2138
  if (config.feishu.requireMention && !hasMention) {
2128
2139
  return {
2129
2140
  shouldAnswer: false,
@@ -2300,7 +2311,7 @@ function createFeishuEventDispatcher(options) {
2300
2311
  return new lark2.EventDispatcher({}).register({
2301
2312
  "im.message.receive_v1": async (data2) => {
2302
2313
  const payload = { event: data2 };
2303
- if (options.questionHandler && isFeishuMessageAddressedToBot(payload)) {
2314
+ if (options.questionHandler && isFeishuMessageAddressedToBot(payload, options.config)) {
2304
2315
  const platformMessageId = data2?.message?.message_id;
2305
2316
  if (platformMessageId && answeredMessageIds.has(platformMessageId)) {
2306
2317
  console.log("\u98DE\u4E66\u63D0\u95EE\u91CD\u590D\u6295\u9012\uFF1A\u5DF2\u8DF3\u8FC7\u56DE\u7B54\u3002");
@@ -3580,6 +3591,10 @@ async function promptForConfiguration(config, secrets) {
3580
3591
  default: config.feishu.domain
3581
3592
  });
3582
3593
  config.feishu.appId = await input({ message: "\u98DE\u4E66 App ID", default: config.feishu.appId });
3594
+ config.feishu.botOpenId = await input({
3595
+ message: "\u98DE\u4E66\u673A\u5668\u4EBA Open ID\uFF08\u5FC5\u586B\uFF0C\u7528\u4E8E\u533A\u5206 @ \u673A\u5668\u4EBA\u548C @ \u5176\u4ED6\u4EBA\uFF09",
3596
+ default: config.feishu.botOpenId
3597
+ });
3583
3598
  secrets.feishu.appSecret = applySecretInput(
3584
3599
  secrets.feishu.appSecret,
3585
3600
  await password({ message: secrets.feishu.appSecret ? "\u98DE\u4E66 App Secret\uFF08\u7559\u7A7A\u4FDD\u7559\uFF09" : "\u98DE\u4E66 App Secret", mask: "*" })
@@ -3611,7 +3626,7 @@ async function promptForConfiguration(config, secrets) {
3611
3626
  config.embedding.dimension = dimension ?? null;
3612
3627
  config.web.port = await number({ message: "Web UI \u7AEF\u53E3", default: config.web.port, required: true }) ?? config.web.port;
3613
3628
  config.feishu.requireMention = await confirm({
3614
- message: "\u7FA4\u804A\u56DE\u7B54\u662F\u5426\u8981\u6C42 @ChatterCatcher\uFF1F",
3629
+ message: "\u7FA4\u804A\u56DE\u7B54\u662F\u5426\u8981\u6C42 @ \u673A\u5668\u4EBA\uFF1F",
3615
3630
  default: config.feishu.requireMention
3616
3631
  });
3617
3632
  }