duclaw-cli 1.8.45 → 1.8.47

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.45" : "unknown"}`);
30245
+ console.log(`duclaw-cli v${true ? "1.8.47" : "unknown"}`);
30246
30246
  }
30247
30247
  function getDuclawTemplate() {
30248
30248
  return {
@@ -37985,8 +37985,8 @@ var getMessages = async (storage, userId, limit = 300, date, cronTitle) => {
37985
37985
  var isInjectedMemoryContextMessage = (msg) => {
37986
37986
  if (msg.role !== "user" || msg.content.length === 0) return false;
37987
37987
  if (!msg.content.every((block) => block.type === "text")) return false;
37988
- const textContent = msg.content.map((block) => block.type === "text" ? block.text : "").join("\n").trim();
37989
- return textContent.startsWith("<memory-context>") && textContent.endsWith("</memory-context>");
37988
+ const textContent2 = msg.content.map((block) => block.type === "text" ? block.text : "").join("\n").trim();
37989
+ return textContent2.startsWith("<memory-context>") && textContent2.endsWith("</memory-context>");
37990
37990
  };
37991
37991
  var hasProtocolBlock = (msg) => {
37992
37992
  return msg.content.some((block) => block.type === "tool_use" || block.type === "tool_result");
@@ -38226,12 +38226,12 @@ var searchChatHistory = async (messageStorage, topicStorage, userId, query, date
38226
38226
  for (let j = from; j <= to; j++) {
38227
38227
  const msg = messages[j];
38228
38228
  if (!msg) continue;
38229
- const textContent = msg.content.filter((b) => b.type === "text").map((b) => b.text).join(" ").slice(0, 200);
38230
- if (textContent) {
38229
+ const textContent2 = msg.content.filter((b) => b.type === "text").map((b) => b.text).join(" ").slice(0, 200);
38230
+ if (textContent2) {
38231
38231
  snippets.push({
38232
38232
  index: j,
38233
38233
  role: msg.role,
38234
- text: textContent,
38234
+ text: textContent2,
38235
38235
  isMatch: j === match2.i
38236
38236
  });
38237
38237
  }
@@ -43766,10 +43766,14 @@ var CEO_MAILBOX_ID2 = `manager`;
43766
43766
  var DESCRIPTION28 = `
43767
43767
  \u5728\u5F53\u524D mailbox \u7EBF\u7A0B\u4E2D\u8FFD\u52A0\u4E00\u6761\u8865\u5145\u6D88\u606F\uFF0C\u4F46\u4E0D\u7ED3\u675F\u539F\u6D88\u606F\u7684\u5904\u7406\u3002
43768
43768
 
43769
+ \u5B83\u5728\u7EC4\u7EC7\u91CC\u7684\u542B\u4E49\u66F4\u63A5\u8FD1\u201C\u540C\u4E00\u4EF6\u4E8B\u7684\u7EE7\u7EED\u6C9F\u901A\u201D\uFF1A\u8BA9\u5BF9\u65B9\u77E5\u9053\u4F60\u5DF2\u7ECF\u5B89\u6392\u3001\u6B63\u5728\u7B49\u8C01\u3001\u50AC\u4E86\u8C01\u3001\u76EE\u524D\u770B\u5230\u4E86\u54EA\u4E9B\u90E8\u5206\u7ED3\u679C\uFF0C\u6216\u9700\u8981\u5BF9\u65B9\u8865\u5145\u4EC0\u4E48\u3002
43770
+ \u7279\u522B\u662F\u7ED9 CEO/manager \u540C\u6B65\u201C\u5DF2\u59D4\u6D3E\u3001\u6B63\u5728\u68C0\u67E5\u3001\u7B49\u5F85\u4E0B\u5C5E\u7ED3\u679C\u3001\u5DF2\u50AC\u4FC3\u201D\u8FD9\u7C7B\u8FDB\u5EA6\u65F6\uFF0C\u4F18\u5148\u4F7F\u7528\u5B83\uFF1B\u7B49\u4F60\u9A8C\u6536\u5B8C\u771F\u5B9E\u7ED3\u679C\u3001\u53EF\u4EE5\u4EA4\u4ED8\u6700\u7EC8\u7ED3\u8BBA\u65F6\uFF0C\u518D\u4F7F\u7528 reply_mailbox\u3002
43771
+
43769
43772
  \u9002\u7528\u573A\u666F\uFF1A
43770
43773
  - \u540C\u6B65\u9636\u6BB5\u6027\u8FDB\u5C55
43771
43774
  - \u4E3B\u52A8\u8FFD\u95EE\u6F84\u6E05\u4FE1\u606F
43772
43775
  - \u5148\u53D1\u51FA\u90E8\u5206\u7ED3\u679C\uFF0C\u7A0D\u540E\u7EE7\u7EED\u8865\u5145
43776
+ - \u544A\u77E5\u4E0A\u6E38\u5DF2\u5B89\u6392\u4E0B\u5C5E\u3001\u6B63\u5728\u7B49\u5F85\u4E0B\u5C5E\u7ED3\u679C\uFF0C\u6216\u5DF2\u7ECF\u50AC\u529E
43773
43777
  - CEO \u6536\u5230\u67D0\u4E2A\u90E8\u95E8\u6210\u5458\u7684\u7ED3\u679C\u540E\uFF0C\u82E5\u7528\u6237\u7EE7\u7EED\u63D0\u4FEE\u6539\u610F\u89C1\u3001bug \u53CD\u9988\u3001\u6253\u4E0D\u5F00\u7B49\u95EE\u9898\uFF0C\u5E94\u4F18\u5148\u5BF9\u8BE5\u6210\u5458\u4E0A\u4E00\u6761\u76F8\u5173\u56DE\u4FE1\u8C03\u7528 mailbox_followup\uFF0C\u628A\u53CD\u9988\u6CBF\u539F\u7EBF\u7A0B\u53D1\u56DE\u539F\u8D23\u4EFB\u4EBA
43774
43778
 
43775
43779
  \u53C2\u6570\uFF1A
@@ -45235,9 +45239,10 @@ var getCompactConfig = () => ({
45235
45239
  enabled: readBoolean("COMPACT_ENABLED", true),
45236
45240
  contextWindowTokens: readNumber("COMPACT_CONTEXT_WINDOW_TOKENS", 2e5),
45237
45241
  outputReserveTokens: readNumber("COMPACT_OUTPUT_RESERVE_TOKENS", 2e4),
45238
- bufferTokens: readNumber("COMPACT_BUFFER_TOKENS", 13e3),
45242
+ bufferTokens: readNumber("COMPACT_BUFFER_TOKENS", 0),
45239
45243
  warningBufferTokens: readNumber("COMPACT_WARNING_BUFFER_TOKENS", 2e4),
45240
45244
  hotTailMessages: readNumber("COMPACT_HOT_TAIL_MESSAGES", 24),
45245
+ compactUserMessageMaxTokens: readNumber("COMPACT_USER_MESSAGE_MAX_TOKENS", 2e4),
45241
45246
  maxFailures: readNumber("COMPACT_MAX_FAILURES", 3),
45242
45247
  microCompactKeepToolResults: readNumber("MICRO_COMPACT_KEEP_TOOL_RESULTS", 5),
45243
45248
  microCompactToolResultChars: readNumber("MICRO_COMPACT_TOOL_RESULT_CHARS", 1200)
@@ -45363,70 +45368,50 @@ var tokenCountWithEstimation = (messages, systemPrompt = "") => {
45363
45368
  };
45364
45369
 
45365
45370
  // src/compact/compactPrompt.ts
45366
- var stringify2 = (value) => {
45367
- try {
45368
- return JSON.stringify(value);
45369
- } catch {
45370
- return "[unserializable]";
45371
- }
45372
- };
45373
- var renderBlock2 = (block) => {
45374
- switch (block.type) {
45375
- case "text":
45376
- return block.text;
45377
- case "tool_use":
45378
- return `[tool_use id=${block.id} name=${block.name} input=${stringify2(block.input)}]`;
45379
- case "tool_result":
45380
- return `[tool_result tool_use_id=${block.tool_use_id} content=${block.content}]`;
45381
- case "image":
45382
- return `[image source=${block.source.type}]`;
45383
- case "thinking":
45384
- return `[thinking ${block.thinking}]`;
45385
- default:
45386
- return stringify2(block);
45387
- }
45388
- };
45389
- var renderMessagesForCompact = (messages) => messages.map((message, index) => {
45390
- const content = message.content.map(renderBlock2).join("\n");
45391
- return `<message index="${index}" role="${message.role}">
45392
- ${content}
45393
- </message>`;
45394
- }).join("\n\n");
45395
- var COMPACT_SYSTEM_PROMPT = `\u4F60\u662F Duclaw \u7684\u4F1A\u8BDD\u538B\u7F29\u5668\u3002\u4F60\u53EA\u8D1F\u8D23\u628A\u7814\u53D1\u667A\u80FD\u4F53\u7684\u5386\u53F2\u5BF9\u8BDD\u538B\u7F29\u6210\u53EF\u7EE7\u7EED\u5DE5\u4F5C\u7684\u7ED3\u6784\u5316\u6458\u8981\uFF0C\u4E0D\u8C03\u7528\u5DE5\u5177\uFF0C\u4E0D\u548C\u7528\u6237\u804A\u5929\u3002
45396
-
45397
- \u8981\u6C42\uFF1A
45398
- 1. \u4FDD\u7559\u5F53\u524D\u7528\u6237\u76EE\u6807\u3001\u6700\u65B0\u660E\u786E\u8981\u6C42\u3001\u7EA6\u675F\u548C\u504F\u597D\u3002
45399
- 2. \u4FDD\u7559\u5F53\u524D\u4EFB\u52A1\u72B6\u6001\u3001\u5DF2\u5B8C\u6210\u5DE5\u4F5C\u3001\u672A\u5B8C\u6210\u4E8B\u9879\u548C\u4E0B\u4E00\u6B65\u3002
45400
- 3. \u4FDD\u7559\u5173\u952E\u6587\u4EF6\u8DEF\u5F84\u3001\u547D\u4EE4\u3001\u9519\u8BEF\u539F\u6587\u7247\u6BB5\u3001\u5916\u90E8\u6587\u6863/\u63A5\u53E3\u7ED3\u8BBA\u3002
45401
- 4. \u4FDD\u7559\u91CD\u8981\u5DE5\u5177\u7ED3\u679C\uFF0C\u4F46\u4E0D\u8981\u7C98\u8D34\u957F\u65E5\u5FD7\uFF1B\u53EA\u5199\u53EF\u884C\u52A8\u7ED3\u8BBA\u3002
45402
- 5. \u6807\u51FA\u5DF2\u4E22\u5F03\u6216\u4E0D\u518D\u91CD\u8981\u7684\u4FE1\u606F\u7C7B\u578B\u3002
45403
- 6. \u5982\u679C\u5386\u53F2\u4E2D\u6709 Department Head\u3001Executor\u3001mailbox\u3001cron \u7EBF\u7D22\uFF0C\u8BB0\u5F55\u8D23\u4EFB\u4EBA\u548C\u7EBF\u7A0B\u72B6\u6001\u3002
45404
- 7. \u8F93\u51FA\u5FC5\u987B\u662F\u7EAF\u6587\u672C\uFF0C\u5E76\u4E25\u683C\u4F7F\u7528\u4E0B\u9762\u7ED3\u6784\uFF1A
45371
+ var COMPACT_SUMMARIZATION_PROMPT = `You are performing a CONTEXT CHECKPOINT COMPACTION. Create a handoff summary for another LLM that will resume the task.
45372
+
45373
+ The summary must be concise, factual, and directly useful for continuing the work. Do not invent missing details. Clearly separate confirmed facts from assumptions or items that still need verification.
45374
+
45375
+ Use this exact schema:
45405
45376
 
45406
45377
  <compact-summary>
45407
- 1. \u7528\u6237\u76EE\u6807\uFF1A
45408
- 2. \u5F53\u524D\u4EFB\u52A1\u72B6\u6001\uFF1A
45409
- 3. \u5DF2\u5B8C\u6210\u5DE5\u4F5C\uFF1A
45410
- 4. \u5DF2\u67E5\u770B/\u4FEE\u6539\u7684\u6587\u4EF6\uFF1A
45411
- 5. \u5173\u952E\u5DE5\u5177\u7ED3\u679C\uFF1A
45412
- 6. \u9519\u8BEF\u4E0E\u4FEE\u590D\uFF1A
45413
- 7. \u7528\u6237\u660E\u786E\u7EA6\u675F\uFF1A
45414
- 8. \u672A\u5B8C\u6210\u4E8B\u9879\uFF1A
45415
- 9. \u4E0B\u4E00\u6B65\u5EFA\u8BAE\uFF1A
45416
- 10. \u5DF2\u4E22\u5F03\u4FE1\u606F\uFF1A
45417
- </compact-summary>`;
45418
- var buildCompactUserPrompt = (messages, reason) => `\u8BF7\u538B\u7F29\u4E0B\u9762\u7684\u4F1A\u8BDD\u5386\u53F2\uFF0C\u89E6\u53D1\u539F\u56E0\uFF1A${reason}\u3002
45419
-
45420
- <conversation>
45421
- ${renderMessagesForCompact(messages)}
45422
- </conversation>`;
45378
+ 1. \u7528\u6237\u6700\u65B0\u76EE\u6807:
45379
+ 2. \u7528\u6237\u786C\u6027\u7EA6\u675F:
45380
+ 3. \u5F53\u524D\u4E8B\u5B9E\u72B6\u6001:
45381
+ 4. \u5DF2\u5B8C\u6210\u52A8\u4F5C:
45382
+ 5. \u6587\u4EF6/\u547D\u4EE4/\u8BC1\u636E:
45383
+ 6. mailbox/department \u7EBF\u7A0B:
45384
+ 7. \u7528\u6237\u53EF\u89C1\u627F\u8BFA:
45385
+ 8. \u672A\u5B8C\u6210\u4E8B\u9879:
45386
+ 9. \u5F53\u524D\u963B\u585E\u4E0E\u7B49\u5F85\u5BF9\u8C61:
45387
+ 10. \u4E0B\u4E00\u6B65\u5FC5\u987B\u52A8\u4F5C:
45388
+ 11. \u4E0D\u786E\u5B9A/\u5F85\u786E\u8BA4:
45389
+ 12. \u5DF2\u4E22\u5F03\u4FE1\u606F:
45390
+ </compact-summary>
45391
+
45392
+ Field guidance:
45393
+ - \u7528\u6237\u6700\u65B0\u76EE\u6807: the latest user intent, not stale earlier goals.
45394
+ - \u7528\u6237\u786C\u6027\u7EA6\u675F: explicit user constraints, safety boundaries, deployment/data-persistence constraints, style preferences, or "do not" instructions.
45395
+ - \u5F53\u524D\u4E8B\u5B9E\u72B6\u6001: verified state only. Say "\u65E0" if there is no verified fact.
45396
+ - \u5DF2\u5B8C\u6210\u52A8\u4F5C: concrete actions already performed by the agent or team.
45397
+ - \u6587\u4EF6/\u547D\u4EE4/\u8BC1\u636E: important paths, commands, test results, errors, URLs, versions, sandbox IDs, mailbox IDs, and other evidence required to continue.
45398
+ - mailbox/department \u7EBF\u7A0B: responsible owner, mailbox thread/message IDs, CEO followups, department head/executor status, who owes a reply to whom, and whether the user-visible closure is complete.
45399
+ - \u7528\u6237\u53EF\u89C1\u627F\u8BFA: what the user has been told or promised, including pending follow-ups.
45400
+ - \u672A\u5B8C\u6210\u4E8B\u9879: work still not done.
45401
+ - \u5F53\u524D\u963B\u585E\u4E0E\u7B49\u5F85\u5BF9\u8C61: blockers, external waits, running commands, pending approvals, or a named agent/person/system being waited on.
45402
+ - \u4E0B\u4E00\u6B65\u5FC5\u987B\u52A8\u4F5C: the minimal next actions the next LLM should take, in order.
45403
+ - \u4E0D\u786E\u5B9A/\u5F85\u786E\u8BA4: assumptions, ambiguous facts, or things that must be re-checked.
45404
+ - \u5DF2\u4E22\u5F03\u4FE1\u606F: categories of old details intentionally omitted, such as long logs, obsolete failed attempts, or completed transient steps.
45405
+
45406
+ If a field does not apply, write "\u65E0".`;
45407
+ var COMPACT_SUMMARY_PREFIX = `Another language model started to solve this problem and produced a summary of its thinking process. You also have access to the state of the tools that were used by that language model. Use this to build on the work that has already been done and avoid duplicating work. Here is the summary produced by the other language model, use the information in this summary to assist with your own analysis:`;
45408
+ var COMPACT_SYSTEM_PROMPT = `You are Duclaw's context compaction worker. Produce only the requested handoff summary. Do not call tools and do not chat with the user.`;
45409
+ var buildCompactUserPrompt = (_messages, reason) => `${COMPACT_SUMMARIZATION_PROMPT}
45410
+
45411
+ Compaction trigger: ${reason}`;
45423
45412
 
45424
45413
  // src/compact/CompactEngine.ts
45425
45414
  var buildCompactSummaryKey = (userId, date, cronTitle) => `compact:summary:${userId}:${date}${cronTitle ? `:${cronTitle}` : ""}`;
45426
- var assistantAck = {
45427
- role: "assistant",
45428
- content: [text("\u6211\u5DF2\u8BFB\u53D6\u538B\u7F29\u6458\u8981\uFF0C\u5C06\u57FA\u4E8E\u8BE5\u72B6\u6001\u7EE7\u7EED\u3002")]
45429
- };
45430
45415
  var extractSummaryText = (message) => message.content.filter((block) => block.type === "text").map((block) => block.text).join("\n").trim();
45431
45416
  var stripAssistantUsage = (message) => {
45432
45417
  if (message.role !== "assistant") return { ...message, content: [...message.content] };
@@ -45435,20 +45420,28 @@ var stripAssistantUsage = (message) => {
45435
45420
  content: [...message.content]
45436
45421
  };
45437
45422
  };
45438
- var selectProtocolSafeHotTail = (messages, hotTailMessages) => {
45439
- if (messages.length === 0 || hotTailMessages <= 0) return [];
45440
- let start = Math.max(0, messages.length - hotTailMessages);
45441
- while (start > 0) {
45442
- while (start > 0 && messages[start]?.role !== "user") {
45443
- start--;
45444
- }
45445
- const startsWithToolResult = messages[start]?.role === "user" && messages[start]?.content.some((block) => block.type === "tool_result");
45446
- if (!startsWithToolResult) break;
45447
- start--;
45448
- }
45449
- const tail = sanitizeMessages(messages.slice(start).map(stripAssistantUsage));
45450
- return tail.slice(-Math.max(hotTailMessages, tail.length));
45451
- };
45423
+ var textContent = (message) => message.content.filter((block) => block.type === "text").map((block) => block.text).join("\n").trim();
45424
+ var isSummaryUserMessage = (message) => message.role === "user" && textContent(message).startsWith(COMPACT_SUMMARY_PREFIX);
45425
+ var isRawTextUserMessage = (message) => message.role === "user" && message.content.length > 0 && message.content.every((block) => block.type === "text") && !isSummaryUserMessage(message);
45426
+ var collectRecentUserMessages = (messages, maxTokens) => {
45427
+ if (maxTokens <= 0) return [];
45428
+ const selected = [];
45429
+ let usedTokens = 0;
45430
+ for (let i = messages.length - 1; i >= 0; i--) {
45431
+ const message = messages[i];
45432
+ if (!message || !isRawTextUserMessage(message)) continue;
45433
+ const messageTokens = roughTokenEstimateText(textContent(message));
45434
+ if (selected.length > 0 && usedTokens + messageTokens > maxTokens) break;
45435
+ if (messageTokens > maxTokens && selected.length === 0) continue;
45436
+ selected.push({ role: "user", content: [...message.content] });
45437
+ usedTokens += messageTokens;
45438
+ }
45439
+ return selected.reverse();
45440
+ };
45441
+ var buildCompactionRequestMessages = (messages, reason) => sanitizeMessagesWithReport([
45442
+ ...messages.map(stripAssistantUsage),
45443
+ userMessage(text(buildCompactUserPrompt(messages, reason)))
45444
+ ], { mergeAdjacentNonProtocolMessages: false }).messages;
45452
45445
  var CompactEngine = class {
45453
45446
  storage;
45454
45447
  summaryStorage;
@@ -45469,20 +45462,21 @@ var CompactEngine = class {
45469
45462
  }
45470
45463
  const tokenCountBefore = tokenCountWithEstimation(sourceMessages, input.systemPrompt);
45471
45464
  const response = await this.llm.chat(
45472
- [userMessage(text(buildCompactUserPrompt(sourceMessages, input.reason)))],
45465
+ buildCompactionRequestMessages(sourceMessages, input.reason),
45473
45466
  COMPACT_SYSTEM_PROMPT,
45474
45467
  []
45475
45468
  );
45476
- const summary = extractSummaryText(response);
45477
- if (!summary) {
45469
+ const rawSummary = extractSummaryText(response);
45470
+ if (!rawSummary) {
45478
45471
  throw new Error("[compact] compact LLM \u6CA1\u6709\u8FD4\u56DE\u6458\u8981\u6587\u672C");
45479
45472
  }
45480
- const hotTail = selectProtocolSafeHotTail(sourceMessages, this.config.hotTailMessages);
45481
- const compactedMessages = sanitizeMessages([
45482
- userMessage(text(summary)),
45483
- assistantAck,
45484
- ...hotTail
45485
- ]);
45473
+ const summary = `${COMPACT_SUMMARY_PREFIX}
45474
+ ${rawSummary}`.trim();
45475
+ const recentUserMessages = collectRecentUserMessages(sourceMessages, this.config.compactUserMessageMaxTokens);
45476
+ const compactedMessages = sanitizeMessagesWithReport([
45477
+ ...recentUserMessages,
45478
+ userMessage(text(summary))
45479
+ ], { mergeAdjacentNonProtocolMessages: false }).messages;
45486
45480
  if (compactedMessages.length === 0) {
45487
45481
  throw new Error("[compact] compact \u540E\u6CA1\u6709\u53EF\u5199\u56DE\u7684\u5408\u6CD5\u6D88\u606F");
45488
45482
  }
@@ -45494,7 +45488,7 @@ var CompactEngine = class {
45494
45488
  ...input.threadId ? { threadId: input.threadId } : {},
45495
45489
  summary,
45496
45490
  sourceMessageCount: sourceMessages.length,
45497
- hotTailCount: hotTail.length,
45491
+ hotTailCount: recentUserMessages.length,
45498
45492
  contextTokensBefore: tokenCountBefore.tokens,
45499
45493
  contextTokensAfter: roughTokenEstimateMessages(compactedMessages),
45500
45494
  tokenCountSource: tokenCountBefore.source,
@@ -45534,7 +45528,7 @@ var CompactEngine = class {
45534
45528
 
45535
45529
  // src/compact/microCompact.ts
45536
45530
  var COMPACTED_MARKER = "[\u65E7\u5DE5\u5177\u7ED3\u679C\u5DF2\u538B\u7F29]";
45537
- var stringify3 = (value) => {
45531
+ var stringify2 = (value) => {
45538
45532
  try {
45539
45533
  return JSON.stringify(value);
45540
45534
  } catch {
@@ -45582,7 +45576,7 @@ var stripAssistantUsage2 = (message) => {
45582
45576
  };
45583
45577
  var buildCompactedToolResultContent = (block, toolUse, maxChars) => {
45584
45578
  const toolName = toolUse?.name ?? "unknown";
45585
- const toolInput = toolUse ? stringify3(toolUse.input) : "{}";
45579
+ const toolInput = toolUse ? stringify2(toolUse.input) : "{}";
45586
45580
  const previewChars = Math.max(200, Math.floor(maxChars * 0.6));
45587
45581
  return `${COMPACTED_MARKER}
45588
45582
  \u5DE5\u5177: ${toolName}
@@ -46338,9 +46332,9 @@ ${memoryInjection}` : "") + dreamInjection;
46338
46332
  const textBlocks = response.content.filter(
46339
46333
  (b) => b.type === "text"
46340
46334
  );
46341
- const textContent = textBlocks.map((b) => b.text).join(`
46335
+ const textContent2 = textBlocks.map((b) => b.text).join(`
46342
46336
  `).trim();
46343
- if (textContent) {
46337
+ if (textContent2) {
46344
46338
  await addMessage(storage, userId, assistantMessageFromResponse(response), beijingTime, job?.title);
46345
46339
  const lateInterrupts = drainInterrupts(userId);
46346
46340
  if (lateInterrupts.length > 0) {
@@ -46367,27 +46361,27 @@ ${msg}</user-interrupt>`
46367
46361
  }
46368
46362
  const visibleCeoFollowupIds = ceoFollowupIdsFromMetadata(request.metadata);
46369
46363
  if (!hasSentMessage && visibleCeoFollowupIds.length > 0 && config2.channelPlugin) {
46370
- if (claimOutboundSend(request.userId, textContent)) {
46364
+ if (claimOutboundSend(request.userId, textContent2)) {
46371
46365
  await config2.channelPlugin.outbound.sendText({
46372
46366
  cfg: {},
46373
46367
  to: request.userId,
46374
- text: textContent,
46368
+ text: textContent2,
46375
46369
  accountId: request.requestId
46376
46370
  });
46377
46371
  } else {
46378
46372
  console.log(`[outbound-dedup] \u8DF3\u8FC7\u5BF9\u7528\u6237 ${request.userId} \u7684\u8FD1\u91CD\u590D\u515C\u5E95\u53D1\u9001`);
46379
46373
  }
46380
46374
  hasSentMessage = true;
46381
- sentMessageContent = textContent;
46375
+ sentMessageContent = textContent2;
46382
46376
  completeUserVisibleCeoFollowups();
46383
46377
  }
46384
46378
  if (topicStorage) {
46385
- const topicSummary = hasSentMessage ? sentMessageContent : textContent;
46379
+ const topicSummary = hasSentMessage ? sentMessageContent : textContent2;
46386
46380
  await updateTopicSummary(topicStorage, userId, beijingTime, topicSummary, job?.title);
46387
46381
  }
46388
46382
  markAgentEventsHandled([...injectedEventIds]);
46389
46383
  return {
46390
- content: hasSentMessage ? sentMessageContent : textContent,
46384
+ content: hasSentMessage ? sentMessageContent : textContent2,
46391
46385
  alreadySent: hasSentMessage
46392
46386
  };
46393
46387
  }
@@ -46806,6 +46800,38 @@ var DESCRIPTION39 = `
46806
46800
  \u53C2\u6570\uFF1A
46807
46801
  - message_id: \u90AE\u4EF6\u7684 id\uFF08\u4ECE list_mailbox \u4E2D\u83B7\u53D6\uFF09
46808
46802
  `;
46803
+ var buildUpstreamContext = (msg) => {
46804
+ if (msg.workItemRole !== "executor_result" || !msg.workItemId) return "";
46805
+ const db3 = createSqliteDB();
46806
+ const upstreamId = msg.upstreamMessageId || msg.workItemId;
46807
+ const upstream = db3.prepare(
46808
+ `SELECT
46809
+ id,
46810
+ from_mailbox_id as fromMailboxId,
46811
+ to_mailbox_id as toMailboxId,
46812
+ content,
46813
+ status
46814
+ FROM mailbox
46815
+ WHERE id = ?
46816
+ OR (
46817
+ work_item_id = ?
46818
+ AND from_mailbox_id = 'manager'
46819
+ AND to_mailbox_id = ?
46820
+ )
46821
+ ORDER BY CASE WHEN id = ? THEN 0 ELSE 1 END, send_time ASC
46822
+ LIMIT 1`
46823
+ ).get(upstreamId, msg.workItemId, msg.toMailboxId, upstreamId);
46824
+ if (!upstream) return "";
46825
+ const preview2 = upstream.content.length > 180 ? `${upstream.content.slice(0, 180)}...` : upstream.content;
46826
+ return [
46827
+ ``,
46828
+ `--- \u4E0A\u6E38\u8D23\u4EFB\u4E0A\u4E0B\u6587 ---`,
46829
+ `\u8FD9\u5C01\u90AE\u4EF6\u662F\u4E0B\u5C5E\u5BF9\u4F60\u59D4\u6D3E\u5DE5\u4F5C\u7684\u7ED3\u679C\uFF0C\u5173\u8054\u5230 CEO/manager \u7ED9\u4F60\u7684\u539F\u59CB\u59D4\u6258\u3002`,
46830
+ `\u4E0A\u6E38\u90AE\u4EF6: ${upstream.id}\uFF08\u72B6\u6001: ${upstream.status}\uFF09`,
46831
+ `\u4E0A\u6E38\u59D4\u6258\u6458\u8981: ${preview2}`,
46832
+ `\u50CF\u8D1F\u8D23\u4EBA\u4E00\u6837\u5148\u9A8C\u6536\u8FD9\u4EFD\u4E0B\u5C5E\u7ED3\u679C\uFF1B\u5982\u679C\u5B83\u5DF2\u7ECF\u8DB3\u591F\u6210\u4E3A\u6700\u7EC8\u7ED3\u8BBA\uFF0C\u8BF7\u6574\u7406\u6210 CEO \u80FD\u76F4\u63A5\u8F6C\u8FF0\u7ED9\u8001\u677F\u7684\u6C47\u603B\uFF0C\u5E76\u56DE\u5230\u4E0A\u6E38\u7EBF\u7A0B\u4EA4\u4EE3\u3002`
46833
+ ].join("\n");
46834
+ };
46809
46835
  var getMailbox = {
46810
46836
  name: `get_mailbox`,
46811
46837
  description: DESCRIPTION39,
@@ -46834,7 +46860,10 @@ var getMailbox = {
46834
46860
  send_time as sendTime,
46835
46861
  status,
46836
46862
  thread_id as threadId,
46837
- parent_message_id as parentMessageId
46863
+ parent_message_id as parentMessageId,
46864
+ work_item_id as workItemId,
46865
+ work_item_role as workItemRole,
46866
+ upstream_message_id as upstreamMessageId
46838
46867
  FROM mailbox WHERE id = ?`
46839
46868
  );
46840
46869
  const msg = stmt.get(messageId);
@@ -46867,13 +46896,14 @@ var getMailbox = {
46867
46896
  });
46868
46897
  const time = new Date(msg.sendTime).toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" });
46869
46898
  const threadId = msg.threadId || msg.id;
46899
+ const upstreamContext = buildUpstreamContext(msg);
46870
46900
  return `[getMailbox] \u90AE\u4EF6\u8BE6\u60C5\uFF1A
46871
46901
  id: ${msg.id}
46872
46902
  \u6765\u81EA: ${msg.fromMailboxId}
46873
46903
  \u65F6\u95F4: ${time}
46874
46904
  \u72B6\u6001: ${msg.status}
46875
46905
  thread: ${threadId}
46876
- parent: ${msg.parentMessageId || "-"}
46906
+ parent: ${msg.parentMessageId || "-"}${upstreamContext}
46877
46907
 
46878
46908
  --- \u90AE\u4EF6\u6B63\u6587 ---
46879
46909
  ${msg.content}`;
@@ -46982,11 +47012,14 @@ var discardMailbox = {
46982
47012
 
46983
47013
  // src/tools/tools/department/ReplyMailbox.ts
46984
47014
  var DESCRIPTION41 = `
46985
- \u6B63\u5F0F\u56DE\u590D\u4E00\u5C01\u90AE\u4EF6\u3002\u5BF9\u5F53\u524D\u6D88\u606F\u5F62\u6210\u660E\u786E\u7ED3\u8BBA\u540E\uFF0C\u4F7F\u7528\u6B64\u5DE5\u5177\u5C06\u7ED3\u679C\u53D1\u56DE\u7ED9\u90AE\u4EF6\u53D1\u9001\u8005\uFF0C\u5E76\u7ED3\u675F\u8FD9\u5C01\u6D88\u606F\u7684\u5904\u7406\u3002
47015
+ \u6B63\u5F0F\u56DE\u590D\u4E00\u5C01\u90AE\u4EF6\u3002\u5BF9\u5F53\u524D\u6D88\u606F\u5F62\u6210\u53EF\u4EE5\u4EA4\u4ED8\u7ED9\u5BF9\u65B9\u7684\u6700\u7EC8\u7ED3\u8BBA\u540E\uFF0C\u4F7F\u7528\u6B64\u5DE5\u5177\u5C06\u7ED3\u679C\u53D1\u56DE\u7ED9\u90AE\u4EF6\u53D1\u9001\u8005\uFF0C\u5E76\u7ED3\u675F\u8FD9\u5C01\u6D88\u606F\u7684\u5904\u7406\u3002
47016
+
47017
+ \u5B83\u5728\u7EC4\u7EC7\u91CC\u7684\u542B\u4E49\u66F4\u63A5\u8FD1\u201C\u6211\u5DF2\u7ECF\u628A\u8FD9\u4EF6\u4E8B\u9A8C\u6536\u6E05\u695A\uFF0C\u53EF\u4EE5\u7ED9\u4F60\u4E00\u4E2A\u7ED3\u8BBA\u201D\uFF0C\u800C\u4E0D\u662F\u666E\u901A\u804A\u5929\u56DE\u590D\u3002
47018
+ \u5982\u679C\u53EA\u662F\u540C\u6B65\u9636\u6BB5\u6027\u8FDB\u5C55\u3001\u8BF4\u660E\u5DF2\u5B89\u6392\u4E0B\u5C5E\u3001\u8FD8\u5728\u7B49\u5F85\u6267\u884C\u7ED3\u679C\u3001\u50AC\u529E\u3001\u8865\u5145\u4E0A\u4E0B\u6587\u6216\u5148\u7ED9\u90E8\u5206\u53D1\u73B0\uFF0C\u5E94\u4F7F\u7528 mailbox_followup\uFF0C\u8BA9\u539F\u90AE\u4EF6\u7EE7\u7EED\u4FDD\u6301\u672A\u5B8C\u5F85\u7EED\u3002
46986
47019
 
46987
47020
  \u53C2\u6570\uFF1A
46988
47021
  - message_id: \u8981\u56DE\u590D\u7684\u90AE\u4EF6 id\uFF08\u4ECE list_mailbox \u6216 get_mailbox \u4E2D\u83B7\u53D6\uFF09
46989
- - content: \u56DE\u590D\u5185\u5BB9\uFF08\u4F60\u7684\u6B63\u5F0F\u5904\u7406\u7ED3\u679C\u3001\u9636\u6BB5\u7ED3\u8BBA\u3001\u6216\u660E\u786E\u8BF4\u660E\u6682\u4E0D\u5904\u7406\u7684\u539F\u56E0\uFF09
47022
+ - content: \u56DE\u590D\u5185\u5BB9\uFF08\u4F60\u7684\u6B63\u5F0F\u5904\u7406\u7ED3\u679C\u3001\u6700\u7EC8\u6C47\u603B\u3001\u9A8C\u6536\u7ED3\u8BBA\uFF0C\u6216\u660E\u786E\u8BF4\u660E\u65E0\u6CD5\u7EE7\u7EED\u5904\u7406\u7684\u539F\u56E0\uFF09
46990
47023
 
46991
47024
  \u6B64\u5DE5\u5177\u4F1A\u81EA\u52A8\uFF1A
46992
47025
  1. \u5C06\u56DE\u590D\u5185\u5BB9\u53D1\u9001\u5230\u539F\u53D1\u9001\u8005\u7684\u90AE\u7BB1
@@ -47603,9 +47636,11 @@ var getDepartmentAgentConfig = (tools, memberFocusOn, workspacePath, departmentN
47603
47636
 
47604
47637
  \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
47638
 
47639
+ \u4F60\u4E0D\u662F\u6D88\u606F\u642C\u8FD0\u5DE5\u3002Executor \u628A\u7ED3\u679C\u4EA4\u7ED9\u4F60\u4EE5\u540E\uFF0C\u4F60\u8981\u50CF\u4E00\u4E2A\u8D1F\u8D23\u4EBA\u90A3\u6837\u5148\u9A8C\u6536\u3001\u63D0\u70BC\u3001\u5224\u65AD\u98CE\u9669\u548C\u4E0B\u4E00\u6B65\uFF0C\u518D\u628A\u4E0B\u5C5E\u4EA4\u4ED8\u8F6C\u6210 CEO \u80FD\u770B\u61C2\u3001\u80FD\u62FF\u53BB\u5411\u8001\u677F\u4EA4\u4EE3\u7684\u7ED3\u8BBA\u3002\u5BF9\u4E0B\u5C5E\u8BF4\u201C\u6536\u5230/\u8BA4\u53EF\u201D\u53EA\u662F\u90E8\u95E8\u5185\u786E\u8BA4\uFF1B\u628A\u771F\u5B9E\u7ED3\u8BBA\u4EA4\u56DE\u7ED9\u4E0A\u6E38\uFF0C\u624D\u662F\u8D1F\u8D23\u4EBA\u8FD9\u4EF6\u4E8B\u7684\u6536\u5C3E\u3002
47640
+
47606
47641
  \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
47642
 
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`;
47643
+ 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\u7ED9\u4E0A\u6E38\u540C\u6B65\u201C\u5DF2\u5B89\u6392\u3001\u8FD8\u5728\u7B49\u3001\u5DF2\u50AC\u4FC3\u3001\u5DF2\u6709\u90E8\u5206\u53D1\u73B0\u201D\u8FD9\u7C7B\u8FDB\u5C55\uFF0C\u7528 mailbox_followup\uFF1B\u7B49\u4F60\u9A8C\u6536\u5B8C\u771F\u5B9E\u7ED3\u679C\u3001\u53EF\u4EE5\u7ED9\u51FA\u6700\u7EC8\u6C47\u603B\u65F6\uFF0C\u518D\u7528 reply_mailbox \u6B63\u5F0F\u4EA4\u4ED8\u7ED3\u8BBA\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`;
47609
47644
  const defaultSystemPrompt = `
47610
47645
  ${COMPANY_VALUES_PROMPT}
47611
47646
 
@@ -47635,7 +47670,7 @@ ${workspacePath ? `
47635
47670
 
47636
47671
  \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
47672
  - 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
47673
+ - reply_mailbox(message_id, content)\uFF1A\u4F60\u5BF9\u8FD9\u5C01\u90AE\u4EF6\u5DF2\u7ECF\u5F62\u6210\u53EF\u4EE5\u4EA4\u4ED8\u7ED9\u5BF9\u65B9\u7684\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\u8FD8\u5728\u7B49\u5F85\u4E0B\u6E38\u3001\u53EA\u662F\u540C\u6B65\u5B89\u6392\u6216\u50AC\u529E\u65F6\uFF0C\u4E0D\u8981\u7528\u5B83\u7ED3\u675F\u4E0A\u6E38\u8BF7\u6C42\u3002
47639
47674
  - 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
47675
  - \u9700\u8981\u4E3B\u52A8\u8054\u7CFB\u522B\u7684\u90E8\u95E8\u6210\u5458\uFF0C\u7528 department_communicate\u3002
47641
47676
 
@@ -52610,7 +52645,7 @@ var systemRoutes = new Hono2();
52610
52645
  var startTime = Date.now();
52611
52646
  systemRoutes.get("/system/info", (c) => {
52612
52647
  return c.json({
52613
- version: true ? "1.8.45" : "unknown",
52648
+ version: true ? "1.8.47" : "unknown",
52614
52649
  uptime: Math.floor((Date.now() - startTime) / 1e3),
52615
52650
  env: process.env.NODE_ENV || "development",
52616
52651
  nodeVersion: process.version