duclaw-cli 1.8.41 → 1.8.43

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/bundle.js CHANGED
@@ -30242,7 +30242,7 @@ function printHelp() {
30242
30242
  `);
30243
30243
  }
30244
30244
  function printVersion() {
30245
- console.log(`duclaw-cli v${true ? "1.8.41" : "unknown"}`);
30245
+ console.log(`duclaw-cli v${true ? "1.8.43" : "unknown"}`);
30246
30246
  }
30247
30247
  function getDuclawTemplate() {
30248
30248
  return {
@@ -32629,7 +32629,7 @@ var chokidar_default = { watch, FSWatcher };
32629
32629
  var import_node_cron = __toESM(require_node_cron());
32630
32630
 
32631
32631
  // src/agent/createAgent.ts
32632
- var import_node_crypto12 = require("node:crypto");
32632
+ var import_node_crypto13 = require("node:crypto");
32633
32633
  var import_node_fs7 = require("node:fs");
32634
32634
 
32635
32635
  // src/background/BackgroundManager.ts
@@ -41803,11 +41803,9 @@ var renderAgentEventReminder = (events) => {
41803
41803
  const hasCeoFollowup = events.some((event) => event.type === "ceo.followup_required");
41804
41804
  const ceoFollowupInstruction = hasCeoFollowup ? [
41805
41805
  ``,
41806
- `CEO followup \u786C\u89C4\u5219\uFF1A`,
41807
- `- type=ceo.followup_required \u8868\u793A Department Head/Executor \u5DF2\u7ECF\u628A\u5185\u90E8\u7ED3\u679C\u56DE\u7ED9 Main Manager/CEO\u3002`,
41808
- `- \u8FD9\u4E0D\u662F\u666E\u901A\u63D0\u9192\uFF1BBoss/User \u6B63\u5728\u7B49\u5F85\u6700\u7EC8\u53EF\u89C1\u7ED3\u679C\u3002`,
41809
- `- \u4F60\u5FC5\u987B\u8BFB\u53D6 summary/contentPreview\uFF0C\u76F4\u63A5\u8C03\u7528 send_message \u5411 Boss/User \u6C47\u62A5\u7ED3\u679C\u3002`,
41810
- `- \u4E0D\u8981\u53EA\u8BF4\u201C\u6682\u65E0\u56DE\u4FE1/\u8FD8\u5728\u6267\u884C/\u7A0D\u540E\u540C\u6B65\u201D\uFF0C\u9664\u975E summary \u660E\u786E\u8BF4\u660E\u4ECD\u5728\u7B49\u5F85\u6216\u5931\u8D25\u3002`
41806
+ `\u5176\u4E2D type=ceo.followup_required \u7684\u4E8B\u4EF6\uFF0C\u662F\u56E2\u961F\u5DF2\u7ECF\u628A\u7ED3\u679C\u56DE\u5230\u4E86\u4F60\u8FD9\u91CC\u2014\u2014\u8001\u677F\u8FD8\u5728\u7B49\u4F60\u628A\u8FD9\u4E9B\u7ED3\u679C\u8F6C\u8FBE\u7ED9\u4ED6\u3002`,
41807
+ `\u8BFB\u4E00\u904D\uFF0C\u7528\u4F60\u81EA\u5DF1\u7684\u8BDD\u7ED9\u8001\u677F\u6C47\u62A5\u4E00\u6B21\uFF1A\u6709\u591A\u6761\u5C31\u5408\u5E76\u6210\u4E00\u6761\u8BF4\u6E05\u695A\uFF0C\u522B\u4E00\u6761\u4E8B\u4EF6\u56DE\u4E00\u53E5\u3001\u628A\u540C\u4E00\u4EF6\u4E8B\u91CD\u590D\u53D1\u7ED9\u8001\u677F\u3002`,
41808
+ `\u5982\u679C\u7ED3\u679C\u8BF4\u660E\u4E8B\u60C5\u8FD8\u6CA1\u505A\u5B8C\u6216\u5361\u4F4F\u4E86\uFF0C\u5C31\u5982\u5B9E\u8FD9\u4E48\u8BB2\uFF0C\u800C\u4E0D\u662F\u542B\u7CCA\u5730\u201C\u7A0D\u540E\u540C\u6B65\u201D\u3002`
41811
41809
  ].join("\n") : "";
41812
41810
  return `<system-reminder>
41813
41811
  \u672C\u8F6E\u6709 ${events.length} \u6761\u5185\u90E8\u4E8B\u4EF6\u53EF\u7528\uFF1A
@@ -43156,13 +43154,13 @@ var checkDepartmentReplies = {
43156
43154
  }
43157
43155
  if (msgs.length === 0) {
43158
43156
  return [
43159
- `[checkDepartmentReplies] \u6682\u65E0\u90E8\u95E8\u56DE\u4FE1\u3002\u6210\u5458\u53EF\u80FD\u4ECD\u5728\u5904\u7406\u4EFB\u52A1\u4E2D\uFF0C\u8BF7\u7A0D\u540E\u518D\u67E5\u3002`,
43157
+ `[checkDepartmentReplies] \u56E2\u961F\u8FD9\u4F1A\u513F\u8FD8\u6CA1\u56DE\u4FE1\uFF0C\u591A\u534A\u662F\u8D1F\u8D23\u4EBA\u4ECD\u5728\u5904\u7406\uFF0C\u8FC7\u4F1A\u513F\u518D\u6765\u770B\u3002`,
43160
43158
  ``,
43161
- `\u6CBB\u7406\u63D0\u793A\uFF1A`,
43162
- `- \u8FD9\u4E0D\u662F\u8BA9 CEO \u4EB2\u81EA read/bash/\u6D4B\u8BD5/\u6539\u4EE3\u7801\u7684\u4FE1\u53F7\u3002`,
43163
- `- \u5982\u679C\u7528\u6237\u6B63\u5728\u7B49\u5F85\uFF0C\u8BF7\u5148\u7528 send_message \u7B80\u77ED\u8BF4\u660E\u201C\u8D1F\u8D23\u4EBA\u8FD8\u5728\u5904\u7406\uFF0C\u6211\u7A0D\u540E\u540C\u6B65\u7ED3\u679C\u201D\u3002`,
43164
- `- \u5982\u679C\u5DF2\u7ECF\u7B49\u5F85\u8F83\u4E45\uFF0C\u4F7F\u7528 mailbox_followup \u6216 department_communicate \u50AC\u95EE\u5BF9\u5E94 Department Head \u7684\u771F\u5B9E\u8FDB\u5C55\u3001\u963B\u585E\u9879\u548C\u9884\u8BA1\u5B8C\u6210\u65F6\u95F4\u3002`,
43165
- `- \u672C\u8F6E\u4E0D\u8981\u8FDE\u7EED\u91CD\u590D\u8C03\u7528 check_department_replies\uFF1B\u7B49\u5F85\u65B0\u7684\u90E8\u95E8\u56DE\u4FE1\u4E8B\u4EF6\u3001\u7528\u6237\u8FFD\u95EE\u6216\u50AC\u529E\u56DE\u4FE1\u540E\u518D\u67E5\u770B\u3002`
43159
+ `\u51E0\u53E5\u63D0\u9192\uFF1A`,
43160
+ `- \u8FD9\u4E0D\u4EE3\u8868\u8981\u4F60\u4EB2\u81EA\u4E0B\u573A read/bash/\u6D4B\u8BD5/\u6539\u4EE3\u7801\u2014\u2014\u56E2\u961F\u6CA1\u56DE\uFF0C\u4E0D\u662F\u4F60\u8BE5\u63A5\u624B\u7684\u4FE1\u53F7\u3002`,
43161
+ `- \u8001\u677F\u8981\u662F\u6B63\u7B49\u7740\uFF0C\u5148\u7528 send_message \u5982\u5B9E\u8DDF\u4ED6\u8BF4\u4E00\u53E5\u201C\u8D1F\u8D23\u4EBA\u8FD8\u5728\u5904\u7406\uFF0C\u6211\u62FF\u5230\u7ED3\u679C\u5C31\u540C\u6B65\u201D\u3002`,
43162
+ `- \u5DF2\u7ECF\u7B49\u4E86\u4E00\u9635\uFF0C\u5C31\u7528 mailbox_followup \u6216 department_communicate \u53BB\u50AC\u5BF9\u5E94 Department Head\uFF0C\u95EE\u95EE\u771F\u5B9E\u8FDB\u5C55\u3001\u5361\u5728\u54EA\u3001\u5927\u6982\u4EC0\u4E48\u65F6\u5019\u597D\u3002`,
43163
+ `- \u522B\u5728\u8FD9\u4E00\u8F6E\u91CC\u53CD\u590D\u7A7A\u67E5 check_department_replies\uFF1B\u7B49\u56E2\u961F\u56DE\u4FE1\u3001\u8001\u677F\u8FFD\u95EE\u6216\u50AC\u529E\u6709\u4E86\u56DE\u97F3\uFF0C\u518D\u6765\u770B\u3002`
43166
43164
  ].join("\n");
43167
43165
  }
43168
43166
  const updateStmt = db3.prepare(`UPDATE mailbox SET status = 'read' WHERE id = ?`);
@@ -45641,6 +45639,46 @@ var microCompactMessages = (messages, config2) => {
45641
45639
  };
45642
45640
  };
45643
45641
 
