duclaw-cli 1.8.42 → 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.42" : "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
@@ -45650,6 +45648,37 @@ var COMPANY_VALUES_PROMPT = `<\u516C\u53F8\u5171\u540C\u4FE1\u5FF5>
45650
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
45651
45649
  </\u516C\u53F8\u5171\u540C\u4FE1\u5FF5>`;
45652
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
+
45653
45682
  // src/agent/createAgent.ts
45654
45683
  var DEFAULT_WORKSPACE_PATH = getDuclawWorkspaceDir();
45655
45684
  var assistantMessageFromResponse = (response) => ({
@@ -45664,7 +45693,7 @@ var isAbortError2 = (error) => {
45664
45693
  return error.name === "AbortError" || error.message.includes("aborted") || error.message.includes("AbortError");
45665
45694
  };
45666
45695
  var llmRequestIdForTurn = (request, messages, system, tools) => {
45667
- 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);
45668
45697
  return `dreq_${hash}`;
45669
45698
  };
45670
45699
  var getDefaultAgentConfig = (tools, systemPrompt) => {
@@ -46097,6 +46126,7 @@ ${notifText}
46097
46126
  if (interrupts.length > 0) {
46098
46127
  for (const interrupt of interrupts) {
46099
46128
  markInterruptEventIdsInjected(interrupt.metadata);
46129
+ rememberCeoFollowupIds(ceoFollowupIdsFromMetadata(interrupt.metadata));
46100
46130
  const msg = interrupt.content;
46101
46131
  console.log(`[agent] \u6536\u5230\u4E2D\u65AD\u6D88\u606F\uFF0C\u6CE8\u5165\u5BF9\u8BDD: ${msg.slice(0, 80)}...`);
46102
46132
  if (interrupt.metadata) {
@@ -46251,12 +46281,16 @@ ${memoryInjection}` : "") + dreamInjection;
46251
46281
  console.log(`channelPlugin: ${JSON.stringify(config2.channelPlugin)}`);
46252
46282
  const { userId: userId2 } = request;
46253
46283
  console.log(`request: ${JSON.stringify(request)}`);
46254
- await config2.channelPlugin.outbound.sendText({
46255
- cfg: {},
46256
- to: userId2,
46257
- text: answer,
46258
- accountId: request.requestId
46259
- });
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
+ }
46260
46294
  }
46261
46295
  hasSentMessage = true;
46262
46296
  sentMessageContent = answer;
@@ -46313,6 +46347,7 @@ ${memoryInjection}` : "") + dreamInjection;
46313
46347
  console.log(`[agent] \u9000\u51FA\u524D\u53D1\u73B0 ${lateInterrupts.length} \u6761\u8FDF\u5230\u7684\u4E2D\u65AD\u6D88\u606F\uFF0C\u7EE7\u7EED\u5904\u7406`);
46314
46348
  for (const interrupt of lateInterrupts) {
46315
46349
  markInterruptEventIdsInjected(interrupt.metadata);
46350
+ rememberCeoFollowupIds(ceoFollowupIdsFromMetadata(interrupt.metadata));
46316
46351
  const msg = interrupt.content;
46317
46352
  if (interrupt.metadata) {
46318
46353
  request.metadata = {
@@ -46332,12 +46367,16 @@ ${msg}</user-interrupt>`
46332
46367
  }
46333
46368
  const visibleCeoFollowupIds = ceoFollowupIdsFromMetadata(request.metadata);
46334
46369
  if (!hasSentMessage && visibleCeoFollowupIds.length > 0 && config2.channelPlugin) {
46335
- await config2.channelPlugin.outbound.sendText({
46336
- cfg: {},
46337
- to: request.userId,
46338
- text: textContent,
46339
- accountId: request.requestId
46340
- });
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
+ }
46341
46380
  hasSentMessage = true;
46342
46381
  sentMessageContent = textContent;
46343
46382
  completeUserVisibleCeoFollowups();
@@ -46358,6 +46397,7 @@ ${msg}</user-interrupt>`
46358
46397
  console.log(`[agent] \u9000\u51FA\u524D\u53D1\u73B0 ${lateInterrupts.length} \u6761\u8FDF\u5230\u7684\u4E2D\u65AD\u6D88\u606F\uFF0C\u7EE7\u7EED\u5904\u7406`);
46359
46398
  for (const interrupt of lateInterrupts) {
46360
46399
  markInterruptEventIdsInjected(interrupt.metadata);
46400
+ rememberCeoFollowupIds(ceoFollowupIdsFromMetadata(interrupt.metadata));
46361
46401
  const msg = interrupt.content;
46362
46402
  if (interrupt.metadata) {
46363
46403
  request.metadata = {
@@ -47193,8 +47233,10 @@ var markMailboxStatus = (msgId, status) => {
47193
47233
  reason: "mailbox_poller"
47194
47234
  });
47195
47235
  };
47196
- var handleCeoFollowup = async (followup) => {
47197
- 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({
47198
47240
  userId: followup.originUserId,
47199
47241
  type: "ceo.followup_required",
47200
47242
  source: "ceo_followup",
@@ -47207,73 +47249,87 @@ var handleCeoFollowup = async (followup) => {
47207
47249
  parentMessageId: followup.parentMessageId || null,
47208
47250
  workItemId: followup.workItemId || null,
47209
47251
  contentPreview: followup.content.slice(0, 1200),
47210
- 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)}`,
47211
47253
  originPlatform: followup.originPlatform
47212
47254
  }
47213
- });
47214
- if (hasRunningAgent(followup.originUserId)) {
47215
- queueInterrupt(followup.originUserId, {
47216
- content: "",
47217
- metadata: {
47218
- internalOnly: true,
47219
- eventId: event.id,
47220
- trigger: "ceo.followup_required",
47221
- ceoFollowupId: followup.id
47222
- }
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
+ });
47223
47267
  });
47224
- 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}`);
47225
47269
  return "queued";
47226
47270
  }
47271
+ const primary = followups[followups.length - 1];
47227
47272
  const request = {
47228
- platform: followup.originPlatform,
47229
- userId: followup.originUserId,
47230
- requestId: followup.sourceMessageId,
47273
+ platform: originPlatform,
47274
+ userId: originUserId,
47275
+ requestId: primary.sourceMessageId,
47231
47276
  departmentAgentId: "",
47232
47277
  content: "",
47233
47278
  metadata: {
47234
47279
  internalOnly: true,
47235
- eventId: event.id,
47280
+ eventId: events[events.length - 1].id,
47236
47281
  trigger: "ceo.followup_required",
47237
- ceoFollowupId: followup.id
47282
+ ceoFollowupId: primary.id,
47283
+ ceoFollowupIds: followups.map((f) => f.id)
47238
47284
  }
47239
47285
  };
47240
47286
  const config2 = getDefaultAgentConfig();
47241
47287
  const mainAgent = createAgent(config2);
47242
47288
  const result = await mainAgent(request);
47243
- 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}`);
47244
47290
  if (result.alreadySent) return "completed";
47245
- const fallback = result.content?.trim() || followup.content;
47291
+ const fallback = result.content?.trim() || followups.map((f) => f.content).join("\n\n---\n\n");
47246
47292
  if (fallback && config2.channelPlugin) {
47247
- try {
47248
- await config2.channelPlugin.outbound.sendText({
47249
- cfg: {},
47250
- to: followup.originUserId,
47251
- text: fallback,
47252
- accountId: followup.sourceMessageId
47253
- });
47254
- 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}`);
47255
- return "completed";
47256
- } catch (sendErr) {
47257
- console.error(`[mailbox] \u8865\u53D1\u6D88\u606F\u5931\u8D25:`, sendErr);
47258
- 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`);
47259
47308
  }
47309
+ return "completed";
47260
47310
  }
47261
47311
  if (fallback && !config2.channelPlugin) return "completed";
47262
- throw new Error(`ceo_followup_no_user_visible_message:${followup.id}`);
47312
+ throw new Error(`ceo_followup_no_user_visible_message:${primary.id}`);
47263
47313
  };
47264
- var processCeoFollowup = async (followup) => {
47265
- const claimed = claimCeoFollowup(followup.id);
47266
- 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;
47267
47321
  try {
47268
- markMailboxStatus(claimed.sourceMessageId, "processing");
47269
- const outcome = await handleCeoFollowup(claimed);
47322
+ for (const c of claimed) markMailboxStatus(c.sourceMessageId, "processing");
47323
+ const outcome = await handleCeoFollowupGroup(claimed);
47270
47324
  if (outcome === "queued") return;
47271
- completeCeoFollowup(claimed.id);
47272
- markMailboxStatus(claimed.sourceMessageId, "done");
47325
+ for (const c of claimed) {
47326
+ completeCeoFollowup(c.id);
47327
+ markMailboxStatus(c.sourceMessageId, "done");
47328
+ }
47273
47329
  } catch (err) {
47274
47330
  const message = err.message;
47275
- failCeoFollowup(claimed.id, message);
47276
- 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);
47277
47333
  }
47278
47334
  };
47279
47335
  var wakeDepartmentAgent = async (mailboxId, msgIds) => {
@@ -47427,6 +47483,7 @@ var finalizeDepartmentAgentUnrepliedMessages = (mailboxId, msgIds, result) => {
47427
47483
  var polling = false;
47428
47484
  var inFlightDepartmentMailboxes = /* @__PURE__ */ new Set();
47429
47485
  var inFlightCeoReplyMessages = /* @__PURE__ */ new Set();
47486
+ var inFlightCeoReplyUsers = /* @__PURE__ */ new Set();
47430
47487
  var pollMailbox = async () => {
47431
47488
  if (polling) return;
47432
47489
  polling = true;
@@ -47456,17 +47513,26 @@ var pollMailbox = async () => {
47456
47513
  }
47457
47514
  const followups = [...pendingFollowups, ...newFollowups];
47458
47515
  const uniqueFollowups = Array.from(new Map(followups.map((followup) => [followup.id, followup])).values());
47516
+ const followupsByUser = /* @__PURE__ */ new Map();
47459
47517
  for (const followup of uniqueFollowups) {
47460
47518
  if (inFlightCeoReplyMessages.has(followup.id)) continue;
47461
- inFlightCeoReplyMessages.add(followup.id);
47462
- 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}...`);
47463
47528
  void (async () => {
47464
47529
  try {
47465
- await processCeoFollowup(followup);
47530
+ await processCeoFollowupGroup(group);
47466
47531
  } catch (err) {
47467
47532
  console.error(`[mailbox] \u5524\u9192\u4E3B agent \u5904\u7406\u56DE\u4FE1\u5931\u8D25:`, err);
47468
47533
  } finally {
47469
- inFlightCeoReplyMessages.delete(followup.id);
47534
+ inFlightCeoReplyUsers.delete(originUserId);
47535
+ for (const f of group) inFlightCeoReplyMessages.delete(f.id);
47470
47536
  }
47471
47537
  })();
47472
47538
  }
@@ -52544,7 +52610,7 @@ var systemRoutes = new Hono2();
52544
52610
  var startTime = Date.now();
52545
52611
  systemRoutes.get("/system/info", (c) => {
52546
52612
  return c.json({
52547
- version: true ? "1.8.42" : "unknown",
52613
+ version: true ? "1.8.43" : "unknown",
52548
52614
  uptime: Math.floor((Date.now() - startTime) / 1e3),
52549
52615
  env: process.env.NODE_ENV || "development",
52550
52616
  nodeVersion: process.version