duclaw-cli 1.8.17 → 1.8.19

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.17" : "unknown"}`);
30245
+ console.log(`duclaw-cli v${true ? "1.8.19" : "unknown"}`);
30246
30246
  }
30247
30247
  function getDuclawTemplate() {
30248
30248
  return {
@@ -46098,7 +46098,7 @@ var saveResultToFile = (job, cronResp) => {
46098
46098
  var DESCRIPTION38 = `
46099
46099
  \u67E5\u770B\u4F60\u7684\u90AE\u7BB1\u4E2D\u6240\u6709\u5F85\u5904\u7406\u90AE\u4EF6\u7684\u6458\u8981\u5217\u8868\u3002
46100
46100
 
46101
- \u8FD4\u56DE\u6BCF\u5C01\u90AE\u4EF6\u7684\uFF1Aid\u3001\u53D1\u9001\u8005\u3001\u53D1\u9001\u65F6\u95F4\u3001\u5185\u5BB9\u6458\u8981\uFF08\u524D100\u5B57\uFF09\u3002
46101
+ \u8FD4\u56DE\u6BCF\u5C01\u90AE\u4EF6\u7684\uFF1Aid\u3001\u53D1\u9001\u8005\u3001\u53D1\u9001\u65F6\u95F4\u3001\u72B6\u6001\u3001\u5185\u5BB9\u6458\u8981\uFF08\u524D100\u5B57\uFF09\u3002
46102
46102
  \u4F60\u5E94\u8BE5\u5148\u8C03\u7528\u6B64\u5DE5\u5177\u4E86\u89E3\u5F53\u524D\u6709\u54EA\u4E9B\u90AE\u4EF6\uFF0C\u518D\u6839\u636E\u65F6\u6548\u6027\u548C\u91CD\u8981\u6027\u51B3\u5B9A\u4F18\u5148\u5904\u7406\u54EA\u5C01\u3002
46103
46103
 
46104
46104
  \u4F7F\u7528\u6D41\u7A0B\uFF1A
@@ -46123,9 +46123,9 @@ var listMailbox = {
46123
46123
  const myMailboxId = userRequest.departmentAgentId;
46124
46124
  const db3 = createSqliteDB();
46125
46125
  const stmt = db3.prepare(
46126
- `SELECT id, from_mailbox_id as fromMailboxId, content, send_time as sendTime
46126
+ `SELECT id, from_mailbox_id as fromMailboxId, content, send_time as sendTime, status
46127
46127
  FROM mailbox
46128
- WHERE to_mailbox_id = ? AND status = 'processing'
46128
+ WHERE to_mailbox_id = ? AND status in ('pending', 'processing')
46129
46129
  ORDER BY send_time ASC`
46130
46130
  );
46131
46131
  const msgs = stmt.all(myMailboxId);
@@ -46157,6 +46157,7 @@ var listMailbox = {
46157
46157
  return `[${i + 1}] id: ${msg.id}
46158
46158
  \u6765\u81EA: ${msg.fromMailboxId}
46159
46159
  \u65F6\u95F4: ${time}
46160
+ \u72B6\u6001: ${msg.status}
46160
46161
  \u6458\u8981: ${preview2}`;
46161
46162
  }).join("\n\n");
46162
46163
  return `[listMailbox] \u4F60\u6709 ${msgs.length} \u5C01\u5F85\u5904\u7406\u90AE\u4EF6\uFF1A
@@ -46170,7 +46171,7 @@ var DESCRIPTION39 = `
46170
46171
  \u83B7\u53D6\u6307\u5B9A\u90AE\u4EF6\u7684\u5B8C\u6574\u5185\u5BB9\u3002
46171
46172
 
46172
46173
  \u5728 list_mailbox \u67E5\u770B\u90AE\u4EF6\u5217\u8868\u540E\uFF0C\u4F7F\u7528\u6B64\u5DE5\u5177\u83B7\u53D6\u4F60\u60F3\u8981\u5904\u7406\u7684\u90AE\u4EF6\u7684\u5B8C\u6574\u5185\u5BB9\u3002
46173
- \u4F20\u5165\u90AE\u4EF6 id \u5373\u53EF\u83B7\u53D6\u5B8C\u6574\u7684\u90AE\u4EF6\u6B63\u6587\u3002
46174
+ \u4F20\u5165\u90AE\u4EF6 id \u5373\u53EF\u83B7\u53D6\u5B8C\u6574\u7684\u90AE\u4EF6\u6B63\u6587\u3002\u5982\u679C\u90AE\u4EF6\u4ECD\u662F pending\uFF0C\u672C\u5DE5\u5177\u4F1A\u5148\u9886\u53D6\u8FD9\u5C01\u90AE\u4EF6\uFF0C\u5C06\u5B83\u6807\u8BB0\u4E3A processing\u3002
46174
46175
 
46175
46176
  \u53C2\u6570\uFF1A
46176
46177
  - message_id: \u90AE\u4EF6\u7684 id\uFF08\u4ECE list_mailbox \u4E2D\u83B7\u53D6\uFF09
@@ -46213,6 +46214,20 @@ var getMailbox = {
46213
46214
  if (msg.toMailboxId !== userRequest.departmentAgentId) {
46214
46215
  return `[getMailbox] \u8BE5\u90AE\u4EF6\u4E0D\u5C5E\u4E8E\u4F60\u7684\u90AE\u7BB1`;
46215
46216
  }
46217
+ if (msg.status === "pending") {
46218
+ const claimed = updateMailboxMessageStatus(msg.id, "processing", {
46219
+ fromStatus: "pending",
46220
+ actorMailboxId: userRequest.departmentAgentId,
46221
+ counterpartMailboxId: msg.fromMailboxId,
46222
+ reason: "get_mailbox_claim"
46223
+ });
46224
+ if (!claimed) {
46225
+ return `[getMailbox] \u90AE\u4EF6 ${messageId} \u9886\u53D6\u5931\u8D25\uFF0C\u72B6\u6001\u53EF\u80FD\u5DF2\u88AB\u5176\u4ED6\u6D41\u7A0B\u6539\u53D8\uFF0C\u8BF7\u91CD\u65B0\u8C03\u7528 list_mailbox \u67E5\u770B\u3002`;
46226
+ }
46227
+ msg.status = "processing";
46228
+ } else if (msg.status !== "processing") {
46229
+ return `[getMailbox] \u90AE\u4EF6 ${messageId} \u5F53\u524D\u72B6\u6001\u4E3A ${msg.status}\uFF0C\u4E0D\u53EF\u9886\u53D6\u6216\u5904\u7406\u3002`;
46230
+ }
46216
46231
  recordMailboxEvent({
46217
46232
  messageId: msg.id,
46218
46233
  mailboxId: msg.toMailboxId,
@@ -46446,7 +46461,7 @@ var wakeDepartmentAgent = async (mailboxId, msgIds) => {
46446
46461
  requestId: msgIds[0],
46447
46462
  departmentAgentId: mailboxId,
46448
46463
  workspacePath,
46449
- content: `\u4F60\u7684\u90AE\u7BB1\u4E2D\u6709 ${msgIds.length} \u5C01\u65B0\u90AE\u4EF6\u3002\u8BF7\u4F7F\u7528 list_mailbox \u67E5\u770B\u90AE\u4EF6\u5217\u8868\uFF0C\u6839\u636E\u91CD\u8981\u6027\u548C\u65F6\u6548\u6027\u51B3\u5B9A\u5904\u7406\u987A\u5E8F\uFF0C\u7136\u540E\u4F7F\u7528 get_mailbox \u83B7\u53D6\u90AE\u4EF6\u5185\u5BB9\uFF0C\u5B8C\u6210\u5DE5\u4F5C\u540E\u4F7F\u7528 reply_mailbox \u56DE\u590D\u3002`
46464
+ 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\u5B8C\u6210\u8FD9\u5C01\u90AE\u4EF6\u540E\u5FC5\u987B\u4F7F\u7528 reply_mailbox \u56DE\u590D\u5E76\u7ED3\u675F\u5B83\uFF0C\u7136\u540E\u7EE7\u7EED list_mailbox \u51B3\u5B9A\u4E0B\u4E00\u5C01\u8981\u5904\u7406\u6216\u5FFD\u7565\u7684\u90AE\u4EF6\u3002`
46450
46465
  };
46451
46466
  const result = await agent(request);
46452
46467
  console.log(`[mailbox] department agent ${mailboxId} \u5904\u7406\u5B8C\u6210, alreadySent=${result.alreadySent}`);
@@ -46463,9 +46478,8 @@ var wakeDepartmentAgent = async (mailboxId, msgIds) => {
46463
46478
  };
46464
46479
  var finalizeDepartmentAgentUnrepliedMessages = (mailboxId, msgIds, result) => {
46465
46480
  const fallbackContent = result.content?.trim();
46466
- for (const id of msgIds) {
46467
- const row = db2.prepare(
46468
- `SELECT
46481
+ const processingRows = msgIds.map((id) => db2.prepare(
46482
+ `SELECT
46469
46483
  id,
46470
46484
  to_mailbox_id as toMailboxId,
46471
46485
  from_mailbox_id as fromMailboxId,
@@ -46475,10 +46489,48 @@ var finalizeDepartmentAgentUnrepliedMessages = (mailboxId, msgIds, result) => {
46475
46489
  thread_id as threadId
46476
46490
  FROM mailbox
46477
46491
  WHERE id = ?`
46478
- ).get(id);
46479
- if (!row || row.status !== "processing") continue;
46492
+ ).get(id)).filter((row) => Boolean(row && row.status === "processing"));
46493
+ if (fallbackContent && processingRows.length > 1) {
46494
+ const bySender = /* @__PURE__ */ new Map();
46495
+ for (const row of processingRows) {
46496
+ const rows = bySender.get(row.fromMailboxId) ?? [];
46497
+ rows.push(row);
46498
+ bySender.set(row.fromMailboxId, rows);
46499
+ }
46500
+ for (const [senderMailboxId, rows] of bySender.entries()) {
46501
+ const changedRows = rows.filter((row) => updateMailboxMessageStatus(row.id, "failed", {
46502
+ fromStatus: "processing",
46503
+ actorMailboxId: mailboxId,
46504
+ counterpartMailboxId: senderMailboxId,
46505
+ reason: "department_agent_batch_fallback_ambiguous"
46506
+ }));
46507
+ if (changedRows.length === 0) continue;
46508
+ const first = changedRows[0];
46509
+ const ids = changedRows.map((row) => row.id).join(", ");
46510
+ sendMessage2(mailboxId, senderMailboxId, [
46511
+ `[\u7CFB\u7EDF\u901A\u77E5] ${mailboxId} \u672C\u8F6E\u540C\u65F6\u5904\u7406\u4E86 ${changedRows.length} \u5C01\u90AE\u4EF6\uFF0C\u4F46\u6CA1\u6709\u8C03\u7528 reply_mailbox\uFF0C\u65E0\u6CD5\u53EF\u9760\u5224\u65AD\u6700\u7EC8\u6587\u672C\u5206\u522B\u5BF9\u5E94\u54EA\u5C01\u90AE\u4EF6\u3002`,
46512
+ `\u5DF2\u5C06\u8FD9\u4E9B\u90AE\u4EF6\u6807\u8BB0\u4E3A failed\uFF0C\u907F\u514D\u91CD\u590D\u6295\u9012\u6216\u751F\u6210\u5927\u91CF\u91CD\u590D\u56DE\u4FE1\u3002`,
46513
+ `\u53D7\u5F71\u54CD\u90AE\u4EF6: ${ids}`,
46514
+ ``,
46515
+ `agent \u6700\u7EC8\u6587\u672C\u6458\u5F55:`,
46516
+ fallbackContent.slice(0, 1200)
46517
+ ].join("\n"), {
46518
+ originUserId: first.originUserId,
46519
+ originPlatform: first.originPlatform,
46520
+ threadId: first.threadId || first.id,
46521
+ parentMessageId: first.id,
46522
+ auditDetail: {
46523
+ fallbackReason: "department_agent_batch_returned_without_reply_mailbox",
46524
+ affectedMessageIds: changedRows.map((row) => row.id)
46525
+ }
46526
+ });
46527
+ console.warn(`[mailbox] department agent ${mailboxId} \u672A\u8C03\u7528 reply_mailbox\uFF0C\u6279\u91CF\u515C\u5E95\u5B58\u5728\u6B67\u4E49\uFF0C\u5DF2\u5C06 ${changedRows.length} \u5C01\u90AE\u4EF6\u6807\u8BB0 failed \u5E76\u5411 ${senderMailboxId} \u53D1\u9001\u4E00\u5C01\u7CFB\u7EDF\u901A\u77E5`);
46528
+ }
46529
+ return;
46530
+ }
46531
+ for (const row of processingRows) {
46480
46532
  if (fallbackContent) {
46481
- const changed2 = updateMailboxMessageStatus(id, "done", {
46533
+ const changed2 = updateMailboxMessageStatus(row.id, "done", {
46482
46534
  fromStatus: "processing",
46483
46535
  actorMailboxId: mailboxId,
46484
46536
  counterpartMailboxId: row.fromMailboxId,
@@ -46494,11 +46546,11 @@ var finalizeDepartmentAgentUnrepliedMessages = (mailboxId, msgIds, result) => {
46494
46546
  fallbackReason: "department_agent_returned_without_reply_mailbox"
46495
46547
  }
46496
46548
  });
46497
- console.warn(`[mailbox] department agent ${mailboxId} \u672A\u8C03\u7528 reply_mailbox\uFF0C\u5DF2\u5C06\u6700\u7EC8\u6587\u672C\u515C\u5E95\u8F6C\u4E3A\u90AE\u4EF6 ${id} \u7684\u56DE\u4FE1`);
46549
+ console.warn(`[mailbox] department agent ${mailboxId} \u672A\u8C03\u7528 reply_mailbox\uFF0C\u5DF2\u5C06\u6700\u7EC8\u6587\u672C\u515C\u5E95\u8F6C\u4E3A\u90AE\u4EF6 ${row.id} \u7684\u56DE\u4FE1`);
46498
46550
  }
46499
46551
  continue;
46500
46552
  }
46501
- const changed = updateMailboxMessageStatus(id, "failed", {
46553
+ const changed = updateMailboxMessageStatus(row.id, "failed", {
46502
46554
  fromStatus: "processing",
46503
46555
  actorMailboxId: mailboxId,
46504
46556
  counterpartMailboxId: row.fromMailboxId,
@@ -46514,7 +46566,7 @@ var finalizeDepartmentAgentUnrepliedMessages = (mailboxId, msgIds, result) => {
46514
46566
  fallbackReason: "department_agent_returned_empty_without_reply_mailbox"
46515
46567
  }
46516
46568
  });
46517
- console.warn(`[mailbox] department agent ${mailboxId} \u6CA1\u6709\u56DE\u590D\u5185\u5BB9\uFF0C\u90AE\u4EF6 ${id} \u5DF2\u6807\u8BB0 failed`);
46569
+ console.warn(`[mailbox] department agent ${mailboxId} \u6CA1\u6709\u56DE\u590D\u5185\u5BB9\uFF0C\u90AE\u4EF6 ${row.id} \u5DF2\u6807\u8BB0 failed`);
46518
46570
  }
46519
46571
  }
46520
46572
  };
@@ -46526,9 +46578,6 @@ var pollMailbox = async () => {
46526
46578
  const mailBoxMsgs = selectStmt.all("pending");
46527
46579
  if (mailBoxMsgs.length === 0) return;
46528
46580
  console.log(`[mailbox] \u62C9\u53D6\u5230 ${mailBoxMsgs.length} \u6761\u5F85\u5904\u7406\u6D88\u606F`);
46529
- for (const msg of mailBoxMsgs) {
46530
- markMailboxStatus(msg.id, "processing");
46531
- }
46532
46581
  const grouped = /* @__PURE__ */ new Map();
46533
46582
  for (const msg of mailBoxMsgs) {
46534
46583
  const group = grouped.get(msg.toMailboxId) || [];
@@ -46540,6 +46589,7 @@ var pollMailbox = async () => {
46540
46589
  for (const msg of ceoMsgs) {
46541
46590
  console.log(`[mailbox] \u6536\u5230 department agent \u56DE\u4FE1\uFF08\u6765\u81EA ${msg.fromMailboxId}\uFF09\uFF0C\u6B63\u5728\u5524\u9192\u4E3B agent...`);
46542
46591
  try {
46592
+ markMailboxStatus(msg.id, "processing");
46543
46593
  await handleCeoReply(msg);
46544
46594
  markMailboxStatus(msg.id, "done");
46545
46595
  } catch (err) {
@@ -46624,9 +46674,9 @@ ${workspacePath ? `
46624
46674
  <Mailbox Workflow>
46625
46675
  \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
46626
46676
 
46627
- 1. \u8C03\u7528 list_mailbox \u67E5\u770B\u90AE\u7BB1\u4E2D\u6240\u6709\u5F85\u5904\u7406\u90AE\u4EF6\u7684\u6458\u8981
46677
+ 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
46628
46678
  2. \u6839\u636E\u90AE\u4EF6\u7684\u65F6\u6548\u6027\u548C\u91CD\u8981\u6027\uFF0C\u51B3\u5B9A\u4F18\u5148\u5904\u7406\u54EA\u5C01
46629
- 3. \u8C03\u7528 get_mailbox(message_id) \u83B7\u53D6\u4F60\u8981\u5904\u7406\u7684\u90AE\u4EF6\u5B8C\u6574\u5185\u5BB9
46679
+ 3. \u8C03\u7528 get_mailbox(message_id) \u9886\u53D6\u5E76\u83B7\u53D6\u4F60\u8981\u5904\u7406\u7684\u90AE\u4EF6\u5B8C\u6574\u5185\u5BB9
46630
46680
  4. \u4F7F\u7528\u4F60\u7684\u4E13\u4E1A\u80FD\u529B\u548C\u5DE5\u5177\u5B8C\u6210\u90AE\u4EF6\u4E2D\u7684\u4EFB\u52A1
46631
46681
  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)
46632
46682
  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
@@ -46635,6 +46685,7 @@ ${workspacePath ? `
46635
46685
  \u6CE8\u610F\u4E8B\u9879\uFF1A
46636
46686
  - 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
46637
46687
  - 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
46688
+ - \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
46638
46689
  - \u5982\u679C\u90AE\u4EF6\u4E2D\u7684\u4EFB\u52A1\u4F60\u5DF2\u7ECF\u5B8C\u6210\u6216\u4E0D\u9700\u8981\u5904\u7406\uFF0C\u53EF\u4EE5\u7528 reply_mailbox \u7B80\u77ED\u56DE\u590D\u8BF4\u660E\u539F\u56E0\uFF08\u5982"\u5DF2\u5B8C\u6210\uFF0C\u65E0\u9700\u5904\u7406"\uFF09\uFF0C\u7136\u540E\u7EE7\u7EED\u4E0B\u4E00\u5C01
46639
46690
  - \u5982\u679C\u9700\u8981\u4E3B\u52A8\u8054\u7CFB\u5176\u4ED6\u90E8\u95E8\u6210\u5458\uFF0C\u4F7F\u7528 department_communicate \u5DE5\u5177
46640
46691
  - \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
@@ -51485,7 +51536,7 @@ var systemRoutes = new Hono2();
51485
51536
  var startTime = Date.now();
51486
51537
  systemRoutes.get("/system/info", (c) => {
51487
51538
  return c.json({
51488
- version: true ? "1.8.17" : "unknown",
51539
+ version: true ? "1.8.19" : "unknown",
51489
51540
  uptime: Math.floor((Date.now() - startTime) / 1e3),
51490
51541
  env: process.env.NODE_ENV || "development",
51491
51542
  nodeVersion: process.version