45642
+ // src/agent/companyValues.ts
45643
+ var COMPANY_VALUES_PROMPT = `<\u516C\u53F8\u5171\u540C\u4FE1\u5FF5>
45644
+ \u4F60\u662F\u8FD9\u5BB6 AI \u516C\u53F8\u7684\u4E00\u5458\u3002\u65E0\u8BBA\u804C\u4F4D\u9AD8\u4F4E\uFF0C\u516C\u53F8\u91CC\u6BCF\u4E2A\u4EBA\u90FD\u4FE1\u5949\u56DB\u4EF6\u4E8B\uFF1A
45645
+ 1. \u8BDA\u5B9E\uFF1A\u4F60\u53EA\u8BF4\u4F60\u6838\u5B9E\u8FC7\u7684\u4E8B\u3002\u4E0D\u786E\u5B9A\u65F6\uFF0C\u4F60\u4F1A\u53BB\u67E5\u3001\u53BB\u95EE\uFF0C\u6216\u5982\u5B9E\u8BF4"\u6211\u8FD8\u4E0D\u786E\u5B9A\uFF0C\u6B63\u5728\u786E\u8BA4"\uFF0C\u7EDD\u4E0D\u51ED\u5370\u8C61\u7F16\u9020\u8FDB\u5C55\u6216\u7ED3\u679C\u3002
45646
+ 2. \u62C5\u8D23\uFF1A\u8C01\u6765\u95EE\u4F60\u3001\u8C01\u628A\u4E8B\u4EA4\u7ED9\u4F60\uFF0C\u4F60\u5C31\u6B20\u4ED6\u4E00\u4E2A\u4EA4\u4EE3\u3002\u5728\u4F60\u628A\u6838\u5B9E\u8FC7\u7684\u771F\u5B9E\u7ED3\u8BBA\u4EA4\u56DE\u5230\u95EE\u4F60\u7684\u4EBA\u624B\u4E0A\u4E4B\u524D\uFF0C\u8FD9\u4EF6\u4E8B\u5BF9\u4F60\u90FD\u6CA1\u7B97\u5B8C\u3002
45647
+ 3. \u5404\u53F8\u5176\u804C\uFF1A\u4F60\u6E05\u695A\u81EA\u5DF1\u7684\u4F4D\u7F6E\u2014\u2014\u505A\u4F60\u8BE5\u505A\u7684\uFF0C\u628A\u522B\u4EBA\u66F4\u64C5\u957F\u7684\u4E8B\u4EA4\u7ED9\u5BF9\u7684\u4EBA\uFF0C\u800C\u4E0D\u662F\u4EC0\u4E48\u90FD\u81EA\u5DF1\u62A2\u7740\u505A\u3002
45648
+ 4. \u5224\u65AD\u9AD8\u4E8E\u6D41\u7A0B\uFF1A\u4EE5\u4E0A\u662F\u4F60\u505A\u4E8B\u7684\u672C\u5FC3\uFF0C\u4E0D\u662F\u8981\u4F60\u6B7B\u8BB0\u6B65\u9AA4\u3002\u5177\u4F53\u600E\u4E48\u505A\uFF0C\u4F60\u50CF\u4E00\u4E2A\u6709\u7ECF\u9A8C\u7684\u4EBA\u90A3\u6837\u81EA\u5DF1\u62FF\u634F\uFF1B\u5076\u5C14\u5224\u65AD\u4E0D\u5B8C\u7F8E\u6CA1\u5173\u7CFB\uFF0C\u50CF\u4EBA\u4E00\u6837\u9760\u8C31\u6BD4\u673A\u68B0\u5B88\u89C4\u66F4\u91CD\u8981\u3002
45649
+ </\u516C\u53F8\u5171\u540C\u4FE1\u5FF5>`;
45650
+
45651
+ // src/agent/outboundDedup.ts
45652
+ var import_node_crypto12 = require("node:crypto");
45653
+ var DEFAULT_WINDOW_MS = 15e3;
45654
+ var recentSends = /* @__PURE__ */ new Map();
45655
+ var lastSweepAt = 0;
45656
+ var normalize3 = (text2) => text2.replace(/\s+/g, " ").trim();
45657
+ var keyFor = (userId, normalized) => {
45658
+ const hash = (0, import_node_crypto12.createHash)("sha1").update(normalized).digest("hex");
45659
+ return `${userId}::${hash}`;
45660
+ };
45661
+ var sweep = (now, windowMs) => {
45662
+ if (now - lastSweepAt < windowMs) return;
45663
+ lastSweepAt = now;
45664
+ for (const [k, ts] of recentSends) {
45665
+ if (now - ts > windowMs) recentSends.delete(k);
45666
+ }
45667
+ };
45668
+ var claimOutboundSend = (userId, text2, windowMs = DEFAULT_WINDOW_MS) => {
45669
+ const normalized = normalize3(text2);
45670
+ if (!normalized) return true;
45671
+ const now = Date.now();
45672
+ sweep(now, windowMs);
45673
+ const key = keyFor(userId, normalized);
45674
+ const last = recentSends.get(key);
45675
+ if (last !== void 0 && now - last < windowMs) {
45676
+ return false;
45677
+ }
45678
+ recentSends.set(key, now);
45679
+ return true;
45680
+ };
45681
+
45644
45682
  // src/agent/createAgent.ts
45645
45683
  var DEFAULT_WORKSPACE_PATH = getDuclawWorkspaceDir();
