dominds 1.0.2 → 1.1.1

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.
Files changed (142) hide show
  1. package/dist/dialog.js +18 -7
  2. package/dist/llm/gen/anthropic.js +45 -26
  3. package/dist/llm/gen/openai-compatible.js +10 -1
  4. package/dist/llm/kernel-driver/drive.js +22 -9
  5. package/dist/minds/system-prompt-parts.js +2 -2
  6. package/dist/persistence.js +11 -5
  7. package/dist/server/websocket-handler.js +41 -0
  8. package/dist/static/assets/_basePickBy-B82bRmTe.js +196 -0
  9. package/dist/static/assets/_basePickBy-B82bRmTe.js.map +1 -0
  10. package/dist/static/assets/{_baseUniq-CXaP1DRN.js → _baseUniq-BqskSet8.js} +214 -39
  11. package/dist/static/assets/_baseUniq-BqskSet8.js.map +1 -0
  12. package/dist/static/assets/{arc-B-paEmmQ.js → arc-BZmiEp2S.js} +2 -2
  13. package/dist/static/assets/{arc-B-paEmmQ.js.map → arc-BZmiEp2S.js.map} +1 -1
  14. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DQ-LRMci.js → architectureDiagram-VXUJARFQ-BHYiDLJT.js} +7 -6
  15. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DQ-LRMci.js.map → architectureDiagram-VXUJARFQ-BHYiDLJT.js.map} +1 -1
  16. package/dist/static/assets/{blockDiagram-VD42YOAC-yXDlmAg6.js → blockDiagram-VD42YOAC-vgEwNOGx.js} +7 -7
  17. package/dist/static/assets/{blockDiagram-VD42YOAC-yXDlmAg6.js.map → blockDiagram-VD42YOAC-vgEwNOGx.js.map} +1 -1
  18. package/dist/static/assets/{c4Diagram-YG6GDRKO-CKlXooRf.js → c4Diagram-YG6GDRKO-n9KviM0v.js} +3 -3
  19. package/dist/static/assets/{c4Diagram-YG6GDRKO-CKlXooRf.js.map → c4Diagram-YG6GDRKO-n9KviM0v.js.map} +1 -1
  20. package/dist/static/assets/{channel-DH1DW5ZR.js → channel-BhUIqVaj.js} +2 -2
  21. package/dist/static/assets/{channel-DH1DW5ZR.js.map → channel-BhUIqVaj.js.map} +1 -1
  22. package/dist/static/assets/{chunk-4BX2VUAB-BGUV26nZ.js → chunk-4BX2VUAB-Bh_flmua.js} +2 -2
  23. package/dist/static/assets/{chunk-4BX2VUAB-BGUV26nZ.js.map → chunk-4BX2VUAB-Bh_flmua.js.map} +1 -1
  24. package/dist/static/assets/{chunk-55IACEB6-D-UDxpaE.js → chunk-55IACEB6-CBcUtrAA.js} +2 -2
  25. package/dist/static/assets/{chunk-55IACEB6-D-UDxpaE.js.map → chunk-55IACEB6-CBcUtrAA.js.map} +1 -1
  26. package/dist/static/assets/{chunk-B4BG7PRW-BmAiwyX-.js → chunk-B4BG7PRW-BYQ8WPXR.js} +5 -5
  27. package/dist/static/assets/{chunk-B4BG7PRW-BmAiwyX-.js.map → chunk-B4BG7PRW-BYQ8WPXR.js.map} +1 -1
  28. package/dist/static/assets/{chunk-DI55MBZ5-Pg62hDG3.js → chunk-DI55MBZ5-DRuIuWIv.js} +4 -4
  29. package/dist/static/assets/{chunk-DI55MBZ5-Pg62hDG3.js.map → chunk-DI55MBZ5-DRuIuWIv.js.map} +1 -1
  30. package/dist/static/assets/{chunk-FMBD7UC4-DypgScXi.js → chunk-FMBD7UC4-Ye7S_b8L.js} +2 -2
  31. package/dist/static/assets/{chunk-FMBD7UC4-DypgScXi.js.map → chunk-FMBD7UC4-Ye7S_b8L.js.map} +1 -1
  32. package/dist/static/assets/{chunk-QN33PNHL-D099B2Lh.js → chunk-QN33PNHL-B4ofgEod.js} +2 -2
  33. package/dist/static/assets/{chunk-QN33PNHL-D099B2Lh.js.map → chunk-QN33PNHL-B4ofgEod.js.map} +1 -1
  34. package/dist/static/assets/{chunk-QZHKN3VN-BRGnk3yw.js → chunk-QZHKN3VN-CxfiB6Ec.js} +2 -2
  35. package/dist/static/assets/{chunk-QZHKN3VN-BRGnk3yw.js.map → chunk-QZHKN3VN-CxfiB6Ec.js.map} +1 -1
  36. package/dist/static/assets/{chunk-TZMSLE5B-J4UFKyHl.js → chunk-TZMSLE5B-nY7Z_R_G.js} +2 -2
  37. package/dist/static/assets/{chunk-TZMSLE5B-J4UFKyHl.js.map → chunk-TZMSLE5B-nY7Z_R_G.js.map} +1 -1
  38. package/dist/static/assets/{classDiagram-2ON5EDUG-DbSBhjnI.js → classDiagram-2ON5EDUG-DZTzWVuP.js} +6 -6
  39. package/dist/static/assets/{classDiagram-2ON5EDUG-DbSBhjnI.js.map → classDiagram-2ON5EDUG-DZTzWVuP.js.map} +1 -1
  40. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-DbSBhjnI.js → classDiagram-v2-WZHVMYZB-DZTzWVuP.js} +6 -6
  41. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-DbSBhjnI.js.map → classDiagram-v2-WZHVMYZB-DZTzWVuP.js.map} +1 -1
  42. package/dist/static/assets/{clone-CMt2CVWH.js → clone-BdtVilYf.js} +2 -2
  43. package/dist/static/assets/{clone-CMt2CVWH.js.map → clone-BdtVilYf.js.map} +1 -1
  44. package/dist/static/assets/{cose-bilkent-S5V4N54A-DgpOcJSM.js → cose-bilkent-S5V4N54A-B4qV2nSp.js} +2 -2
  45. package/dist/static/assets/{cose-bilkent-S5V4N54A-DgpOcJSM.js.map → cose-bilkent-S5V4N54A-B4qV2nSp.js.map} +1 -1
  46. package/dist/static/assets/{dagre-6UL2VRFP-Sfkohrpt.js → dagre-6UL2VRFP-BURABS5h.js} +7 -7
  47. package/dist/static/assets/{dagre-6UL2VRFP-Sfkohrpt.js.map → dagre-6UL2VRFP-BURABS5h.js.map} +1 -1
  48. package/dist/static/assets/{defaultLocale-DVr69WTU.js → defaultLocale-B2RvLBDe.js} +9 -9
  49. package/dist/static/assets/defaultLocale-B2RvLBDe.js.map +1 -0
  50. package/dist/static/assets/{diagram-PSM6KHXK-sqQ1DZXq.js → diagram-PSM6KHXK-Dt_DQywa.js} +9 -8
  51. package/dist/static/assets/{diagram-PSM6KHXK-sqQ1DZXq.js.map → diagram-PSM6KHXK-Dt_DQywa.js.map} +1 -1
  52. package/dist/static/assets/{diagram-QEK2KX5R-Bvygmx1Z.js → diagram-QEK2KX5R-aTQ10cZh.js} +7 -6
  53. package/dist/static/assets/{diagram-QEK2KX5R-Bvygmx1Z.js.map → diagram-QEK2KX5R-aTQ10cZh.js.map} +1 -1
  54. package/dist/static/assets/{diagram-S2PKOQOG-C1G_lxWW.js → diagram-S2PKOQOG-rXRvB-0y.js} +7 -6
  55. package/dist/static/assets/{diagram-S2PKOQOG-C1G_lxWW.js.map → diagram-S2PKOQOG-rXRvB-0y.js.map} +1 -1
  56. package/dist/static/assets/{erDiagram-Q2GNP2WA-DLDetWzs.js → erDiagram-Q2GNP2WA-C3_qe-ml.js} +5 -5
  57. package/dist/static/assets/{erDiagram-Q2GNP2WA-DLDetWzs.js.map → erDiagram-Q2GNP2WA-C3_qe-ml.js.map} +1 -1
  58. package/dist/static/assets/{flowDiagram-NV44I4VS-Co5LYFvC.js → flowDiagram-NV44I4VS-yePT6duF.js} +6 -6
  59. package/dist/static/assets/{flowDiagram-NV44I4VS-Co5LYFvC.js.map → flowDiagram-NV44I4VS-yePT6duF.js.map} +1 -1
  60. package/dist/static/assets/{ganttDiagram-JELNMOA3-ypMwB2Et.js → ganttDiagram-JELNMOA3-CeeiTfoC.js} +4 -4
  61. package/dist/static/assets/{ganttDiagram-JELNMOA3-ypMwB2Et.js.map → ganttDiagram-JELNMOA3-CeeiTfoC.js.map} +1 -1
  62. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BvpFeNi-.js → gitGraphDiagram-V2S2FVAM-0aHvE9pz.js} +8 -7
  63. package/dist/static/assets/gitGraphDiagram-V2S2FVAM-0aHvE9pz.js.map +1 -0
  64. package/dist/static/assets/{graph-pB4WAL9S.js → graph-D6HTT7TU.js} +4 -176
  65. package/dist/static/assets/graph-D6HTT7TU.js.map +1 -0
  66. package/dist/static/assets/{index-B53Fp26r.js → index-C0pO-3BA.js} +1015 -710
  67. package/dist/static/assets/index-C0pO-3BA.js.map +1 -0
  68. package/dist/static/assets/{index-JpBjWftL.css → index-CTkAdCTv.css} +1 -1
  69. package/dist/static/assets/{infoDiagram-WHAUD3N6-DrDDAMEE.js → infoDiagram-HS3SLOUP-B9k-VH4_.js} +6 -5
  70. package/dist/static/assets/{infoDiagram-WHAUD3N6-DrDDAMEE.js.map → infoDiagram-HS3SLOUP-B9k-VH4_.js.map} +1 -1
  71. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-DxdCX6xw.js → journeyDiagram-XKPGCS4Q-knPCsoIX.js} +5 -5
  72. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-DxdCX6xw.js.map → journeyDiagram-XKPGCS4Q-knPCsoIX.js.map} +1 -1
  73. package/dist/static/assets/{kanban-definition-3W4ZIXB7-9zHUhw43.js → kanban-definition-3W4ZIXB7-3eeN94jd.js} +3 -3
  74. package/dist/static/assets/{kanban-definition-3W4ZIXB7-9zHUhw43.js.map → kanban-definition-3W4ZIXB7-3eeN94jd.js.map} +1 -1
  75. package/dist/static/assets/{layout-dfqRYhym.js → layout-CLflNybh.js} +5 -152
  76. package/dist/static/assets/layout-CLflNybh.js.map +1 -0
  77. package/dist/static/assets/{linear-0yPuHNCD.js → linear-AqFaRRSl.js} +3 -3
  78. package/dist/static/assets/{linear-0yPuHNCD.js.map → linear-AqFaRRSl.js.map} +1 -1
  79. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CIFBkhco.js → mindmap-definition-VGOIOE7T-cftGGw45.js} +4 -4
  80. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CIFBkhco.js.map → mindmap-definition-VGOIOE7T-cftGGw45.js.map} +1 -1
  81. package/dist/static/assets/{pieDiagram-ADFJNKIX-B-ZSbZbg.js → pieDiagram-ADFJNKIX-B3tVdWMf.js} +8 -7
  82. package/dist/static/assets/{pieDiagram-ADFJNKIX-B-ZSbZbg.js.map → pieDiagram-ADFJNKIX-B3tVdWMf.js.map} +1 -1
  83. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-C2idOr0t.js → quadrantDiagram-AYHSOK5B-C2JgiL3r.js} +4 -4
  84. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-C2idOr0t.js.map → quadrantDiagram-AYHSOK5B-C2JgiL3r.js.map} +1 -1
  85. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-ZEZEoVlF.js → requirementDiagram-UZGBJVZJ-DJbgSNem.js} +4 -4
  86. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-ZEZEoVlF.js.map → requirementDiagram-UZGBJVZJ-DJbgSNem.js.map} +1 -1
  87. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CK8iW527.js → sankeyDiagram-TZEHDZUN-BFR9TXZu.js} +2 -2
  88. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CK8iW527.js.map → sankeyDiagram-TZEHDZUN-BFR9TXZu.js.map} +1 -1
  89. package/dist/static/assets/{sequenceDiagram-WL72ISMW-DZiRKs1m.js → sequenceDiagram-WL72ISMW-30QrbvxJ.js} +4 -4
  90. package/dist/static/assets/{sequenceDiagram-WL72ISMW-DZiRKs1m.js.map → sequenceDiagram-WL72ISMW-30QrbvxJ.js.map} +1 -1
  91. package/dist/static/assets/{stateDiagram-FKZM4ZOC-CudtHfJm.js → stateDiagram-FKZM4ZOC-agDrhxdD.js} +9 -9
  92. package/dist/static/assets/{stateDiagram-FKZM4ZOC-CudtHfJm.js.map → stateDiagram-FKZM4ZOC-agDrhxdD.js.map} +1 -1
  93. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-BNlnt1-z.js → stateDiagram-v2-4FDKWEC3-BsKiwDu_.js} +5 -5
  94. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-BNlnt1-z.js.map → stateDiagram-v2-4FDKWEC3-BsKiwDu_.js.map} +1 -1
  95. package/dist/static/assets/{timeline-definition-IT6M3QCI-ByNiGsN2.js → timeline-definition-IT6M3QCI-DSrCFaAi.js} +3 -3
  96. package/dist/static/assets/{timeline-definition-IT6M3QCI-ByNiGsN2.js.map → timeline-definition-IT6M3QCI-DSrCFaAi.js.map} +1 -1
  97. package/dist/static/assets/{treemap-KMMF4GRG-BO_Bm7x_.js → treemap-GDKQZRPO-Cc0kNh36.js} +15788 -10901
  98. package/dist/static/assets/treemap-GDKQZRPO-Cc0kNh36.js.map +1 -0
  99. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DcP2SWz8.js → xychartDiagram-PRI3JC2R-BR_1T6y3.js} +4 -4
  100. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DcP2SWz8.js.map → xychartDiagram-PRI3JC2R-BR_1T6y3.js.map} +1 -1
  101. package/dist/static/index.html +2 -2
  102. package/dist/tool.js +26 -0
  103. package/dist/tools/builtins.js +2 -2
  104. package/dist/tools/ctrl.js +83 -13
  105. package/dist/tools/fs.js +2 -2
  106. package/dist/tools/plan.js +16 -5
  107. package/dist/tools/prompts/control/en/errors.md +1 -1
  108. package/dist/tools/prompts/control/zh/errors.md +1 -1
  109. package/package.json +11 -11
  110. package/dist/agent-priming.js +0 -2051
  111. package/dist/docs/dominds-agent-priming.md +0 -218
  112. package/dist/docs/dominds-agent-priming.zh.md +0 -196
  113. package/dist/docs/drive-logic-context-refactor-plan.zh.md +0 -338
  114. package/dist/docs/keep-going.md +0 -176
  115. package/dist/docs/keep-going.zh.md +0 -162
  116. package/dist/docs/showing-by-doing.md +0 -208
  117. package/dist/docs/showing-by-doing.zh.md +0 -177
  118. package/dist/docs/team-mgmt-toolset.md +0 -482
  119. package/dist/docs/team-mgmt-toolset.zh.md +0 -426
  120. package/dist/llm/driver.js +0 -4093
  121. package/dist/minds/promptdocs.js +0 -263
  122. package/dist/server/prompts-routes.js +0 -545
  123. package/dist/shared/team-mgmt-manual.js +0 -120
  124. package/dist/shared/types/prompts.js +0 -2
  125. package/dist/shared/types/tellask.js +0 -8
  126. package/dist/showing-by-doing.js +0 -1091
  127. package/dist/snippets/README.en.md +0 -3
  128. package/dist/snippets/README.md +0 -4
  129. package/dist/static/assets/_baseUniq-CXaP1DRN.js.map +0 -1
  130. package/dist/static/assets/defaultLocale-DVr69WTU.js.map +0 -1
  131. package/dist/static/assets/gitGraphDiagram-NY62KEGX-BvpFeNi-.js.map +0 -1
  132. package/dist/static/assets/graph-pB4WAL9S.js.map +0 -1
  133. package/dist/static/assets/index-B53Fp26r.js.map +0 -1
  134. package/dist/static/assets/layout-dfqRYhym.js.map +0 -1
  135. package/dist/static/assets/min-IX83iO4F.js +0 -42
  136. package/dist/static/assets/min-IX83iO4F.js.map +0 -1
  137. package/dist/static/assets/treemap-KMMF4GRG-BO_Bm7x_.js.map +0 -1
  138. package/dist/tellask.js +0 -439
  139. package/dist/tools/context-health.js +0 -177
  140. package/dist/tools/diag.js +0 -583
  141. package/dist/tools/team-mgmt.js +0 -3487
  142. package/dist/utils/task-doc.js +0 -236