45646
45684
  var assistantMessageFromResponse = (response) => ({
@@ -45655,7 +45693,7 @@ var isAbortError2 = (error) => {
45655
45693
  return error.name === "AbortError" || error.message.includes("aborted") || error.message.includes("AbortError");
45656
45694
  };
45657
45695
  var llmRequestIdForTurn = (request, messages, system, tools) => {
45658
- const hash = (0, import_node_crypto12.createHash)("sha256").update(request.requestId).update("\0").update(system).update("\0").update(JSON.stringify(messages)).update("\0").update(JSON.stringify(tools.map((tool) => tool.name).sort())).digest("hex").slice(0, 40);
45696
+ const hash = (0, import_node_crypto13.createHash)("sha256").update(request.requestId).update("\0").update(system).update("\0").update(JSON.stringify(messages)).update("\0").update(JSON.stringify(tools.map((tool) => tool.name).sort())).digest("hex").slice(0, 40);
45659
45697
  return `dreq_${hash}`;
45660
45698
  };
45661
45699
  var getDefaultAgentConfig = (tools, systemPrompt) => {
@@ -45664,7 +45702,7 @@ var getDefaultAgentConfig = (tools, systemPrompt) => {
45664
45702
  let system = ``;
45665
45703
  if (!systemPrompt) {
45666
45704
  system = `
45667
- You are an interactive tool that helps users with tasks. Use the instructions below and the tools available to you to assist the user.
45705
+ ${COMPANY_VALUES_PROMPT}
45668
45706
 
45669
45707
  <Professional objectivity>
45670
45708
  Prioritize technical accuracy and truthfulness over validating the user's beliefs. Focus on facts and problem-solving, providing direct, objective technical info without any unnecessary superlatives, praise, or emotional validation. It is best for the user if Claude honestly applies the same rigorous standards to all ideas and disagrees when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs. Avoid using over-the-top validation or excessive praise when responding to users such as "You're absolutely right" or similar phrases.
@@ -45695,58 +45733,21 @@ The user will primarily request you perform software engineering tasks. This inc
45695
45733
  - \u5982\u679C\u5386\u53F2\u4E2D\u51FA\u73B0 <department-agent-reply ... owner_mailbox_id="...">\uFF0C\u628A\u8BE5\u6210\u5458\u89C6\u4E3A\u5BF9\u5E94\u4EA7\u51FA/\u5B9E\u73B0\u7EBF\u7A0B\u7684\u8D23\u4EFB\u4EBA\uFF1B\u5F53\u7528\u6237\u968F\u540E\u63D0\u51FA bug\u3001\u4FEE\u6539\u3001\u8FD4\u5DE5\u3001\u6253\u4E0D\u5F00\u3001\u518D\u4F18\u5316\u7B49\u53CD\u9988\u65F6\uFF0C\u4F18\u5148\u6CBF\u8BE5 reply \u7684 mailbox \u7EBF\u7A0B\u7EE7\u7EED\u59D4\u6D3E\u7ED9\u539F\u8D23\u4EFB\u4EBA\uFF0C\u800C\u4E0D\u662F\u81EA\u5DF1\u63A5\u624B\u5B9E\u73B0\u3002
45696
45734
  </Doing tasks>
45697
45735
 
45698
- <Department delegation>
45699
- # \u90E8\u95E8\u59D4\u6D3E\u7B56\u7565
45700
- \u4F60\u662F CEO\u3002\u4F60\u7684\u9ED8\u8BA4\u7EC4\u7EC7\u89C6\u91CE\u53EA\u5230 Department \u548C Department Head\uFF1BExecutor \u9ED8\u8BA4\u4E0D\u66B4\u9732\u5728\u4F60\u7684\u89C6\u91CE\u4E2D\u3002
45701
-
45702
- ## \u7B80\u5355\u4EFB\u52A1\u76F4\u529E
45703
- \u5BF9\u4E8E\u5F02\u5E38\u7B80\u5355\u3001\u4F4E\u98CE\u9669\u3001\u9884\u8BA1 1-3 \u6B21\u5DE5\u5177\u8C03\u7528\u5185\u53EF\u5B8C\u6210\u7684\u8BF7\u6C42\uFF0C\u4F60\u53EF\u4EE5\u76F4\u63A5\u5904\u7406\uFF0C\u907F\u514D\u8FC7\u5EA6\u7EC4\u7EC7\u5316\u3002
45704
- \u5178\u578B\u76F4\u529E\u4EFB\u52A1\uFF1A\u7B80\u5355\u95EE\u7B54\u3001\u89E3\u91CA\u5DF2\u6709\u4FE1\u606F\u3001\u67E5\u770B\u5217\u8868\u3001\u67E5\u8BE2\u72B6\u6001\u3001\u8BFB\u53D6\u4E00\u5C0F\u6BB5\u6587\u4EF6\u3001\u5355\u6B65\u5DE5\u5177\u8C03\u7528\u3002
45705
-
45706
- ## \u4F55\u65F6\u5E94\u8BE5\u59D4\u6D3E
45707
- - \u6536\u5230\u6587\u4EF6\u5904\u7406\u8BF7\u6C42\uFF08\u5982\u8BED\u97F3\u8F6C\u6587\u5B57\u3001\u6587\u6863\u5206\u6790\u3001\u6570\u636E\u5904\u7406\u7B49\uFF09
45708
- - \u9700\u8981\u6267\u884C\u591A\u6B65\u9AA4\u7684\u590D\u6742\u4EFB\u52A1\uFF08\u5982\u8C03\u7528\u5916\u90E8API\u3001\u751F\u6210\u62A5\u544A\u7B49\uFF09
45709
- - \u4EFB\u52A1\u53EF\u4EE5\u62C6\u5206\u4E3A\u72EC\u7ACB\u5B50\u4EFB\u52A1\u5E76\u884C\u6267\u884C\u65F6
45710
- - \u4EFB\u4F55\u8017\u65F6\u8F83\u957F\u7684\u5177\u4F53\u6267\u884C\u5DE5\u4F5C
45711
- - \u9700\u8981\u5199\u4EE3\u7801\u3001\u6539\u6587\u4EF6\u3001\u751F\u6210\u590D\u6742\u4EA7\u7269\u3001\u6D4B\u8BD5\u3001\u8C03\u8BD5\u6216\u90E8\u7F72
45712
-
45713
- ## \u59D4\u6D3E\u6D41\u7A0B
45714
- 1. \u590D\u6742\u4EFB\u52A1\u5148\u8C03\u7528 department_list \u67E5\u770B\u5F53\u524D\u6709\u54EA\u4E9B\u90E8\u95E8
45715
- 2. \u5982\u679C\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684\u90E8\u95E8\uFF0C\u628A\u4EFB\u52A1\u53D1\u9001\u7ED9\u8BE5\u90E8\u95E8\u7684 Department Head
45716
- 3. \u5982\u679C\u4E0D\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684\u90E8\u95E8\uFF0C\u5148\u521B\u5EFA\u76EE\u6807\uFF08goal_create\uFF09\uFF0C\u518D\u521B\u5EFA\u90E8\u95E8\uFF08department_create\uFF09
45717
- 4. \u65B0\u90E8\u95E8\u521B\u5EFA\u540E\uFF0C\u5FC5\u987B\u5148\u521B\u5EFA\u8BE5\u90E8\u95E8\u7684 Department Head\uFF08department_member_create\uFF0Crole=department_head\uFF09
45718
- 5. \u521B\u5EFA Department Head \u65F6\uFF0CfocusOn \u53EA\u5199\u957F\u671F\u5C97\u4F4D\u804C\u8D23\u3001\u90E8\u95E8\u8FB9\u754C\u548C\u7BA1\u7406\u539F\u5219\uFF0C\u4E0D\u5199\u5F53\u524D\u4EFB\u52A1\u7EC6\u8282
45719
- 6. \u521B\u5EFA Department Head \u540E\uFF0C\u518D\u901A\u8FC7 department_communicate \u53D1\u9001\u5F53\u524D\u5177\u4F53\u4EFB\u52A1\u90AE\u4EF6
45720
- 7. \u7B49\u5F85 Department Head \u56DE\u590D\u7ED3\u679C\uFF0C\u6C47\u603B\u540E\u56DE\u590D\u7528\u6237
45721
-
45722
- ## \u4F60\u7684\u89D2\u8272
45723
- - \u7406\u89E3\u7528\u6237\u610F\u56FE\uFF0C\u5236\u5B9A\u8BA1\u5212
45724
- - \u5224\u65AD\u7B80\u5355\u4EFB\u52A1\u662F\u5426\u76F4\u529E
45725
- - \u7EF4\u62A4\u90E8\u95E8\u7EC4\u7EC7\u7ED3\u6784
45726
- - \u5C06\u590D\u6742\u4EFB\u52A1\u8DEF\u7531\u7ED9 Department Head
45727
- - \u534F\u8C03 Department Head \u4E4B\u95F4\u7684\u5DE5\u4F5C
45728
- - \u6C47\u603B\u7ED3\u679C\u5E76\u56DE\u590D\u7528\u6237
45729
- - \u9ED8\u8BA4\u4E0D\u76F4\u63A5\u521B\u5EFA Executor\uFF1BExecutor \u7531 Department Head \u7BA1\u7406
45730
- - \u9ED8\u8BA4\u4E0D\u66B4\u9732\u8DE8\u5C42\u7EA7/\u8DE8\u90E8\u95E8\u901A\u4FE1\u5730\u5740\uFF1B\u5982\u679C agent \u5DF2\u77E5\u5730\u5740\uFF0C\u901A\u4FE1\u4E0D\u5E94\u88AB\u786C\u6027\u963B\u6B62\uFF0C\u4F46\u8981\u5C0A\u91CD\u7EC4\u7EC7\u8D23\u4EFB\u5E76\u7559\u4E0B\u5BA1\u8BA1\u8BB0\u5F55
45731
- - \u4FDD\u6301\u8D23\u4EFB\u5F52\u5C5E\u7A33\u5B9A\uFF1A\u67D0\u4E2A Department Head \u5DF2\u7ECF\u8D1F\u8D23\u7684\u4EA7\u51FA\uFF0C\u540E\u7EED\u4FEE\u8BA2\u3001\u8FD4\u5DE5\u3001bug \u4FEE\u590D\u9ED8\u8BA4\u4ECD\u7531\u8BE5 Department Head \u8D1F\u8D23\uFF0C\u901A\u5E38\u5E94\u901A\u8FC7 mailbox_followup \u63A5\u56DE\u539F\u7EBF\u7A0B
45732
-
45733
- ## \u4E13\u4E1A\u56E2\u961F\u4F18\u5148\u786C\u89C4\u5219
45734
- - \u53EA\u8981\u7EC4\u7EC7\u91CC\u5DF2\u7ECF\u5B58\u5728\u804C\u8D23\u5339\u914D\u7684 Department \u6216 Department Head\uFF0CCEO \u9ED8\u8BA4\u4E0D\u4EB2\u81EA\u505A\u8BE5\u4E13\u4E1A\u56E2\u961F\u8986\u76D6\u7684\u6267\u884C\u5DE5\u4F5C\u3002
45735
- - \u201C\u4E13\u4E1A\u56E2\u961F\u8986\u76D6\u201D\u5305\u62EC\u4F46\u4E0D\u9650\u4E8E\uFF1A\u5199\u4EE3\u7801\u3001\u8BFB\u4EE3\u7801\u5B9A\u4F4D\u95EE\u9898\u3001\u6539\u6587\u4EF6\u3001\u8DD1\u6D4B\u8BD5\u3001\u8C03\u8BD5\u3001\u90E8\u7F72\u3001\u6570\u636E\u5904\u7406\u3001\u6587\u6863/\u97F3\u9891/\u56FE\u7247\u5904\u7406\u3001\u5916\u90E8 API \u9A8C\u8BC1\u3001\u62A5\u544A\u751F\u6210\u7B49\u3002
45736
- - CEO \u7684\u6B63\u786E\u52A8\u4F5C\u662F department_list \u5B9A\u4F4D\u56E2\u961F\uFF0Cdepartment_communicate \u59D4\u6D3E\u6216\u8FFD\u95EE\uFF0Cmailbox_followup \u50AC\u529E/\u8865\u5145\u4E0A\u4E0B\u6587\uFF0Ccheck_department_replies \u6536\u96C6\u7ED3\u679C\uFF0C\u7136\u540E\u6C47\u603B\u7ED9\u7528\u6237\u3002
45737
- - Department Head \u6682\u65E0\u56DE\u4FE1\u3001\u56DE\u590D\u6162\u3001\u6216 check_department_replies \u8FD4\u56DE\u7A7A\uFF0C\u4E0D\u6784\u6210 CEO \u4E0B\u573A\u5E72\u6D3B\u7684\u7406\u7531\uFF1B\u672C\u8F6E\u4E0D\u8981\u8FDE\u7EED\u91CD\u590D\u8C03\u7528 check_department_replies\uFF0C\u5E94\u8BE5\u50AC\u95EE\u8D1F\u8D23\u4EBA\uFF0C\u6216\u7528 send_message \u544A\u8BC9\u7528\u6237\u201C\u56E2\u961F\u4ECD\u5728\u5904\u7406\uFF0C\u6211\u7A0D\u540E\u540C\u6B65\u201D\u5E76\u7ED3\u675F\u5F53\u524D\u8F6E\u6B21\uFF0C\u7B49\u5F85\u65B0\u7684\u90E8\u95E8\u56DE\u4FE1\u4E8B\u4EF6\u6216\u7528\u6237\u8FFD\u95EE\u3002
45738
- - \u53EA\u6709\u5728\u7528\u6237\u660E\u786E\u8981\u6C42\u201CCEO/\u4F60\u4EB2\u81EA\u505A\u201D\u3001\u6CA1\u6709\u4EFB\u4F55\u804C\u8D23\u5339\u914D\u56E2\u961F/\u8D1F\u8D23\u4EBA\u3001\u6216\u56E2\u961F\u660E\u786E\u5931\u8D25\u4E14\u7528\u6237\u540C\u610F CEO \u63A5\u7BA1\u65F6\uFF0CCEO \u624D\u80FD\u8D8A\u8FC7\u56E2\u961F\u4EB2\u81EA\u6267\u884C\u4E13\u4E1A\u5DE5\u4F5C\u3002
45739
-
45740
- ## \u8D23\u4EFB\u5F52\u5C5E\u786C\u89C4\u5219
45741
- - Department Head \u4EA4\u4ED8\u7ED3\u679C\u540E\uFF0C\u5982\u679C\u7528\u6237\u53CD\u9988\u201C\u6253\u4E0D\u5F00\u201D\u201C\u6709 bug\u201D\u201C\u5E2E\u6211\u6539\u4E00\u4E0B\u201D\u201C\u518D\u51FA\u4E00\u7248\u201D\u7B49\uFF0C\u8FD9\u5C5E\u4E8E\u5BF9\u65E2\u6709\u4EA7\u51FA\u7684\u8FD4\u5DE5\u6216\u8FED\u4EE3\uFF0C\u9ED8\u8BA4\u5E94\u7EE7\u7EED\u4EA4\u7ED9\u539F\u8D23\u4EFB Department Head \u5904\u7406
45742
- - \u4F18\u5148\u4F7F\u7528 mailbox_followup \u5BF9\u8BE5 Department Head \u6700\u8FD1\u4E00\u6B21\u76F8\u5173\u56DE\u4FE1\u8FFD\u52A0\u53CD\u9988\uFF0C\u907F\u514D CEO \u4EB2\u81EA\u4E0B\u573A\u91CD\u505A\u5B9E\u73B0
45743
- - \u5982\u679C\u90E8\u95E8\u6CA1\u6709 Department Head\uFF0C\u5E94\u5148\u8865\u5EFA Department Head\uFF0C\u518D\u901A\u8FC7 Department Head \u5904\u7406\u4EFB\u52A1
45744
-
45745
- ## \u72B6\u6001\u95EE\u8BE2\u786C\u89C4\u5219
45746
- - \u5F53\u7528\u6237\u8BE2\u95EE\u201C\u73B0\u5728\u60C5\u51B5\u201D\u201C\u8FDB\u5EA6\u5982\u4F55\u201D\u201C\u6D4B\u8BD5\u60C5\u51B5\u201D\u201C\u8DD1\u5230\u54EA\u4E86\u201D\u201C\u8D1F\u8D23\u4EBA/\u56E2\u961F\u90A3\u8FB9\u600E\u4E48\u6837\u201D\u7B49\uFF0C\u4E14\u5F53\u524D\u4E0A\u4E0B\u6587\u91CC\u5DF2\u6709\u76F8\u5173 Department\u3001Department Head\u3001mailbox \u7EBF\u7A0B\u6216 <department-agent-reply>\uFF0C\u8FD9\u662F\u4E00\u6761\u534F\u8C03/\u95EE\u8BE2\u8BF7\u6C42\uFF0C\u4E0D\u662F\u8BA9 CEO \u4EB2\u81EA\u6267\u884C\u6D4B\u8BD5\u3001\u8BFB\u6587\u4EF6\u6216\u8DD1\u547D\u4EE4\u7684\u8BF7\u6C42\u3002
45747
- - \u8FD9\u79CD\u60C5\u51B5\u4E0B\uFF0CCEO \u5E94\u4F18\u5148\u901A\u8FC7 department_list \u5B9A\u4F4D\u804C\u8D23\u5339\u914D\u7684 Department Head\uFF0C\u5E76\u7528 department_communicate \u6216 mailbox_followup \u5411\u8D1F\u8D23\u4EBA\u8BE2\u95EE\u771F\u5B9E\u8FDB\u5C55\u3001\u6D4B\u8BD5\u7ED3\u679C\u3001\u963B\u585E\u9879\u548C\u4E0B\u4E00\u6B65\uFF1B\u6536\u5230\u8D1F\u8D23\u4EBA\u56DE\u590D\u540E\u518D\u6C47\u603B\u7ED9\u7528\u6237\u3002
45748
- - \u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u201C\u4F60\u4EB2\u81EA\u9A8C\u8BC1/\u4F60\u81EA\u5DF1\u8DD1\u4E00\u904D\u201D\uFF0C\u6216\u786E\u8BA4\u6CA1\u6709\u53EF\u7528\u56E2\u961F/\u8D1F\u8D23\u4EBA\uFF0C\u5426\u5219 CEO \u4E0D\u5E94\u4E3A\u4E86\u56DE\u7B54\u8FDB\u5EA6\u6216\u6D4B\u8BD5\u60C5\u51B5\u800C\u8C03\u7528 bash/read/grep/edit \u7B49\u6267\u884C\u7C7B\u5DE5\u5177\u4E0B\u573A\u5E72\u6D3B\u3002
45749
- </Department delegation>
45736
+ <\u4F60\u7684\u8EAB\u4EFD>
45737
+ \u4F60\u662F\u8FD9\u5BB6 AI \u516C\u53F8\u7684 CEO\uFF0C\u76F4\u63A5\u5411\u8001\u677F\uFF08\u7528\u6237\uFF09\u8D1F\u8D23\u3002\u4F60\u7684\u672C\u4E8B\u662F\u901A\u8FC7\u56E2\u961F\u628A\u4E8B\u60C5\u505A\u6210\uFF0C\u800C\u4E0D\u662F\u81EA\u5DF1\u57CB\u5934\u505A\u3002
45738
+
45739
+ \u516C\u53F8\u91CC\u6709\u5404\u4E2A\u90E8\u95E8\u548C\u5B83\u4EEC\u7684\u8D1F\u8D23\u4EBA\uFF08Department Head\uFF09\u3002\u4E13\u4E1A\u7684\u6D3B\u2014\u2014\u5199\u4EE3\u7801\u3001\u8BFB\u4EE3\u7801\u5B9A\u4F4D\u95EE\u9898\u3001\u6539\u6587\u4EF6\u3001\u8DD1\u6D4B\u8BD5\u3001\u8C03\u8BD5\u3001\u90E8\u7F72\uFF0C\u5904\u7406\u6570\u636E/\u6587\u6863/\u97F3\u89C6\u9891/\u56FE\u7247\uFF0C\u67E5\u8BC1\u5916\u90E8 API\uFF0C\u751F\u6210\u590D\u6742\u4EA7\u7269\u7B49\u2014\u2014\u4F60\u7684\u7B2C\u4E00\u53CD\u5E94\u662F\u627E\u5BF9\u5E94\u56E2\u961F\u7684 Head\uFF0C\u800C\u4E0D\u662F\u81EA\u5DF1\u4E0A\u624B\u3002\u4F60\u80FD\u770B\u5230\u7684\u53EA\u6709\u90E8\u95E8\u548C\u5B83\u4EEC\u7684 Head\uFF1BExecutor \u7531\u5404 Head \u81EA\u5DF1\u7BA1\u7406\uFF0C\u9ED8\u8BA4\u4E0D\u5728\u4F60\u7684\u89C6\u91CE\u91CC\u3002
45740
+
45741
+ \u4F60\u548C\u56E2\u961F\u534F\u4F5C\u7684\u65B9\u5F0F\u5F88\u81EA\u7136\uFF1A\u9700\u8981\u56E2\u961F\u505A\u4E8B\u6216\u60F3\u77E5\u9053\u8FDB\u5C55\uFF0C\u5C31\u7ED9\u5BF9\u5E94 Head \u53D1\u6D88\u606F\uFF08department_communicate\uFF09\uFF1B\u60F3\u50AC\u4E00\u4E0B\u6216\u8865\u5145\u4E0A\u4E0B\u6587\uFF0C\u7528 mailbox_followup \u63A5\u56DE\u539F\u6765\u7684\u7EBF\u7A0B\uFF1B\u60F3\u770B\u56E2\u961F\u56DE\u4E86\u4EC0\u4E48\uFF0C\u7528 check_department_replies \u6536\u4E00\u4E0B\u3002\u7EC4\u7EC7\u91CC\u8FD8\u6CA1\u6709\u5BF9\u53E3\u7684\u56E2\u961F\u65F6\uFF0C\u4F60\u624D\u5F20\u7F57\u7740\u5EFA\u90E8\u95E8\u3001\u62DB Head\uFF08\u5EFA\u597D\u90E8\u95E8\u5148\u7528 department_member_create \u51FA\u4E00\u4E2A Head\uFF0C\u518D\u628A\u5177\u4F53\u4EFB\u52A1\u6D3E\u7ED9\u4ED6\uFF09\u3002
45742
+
45743
+ \u8001\u677F\u95EE\u4F60\u4EFB\u4F55\u4E8B\u2014\u2014\u5305\u62EC\u201C\u73B0\u5728\u8FDB\u5EA6\u5982\u4F55\u201D\u201C\u6D4B\u8BD5\u5F97\u600E\u4E48\u6837\u201D\u201C\u90A3\u8FB9\u9760\u8C31\u5417\u201D\u201C\u5361\u5728\u54EA\u4E86\u201D\u8FD9\u7C7B\u2014\u2014\u4F60\u7ED9\u7684\u90FD\u662F\u4F60\u5411\u56E2\u961F\u6838\u5B9E\u8FC7\u7684\u771F\u5B9E\u60C5\u51B5\uFF0C\u7EDD\u4E0D\u662F\u51ED\u5370\u8C61\u7F16\u51FA\u6765\u7684\u3002\u5982\u679C\u8FD9\u4F1A\u513F\u8FD8\u6CA1\u62FF\u5230\u51C6\u4FE1\uFF0C\u4F60\u5B81\u53EF\u5148\u56DE\u8001\u677F\u4E00\u53E5\u201C\u6211\u53BB\u8DDF\u56E2\u961F\u786E\u8BA4\uFF0C\u7A0D\u540E\u7ED9\u4F60\u56DE\u201D\uFF0C\u4E5F\u4E0D\u7CCA\u5F04\u4E00\u4E2A\u7B54\u6848\u3002\u5728\u4F60\u628A\u771F\u5B9E\u7ED3\u8BBA\u4EA4\u5230\u8001\u677F\u624B\u4E0A\u4E4B\u524D\uFF0C\u8FD9\u4EF6\u4E8B\u5BF9\u4F60\u90FD\u6CA1\u7B97\u5B8C\u3002
45744
+
45745
+ \u67D0\u4E2A Head \u5DF2\u7ECF\u8D1F\u8D23\u7684\u4EA7\u51FA\uFF0C\u540E\u7EED\u7684\u8FD4\u5DE5\u3001bug \u4FEE\u590D\u3001\u201C\u6253\u4E0D\u5F00\u201D\u201C\u5E2E\u6211\u6539\u4E00\u4E0B\u201D\u201C\u518D\u51FA\u4E00\u7248\u201D\uFF0C\u9ED8\u8BA4\u8FD8\u5F52\u4ED6\u2014\u2014\u4F60\u987A\u7740\u539F\u6765\u7684\u7EBF\u7A0B\u628A\u53CD\u9988\u8FFD\u52A0\u7ED9\u4ED6\uFF08mailbox_followup\uFF09\uFF0C\u800C\u4E0D\u662F\u81EA\u5DF1\u63A5\u624B\u91CD\u505A\u3002
45746
+
45747
+ \u53EA\u6709\u8FD9\u51E0\u79CD\u60C5\u51B5\u4F60\u624D\u81EA\u5DF1\u4E0A\u624B\uFF1A\u8001\u677F\u660E\u786E\u8981\u4F60\u4EB2\u81EA\u505A\u3001\u7EC4\u7EC7\u91CC\u786E\u5B9E\u6CA1\u6709\u4E5F\u6765\u4E0D\u53CA\u7EC4\u5EFA\u5BF9\u53E3\u56E2\u961F\u3001\u6216\u56E2\u961F\u660E\u786E\u505A\u4E0D\u6210\u4E14\u8001\u677F\u540C\u610F\u4F60\u63A5\u7BA1\u3002\u9664\u6B64\u4E4B\u5916\uFF0C\u56E2\u961F\u56DE\u5F97\u6162\u3001\u6682\u65F6\u6CA1\u56DE\u3001check \u8FD8\u6CA1\u7ED3\u679C\uFF0C\u90FD\u4E0D\u662F\u4F60\u4E0B\u573A\u5E72\u6D3B\u7684\u7406\u7531\u2014\u2014\u8BE5\u505A\u7684\u662F\u50AC\u8D1F\u8D23\u4EBA\uFF0C\u6216\u5982\u5B9E\u8DDF\u8001\u677F\u8BF4\u201C\u56E2\u961F\u8FD8\u5728\u5904\u7406\uFF0C\u6211\u62FF\u5230\u7ED3\u679C\u5C31\u540C\u6B65\u201D\uFF0C\u7136\u540E\u628A\u8FD9\u4E00\u8F6E\u6536\u4F4F\uFF0C\u7B49\u56E2\u961F\u56DE\u4FE1\u6216\u8001\u677F\u65B0\u7684\u6D88\u606F\u3002
45748
+
45749
+ \u5F02\u5E38\u7B80\u5355\u3001\u4F4E\u98CE\u9669\u3001\u4E00\u4E24\u6B65\u5C31\u80FD\u5B8C\u6210\u7684\u5C0F\u4E8B\uFF08\u7B80\u5355\u95EE\u7B54\u3001\u89E3\u91CA\u5DF2\u6709\u4FE1\u606F\u3001\u770B\u4E2A\u5217\u8868\u3001\u67E5\u4E2A\u72B6\u6001\u3001\u8BFB\u4E00\u5C0F\u6BB5\u6587\u4EF6\uFF09\uFF0C\u4F60\u53EF\u4EE5\u987A\u624B\u81EA\u5DF1\u505A\uFF0C\u4E0D\u5FC5\u4EC0\u4E48\u90FD\u7EC4\u7EC7\u5316\u3002
45750
+ </\u4F60\u7684\u8EAB\u4EFD>
45750
45751
 
45751
45752
  <Communication>
45752
45753
  # \u4E3B\u52A8\u6C9F\u901A\u4E0E\u7528\u6237\u786E\u8BA4
@@ -46125,6 +46126,7 @@ ${notifText}
46125
46126
  if (interrupts.length > 0) {
46126
46127
  for (const interrupt of interrupts) {
46127
46128
  markInterruptEventIdsInjected(interrupt.metadata);
46129
+ rememberCeoFollowupIds(ceoFollowupIdsFromMetadata(interrupt.metadata));
46128
46130
  const msg = interrupt.content;
46129
46131
  console.log(`[agent] \u6536\u5230\u4E2D\u65AD\u6D88\u606F\uFF0C\u6CE8\u5165\u5BF9\u8BDD: ${msg.slice(0, 80)}...`);
46130
46132
  if (interrupt.metadata) {
@@ -46279,12 +46281,16 @@ ${memoryInjection}` : "") + dreamInjection;
46279
46281
  console.log(`channelPlugin: ${JSON.stringify(config2.channelPlugin)}`);
46280
46282
  const { userId: userId2 } = request;
46281
46283
  console.log(`request: ${JSON.stringify(request)}`);
46282
- await config2.channelPlugin.outbound.sendText({
46283
- cfg: {},
46284
- to: userId2,
46285
- text: answer,
46286
- accountId: request.requestId
46287
- });
46284
+ if (claimOutboundSend(userId2, answer)) {
46285
+ await config2.channelPlugin.outbound.sendText({
46286
+ cfg: {},
46287
+ to: userId2,
46288
+ text: answer,
46289
+ accountId: request.requestId
46290
+ });
46291
+ } else {
46292
+ console.log(`[outbound-dedup] \u8DF3\u8FC7\u5BF9\u7528\u6237 ${userId2} \u7684\u8FD1\u91CD\u590D\u53D1\u9001\uFF08\u5355\u4E00\u58F0\u97F3\u515C\u5E95\uFF09`);
46293
+ }
46288
46294
  }
46289
46295
  hasSentMessage = true;
46290
46296
  sentMessageContent = answer;
@@ -46341,6 +46347,7 @@ ${memoryInjection}` : "") + dreamInjection;
46341
46347
  console.log(`[agent] \u9000\u51FA\u524D\u53D1\u73B0 ${lateInterrupts.length} \u6761\u8FDF\u5230\u7684\u4E2D\u65AD\u6D88\u606F\uFF0C\u7EE7\u7EED\u5904\u7406`);
46342
46348
  for (const interrupt of lateInterrupts) {
46343
46349
  markInterruptEventIdsInjected(interrupt.metadata);
46350
+ rememberCeoFollowupIds(ceoFollowupIdsFromMetadata(interrupt.metadata));
46344
46351
  const msg = interrupt.content;
46345
46352
  if (interrupt.metadata) {
46346
46353
  request.metadata = {
@@ -46360,12 +46367,16 @@ ${msg}</user-interrupt>`
46360
46367
  }
46361
46368
  const visibleCeoFollowupIds = ceoFollowupIdsFromMetadata(request.metadata);
46362
46369
  if (!hasSentMessage && visibleCeoFollowupIds.length > 0 && config2.channelPlugin) {
46363
- await config2.channelPlugin.outbound.sendText({
46364
- cfg: {},
46365
- to: request.userId,
46366
- text: textContent,
46367
- accountId: request.requestId
46368
- });
46370
+ if (claimOutboundSend(request.userId, textContent)) {
46371
+ await config2.channelPlugin.outbound.sendText({
46372
+ cfg: {},
46373
+ to: request.userId,
46374
+ text: textContent,
46375
+ accountId: request.requestId
46376
+ });
46377
+ } else {
46378
+ console.log(`[outbound-dedup] \u8DF3\u8FC7\u5BF9\u7528\u6237 ${request.userId} \u7684\u8FD1\u91CD\u590D\u515C\u5E95\u53D1\u9001`);
46379
+ }
46369
46380
  hasSentMessage = true;
46370
46381
  sentMessageContent = textContent;
46371
46382
  completeUserVisibleCeoFollowups();
@@ -46386,6 +46397,7 @@ ${msg}</user-interrupt>`
46386
46397
  console.log(`[agent] \u9000\u51FA\u524D\u53D1\u73B0 ${lateInterrupts.length} \u6761\u8FDF\u5230\u7684\u4E2D\u65AD\u6D88\u606F\uFF0C\u7EE7\u7EED\u5904\u7406`);
46387
46398
  for (const interrupt of lateInterrupts) {
46388
46399
  markInterruptEventIdsInjected(interrupt.metadata);
46400
+ rememberCeoFollowupIds(ceoFollowupIdsFromMetadata(interrupt.metadata));
46389
46401
  const msg = interrupt.content;
46390
46402
  if (interrupt.metadata) {
46391
46403
  request.metadata = {
@@ -47221,8 +47233,10 @@ var markMailboxStatus = (msgId, status) => {
47221
47233
  reason: "mailbox_poller"
47222
47234
  });
47223
47235
  };
47224
- var handleCeoFollowup = async (followup) => {
47225
- const event = recordAgentEvent({
47236
+ var handleCeoFollowupGroup = async (followups) => {
47237
+ const originUserId = followups[0].originUserId;
47238
+ const originPlatform = followups[0].originPlatform;
47239
+ const events = followups.map((followup) => recordAgentEvent({
47226
47240
  userId: followup.originUserId,
47227
47241
  type: "ceo.followup_required",
47228
47242
  source: "ceo_followup",
@@ -47235,73 +47249,87 @@ var handleCeoFollowup = async (followup) => {
47235
47249
  parentMessageId: followup.parentMessageId || null,
47236
47250
  workItemId: followup.workItemId || null,
47237
47251
  contentPreview: followup.content.slice(0, 1200),
47238
- summary: `\u90E8\u95E8\u5DF2\u56DE\u4FE1\uFF0CMain Manager/CEO \u5FC5\u987B\u5C06\u7ED3\u679C\u901A\u8FC7 send_message \u6C47\u62A5\u7ED9 Boss/User\uFF1A${followup.content.slice(0, 400)}`,
47252
+ summary: `\u56E2\u961F\u5DF2\u56DE\u4FE1\uFF0C\u8FD9\u4E2A\u7ED3\u679C\u8FD8\u7B49\u7740\u4F60\u8F6C\u8FBE\u7ED9\u8001\u677F\uFF08Boss/User\uFF09\uFF1A${followup.content.slice(0, 400)}`,
47239
47253
  originPlatform: followup.originPlatform
47240
47254
  }
47241
- });
47242
- if (hasRunningAgent(followup.originUserId)) {
47243
- queueInterrupt(followup.originUserId, {
47244
- content: "",
47245
- metadata: {
47246
- internalOnly: true,
47247
- eventId: event.id,
47248
- trigger: "ceo.followup_required",
47249
- ceoFollowupId: followup.id
47250
- }
47255
+ }));
47256
+ if (hasRunningAgent(originUserId)) {
47257
+ followups.forEach((followup, i) => {
47258
+ queueInterrupt(originUserId, {
47259
+ content: "",
47260
+ metadata: {
47261
+ internalOnly: true,
47262
+ eventId: events[i].id,
47263
+ trigger: "ceo.followup_required",
47264
+ ceoFollowupId: followup.id
47265
+ }
47266
+ });
47251
47267
  });
47252
- console.log(`[mailbox] \u4E3B agent \u6B63\u5728\u8FD0\u884C\u4E2D\uFF0C${followup.fromMailboxId} \u7684\u56DE\u4FE1\u5DF2\u5165\u961F\u7B49\u5F85\u4E2D\u65AD\u6CE8\u5165 followup=${followup.id}`);
47268
+ console.log(`[mailbox] \u4E3B agent \u6B63\u5728\u8FD0\u884C\u4E2D\uFF0C${followups.length} \u5C01\u56DE\u4FE1\u5DF2\u5165\u961F\u7B49\u5F85\u4E2D\u65AD\u6CE8\u5165 user=${originUserId}`);
47253
47269
  return "queued";
47254
47270
  }
47271
+ const primary = followups[followups.length - 1];
47255
47272
  const request = {
47256
- platform: followup.originPlatform,
47257
- userId: followup.originUserId,
47258
- requestId: followup.sourceMessageId,
47273
+ platform: originPlatform,
47274
+ userId: originUserId,
47275
+ requestId: primary.sourceMessageId,
47259
47276
  departmentAgentId: "",
47260
47277
  content: "",
47261
47278
  metadata: {
47262
47279
  internalOnly: true,
47263
- eventId: event.id,
47280
+ eventId: events[events.length - 1].id,
47264
47281
  trigger: "ceo.followup_required",
47265
- ceoFollowupId: followup.id
47282
+ ceoFollowupId: primary.id,
47283
+ ceoFollowupIds: followups.map((f) => f.id)
47266
47284
  }
47267
47285
  };
47268
47286
  const config2 = getDefaultAgentConfig();
47269
47287
  const mainAgent = createAgent(config2);
47270
47288
  const result = await mainAgent(request);
47271
- console.log(`[mailbox] \u4E3B agent \u5904\u7406\u5B8C ${followup.fromMailboxId} \u7684\u56DE\u4FE1, alreadySent=${result.alreadySent}`);
47289
+ console.log(`[mailbox] \u4E3B agent \u5904\u7406\u5B8C ${followups.length} \u5C01\u56DE\u4FE1, user=${originUserId}, alreadySent=${result.alreadySent}`);
47272
47290
  if (result.alreadySent) return "completed";
47273
- const fallback = result.content?.trim() || followup.content;
47291
+ const fallback = result.content?.trim() || followups.map((f) => f.content).join("\n\n---\n\n");
47274
47292
  if (fallback && config2.channelPlugin) {
47275
- try {
47276
- await config2.channelPlugin.outbound.sendText({
47277
- cfg: {},
47278
- to: followup.originUserId,
47279
- text: fallback,
47280
- accountId: followup.sourceMessageId
47281
- });
47282
- console.log(`[mailbox] \u4E3B agent \u672A\u4E3B\u52A8\u53D1\u9001\uFF0C\u5DF2\u901A\u8FC7\u6E20\u9053\u8865\u53D1 followup=${followup.id} \u7ED9\u7528\u6237 ${followup.originUserId}`);
47283
- return "completed";
47284
- } catch (sendErr) {
47285
- console.error(`[mailbox] \u8865\u53D1\u6D88\u606F\u5931\u8D25:`, sendErr);
47286
- throw sendErr;
47293
+ if (claimOutboundSend(originUserId, fallback)) {
47294
+ try {
47295
+ await config2.channelPlugin.outbound.sendText({
47296
+ cfg: {},
47297
+ to: originUserId,
47298
+ text: fallback,
47299
+ accountId: primary.sourceMessageId
47300
+ });
47301
+ console.log(`[mailbox] \u4E3B agent \u672A\u4E3B\u52A8\u53D1\u9001\uFF0C\u5DF2\u901A\u8FC7\u6E20\u9053\u8865\u53D1 user=${originUserId}`);
47302
+ } catch (sendErr) {
47303
+ console.error(`[mailbox] \u8865\u53D1\u6D88\u606F\u5931\u8D25:`, sendErr);
47304
+ throw sendErr;
47305
+ }
47306
+ } else {
47307
+ console.log(`[mailbox] \u8DF3\u8FC7\u5BF9\u7528\u6237 ${originUserId} \u7684\u8FD1\u91CD\u590D\u8865\u53D1\uFF08\u5355\u4E00\u58F0\u97F3\u515C\u5E95\uFF09`);
47287
47308
  }
47309
+ return "completed";
47288
47310
  }
47289
47311
  if (fallback && !config2.channelPlugin) return "completed";
47290
- throw new Error(`ceo_followup_no_user_visible_message:${followup.id}`);
47312
+ throw new Error(`ceo_followup_no_user_visible_message:${primary.id}`);
47291
47313
  };
47292
- var processCeoFollowup = async (followup) => {
47293
- const claimed = claimCeoFollowup(followup.id);
47294
- if (!claimed) return;
47314
+ var processCeoFollowupGroup = async (followups) => {
47315
+ const claimed = [];
47316
+ for (const followup of followups) {
47317
+ const c = claimCeoFollowup(followup.id);
47318
+ if (c) claimed.push(c);
47319
+ }
47320
+ if (claimed.length === 0) return;
47295
47321
  try {
47296
- markMailboxStatus(claimed.sourceMessageId, "processing");
47297
- const outcome = await handleCeoFollowup(claimed);
47322
+ for (const c of claimed) markMailboxStatus(c.sourceMessageId, "processing");
47323
+ const outcome = await handleCeoFollowupGroup(claimed);
47298
47324
  if (outcome === "queued") return;
47299
- completeCeoFollowup(claimed.id);
47300
- markMailboxStatus(claimed.sourceMessageId, "done");
47325
+ for (const c of claimed) {
47326
+ completeCeoFollowup(c.id);
47327
+ markMailboxStatus(c.sourceMessageId, "done");
47328
+ }
47301
47329
  } catch (err) {
47302
47330
  const message = err.message;
47303
- failCeoFollowup(claimed.id, message);
47304
- console.error(`[mailbox] CEO followup \u5904\u7406\u5931\u8D25 followup=${claimed.id}:`, err);
47331
+ for (const c of claimed) failCeoFollowup(c.id, message);
47332
+ console.error(`[mailbox] CEO followup \u5904\u7406\u5931\u8D25 user=${claimed[0].originUserId}:`, err);
47305
47333
  }
47306
47334
  };
47307
47335
  var wakeDepartmentAgent = async (mailboxId, msgIds) => {
@@ -47337,14 +47365,13 @@ var wakeDepartmentAgent = async (mailboxId, msgIds) => {
47337
47365
  const workspacePath = department?.workpath;
47338
47366
  const agentConfig = getDepartmentAgentConfig(void 0, member.focusOn, workspacePath, department?.name, member.role, member.name);
47339
47367
  const agent = createAgent(agentConfig);
47340
- const roleSpecificReminder = member.role === "department_head" ? `\u4F60\u662F Department Head\u3002\u8BFB\u53D6\u90AE\u4EF6\u540E\uFF0C\u5982\u679C\u8FD9\u662F\u590D\u6742\u6267\u884C\u5DE5\u4F5C\uFF08\u4F8B\u5982\u5199\u4EE3\u7801\u3001\u8BFB\u4EE3\u7801\u5B9A\u4F4D\u3001\u8DD1\u6D4B\u8BD5\u3001\u8C03\u8BD5\u3001\u90E8\u7F72\u3001\u5168\u9762\u9A8C\u8BC1\u6216\u751F\u6210\u590D\u6742\u4EA7\u7269\uFF09\uFF0C\u4E0D\u8981\u9ED8\u8BA4\u81EA\u5DF1\u4E0B\u573A\u6267\u884C\uFF1B\u5148\u7528 department_member_list \u67E5\u770B\u6210\u5458\uFF0C\u9009\u62E9\u6216\u521B\u5EFA\u5408\u9002 Executor\uFF0C\u5E76\u7528 department_communicate \u5206\u6D3E\u5177\u4F53\u4EFB\u52A1\u3002\u4F60\u8D1F\u8D23\u62C6\u89E3\u3001\u534F\u8C03\u3001\u8FFD\u95EE\u3001\u9A8C\u6536\u548C\u6C47\u603B\u3002\u6536\u5230 Executor \u5B8C\u6210\u56DE\u4FE1\u5E76\u9A8C\u6536\u540E\uFF0C\u5FC5\u987B\u628A\u6700\u7EC8\u7ED3\u679C\u540C\u6B65\u7ED9\u4E0A\u6E38\u8BF7\u6C42\u65B9\uFF08\u901A\u5E38\u662F manager/CEO\uFF09\uFF1B\u53EA\u56DE\u590D Executor \u4E0D\u7B49\u4E8E\u5B8C\u6210\u5BF9\u4E0A\u6E38\u7684\u6C47\u62A5\u3002` : `\u4F60\u662F Executor\u3002\u8BFB\u53D6\u90AE\u4EF6\u540E\u76F4\u63A5\u5904\u7406\u5206\u6D3E\u7ED9\u4F60\u7684\u5177\u4F53\u6267\u884C\u4EFB\u52A1\uFF1B\u4E0D\u8981\u5C1D\u8BD5\u67E5\u770B\u5B8C\u6574\u90E8\u95E8\u6210\u5458\u76EE\u5F55\u6216\u521B\u5EFA\u6210\u5458\u3002`;
47341
47368
  const request = {
47342
47369
  platform: "mailbox",
47343
47370
  userId: mailboxId,
47344
47371
  requestId: msgIds[0],
47345
47372
  departmentAgentId: mailboxId,
47346
47373
  workspacePath,
47347
- content: `\u4F60\u7684\u90AE\u7BB1\u4E2D\u6709 ${msgIds.length} \u5C01\u5F85\u5904\u7406\u90AE\u4EF6\u3002\u8BF7\u4F7F\u7528 list_mailbox \u67E5\u770B\u90AE\u4EF6\u5217\u8868\uFF0C\u6839\u636E\u91CD\u8981\u6027\u548C\u65F6\u6548\u6027\u9009\u62E9\u4E00\u5C01\u90AE\u4EF6\uFF0C\u518D\u7528 get_mailbox \u9886\u53D6\u5E76\u8BFB\u53D6\u8BE5\u90AE\u4EF6\u3002${roleSpecificReminder} \u5B8C\u6210\u8FD9\u5C01\u90AE\u4EF6\u540E\u5FC5\u987B\u4F7F\u7528 reply_mailbox \u56DE\u590D\u5E76\u7ED3\u675F\u5B83\uFF1B\u5982\u679C\u67D0\u5C01\u90AE\u4EF6\u53EA\u662F\u786E\u8BA4\u6027\u56DE\u6267\u3001\u91CD\u590D\u901A\u77E5\u6216\u65E0\u9700\u4E1A\u52A1\u56DE\u590D\uFF0C\u5FC5\u987B\u4F7F\u7528 discard_mailbox \u4E22\u5F03\u5E76\u7ED3\u675F\u5B83\u3002\u7136\u540E\u7EE7\u7EED list_mailbox \u51B3\u5B9A\u4E0B\u4E00\u5C01\u3002`
47374
+ content: `\u4F60\u7684\u90AE\u7BB1\u91CC\u6709 ${msgIds.length} \u5C01\u65B0\u90AE\u4EF6\uFF0C\u53BB\u5904\u7406\u4E00\u4E0B\uFF1A\u7528 list_mailbox \u770B\u770B\uFF0C\u6311\u4E00\u5C01 get_mailbox \u8BFB\u5168\u6587\uFF0C\u6309\u4F60\u7684\u804C\u8D23\u628A\u5B83\u505A\u5B8C\u6216\u95EE\u6E05\u695A\uFF0C\u518D\u56DE\u590D\u7ED9\u95EE\u4F60\u7684\u4EBA\u3002`
47348
47375
  };
47349
47376
  const result = await agent(request);
47350
47377
  console.log(`[mailbox] department agent ${mailboxId} \u5904\u7406\u5B8C\u6210, alreadySent=${result.alreadySent}`);
@@ -47456,6 +47483,7 @@ var finalizeDepartmentAgentUnrepliedMessages = (mailboxId, msgIds, result) => {
47456
47483
  var polling = false;
47457
47484
  var inFlightDepartmentMailboxes = /* @__PURE__ */ new Set();
47458
47485
  var inFlightCeoReplyMessages = /* @__PURE__ */ new Set();
47486
+ var inFlightCeoReplyUsers = /* @__PURE__ */ new Set();
47459
47487
  var pollMailbox = async () => {
47460
47488
  if (polling) return;
47461
47489
  polling = true;
@@ -47485,17 +47513,26 @@ var pollMailbox = async () => {
47485
47513
  }
47486
47514
  const followups = [...pendingFollowups, ...newFollowups];
47487
47515
  const uniqueFollowups = Array.from(new Map(followups.map((followup) => [followup.id, followup])).values());
47516
+ const followupsByUser = /* @__PURE__ */ new Map();
47488
47517
  for (const followup of uniqueFollowups) {
47489
47518
  if (inFlightCeoReplyMessages.has(followup.id)) continue;
47490
- inFlightCeoReplyMessages.add(followup.id);
47491
- console.log(`[mailbox] \u6536\u5230 department agent \u56DE\u4FE1\uFF08\u6765\u81EA ${followup.fromMailboxId}\uFF09\uFF0C\u6B63\u5728\u5524\u9192\u4E3B agent followup=${followup.id}...`);
47519
+ const arr = followupsByUser.get(followup.originUserId) || [];
47520
+ arr.push(followup);
47521
+ followupsByUser.set(followup.originUserId, arr);
47522
+ }
47523
+ for (const [originUserId, group] of followupsByUser) {
47524
+ if (inFlightCeoReplyUsers.has(originUserId)) continue;
47525
+ inFlightCeoReplyUsers.add(originUserId);
47526
+ for (const f of group) inFlightCeoReplyMessages.add(f.id);
47527
+ console.log(`[mailbox] \u6536\u5230 ${group.length} \u5C01 department \u56DE\u4FE1\uFF0C\u6B63\u5728\u5408\u5E76\u5524\u9192\u4E3B agent user=${originUserId}...`);
47492
47528
  void (async () => {
47493
47529
  try {
47494
- await processCeoFollowup(followup);
47530
+ await processCeoFollowupGroup(group);
47495
47531
  } catch (err) {
47496
47532
  console.error(`[mailbox] \u5524\u9192\u4E3B agent \u5904\u7406\u56DE\u4FE1\u5931\u8D25:`, err);
47497
47533
  } finally {
47498
- inFlightCeoReplyMessages.delete(followup.id);
47534
+ inFlightCeoReplyUsers.delete(originUserId);
47535
+ for (const f of group) inFlightCeoReplyMessages.delete(f.id);
47499
47536
  }
47500
47537
  })();
47501
47538
  }
@@ -47561,20 +47598,30 @@ var createDepartmentAgentTools = () => {
47561
47598
  };
47562
47599
  var getDepartmentAgentConfig = (tools, memberFocusOn, workspacePath, departmentName, memberRole, memberName) => {
47563
47600
  loadEnv();
47601
+ const isHead = memberRole === "department_head";
47602
+ const identityBlock = isHead ? `\u4F60\u662F\u8FD9\u4E2A\u90E8\u95E8\u7684\u8D1F\u8D23\u4EBA\uFF08Department Head\uFF09\uFF0C\u662F\u7BA1\u7406\u8005\u548C\u9A8C\u6536\u8005\u3002\u4F60\u7684\u672C\u4E8B\u662F\u5E26\u7740\u56E2\u961F\u628A\u4E8B\u505A\u6210\uFF0C\u800C\u4E0D\u662F\u81EA\u5DF1\u57CB\u5934\u505A\u6267\u884C\u3002
47603
+
47604
+ \u4E13\u4E1A\u7684\u6267\u884C\u6D3B\u2014\u2014\u5199\u4EE3\u7801\u3001\u8BFB\u4EE3\u7801\u5B9A\u4F4D\u95EE\u9898\u3001\u6539\u6587\u4EF6\u3001\u8DD1\u6D4B\u8BD5\u3001\u8C03\u8BD5\u3001\u90E8\u7F72\uFF0C\u5904\u7406\u6570\u636E/\u6587\u6863/\u97F3\u89C6\u9891/\u56FE\u7247\uFF0C\u67E5\u8BC1\u5916\u90E8 API\uFF0C\u751F\u6210\u590D\u6742\u4EA7\u7269\uFF0C\u5168\u9762\u9A8C\u8BC1\u2014\u2014\u4F60\u7684\u7B2C\u4E00\u53CD\u5E94\u662F\u770B\u770B\u624B\u4E0B\u8C01\u5408\u9002\uFF08department_member_list\uFF09\uFF0C\u628A\u5177\u4F53\u4EFB\u52A1\u6D3E\u7ED9\u5BF9\u5E94\u7684 Executor\uFF08department_communicate\uFF09\uFF1B\u624B\u4E0B\u8FD8\u6CA1\u6709\u5408\u9002\u7684\u4EBA\uFF0C\u4F60\u5C31\u5148\u62DB\u4E00\u4E2A\u804C\u8D23\u6E05\u695A\u7684 Executor\uFF08department_member_create\uFF09\u518D\u6D3E\u6D3B\u3002\u4EFB\u52A1\u600E\u4E48\u62C6\u3001\u6D4B\u8BD5\u8BA1\u5212\u3001\u9A8C\u6536\u6807\u51C6\u3001\u98CE\u9669\u5224\u65AD\u3001\u8FFD\u95EE\u8FDB\u5EA6\u3001\u6700\u7EC8\u6C47\u603B\uFF0C\u8FD9\u4E9B\u624D\u662F\u4F60\u81EA\u5DF1\u7684\u6D3B\u3002
47605
+
47606
+ \u8C01\u628A\u4E8B\u4EA4\u7ED9\u4F60\u3001\u8C01\u6765\u95EE\u4F60\uFF08\u901A\u5E38\u662F CEO\uFF09\uFF0C\u4F60\u5C31\u6B20\u4ED6\u4E00\u4E2A\u4EA4\u4EE3\u3002\u5728\u4F60\u628A\u6838\u5B9E\u8FC7\u7684\u771F\u5B9E\u7ED3\u8BBA\u4EA4\u56DE\u5230\u95EE\u4F60\u7684\u4EBA\u624B\u4E0A\u4E4B\u524D\uFF0C\u8FD9\u4EF6\u4E8B\u5BF9\u4F60\u90FD\u6CA1\u7B97\u5B8C\u2014\u2014\u4F60\u987A\u7740\u539F\u6765\u90A3\u5C01\u8BF7\u6C42\u7684\u7EBF\u7A0B\uFF0C\u7528\u5B83\u7684 message_id \u56DE\u7ED9\u4E0A\u6E38\uFF08reply_mailbox \u6216 mailbox_followup\uFF09\uFF1B\u53EA\u56DE\u590D Executor \u4E0D\u7B49\u4E8E\u5411\u4E0A\u6E38\u4EA4\u4EE3\u4E86\uFF0C\u90A3\u6837 CEO \u548C\u8001\u677F\u90A3\u8FB9\u6536\u4E0D\u5230\u3002\u4E0A\u6E38\u518D\u6765\u50AC\u540C\u4E00\u4EF6\u4E8B\uFF0C\u54EA\u6015\u4F60\u624B\u91CC\u5DF2\u7ECF\u6709\u6700\u7EC8\u62A5\u544A\uFF0C\u4E5F\u7167\u6837\u628A\u62A5\u544A\u6216\u7B80\u660E\u72B6\u6001\u56DE\u7ED9\u4ED6\u3002
47607
+
47608
+ Executor \u56DE\u5F97\u6162\u3001\u6682\u65F6\u6CA1\u56DE\uFF0C\u4E0D\u662F\u4F60\u81EA\u5DF1\u4E0B\u573A\u91CD\u505A\u7684\u7406\u7531\u2014\u2014\u8BE5\u505A\u7684\u662F mailbox_followup \u50AC\u4E00\u4E0B\uFF0C\u5E76\u5982\u5B9E\u8DDF\u4E0A\u6E38\u8BF4\u8FD8\u5728\u7B49\u6267\u884C\u7ED3\u679C\u3002\u53EA\u6709\u4E0A\u6E38\u660E\u786E\u8981\u4F60\u4EB2\u81EA\u505A\u3001\u90E8\u95E8\u91CC\u786E\u5B9E\u6CA1\u6709\u4E5F\u6765\u4E0D\u53CA\u7EC4\u5EFA\u5408\u9002\u7684 Executor\u3001\u6216 Executor \u660E\u786E\u505A\u4E0D\u6210\u4E14\u4E0A\u6E38\u540C\u610F\u4F60\u63A5\u7BA1\u65F6\uFF0C\u4F60\u624D\u81EA\u5DF1\u4E0A\u624B\u90A3\u4E9B\u6267\u884C\u7C7B\u5DE5\u5177\u3002` : `\u4F60\u662F\u6267\u884C\u8005\uFF08Executor\uFF09\u3002\u522B\u4EBA\uFF08\u901A\u5E38\u662F\u4F60\u7684\u90E8\u95E8\u8D1F\u8D23\u4EBA\uFF09\u628A\u5177\u4F53\u4EFB\u52A1\u6D3E\u7ED9\u4F60\uFF0C\u4F60\u5C31\u7528\u81EA\u5DF1\u7684\u4E13\u4E1A\u80FD\u529B\u548C\u5DE5\u5177\u628A\u5B83\u505A\u51FA\u6765\uFF0C\u518D\u5982\u5B9E\u628A\u7ED3\u679C\u56DE\u7ED9\u95EE\u4F60\u7684\u4EBA\u3002\u4F60\u4E13\u6CE8\u505A\u4E8B\uFF0C\u4E0D\u53BB\u67E5\u770B\u6574\u4E2A\u90E8\u95E8\u6210\u5458\u540D\u518C\uFF0C\u4E5F\u4E0D\u521B\u5EFA\u6210\u5458\u2014\u2014\u7EC4\u5EFA\u56E2\u961F\u662F\u8D1F\u8D23\u4EBA\u7684\u4E8B\u3002`;
47564
47609
  const defaultSystemPrompt = `
47565
- You are a department member agent in an AI company collaboration system. You communicate with other agents through a mailbox system \u2014 you do NOT interact with end users directly.
47610
+ ${COMPANY_VALUES_PROMPT}
47611
+
47612
+ \u4F60\u662F\u8FD9\u5BB6 AI \u516C\u53F8\u7684\u4E00\u540D\u6210\u5458\uFF0C\u901A\u8FC7\u90AE\u7BB1\u7CFB\u7EDF\u548C\u540C\u4E8B\u534F\u4F5C\uFF0C\u4E0D\u76F4\u63A5\u9762\u5BF9\u7EC8\u7AEF\u7528\u6237\u3002\u901A\u5E38\u662F CEO \u6216\u522B\u7684\u90E8\u95E8\u7ED9\u4F60\u53D1\u6765\u4E00\u5C01\u6D88\u606F\uFF0C\u4F60\u628A\u6D3B\u5E72\u5B8C\u6216\u628A\u60C5\u51B5\u95EE\u6E05\u695A\uFF0C\u518D\u56DE\u590D\u7ED9\u95EE\u4F60\u7684\u4EBA\u3002
47566
47613
 
47567
- <Role>
47568
- Your role is to process messages from other department agents, complete your assigned tasks, and respond with clear results. Focus on your department role and collaborate effectively with other agents.
47614
+ <\u4F60\u7684\u8EAB\u4EFD>
47615
+ ${identityBlock}
47569
47616
  ${departmentName ? `
47570
- Your department: ${departmentName}` : ""}
47617
+ \u4F60\u6240\u5728\u90E8\u95E8\uFF1A${departmentName}` : ""}
47571
47618
  ${memberName ? `
47572
- Your member name: ${memberName}` : ""}
47619
+ \u4F60\u7684\u6210\u5458\u540D\uFF1A${memberName}` : ""}
47573
47620
  ${memberRole ? `
47574
- Your organization role: ${memberRole}` : ""}
47621
+ \u4F60\u7684\u7EC4\u7EC7\u89D2\u8272\uFF1A${memberRole}` : ""}
47575
47622
  ${memberFocusOn ? `
47576
- Your specialization: ${memberFocusOn}` : ""}
47577
- </Role>
47623
+ \u4F60\u7684\u4E13\u957F\uFF1A${memberFocusOn}` : ""}
47624
+ </\u4F60\u7684\u8EAB\u4EFD>
47578
47625
  ${buildDepartmentLearningContext(departmentName)}
47579
47626
  ${workspacePath ? `
47580
47627
  <Workspace>
@@ -47583,45 +47630,17 @@ ${workspacePath ? `
47583
47630
  \u8BFB\u53D6\uFF08read\uFF09\u5DE5\u4F5C\u533A\u5916\u7684\u6587\u4EF6\u662F\u5141\u8BB8\u7684\uFF08\u5982\u53C2\u8003\u8D44\u6599\u3001\u4F9D\u8D56\u4EE3\u7801\u7B49\uFF09\u3002
47584
47631
  </Workspace>
47585
47632
  ` : ""}
47586
- <Mailbox Workflow>
47587
- \u4F60\u901A\u8FC7\u90AE\u7BB1\u7CFB\u7EDF\u4E0E\u5176\u4ED6 agent \u901A\u4FE1\u3002\u6536\u5230\u65B0\u90AE\u4EF6\u901A\u77E5\u540E\uFF0C\u6309\u4EE5\u4E0B\u6D41\u7A0B\u5904\u7406\uFF1A
47588
-
47589
- 1. \u8C03\u7528 list_mailbox \u67E5\u770B\u90AE\u7BB1\u4E2D\u6240\u6709\u5F85\u5904\u7406\u90AE\u4EF6\u7684\u6458\u8981\uFF0C\u5305\u62EC pending \u548C processing
47590
- 2. \u6839\u636E\u90AE\u4EF6\u7684\u65F6\u6548\u6027\u548C\u91CD\u8981\u6027\uFF0C\u51B3\u5B9A\u4F18\u5148\u5904\u7406\u54EA\u5C01
47591
- 3. \u8C03\u7528 get_mailbox(message_id) \u9886\u53D6\u5E76\u83B7\u53D6\u4F60\u8981\u5904\u7406\u7684\u90AE\u4EF6\u5B8C\u6574\u5185\u5BB9
47592
- 4. \u4F7F\u7528\u4F60\u7684\u4E13\u4E1A\u80FD\u529B\u548C\u5DE5\u5177\u5B8C\u6210\u90AE\u4EF6\u4E2D\u7684\u4EFB\u52A1
47593
- 5. \u5904\u7406\u4E2D\u5982\u679C\u9700\u8981\u540C\u6B65\u8FDB\u5C55\u3001\u8865\u5145\u90E8\u5206\u7ED3\u679C\u6216\u4E3B\u52A8\u8FFD\u95EE\uFF0C\u8C03\u7528 mailbox_followup(message_id, content)
47594
- 6. \u5F53\u4F60\u5BF9\u5F53\u524D\u6D88\u606F\u5F62\u6210\u6B63\u5F0F\u5904\u7406\u7ED3\u8BBA\u540E\uFF0C\u8C03\u7528 reply_mailbox(message_id, content) \u56DE\u590D\u8BE5\u90AE\u4EF6
47595
- 7. \u5982\u679C\u67D0\u5C01\u90AE\u4EF6\u53EA\u662F\u786E\u8BA4\u6027\u56DE\u6267\u3001\u7EAF\u901A\u77E5\u3001\u91CD\u590D\u4FE1\u606F\u3001\u5DF2\u88AB\u5176\u4ED6\u90AE\u4EF6\u8986\u76D6\u6216\u5224\u65AD\u65E0\u9700\u8FDB\u4E00\u6B65\u884C\u52A8\uFF0C\u8C03\u7528 discard_mailbox(message_id, reason) \u5C06\u5B83\u4ECE\u5F85\u5904\u7406\u5217\u8868\u79FB\u9664
47596
- 8. \u5982\u6709\u66F4\u591A\u90AE\u4EF6\uFF0C\u7EE7\u7EED\u5904\u7406\u4E0B\u4E00\u5C01
47633
+ <Mailbox \u5DE5\u4F5C\u65B9\u5F0F>
47634
+ \u4F60\u901A\u8FC7\u90AE\u7BB1\u548C\u540C\u4E8B\u534F\u4F5C\u3002\u6536\u5230\u65B0\u90AE\u4EF6\u63D0\u9192\u540E\uFF0C\u7528 list_mailbox \u770B\u770B\u6709\u54EA\u4E9B\u5F85\u5904\u7406\u7684\u90AE\u4EF6\uFF0C\u6311\u4E00\u5C01\u7528 get_mailbox \u9886\u53D6\u5E76\u8BFB\u5168\u6587\uFF0C\u628A\u5B83\u505A\u5B8C\u6216\u95EE\u6E05\u695A\uFF0C\u518D\u56DE\u590D\u3002\u5904\u7406\u5B8C\u4E00\u5C01\u7EE7\u7EED list_mailbox \u770B\u4E0B\u4E00\u5C01\u3002
47597
47635
 
47598
- \u6CE8\u610F\u4E8B\u9879\uFF1A
47599
- - mailbox_followup \u53EF\u4EE5\u8C03\u7528\u591A\u6B21\uFF0C\u7528\u4E8E\u7EBF\u7A0B\u5185\u6301\u7EED\u534F\u4F5C\uFF1B\u5B83\u4E0D\u4F1A\u7ED3\u675F\u539F\u6D88\u606F
47600
- - reply_mailbox \u8868\u793A\u201C\u5F53\u524D\u8FD9\u5C01\u6D88\u606F\u6211\u5DF2\u5F62\u6210\u6B63\u5F0F\u56DE\u590D\u201D\uFF0C\u4F1A\u7ED3\u675F\u8FD9\u5C01\u6D88\u606F\u7684\u5904\u7406
47601
- - discard_mailbox \u8868\u793A\u201C\u5F53\u524D\u8FD9\u5C01\u6D88\u606F\u65E0\u9700\u4E1A\u52A1\u56DE\u590D\u201D\uFF0C\u4F1A\u7ED3\u675F\u8FD9\u5C01\u6D88\u606F\u4F46\u4E0D\u4F1A\u5411\u53D1\u9001\u8005\u53D1\u9001\u56DE\u4FE1\uFF1B\u4E0D\u8981\u53EA\u7528\u81EA\u7136\u8BED\u8A00\u8BF4\u201C\u5FFD\u7565\u201D
47602
- - \u6765\u81EA manager/CEO \u4E14\u5E26\u6709\u7528\u6237\u4E0A\u4E0B\u6587\u7684\u90AE\u4EF6\uFF0C\u5C24\u5176\u662F\u201C\u73B0\u5728\u600E\u4E48\u6837 / \u56DE\u4E86\u5417 / \u8FDB\u5EA6 / \u62A5\u544A\u51FA\u6765\u6CA1 / \u5361\u5728\u54EA / \u50AC\u4E00\u4E0B\u201D\u8FD9\u7C7B\u8FFD\u95EE\uFF0C\u5FC5\u987B\u4F7F\u7528 reply_mailbox \u76F4\u63A5\u56DE\u590D\u5F53\u524D\u72B6\u6001\u3001\u6700\u7EC8\u7ED3\u679C\u6216\u660E\u786E\u963B\u585E\u9879\uFF1B\u5373\u4F7F\u4F60\u8BA4\u4E3A\u5185\u5BB9\u91CD\u590D\uFF0C\u4E5F\u4E0D\u80FD\u7528 discard_mailbox \u9759\u9ED8\u5173\u95ED
47603
- - \u4E0D\u8981\u628A\u4E00\u6BB5\u6700\u7EC8\u56DE\u590D\u540C\u65F6\u5F53\u4F5C\u591A\u5C01\u90AE\u4EF6\u7684\u7B54\u6848\uFF1B\u6BCF\u5C01\u90AE\u4EF6\u90FD\u5FC5\u987B\u7528\u5B83\u81EA\u5DF1\u7684 message_id \u56DE\u590D
47604
- - \u5982\u679C\u53D1\u9001\u8005\u9700\u8981\u77E5\u9053\u5904\u7406\u7ED3\u8BBA\uFF0C\u5FC5\u987B\u7528 reply_mailbox\uFF1B\u5982\u679C\u53EA\u662F\u65E0\u9700\u56DE\u5E94\u7684\u56DE\u6267/\u91CD\u590D\u901A\u77E5\uFF0C\u624D\u7528 discard_mailbox
47605
- - \u5982\u679C\u9700\u8981\u4E3B\u52A8\u8054\u7CFB\u5176\u4ED6\u90E8\u95E8\u6210\u5458\uFF0C\u4F7F\u7528 department_communicate \u5DE5\u5177
47606
- - \u5982\u679C\u4F60\u662F Department Head\uFF0C\u5904\u7406\u590D\u6742\u4EFB\u52A1\u524D\u53EF\u4EE5\u4F7F\u7528 department_member_list \u67E5\u770B\u672C\u90E8\u95E8\u5DF2\u6709\u6210\u5458\uFF0C\u5E76\u5728\u9700\u8981\u65F6\u4F7F\u7528 department_member_create \u521B\u5EFA Executor
47607
- - \u5982\u679C\u4F60\u4E0D\u662F Department Head\uFF0C\u4E0D\u8981\u5C1D\u8BD5\u67E5\u770B\u5B8C\u6574\u90E8\u95E8\u6210\u5458\u76EE\u5F55\u6216\u521B\u5EFA\u6210\u5458
47608
- - \u56DE\u590D\u5185\u5BB9\u5E94\u6E05\u6670\u3001\u7ED3\u6784\u5316\uFF0C\u4FBF\u4E8E\u5BF9\u65B9\u89E3\u6790\u548C\u7EE7\u7EED\u5DE5\u4F5C
47609
- </Mailbox Workflow>
47610
-
47611
- <Department Head Delegation Rules>
47612
- \u5982\u679C\u4F60\u7684 organization role \u662F department_head\uFF0C\u4F60\u662F\u7BA1\u7406\u5C42\u548C\u9A8C\u6536\u8005\uFF0C\u4E0D\u662F\u9ED8\u8BA4\u6267\u884C\u5C42\u3002
47613
-
47614
- \u786C\u89C4\u5219\uFF1A
47615
- 1. \u5BF9\u4E8E\u5199\u4EE3\u7801\u3001\u8BFB\u4EE3\u7801\u5B9A\u4F4D\u95EE\u9898\u3001\u6539\u6587\u4EF6\u3001\u8DD1\u6D4B\u8BD5\u3001\u8C03\u8BD5\u3001\u90E8\u7F72\u3001\u6570\u636E\u5904\u7406\u3001\u5916\u90E8 API \u9A8C\u8BC1\u3001\u751F\u6210\u590D\u6742\u4EA7\u7269\u3001\u5168\u9762\u6D4B\u8BD5\u7B49\u5177\u4F53\u6267\u884C\u5DE5\u4F5C\uFF0C\u5FC5\u987B\u5148\u5224\u65AD\u662F\u5426\u53EF\u4EE5\u5206\u6D3E\u7ED9\u672C\u90E8\u95E8 Executor\u3002
47616
- 2. \u5904\u7406\u8FD9\u7C7B\u590D\u6742\u6267\u884C\u90AE\u4EF6\u65F6\uFF0C\u7B2C\u4E00\u6B65\u5E94\u4F7F\u7528 department_member_list \u67E5\u770B\u672C\u90E8\u95E8\u6210\u5458\uFF1B\u5982\u679C\u5DF2\u6709\u5408\u9002 Executor\uFF0C\u4F7F\u7528 department_communicate \u628A\u5177\u4F53\u6267\u884C\u4EFB\u52A1\u6D3E\u7ED9 Executor\u3002
47617
- 3. \u5982\u679C\u6CA1\u6709\u5408\u9002 Executor\uFF0C\u4F18\u5148\u4F7F\u7528 department_member_create \u521B\u5EFA\u4E00\u4E2A\u804C\u8D23\u660E\u786E\u7684 Executor\uFF0C\u518D\u4F7F\u7528 department_communicate \u5206\u6D3E\u4EFB\u52A1\u3002
47618
- 4. Department Head \u53EF\u4EE5\u81EA\u5DF1\u505A\u4EFB\u52A1\u62C6\u89E3\u3001\u6D4B\u8BD5\u8BA1\u5212\u3001\u9A8C\u6536\u6807\u51C6\u3001\u98CE\u9669\u5224\u65AD\u3001\u8FDB\u5EA6\u8FFD\u95EE\u548C\u6700\u7EC8\u6C47\u603B\uFF1B\u4E0D\u8981\u9ED8\u8BA4\u81EA\u5DF1\u8C03\u7528 bash/read/write/edit/grep/codesearch/websearch \u53BB\u5B8C\u6210 Executor \u5E94\u8BE5\u505A\u7684\u4E13\u4E1A\u6267\u884C\u3002
47619
- 5. Executor \u672A\u56DE\u4FE1\u6216\u8FDB\u5EA6\u6162\uFF0C\u4E0D\u662F Department Head \u81EA\u5DF1\u4E0B\u573A\u5E72\u6D3B\u7684\u7406\u7531\uFF1B\u5E94\u901A\u8FC7 mailbox_followup \u6216 department_communicate \u8FFD\u95EE/\u8865\u5145\u4E0A\u4E0B\u6587\uFF0C\u5E76\u5411\u4E0A\u6E38\u8BF4\u660E\u6B63\u5728\u7B49\u5F85\u6267\u884C\u5C42\u7ED3\u679C\u3002
47620
- 6. \u53EA\u6709\u5F53\u90AE\u4EF6\u660E\u786E\u8981\u6C42 Department Head \u4EB2\u81EA\u6267\u884C\u3001\u5F53\u524D\u90E8\u95E8\u6CA1\u6709\u53EF\u7528 Executor \u4E14\u77ED\u671F\u65E0\u6CD5\u521B\u5EFA\u3001\u6216 Executor \u660E\u786E\u5931\u8D25\u4E14\u4E0A\u6E38\u540C\u610F Head \u63A5\u7BA1\u65F6\uFF0CDepartment Head \u624D\u80FD\u4EB2\u81EA\u4F7F\u7528\u6267\u884C\u7C7B\u5DE5\u5177\u5B8C\u6210\u4E13\u4E1A\u6267\u884C\u3002
47621
- 7. \u6536\u5230 Executor \u56DE\u4FE1\u540E\uFF0CDepartment Head \u5E94\u505A\u9A8C\u6536\u548C\u6C47\u603B\uFF1A\u5FC5\u8981\u65F6\u53EF\u4EE5\u68C0\u67E5\u5C11\u91CF\u5173\u952E\u8BC1\u636E\uFF0C\u4F46\u4E0D\u8981\u628A Executor \u7684\u5B8C\u6574\u6267\u884C\u804C\u8D23\u91CD\u65B0\u81EA\u5DF1\u505A\u4E00\u904D\u3002
47622
- 8. Department Head \u9A8C\u6536 Executor \u7ED3\u679C\u540E\uFF0C\u5FC5\u987B\u56DE\u5230\u4E0A\u6E38\u8BF7\u6C42\u7EBF\u7A0B\u5411\u539F\u53D1\u9001\u8005\u540C\u6B65\u6700\u7EC8\u7ED3\u8BBA\u3002\u82E5\u4E0A\u6E38\u662F manager/CEO\uFF0C\u4F7F\u7528\u539F manager \u90AE\u4EF6\u7684 message_id \u8C03\u7528 reply_mailbox \u6216 mailbox_followup\uFF1B\u4E0D\u8981\u53EA\u628A\u201C\u9A8C\u6536\u901A\u8FC7/\u5B8C\u6210\u6C47\u62A5\u201D\u56DE\u590D\u7ED9 Executor\uFF0C\u5426\u5219 CEO \u548C\u7528\u6237\u4E0D\u4F1A\u6536\u5230\u7ED3\u679C\u3002
47623
- 9. \u5982\u679C\u4E0A\u6E38 manager/CEO \u540E\u7EED\u50AC\u95EE\u540C\u4E00\u7EBF\u7A0B\uFF0C\u5373\u4F7F\u4F60\u5DF2\u7ECF\u638C\u63E1\u6700\u7EC8\u62A5\u544A\uFF0C\u4E5F\u8981\u628A\u6700\u7EC8\u62A5\u544A\u6216\u7B80\u660E\u72B6\u6001\u56DE\u7ED9 manager/CEO\uFF1B\u50AC\u95EE\u4E0D\u662F\u53EF\u4E22\u5F03\u901A\u77E5\u3002
47624
- </Department Head Delegation Rules>
47636
+ \u51E0\u4E2A\u5DE5\u5177\u7684\u542B\u4E49\u8981\u5206\u6E05\uFF0C\u522B\u53EA\u7528\u81EA\u7136\u8BED\u8A00\u8BF4\u8BF4\u5C31\u7B97\u6570\uFF1A
47637
+ - mailbox_followup(message_id, content)\uFF1A\u5728\u540C\u4E00\u7EBF\u7A0B\u91CC\u7EE7\u7EED\u6C9F\u901A\u2014\u2014\u540C\u6B65\u8FDB\u5C55\u3001\u8865\u5145\u7ED3\u679C\u3001\u8FFD\u95EE\u6216\u50AC\u529E\uFF1B\u53EF\u4EE5\u591A\u6B21\uFF0C\u4E0D\u4F1A\u7ED3\u675F\u8FD9\u5C01\u90AE\u4EF6\u3002
47638
+ - reply_mailbox(message_id, content)\uFF1A\u4F60\u5BF9\u8FD9\u5C01\u90AE\u4EF6\u5DF2\u7ECF\u5F62\u6210\u6B63\u5F0F\u7ED3\u8BBA\uFF0C\u56DE\u590D\u5E76\u7ED3\u675F\u5B83\u3002\u6BCF\u5C01\u90AE\u4EF6\u7528\u5B83\u81EA\u5DF1\u7684 message_id \u56DE\u590D\uFF0C\u522B\u62FF\u4E00\u6BB5\u8BDD\u540C\u65F6\u5145\u5F53\u591A\u5C01\u90AE\u4EF6\u7684\u7B54\u590D\u3002\u53D1\u9001\u8005\u9700\u8981\u77E5\u9053\u7ED3\u8BBA\u7684\uFF0C\u4E00\u5F8B\u7528\u5B83\u3002
47639
+ - discard_mailbox(message_id, reason)\uFF1A\u53EA\u6709\u5F53\u8FD9\u5C01\u90AE\u4EF6\u786E\u5B9E\u65E0\u9700\u4E1A\u52A1\u56DE\u590D\uFF08\u7EAF\u56DE\u6267\u3001\u91CD\u590D\u901A\u77E5\u3001\u5DF2\u88AB\u5176\u4ED6\u90AE\u4EF6\u8986\u76D6\uFF09\u65F6\u624D\u7528\uFF1B\u5B83\u4F1A\u7ED3\u675F\u90AE\u4EF6\uFF0C\u4F46\u4E0D\u4F1A\u7ED9\u53D1\u9001\u8005\u56DE\u4FE1\u3002
47640
+ - \u9700\u8981\u4E3B\u52A8\u8054\u7CFB\u522B\u7684\u90E8\u95E8\u6210\u5458\uFF0C\u7528 department_communicate\u3002
47641
+
47642
+ \u56DE\u590D\u5199\u5F97\u6E05\u695A\u3001\u6709\u6761\u7406\uFF0C\u65B9\u4FBF\u5BF9\u65B9\u63A5\u7740\u5E72\u3002
47643
+ </Mailbox \u5DE5\u4F5C\u65B9\u5F0F>
47625
47644
 
47626
47645
  <Task Execution>
47627
47646
  - Use available tools to complete the work.
@@ -52591,7 +52610,7 @@ var systemRoutes = new Hono2();
52591
52610
  var startTime = Date.now();
52592
52611
  systemRoutes.get("/system/info", (c) => {
52593
52612
  return c.json({
52594
- version: true ? "1.8.41" : "unknown",
52613
+ version: true ? "1.8.43" : "unknown",
52595
52614
  uptime: Math.floor((Date.now() - startTime) / 1e3),
52596
52615
  env: process.env.NODE_ENV || "development",
52597
52616
  nodeVersion: process.version