package/dist/dialog.js CHANGED
@@ -23,6 +23,7 @@ const runtime_language_1 = require("./shared/runtime-language");
23
23
  const id_1 = require("./shared/utils/id");
24
24
  const inter_dialog_format_1 = require("./shared/utils/inter-dialog-format");
25
25
  const time_1 = require("./shared/utils/time");
26
+ const tool_1 = require("./tool");
26
27
  const id_2 = require("./utils/id");
27
28
  class DialogID {
28
29
  constructor(selfId, rootId) {
@@ -313,8 +314,13 @@ class Dialog {
313
314
  // should continue generating next llm messages immediately;
314
315
  //
315
316
  // Reminder management methods
316
- addReminder(content, owner, meta, position) {
317
- const reminder = { content, owner, meta };
317
+ addReminder(content, owner, meta, position, options) {
318
+ const reminder = {
319
+ content,
320
+ owner,
321
+ meta,
322
+ echoback: options?.echoback,
323
+ };
318
324
  const insertIndex = position !== undefined ? position : this.reminders.length;
319
325
  if (insertIndex < 0 || insertIndex > this.reminders.length) {
320
326
  throw new Error(`Invalid reminder position ${insertIndex}. Valid range: 0-${this.reminders.length}`);
@@ -334,7 +340,7 @@ class Dialog {
334
340
  this._remindersVer++;
335
341
  return deleted;
336
342
  }
337
- updateReminder(index, content, meta) {
343
+ updateReminder(index, content, meta, options) {
338
344
  if (index < 0 || index >= this.reminders.length) {
339
345
  throw new Error(`Reminder index ${index} does not exist. Available reminders: 0-${this.reminders.length - 1}`);
340
346
  }
@@ -343,6 +349,7 @@ class Dialog {
343
349
  content,
344
350
  owner: oldReminder.owner,
345
351
  meta: meta !== undefined ? meta : oldReminder.meta,
352
+ echoback: options?.echoback ?? oldReminder.echoback,
346
353
  };
347
354
  this.reminders[index] = updatedReminder;
348
355
  this._updatedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
@@ -381,6 +388,7 @@ class Dialog {
381
388
  content: result.updatedContent,
382
389
  owner: reminder.owner,
383
390
  meta: result.updatedMeta !== undefined ? result.updatedMeta : reminder.meta,
391
+ echoback: reminder.echoback,
384
392
  };
385
393
  this.reminders[i] = updatedReminder;
386
394
  }
@@ -410,9 +418,12 @@ class Dialog {
410
418
  catch (err) {
411
419
  log_1.log.warn('Failed to persist reminders', err, { dialogId: this.id.valueOf() });
412
420
  }
413
- const reminders = this.reminders.map((r) => ({
421
+ const reminderNoByIndex = (0, tool_1.computeReminderNoByIndex)(this.reminders);
422
+ const reminders = this.reminders.map((r, index) => ({
414
423
  content: r.content,
415
424
  meta: r.meta,
425
+ reminder_no: reminderNoByIndex.get(index),
426
+ echoback: (0, tool_1.reminderEchoBackEnabled)(r),
416
427
  }));
417
428
  // Emit full_reminders_update event with complete reminder list including metadata
418
429
  const fullRemindersEvt = {
@@ -652,7 +663,7 @@ class Dialog {
652
663
  async receiveFuncResult(result) {
653
664
  return await this.dlgStore.receiveFuncResult(this, result);
654
665
  }
655
- async notifyGeneratingStart() {
666
+ async notifyGeneratingStart(msgId) {
656
667
  // Capture the generation's starting course so any events emitted during this generation
657
668
  // remain attributed to the correct course even if a tool mutates dialog.currentCourse
658
669
  // mid-generation (e.g., clear_mind).
@@ -668,7 +679,7 @@ class Dialog {
668
679
  // Mark generation as started with the actual genseq
669
680
  // This ensures subdialog_final_response_evt waits for both user_text and generating_start_evt
670
681
  this.markGenerationStarted();
671
- await this.dlgStore.notifyGeneratingStart(this);
682
+ await this.dlgStore.notifyGeneratingStart(this, msgId);
672
683
  }
673
684
  async notifyGeneratingFinish(contextHealth, llmGenModel) {
674
685
  if (contextHealth) {
@@ -1070,7 +1081,7 @@ class DialogStore {
1070
1081
  /**
1071
1082
  * Notify start of LLM generation lifecycle (generating_start_evt)
1072
1083
  */
1073
- async notifyGeneratingStart(_dialog) { }
1084
+ async notifyGeneratingStart(_dialog, _msgId) { }
1074
1085
  /**
1075
1086
  * Notify end of LLM generation lifecycle (generating_finish_evt)
1076
1087
  */
@@ -576,8 +576,8 @@ function validateReconstructedContext(messages) {
576
576
  }
577
577
  async function consumeAnthropicStream(stream, receiver, abortSignal, forcedJsonToolName) {
578
578
  // Stream lifecycle management using SDK start/stop events
579
- let currentContentBlock = null;
580
- let currentToolUse = null;
579
+ const activeContentBlocks = new Map();
580
+ const activeToolUses = new Map();
581
581
  let sayingStarted = false;
582
582
  let thinkingStarted = false;
583
583
  let usage = { kind: 'unavailable' };
@@ -588,23 +588,35 @@ async function consumeAnthropicStream(stream, receiver, abortSignal, forcedJsonT
588
588
  }
589
589
  switch (event.type) {
590
590
  case 'content_block_start': {
591
+ const blockIndex = event.index;
591
592
  const contentBlock = event.content_block;
593
+ const existingBlock = activeContentBlocks.get(blockIndex);
594
+ if (existingBlock) {
595
+ log.warn('ANTH content_block_start replacing active content block at index', new Error('content_block_start_without_stop'), {
596
+ index: blockIndex,
597
+ prevType: existingBlock.type,
598
+ nextType: contentBlock.type,
599
+ });
600
+ }
601
+ activeContentBlocks.set(blockIndex, contentBlock);
592
602
  // Track tool use so we can emit function calls once JSON is complete
593
603
  if (contentBlock.type === 'tool_use') {
594
- currentToolUse = {
604
+ activeToolUses.set(blockIndex, {
595
605
  id: contentBlock.id,
596
606
  name: contentBlock.name,
597
607
  inputJson: '',
598
608
  initialInput: contentBlock.input,
599
- };
609
+ });
600
610
  }
601
- currentContentBlock = contentBlock;
602
611
  break;
603
612
  }
604
613
  case 'content_block_delta': {
614
+ const blockIndex = event.index;
615
+ const activeContentBlock = activeContentBlocks.get(blockIndex);
605
616
  // Only process deltas for known content blocks
606
- if (!currentContentBlock) {
617
+ if (!activeContentBlock) {
607
618
  log.warn('ANTH unexpected content_block_delta without active content block', new Error('Delta received before content_block_start'), {
619
+ index: blockIndex,
608
620
  deltaType: event.delta.type,
609
621
  });
610
622
  break;
@@ -657,37 +669,44 @@ async function consumeAnthropicStream(stream, receiver, abortSignal, forcedJsonT
657
669
  }
658
670
  else if (delta.type === 'input_json_delta') {
659
671
  const partialJson = delta.partial_json;
660
- if (currentToolUse) {
661
- applyInputJsonDelta(currentToolUse, partialJson);
672
+ const activeToolUse = activeToolUses.get(blockIndex);
673
+ if (activeToolUse) {
674
+ applyInputJsonDelta(activeToolUse, partialJson);
662
675
  }
663
676
  else if (partialJson.length > 0) {
664
677
  log.warn('ANTH input_json_delta without active tool_use', new Error('Input JSON delta received without active tool_use block'), {
665
- hasCurrentBlock: currentContentBlock !== null,
666
- blockType: currentContentBlock ? currentContentBlock.type : 'none',
678
+ hasCurrentBlock: true,
679
+ blockIndex,
680
+ blockType: activeContentBlock.type,
667
681
  });
668
682
  }
669
683
  }
670
684
  break;
671
685
  }
672
686
  case 'content_block_stop': {
673
- if (!currentContentBlock) {
687
+ const blockIndex = event.index;
688
+ const activeContentBlock = activeContentBlocks.get(blockIndex);
689
+ if (!activeContentBlock) {
674
690
  break;
675
691
  }
676
692
  // Close thinking as soon as the thinking block ends so downstream UI/persistence reflects
677
693
  // strict generation order (thinking first, then saying). This also avoids emitting
678
694
  // thinking_finish after the main message has already completed.
679
- if (currentContentBlock.type === 'thinking' && thinkingStarted) {
695
+ if (activeContentBlock.type === 'thinking' && thinkingStarted) {
680
696
  await receiver.thinkingFinish();
681
697
  thinkingStarted = false;
682
698
  }
683
- if (currentContentBlock.type === 'tool_use') {
684
- if (!currentToolUse) {
685
- log.warn('ANTH tool_use stop without active tool_use', new Error('Tool_use block stopped without active tool tracking'));
699
+ if (activeContentBlock.type === 'tool_use') {
700
+ const activeToolUse = activeToolUses.get(blockIndex);
701
+ if (!activeToolUse) {
702
+ log.warn('ANTH tool_use stop without active tool_use', new Error('Tool_use block stopped without active tool tracking'), {
703
+ blockIndex,
704
+ });
686
705
  }
687
706
  else {
688
- if (forcedJsonToolName && currentToolUse.name === forcedJsonToolName) {
689
- const forcedInput = parseForcedJsonToolInput(currentToolUse.inputJson, currentToolUse.initialInput, `tool_use:${currentToolUse.id}:${currentToolUse.name}`);
690
- const jsonText = serializeAnthropicForcedJsonObject(forcedInput, `tool_use:${currentToolUse.id}:${currentToolUse.name}`);
707
+ if (forcedJsonToolName && activeToolUse.name === forcedJsonToolName) {
708
+ const forcedInput = parseForcedJsonToolInput(activeToolUse.inputJson, activeToolUse.initialInput, `tool_use:${activeToolUse.id}:${activeToolUse.name}`);
709
+ const jsonText = serializeAnthropicForcedJsonObject(forcedInput, `tool_use:${activeToolUse.id}:${activeToolUse.name}`);
691
710
  if (!sayingStarted) {
692
711
  sayingStarted = true;
693
712
  await receiver.sayingStart();
@@ -698,20 +717,20 @@ async function consumeAnthropicStream(stream, receiver, abortSignal, forcedJsonT
698
717
  }
699
718
  else {
700
719
  let argsJson = '';
701
- if (currentToolUse.inputJson.trim().length > 0) {
702
- argsJson = currentToolUse.inputJson;
720
+ if (activeToolUse.inputJson.trim().length > 0) {
721
+ argsJson = activeToolUse.inputJson;
703
722
  }
704
723
  else {
705
- const stringified = JSON.stringify(currentToolUse.initialInput);
724
+ const stringified = JSON.stringify(activeToolUse.initialInput);
706
725
  argsJson =
707
726
  typeof stringified === 'string' && stringified.length > 0 ? stringified : '{}';
708
727
  }
709
- await receiver.funcCall(currentToolUse.id, currentToolUse.name, argsJson);
728
+ await receiver.funcCall(activeToolUse.id, activeToolUse.name, argsJson);
710
729
  }
711
730
  }
712
- currentToolUse = null;
731
+ activeToolUses.delete(blockIndex);
713
732
  }
714
- currentContentBlock = null;
733
+ activeContentBlocks.delete(blockIndex);
715
734
  break;
716
735
  }
717
736
  case 'message_start': {
@@ -767,8 +786,8 @@ async function consumeAnthropicStream(stream, receiver, abortSignal, forcedJsonT
767
786
  break;
768
787
  }
769
788
  case 'message_stop': {
770
- currentContentBlock = null;
771
- currentToolUse = null;
789
+ activeContentBlocks.clear();
790
+ activeToolUses.clear();
772
791
  if (thinkingStarted) {
773
792
  await receiver.thinkingFinish();
774
793
  thinkingStarted = false;
@@ -627,7 +627,16 @@ class OpenAiCompatibleGen {
627
627
  const toolCalls = delta.tool_calls;
628
628
  if (Array.isArray(toolCalls)) {
629
629
  for (const call of toolCalls) {
630
- const index = call.index;
630
+ const rawIndex = call.index;
631
+ if (typeof rawIndex !== 'number' || !Number.isInteger(rawIndex) || rawIndex < 0) {
632
+ const detail = `OPENAI-COMPATIBLE invalid tool call index: ${JSON.stringify(rawIndex)}`;
633
+ log.error(detail, new Error('openai_compatible_invalid_tool_call_index'));
634
+ if (receiver.streamError) {
635
+ await receiver.streamError(detail);
636
+ }
637
+ throw new Error(detail);
638
+ }
639
+ const index = rawIndex;
631
640
  const existing = activeCallsByIndex.get(index);
632
641
  const state = existing ??
633
642
  {
@@ -12,6 +12,7 @@ const driver_messages_1 = require("../../shared/i18n/driver-messages");
12
12
  const runtime_language_1 = require("../../shared/runtime-language");
13
13
  const id_1 = require("../../shared/utils/id");
14
14
  const time_1 = require("../../shared/utils/time");
15
+ const tool_1 = require("../../tool");
15
16
  const taskdoc_1 = require("../../utils/taskdoc");
16
17
  const client_1 = require("../client");
17
18
  const registry_1 = require("../gen/registry");
@@ -405,18 +406,30 @@ async function renderRemindersForContext(dlg) {
405
406
  if (dlg.reminders.length === 0)
406
407
  return [];
407
408
  const language = (0, runtime_language_1.getWorkLanguage)();
408
- return await Promise.all(dlg.reminders.map(async (reminder, index) => {
409
+ const reminderNoByIndex = (0, tool_1.computeReminderNoByIndex)(dlg.reminders);
410
+ const rendered = [];
411
+ for (let index = 0; index < dlg.reminders.length; index += 1) {
412
+ const reminder = dlg.reminders[index];
413
+ if (!reminder || !(0, tool_1.reminderEchoBackEnabled)(reminder)) {
414
+ continue;
415
+ }
416
+ const reminderNo = reminderNoByIndex.get(index);
417
+ if (reminderNo === undefined) {
418
+ continue;
419
+ }
409
420
  if (reminder.owner) {
410
- return await reminder.owner.renderReminder(dlg, reminder, index);
421
+ rendered.push(await reminder.owner.renderReminder(dlg, reminder, reminderNo - 1));
422
+ continue;
411
423
  }
412
- return {
424
+ rendered.push({
413
425
  type: 'environment_msg',
414
426
  role: 'user',
415
- content: (0, driver_messages_1.formatReminderItemGuide)(language, index + 1, reminder.content, {
427
+ content: (0, driver_messages_1.formatReminderItemGuide)(language, reminderNo, reminder.content, {
416
428
  meta: reminder.meta,
417
429
  }),
418
- };
419
- }));
430
+ });
431
+ }
432
+ return rendered;
420
433
  }
421
434
  function parseUnifiedTimestampMs(ts) {
422
435
  const normalized = ts.trim();
@@ -1052,10 +1065,10 @@ async function driveDialogStreamCore(dlg, humanPrompt, driveOptions, callbacks)
1052
1065
  let contextHealthForGen;
1053
1066
  let llmGenModelForGen = model;
1054
1067
  let suspendForHuman = false;
1055
- await dlg.notifyGeneratingStart();
1068
+ const currentPrompt = pendingPrompt;
1069
+ pendingPrompt = undefined;
1070
+ await dlg.notifyGeneratingStart(currentPrompt?.msgId);
1056
1071
  try {
1057
- const currentPrompt = pendingPrompt;
1058
- pendingPrompt = undefined;
1059
1072
  if (currentPrompt) {
1060
1073
  const origin = currentPrompt.origin ?? 'user';
1061
1074
  if (origin === 'diligence_push' &&
@@ -144,7 +144,7 @@ function getMemoryPromptCopy(ctx) {
144
144
  progressLine: '- 其中 `progress` 是全队共享公告牌:用于“阶段性进度快照”(关键决策/当前状态/下一步),不是流水账。',
145
145
  injectedTaskdocLine: '- 重要:差遣牒内容会被系统以内联形式注入到上下文中(本轮生成视角下即为最新;注入内容不包括全局约束)。需要回顾时请直接基于上下文里的差遣牒内容回顾与决策,不要试图用通用文件工具读取 `*.tsk/` 下的文件(会被拒绝)。',
146
146
  constraintsLine: '- 约定:`constraints` 只写任务特有的硬要求,不得写入系统提示/工具文档里已明确且由系统强制执行的通用规则(例如 `*.tsk/` 封装禁止通用文件工具)。一经发现重复,必须删除并告知用户。',
147
- remindersLine: '- 提醒项(工作集):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。',
147
+ remindersLine: '- 提醒项(即编号提醒,工作集):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。',
148
148
  teamMemoryLine: '- 团队记忆:稳定的团队约定/工程规约(跨任务共享)。',
149
149
  personalMemoryLine: '- 个人记忆:稳定的个人习惯/偏好与职责域知识;可维护你职责范围内的“rtws 索引”(关键文档/代码的准确路径 + 必要要点),以减少重复读文件;不要记录具体任务状态。',
150
150
  subdialogDutyLine: `你当前处于支线对话:此处不允许 \`change_mind\`。当你判断需要更新差遣牒(尤其是 progress 公告牌)时,请在合适时机直接诉请差遣牒维护人 \`@${ctx.taskdocMaintainerId}\` 执行更新,并给出你已合并好的“新全文/替换稿”(用于替换对应章节全文)。不要声称已更新,除非看到回执。`,
@@ -166,7 +166,7 @@ function getMemoryPromptCopy(ctx) {
166
166
  progressLine: '- Taskdoc `progress` is the team’s shared bulletin board: distilled milestone snapshots (key decisions/current status/next steps), not raw logs.',
167
167
  injectedTaskdocLine: '- Important: the Taskdoc content is injected inline into the context (the latest as of this generation; injected content excludes global constraints). Review the injected Taskdoc instead of trying to read files under `*.tsk/` via general file tools (they will be rejected).',
168
168
  constraintsLine: '- Convention: Taskdoc `constraints` must contain task-specific requirements only; do not include global, system-enforced rules already stated in system prompt/tool docs (e.g. `.tsk/` encapsulation bans general file tools). If duplication is found, you MUST remove it and notify the user.',
169
- remindersLine: '- Reminders (working set): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small (often 1–3 items), prefer `update_reminder` to compress/merge; delete when obsolete.',
169
+ remindersLine: '- Reminders (i.e. numbered reminders, working set): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small (often 1–3 items), prefer `update_reminder` to compress/merge; delete when obsolete.',
170
170
  teamMemoryLine: '- Team memory: stable shared conventions (cross-task).',
171
171
  personalMemoryLine: '- Personal memory: stable personal habits/preferences and responsibility-scope knowledge. Maintain a compact responsibility-area rtws index (exact key doc/code paths + minimal key facts) to reduce repeat file reads; do not store per-task state.',
172
172
  subdialogDutyLine: `You are currently in a subdialog: \`change_mind\` is not allowed here. When Taskdoc should be updated (especially the shared progress bulletin board), tellask the Taskdoc maintainer \`@${ctx.taskdocMaintainerId}\` with a fully merged replacement draft (full-section replacement). Do not claim it is updated until you see a receipt.`,
@@ -819,7 +819,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
819
819
  * CRITICAL: This must be called BEFORE any substream events (thinking_start, markdown_start, etc.)
820
820
  * to ensure proper event ordering on the frontend.
821
821
  */
822
- async notifyGeneratingStart(dialog) {
822
+ async notifyGeneratingStart(dialog, msgId) {
823
823
  const course = dialog.activeGenCourseOrUndefined ?? dialog.currentCourse;
824
824
  const genseq = dialog.activeGenSeq;
825
825
  try {
@@ -837,6 +837,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
837
837
  type: 'generating_start_evt',
838
838
  course,
839
839
  genseq: genseq,
840
+ msgId: typeof msgId === 'string' && msgId.trim() !== '' ? msgId : undefined,
840
841
  };
841
842
  (0, evt_registry_1.postDialogEvent)(dialog, genStartEvt);
842
843
  // Update generating flag in latest.yaml
@@ -1460,11 +1461,14 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
1460
1461
  }
1461
1462
  // Rehydrate reminders from dialog state
1462
1463
  const dialogState = await DialogPersistence.restoreDialog(dialog.id, status);
1463
- const rehydrated = (dialogState?.reminders ?? []).map((r) => {
1464
- return { content: r.content, owner: r.owner, meta: r.meta };
1465
- });
1464
+ if (!dialogState) {
1465
+ throw new Error(`Dialog state missing during direct event replay: ${dialog.id.valueOf()} (${status})`);
1466
+ }
1467
+ // Keep typed reminder objects as-is instead of field-picking rehydrate.
1468
+ // This prevents accidental field loss (e.g. echoback) when Reminder shape evolves.
1469
+ const restoredReminders = dialogState.reminders;
1466
1470
  dialog.reminders.length = 0;
1467
- dialog.reminders.push(...rehydrated);
1471
+ dialog.reminders.push(...restoredReminders);
1468
1472
  }
1469
1473
  catch (error) {
1470
1474
  log_1.log.error(`Failed to send dialog events directly for ${dialog.id.selfId}:`, error);
@@ -2641,6 +2645,7 @@ class DialogPersistence {
2641
2645
  content: r.content,
2642
2646
  ownerName: r.owner ? r.owner.name : undefined,
2643
2647
  meta: r.meta,
2648
+ echoback: r.echoback,
2644
2649
  createdAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
2645
2650
  priority: 'medium',
2646
2651
  })),
@@ -2675,6 +2680,7 @@ class DialogPersistence {
2675
2680
  content: r.content,
2676
2681
  owner,
2677
2682
  meta: r.meta,
2683
+ echoback: r.echoback,
2678
2684
  createdAt: r.createdAt,
2679
2685
  priority: r.priority,
2680
2686
  };
@@ -82,6 +82,39 @@ function resolveUserLanguageCode(ws, raw, fallbackDialog) {
82
82
  return fallbackDialog.getLastUserLanguageCode();
83
83
  return (0, runtime_language_1.getWorkLanguage)();
84
84
  }
85
+ async function queueUserSupplementAtGenerationBoundary(dialog, prompt) {
86
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialog.id, 'running');
87
+ const runStateKind = latest?.runState?.kind;
88
+ if (runStateKind !== 'proceeding') {
89
+ return false;
90
+ }
91
+ if (!dialog.isLocked()) {
92
+ return false;
93
+ }
94
+ if (dialog.hasUpNext()) {
95
+ throw new Error(`Dialog already has pending upNext prompt; cannot queue supplement now (dialog=${dialog.id.valueOf()} incomingMsgId=${prompt.msgId})`);
96
+ }
97
+ dialog.queueUpNextPrompt({
98
+ prompt: prompt.content,
99
+ msgId: prompt.msgId,
100
+ grammar: prompt.grammar,
101
+ userLanguageCode: prompt.userLanguageCode,
102
+ });
103
+ (0, evt_registry_1.postDialogEvent)(dialog, {
104
+ type: 'queue_user_msg_evt',
105
+ course: dialog.currentCourse,
106
+ msgId: prompt.msgId,
107
+ content: prompt.content,
108
+ grammar: prompt.grammar,
109
+ userLanguageCode: prompt.userLanguageCode,
110
+ });
111
+ log.debug('Queued user supplement for next generation boundary', undefined, {
112
+ rootId: dialog.id.rootId,
113
+ selfId: dialog.id.selfId,
114
+ msgId: prompt.msgId,
115
+ });
116
+ return true;
117
+ }
85
118
  /**
86
119
  * Get error code from unknown error
87
120
  */
@@ -948,6 +981,10 @@ async function handleUserMsg2Dlg(ws, packet) {
948
981
  existingDialog.status === 'running' &&
949
982
  existingSub &&
950
983
  existingSub.dialogKey === existingDialog.id.valueOf()) {
984
+ const queuedAtBoundary = await queueUserSupplementAtGenerationBoundary(existingDialog, effectivePrompt);
985
+ if (queuedAtBoundary) {
986
+ return;
987
+ }
951
988
  await (0, kernel_driver_1.driveDialogStream)(existingDialog, {
952
989
  content: effectivePrompt.content,
953
990
  msgId: effectivePrompt.msgId,
@@ -974,6 +1011,10 @@ async function handleUserMsg2Dlg(ws, packet) {
974
1011
  return;
975
1012
  }
976
1013
  await setupWebSocketSubscription(ws, dialog);
1014
+ const queuedAtBoundary = await queueUserSupplementAtGenerationBoundary(dialog, effectivePrompt);
1015
+ if (queuedAtBoundary) {
1016
+ return;
1017
+ }
977
1018
  await (0, kernel_driver_1.driveDialogStream)(dialog, {
978
1019
  content: effectivePrompt.content,
979
1020
  msgId: effectivePrompt.msgId,
@@ -0,0 +1,196 @@
1
+ import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-BqskSet8.js";
2
+ import { aR as isObject, aA as baseRest, aS as isIterateeCall, aT as keysIn, aU as eq, aV as isArrayLike, aW as isArray, aX as identity, aY as isIndex, aZ as assignValue } from "./index-C0pO-3BA.js";
3
+ var reWhitespace = /\s/;
4
+ function trimmedEndIndex(string) {
5
+ var index = string.length;
6
+ while (index-- && reWhitespace.test(string.charAt(index))) {
7
+ }
8
+ return index;
9
+ }
10
+ var reTrimStart = /^\s+/;
11
+ function baseTrim(string) {
12
+ return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string;
13
+ }
14
+ var NAN = 0 / 0;
15
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
16
+ var reIsBinary = /^0b[01]+$/i;
17
+ var reIsOctal = /^0o[0-7]+$/i;
18
+ var freeParseInt = parseInt;
19
+ function toNumber(value) {
20
+ if (typeof value == "number") {
21
+ return value;
22
+ }
23
+ if (isSymbol(value)) {
24
+ return NAN;
25
+ }
26
+ if (isObject(value)) {
27
+ var other = typeof value.valueOf == "function" ? value.valueOf() : value;
28
+ value = isObject(other) ? other + "" : other;
29
+ }
30
+ if (typeof value != "string") {
31
+ return value === 0 ? value : +value;
32
+ }
33
+ value = baseTrim(value);
34
+ var isBinary = reIsBinary.test(value);
35
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
36
+ }
37
+ var INFINITY = 1 / 0, MAX_INTEGER = 17976931348623157e292;
38
+ function toFinite(value) {
39
+ if (!value) {
40
+ return value === 0 ? value : 0;
41
+ }
42
+ value = toNumber(value);
43
+ if (value === INFINITY || value === -INFINITY) {
44
+ var sign = value < 0 ? -1 : 1;
45
+ return sign * MAX_INTEGER;
46
+ }
47
+ return value === value ? value : 0;
48
+ }
49
+ function toInteger(value) {
50
+ var result = toFinite(value), remainder = result % 1;
51
+ return result === result ? remainder ? result - remainder : result : 0;
52
+ }
53
+ function flatten(array) {
54
+ var length = array == null ? 0 : array.length;
55
+ return length ? baseFlatten(array) : [];
56
+ }
57
+ var objectProto$1 = Object.prototype;
58
+ var hasOwnProperty$1 = objectProto$1.hasOwnProperty;
59
+ var defaults = baseRest(function(object, sources) {
60
+ object = Object(object);
61
+ var index = -1;
62
+ var length = sources.length;
63
+ var guard = length > 2 ? sources[2] : void 0;
64
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
65
+ length = 1;
66
+ }
67
+ while (++index < length) {
68
+ var source = sources[index];
69
+ var props = keysIn(source);
70
+ var propsIndex = -1;
71
+ var propsLength = props.length;
72
+ while (++propsIndex < propsLength) {
73
+ var key = props[propsIndex];
74
+ var value = object[key];
75
+ if (value === void 0 || eq(value, objectProto$1[key]) && !hasOwnProperty$1.call(object, key)) {
76
+ object[key] = source[key];
77
+ }
78
+ }
79
+ }
80
+ return object;
81
+ });
82
+ function last(array) {
83
+ var length = array == null ? 0 : array.length;
84
+ return length ? array[length - 1] : void 0;
85
+ }
86
+ function createFind(findIndexFunc) {
87
+ return function(collection, predicate, fromIndex) {
88
+ var iterable = Object(collection);
89
+ if (!isArrayLike(collection)) {
90
+ var iteratee = baseIteratee(predicate);
91
+ collection = keys(collection);
92
+ predicate = function(key) {
93
+ return iteratee(iterable[key], key, iterable);
94
+ };
95
+ }
96
+ var index = findIndexFunc(collection, predicate, fromIndex);
97
+ return index > -1 ? iterable[iteratee ? collection[index] : index] : void 0;
98
+ };
99
+ }
100
+ var nativeMax = Math.max;
101
+ function findIndex(array, predicate, fromIndex) {
102
+ var length = array == null ? 0 : array.length;
103
+ if (!length) {
104
+ return -1;
105
+ }
106
+ var index = fromIndex == null ? 0 : toInteger(fromIndex);
107
+ if (index < 0) {
108
+ index = nativeMax(length + index, 0);
109
+ }
110
+ return baseFindIndex(array, baseIteratee(predicate), index);
111
+ }
112
+ var find = createFind(findIndex);
113
+ function baseMap(collection, iteratee) {
114
+ var index = -1, result = isArrayLike(collection) ? Array(collection.length) : [];
115
+ baseEach(collection, function(value, key, collection2) {
116
+ result[++index] = iteratee(value, key, collection2);
117
+ });
118
+ return result;
119
+ }
120
+ function map(collection, iteratee) {
121
+ var func = isArray(collection) ? arrayMap : baseMap;
122
+ return func(collection, baseIteratee(iteratee));
123
+ }
124
+ var objectProto = Object.prototype;
125
+ var hasOwnProperty = objectProto.hasOwnProperty;
126
+ function baseHas(object, key) {
127
+ return object != null && hasOwnProperty.call(object, key);
128
+ }
129
+ function has(object, path) {
130
+ return object != null && hasPath(object, path, baseHas);
131
+ }
132
+ function baseLt(value, other) {
133
+ return value < other;
134
+ }
135
+ function baseExtremum(array, iteratee, comparator) {
136
+ var index = -1, length = array.length;
137
+ while (++index < length) {
138
+ var value = array[index], current = iteratee(value);
139
+ if (current != null && (computed === void 0 ? current === current && !isSymbol(current) : comparator(current, computed))) {
140
+ var computed = current, result = value;
141
+ }
142
+ }
143
+ return result;
144
+ }
145
+ function min(array) {
146
+ return array && array.length ? baseExtremum(array, identity, baseLt) : void 0;
147
+ }
148
+ function baseSet(object, path, value, customizer) {
149
+ if (!isObject(object)) {
150
+ return object;
151
+ }
152
+ path = castPath(path, object);
153
+ var index = -1, length = path.length, lastIndex = length - 1, nested = object;
154
+ while (nested != null && ++index < length) {
155
+ var key = toKey(path[index]), newValue = value;
156
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
157
+ return object;
158
+ }
159
+ if (index != lastIndex) {
160
+ var objValue = nested[key];
161
+ newValue = void 0;
162
+ if (newValue === void 0) {
163
+ newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};
164
+ }
165
+ }
166
+ assignValue(nested, key, newValue);
167
+ nested = nested[key];
168
+ }
169
+ return object;
170
+ }
171
+ function basePickBy(object, paths, predicate) {
172
+ var index = -1, length = paths.length, result = {};
173
+ while (++index < length) {
174
+ var path = paths[index], value = baseGet(object, path);
175
+ if (predicate(value, path)) {
176
+ baseSet(result, castPath(path, object), value);
177
+ }
178
+ }
179
+ return result;
180
+ }
181
+ export {
182
+ baseLt as a,
183
+ baseExtremum as b,
184
+ baseMap as c,
185
+ basePickBy as d,
186
+ min as e,
187
+ flatten as f,
188
+ find as g,
189
+ has as h,
190
+ defaults as i,
191
+ toInteger as j,
192
+ last as l,
193
+ map as m,
194
+ toFinite as t
195
+ };
196
+ //# sourceMappingURL=_basePickBy-B82bRmTe.js.map