dominds 1.17.4 → 1.17.5

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 (156) hide show
  1. package/dist/dialog.d.ts +1 -0
  2. package/dist/dialog.js +3 -0
  3. package/dist/docs/dialog-system.md +6 -5
  4. package/dist/docs/dialog-system.zh.md +2 -1
  5. package/dist/docs/fbr.md +1 -1
  6. package/dist/docs/fbr.zh.md +1 -1
  7. package/dist/docs/tellask-collab.md +6 -6
  8. package/dist/docs/tellask-collab.zh.md +2 -2
  9. package/dist/minds/system-prompt.js +6 -6
  10. package/dist/persistence.js +215 -16
  11. package/package.json +4 -4
  12. package/webapp/dist/assets/{_basePickBy-CgM-M_q8.js → _basePickBy-CpHP1wBo.js} +3 -3
  13. package/webapp/dist/assets/_basePickBy-CpHP1wBo.js.map +1 -0
  14. package/webapp/dist/assets/{_baseUniq-B06twih4.js → _baseUniq-CvZnDuif.js} +2 -2
  15. package/webapp/dist/assets/_baseUniq-CvZnDuif.js.map +1 -0
  16. package/webapp/dist/assets/{arc-CoXJvjeB.js → arc-BHFujbnL.js} +2 -2
  17. package/webapp/dist/assets/arc-BHFujbnL.js.map +1 -0
  18. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-BLFRWTKn.js → architectureDiagram-VXUJARFQ-Di1oQVRu.js} +8 -26
  19. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-Di1oQVRu.js.map +1 -0
  20. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CYRE6deu.js → blockDiagram-VD42YOAC-DQvfo_FK.js} +170 -187
  21. package/webapp/dist/assets/blockDiagram-VD42YOAC-DQvfo_FK.js.map +1 -0
  22. package/webapp/dist/assets/{c4Diagram-IC4MRINW-B26QTIJt.js → c4Diagram-YG6GDRKO-ZhmyLfpa.js} +4 -4
  23. package/webapp/dist/assets/c4Diagram-YG6GDRKO-ZhmyLfpa.js.map +1 -0
  24. package/webapp/dist/assets/{channel-C5U2W0P9.js → channel-BzUmZVV0.js} +2 -2
  25. package/webapp/dist/assets/channel-BzUmZVV0.js.map +1 -0
  26. package/webapp/dist/assets/{chunk-4BX2VUAB-7z2PgnSv.js → chunk-4BX2VUAB-btqBd7Au.js} +2 -2
  27. package/webapp/dist/assets/chunk-4BX2VUAB-btqBd7Au.js.map +1 -0
  28. package/webapp/dist/assets/{chunk-55IACEB6-6sRVmXqs.js → chunk-55IACEB6-Dd88jUsB.js} +2 -2
  29. package/webapp/dist/assets/chunk-55IACEB6-Dd88jUsB.js.map +1 -0
  30. package/webapp/dist/assets/{chunk-WL4C6EOR-DkpfoQzK.js → chunk-B4BG7PRW-CF0szfFw.js} +121 -171
  31. package/webapp/dist/assets/chunk-B4BG7PRW-CF0szfFw.js.map +1 -0
  32. package/webapp/dist/assets/{chunk-NQ4KR5QH-3cQSOzCt.js → chunk-DI55MBZ5-CuueZ5mR.js} +7 -9
  33. package/webapp/dist/assets/chunk-DI55MBZ5-CuueZ5mR.js.map +1 -0
  34. package/webapp/dist/assets/{chunk-FMBD7UC4-BwYp8OtY.js → chunk-FMBD7UC4-BWirvwW5.js} +2 -2
  35. package/webapp/dist/assets/chunk-FMBD7UC4-BWirvwW5.js.map +1 -0
  36. package/webapp/dist/assets/{chunk-KX2RTZJC-CzFE355P.js → chunk-QN33PNHL-C8y0hbMe.js} +2 -2
  37. package/webapp/dist/assets/chunk-QN33PNHL-C8y0hbMe.js.map +1 -0
  38. package/webapp/dist/assets/{chunk-QZHKN3VN-DWkpxb-w.js → chunk-QZHKN3VN-CYBh9MjS.js} +2 -2
  39. package/webapp/dist/assets/chunk-QZHKN3VN-CYBh9MjS.js.map +1 -0
  40. package/webapp/dist/assets/{chunk-JSJVCQXG-CRq8LK53.js → chunk-TZMSLE5B-Dp3nxkVa.js} +6 -14
  41. package/webapp/dist/assets/chunk-TZMSLE5B-Dp3nxkVa.js.map +1 -0
  42. package/webapp/dist/assets/{classDiagram-VBA2DB6C-mVfJeuZL.js → classDiagram-2ON5EDUG-DqWZ8QKp.js} +6 -7
  43. package/webapp/dist/assets/classDiagram-2ON5EDUG-DqWZ8QKp.js.map +1 -0
  44. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-mVfJeuZL.js → classDiagram-v2-WZHVMYZB-DqWZ8QKp.js} +6 -7
  45. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-DqWZ8QKp.js.map +1 -0
  46. package/webapp/dist/assets/{clone-5uLJc7AC.js → clone-CUPRkFmQ.js} +2 -2
  47. package/webapp/dist/assets/clone-CUPRkFmQ.js.map +1 -0
  48. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CoiJzdQi.js → cose-bilkent-S5V4N54A-DMy7cbOH.js} +2 -2
  49. package/webapp/dist/assets/cose-bilkent-S5V4N54A-DMy7cbOH.js.map +1 -0
  50. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  51. package/webapp/dist/assets/{dagre-KLK3FWXG-DU_3BSOq.js → dagre-6UL2VRFP-oKcmfGzQ.js} +7 -7
  52. package/webapp/dist/assets/dagre-6UL2VRFP-oKcmfGzQ.js.map +1 -0
  53. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  54. package/webapp/dist/assets/{diagram-E7M64L7V-DgqOvF1U.js → diagram-PSM6KHXK-DaqJJraw.js} +10 -10
  55. package/webapp/dist/assets/diagram-PSM6KHXK-DaqJJraw.js.map +1 -0
  56. package/webapp/dist/assets/{diagram-IFDJBPK2-CFWMc1oD.js → diagram-QEK2KX5R-CYJxrEIt.js} +8 -9
  57. package/webapp/dist/assets/diagram-QEK2KX5R-CYJxrEIt.js.map +1 -0
  58. package/webapp/dist/assets/{diagram-P4PSJMXO-lrqvXDXp.js → diagram-S2PKOQOG-CLU09icu.js} +8 -8
  59. package/webapp/dist/assets/diagram-S2PKOQOG-CLU09icu.js.map +1 -0
  60. package/webapp/dist/assets/{erDiagram-INFDFZHY-C28KjRkA.js → erDiagram-Q2GNP2WA-DSZdQ4Um.js} +75 -96
  61. package/webapp/dist/assets/erDiagram-Q2GNP2WA-DSZdQ4Um.js.map +1 -0
  62. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DkxGh-JF.js → flowDiagram-NV44I4VS-BMQN6R95.js} +81 -98
  63. package/webapp/dist/assets/flowDiagram-NV44I4VS-BMQN6R95.js.map +1 -0
  64. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BmZnHD96.js → ganttDiagram-JELNMOA3-Bsx24uHi.js} +3 -28
  65. package/webapp/dist/assets/ganttDiagram-JELNMOA3-Bsx24uHi.js.map +1 -0
  66. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-xiHqomZC.js → gitGraphDiagram-V2S2FVAM-zwxKKypo.js} +46 -38
  67. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-zwxKKypo.js.map +1 -0
  68. package/webapp/dist/assets/graph-E0vpJDes.js +425 -0
  69. package/webapp/dist/assets/graph-E0vpJDes.js.map +1 -0
  70. package/webapp/dist/assets/{index-Cyx7eev_.js → index-DN9U1zRL.js} +1046 -1021
  71. package/webapp/dist/assets/{index-Cyx7eev_.js.map → index-DN9U1zRL.js.map} +1 -1
  72. package/webapp/dist/assets/{index-YaxF76or.css → index-xvYYeHuy.css} +1 -1
  73. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-fLl_TA1F.js → infoDiagram-HS3SLOUP-DTsziUlk.js} +7 -7
  74. package/webapp/dist/assets/infoDiagram-HS3SLOUP-DTsziUlk.js.map +1 -0
  75. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  76. package/webapp/dist/assets/{journeyDiagram-4ABVD52K--aRyymZs.js → journeyDiagram-XKPGCS4Q-BRCxHm94.js} +5 -5
  77. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-BRCxHm94.js.map +1 -0
  78. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BO_QdW_O.js → kanban-definition-3W4ZIXB7-CpQyoAYJ.js} +3 -5
  79. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CpQyoAYJ.js.map +1 -0
  80. package/webapp/dist/assets/{layout-Bu3Xw0z2.js → layout-CbfoT0O3.js} +5 -5
  81. package/webapp/dist/assets/layout-CbfoT0O3.js.map +1 -0
  82. package/webapp/dist/assets/{linear-Bq77itJm.js → linear-D1HwcPmT.js} +2 -2
  83. package/webapp/dist/assets/linear-D1HwcPmT.js.map +1 -0
  84. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-CHB8qv8L.js → mindmap-definition-VGOIOE7T-C9bCAYD2.js} +5 -7
  85. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-C9bCAYD2.js.map +1 -0
  86. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  87. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Cxg_wh4K.js → pieDiagram-ADFJNKIX-CkWs3EqH.js} +8 -8
  88. package/webapp/dist/assets/pieDiagram-ADFJNKIX-CkWs3EqH.js.map +1 -0
  89. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DFguuaS9.js → quadrantDiagram-AYHSOK5B-lePBdGYd.js} +3 -3
  90. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-lePBdGYd.js.map +1 -0
  91. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP--tJ_dfsT.js → requirementDiagram-UZGBJVZJ-BM_GNlHQ.js} +6 -16
  92. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-BM_GNlHQ.js.map +1 -0
  93. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-f0zWimMc.js → sankeyDiagram-TZEHDZUN-Z3UUlzwo.js} +2 -2
  94. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-Z3UUlzwo.js.map +1 -0
  95. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-dwXRRnyq.js → sequenceDiagram-WL72ISMW-BmcsPWXz.js} +201 -601
  96. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-BmcsPWXz.js.map +1 -0
  97. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DToxcEC2.js → stateDiagram-FKZM4ZOC-THsxiqRA.js} +9 -9
  98. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-THsxiqRA.js.map +1 -0
  99. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BY5hDUqz.js → stateDiagram-v2-4FDKWEC3-B2oIvgOa.js} +5 -5
  100. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-B2oIvgOa.js.map +1 -0
  101. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CT3WRcFt.js → timeline-definition-IT6M3QCI-DRB7VKTt.js} +3 -3
  102. package/webapp/dist/assets/timeline-definition-IT6M3QCI-DRB7VKTt.js.map +1 -0
  103. package/webapp/dist/assets/{treemap-KZPCXAKY-Lnkh2bpd.js → treemap-GDKQZRPO-h6k2E_-V.js} +24 -37
  104. package/webapp/dist/assets/treemap-GDKQZRPO-h6k2E_-V.js.map +1 -0
  105. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DgvaqrGO.js → xychartDiagram-PRI3JC2R-CeoSM0y_.js} +4 -4
  106. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-CeoSM0y_.js.map +1 -0
  107. package/webapp/dist/index.html +2 -2
  108. package/webapp/dist/assets/_basePickBy-CgM-M_q8.js.map +0 -1
  109. package/webapp/dist/assets/_baseUniq-B06twih4.js.map +0 -1
  110. package/webapp/dist/assets/arc-CoXJvjeB.js.map +0 -1
  111. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-BLFRWTKn.js.map +0 -1
  112. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-CYRE6deu.js.map +0 -1
  113. package/webapp/dist/assets/c4Diagram-IC4MRINW-B26QTIJt.js.map +0 -1
  114. package/webapp/dist/assets/channel-C5U2W0P9.js.map +0 -1
  115. package/webapp/dist/assets/chunk-4BX2VUAB-7z2PgnSv.js.map +0 -1
  116. package/webapp/dist/assets/chunk-55IACEB6-6sRVmXqs.js.map +0 -1
  117. package/webapp/dist/assets/chunk-FMBD7UC4-BwYp8OtY.js.map +0 -1
  118. package/webapp/dist/assets/chunk-JSJVCQXG-CRq8LK53.js.map +0 -1
  119. package/webapp/dist/assets/chunk-KX2RTZJC-CzFE355P.js.map +0 -1
  120. package/webapp/dist/assets/chunk-NQ4KR5QH-3cQSOzCt.js.map +0 -1
  121. package/webapp/dist/assets/chunk-QZHKN3VN-DWkpxb-w.js.map +0 -1
  122. package/webapp/dist/assets/chunk-WL4C6EOR-DkpfoQzK.js.map +0 -1
  123. package/webapp/dist/assets/classDiagram-VBA2DB6C-mVfJeuZL.js.map +0 -1
  124. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-mVfJeuZL.js.map +0 -1
  125. package/webapp/dist/assets/clone-5uLJc7AC.js.map +0 -1
  126. package/webapp/dist/assets/cose-bilkent-S5V4N54A-CoiJzdQi.js.map +0 -1
  127. package/webapp/dist/assets/dagre-KLK3FWXG-DU_3BSOq.js.map +0 -1
  128. package/webapp/dist/assets/diagram-E7M64L7V-DgqOvF1U.js.map +0 -1
  129. package/webapp/dist/assets/diagram-IFDJBPK2-CFWMc1oD.js.map +0 -1
  130. package/webapp/dist/assets/diagram-P4PSJMXO-lrqvXDXp.js.map +0 -1
  131. package/webapp/dist/assets/erDiagram-INFDFZHY-C28KjRkA.js.map +0 -1
  132. package/webapp/dist/assets/flowDiagram-PKNHOUZH-DkxGh-JF.js.map +0 -1
  133. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-BmZnHD96.js.map +0 -1
  134. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-xiHqomZC.js.map +0 -1
  135. package/webapp/dist/assets/graph-ozb0amP0.js +0 -782
  136. package/webapp/dist/assets/graph-ozb0amP0.js.map +0 -1
  137. package/webapp/dist/assets/infoDiagram-LFFYTUFH-fLl_TA1F.js.map +0 -1
  138. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-ZL9tBKUr.js +0 -966
  139. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-ZL9tBKUr.js.map +0 -1
  140. package/webapp/dist/assets/journeyDiagram-4ABVD52K--aRyymZs.js.map +0 -1
  141. package/webapp/dist/assets/kanban-definition-K7BYSVSG-BO_QdW_O.js.map +0 -1
  142. package/webapp/dist/assets/layout-Bu3Xw0z2.js.map +0 -1
  143. package/webapp/dist/assets/linear-Bq77itJm.js.map +0 -1
  144. package/webapp/dist/assets/mindmap-definition-YRQLILUH-CHB8qv8L.js.map +0 -1
  145. package/webapp/dist/assets/pieDiagram-SKSYHLDU-Cxg_wh4K.js.map +0 -1
  146. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DFguuaS9.js.map +0 -1
  147. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP--tJ_dfsT.js.map +0 -1
  148. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-f0zWimMc.js.map +0 -1
  149. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-dwXRRnyq.js.map +0 -1
  150. package/webapp/dist/assets/stateDiagram-RAJIS63D-DToxcEC2.js.map +0 -1
  151. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-BY5hDUqz.js.map +0 -1
  152. package/webapp/dist/assets/timeline-definition-YZTLITO2-CT3WRcFt.js.map +0 -1
  153. package/webapp/dist/assets/treemap-KZPCXAKY-Lnkh2bpd.js.map +0 -1
  154. package/webapp/dist/assets/vennDiagram-LZ73GAT5-CYSLSh1w.js +0 -2487
  155. package/webapp/dist/assets/vennDiagram-LZ73GAT5-CYSLSh1w.js.map +0 -1
  156. package/webapp/dist/assets/xychartDiagram-JWTSCODW-DgvaqrGO.js.map +0 -1
package/dist/dialog.d.ts CHANGED
@@ -294,6 +294,7 @@ export declare abstract class Dialog {
294
294
  get activeGenSeq(): number;
295
295
  get activeGenSeqOrUndefined(): number | undefined;
296
296
  get activeGenCourseOrUndefined(): number | undefined;
297
+ get hasActiveGeneration(): boolean;
297
298
  /**
298
299
  * Check if generation has started for the current course.
299
300
  * Used to ensure subdialog_final_response_evt arrives after parent events.
package/dist/dialog.js CHANGED
@@ -586,6 +586,9 @@ class Dialog {
586
586
  get activeGenCourseOrUndefined() {
587
587
  return this._activeGenCourse;
588
588
  }
589
+ get hasActiveGeneration() {
590
+ return this._activeGenCourse !== undefined;
591
+ }
589
592
  /**
590
593
  * Check if generation has started for the current course.
591
594
  * Used to ensure subdialog_final_response_evt arrives after parent events.
@@ -246,9 +246,9 @@ flowchart TD
246
246
  **Sideline delivery rule (normative)**:
247
247
 
248
248
  - If a sideline dialog has completed all assigned goals and can deliver the final result, it MUST reply directly with the response body; do not use `tellaskBack` to send final delivery.
249
- - Runtime treats that direct reply as the completion delivery to the tellasker dialog and injects the work-language marker automatically (`【Completed】` in English work language, and the localized Chinese completion marker in Chinese work language).
249
+ - Runtime treats that direct reply as the completion delivery to the tellasker dialog and injects the work-language marker automatically (`【Completed】` in English work language, `【最终完成】` in Chinese work language).
250
250
  - If any goal is incomplete, the dialog is blocked, or critical context is missing, it MUST issue `tellaskBack({ tellaskContent: "..." })` to request clarification or next-step confirmation before proceeding.
251
- - **FBR exception**: FBR sideline dialogs are tellask-free (no `tellaskBack`); they must list missing context and return.
251
+ - **FBR exception**: FBR sideline dialogs forbid all tellask calls (including `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`); they must list missing context and return.
252
252
 
253
253
  **Inter-dialog transfer and markers (normative)**:
254
254
 
@@ -259,9 +259,10 @@ flowchart TD
259
259
  - Regular completed sideline reply: `【Completed】`
260
260
  - FBR sideline reply: `【FBR-Direct Reply】` or `【FBR-Reasoning Only】`
261
261
  - Chinese work language:
262
- - Ask-back reply: `【TellaskBack】`
263
- - Regular completed sideline reply: `【Completed】`
264
- - FBR sideline reply: `【FBR-Direct Reply】` or `【FBR-Reasoning Only】`
262
+ - Ask-back reply: `【回问诉请】`
263
+ - Regular completed sideline reply: `【最终完成】`
264
+ - FBR sideline reply: `【FBR-直接回复】` or `【FBR-仅推理】`
265
+ - If the requester defines a “reply/delivery format” inside the tellask body, keep it to the business delivery structure; do not require responder-side hand-written markers, because runtime injects those markers automatically.
265
266
  - Source-dialog model raw is naturally preserved in source-dialog persistence; inter-dialog transfer must not rewrite or overwrite that source raw.
266
267
  - Template-wrapped transfer is allowed: a model output from one dialog may be embedded into a runtime template and sent as the body to another dialog.
267
268
 
@@ -242,7 +242,7 @@ flowchart TD
242
242
 
243
243
  - 只有当所有目标完成时,支线对话才可直接正常回复诉请者对话。
244
244
  - 若任何目标未完成或关键信息缺失,必须先用 `tellaskBack({ tellaskContent: "..." })` 回问诉请者对话再继续。
245
- - **FBR 例外**:FBR 支线对话禁止任何诉请(包括 `tellaskBack`),只能列出缺口与阻塞原因并直接回复。
245
+ - **FBR 例外**:FBR 支线对话禁止一切 tellask(包括 `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`),只能列出缺口与阻塞原因并直接回复。
246
246
 
247
247
  **跨对话传递与标记(强制)**:
248
248
 
@@ -256,6 +256,7 @@ flowchart TD
256
256
  - 回问诉请回贴:`【TellaskBack】`
257
257
  - 常规支线完成回贴:`【Completed】`
258
258
  - FBR 回贴:`【FBR-Direct Reply】` 或 `【FBR-Reasoning Only】`
259
+ - 若诉请方在正文中定义“回贴格式/交付格式”,只写业务交付结构即可;不得要求被诉请者手写任何标记,因为这些标记由运行时自动注入。
259
260
  - 源对话的模型原始输出(raw)天然保留在源对话持久记录中;跨对话传递不得改写或覆盖该源 raw。
260
261
  - 允许将“某对话的模型原文”拼接进运行时模板后,作为传递到另一对话的正文(即模板化传递是规范路径)。
261
262
 
package/dist/docs/fbr.md CHANGED
@@ -126,7 +126,7 @@ If the model attempts any other tool/function call, runtime MUST hard-reject it
126
126
 
127
127
  ### 4.3 Tellask restriction: none allowed
128
128
 
129
- FBR sideline dialogs MUST NOT issue any teammate Tellasks (including `tellaskBack({ tellaskContent: "..." })` or `askHuman({ tellaskContent: "..." })`).
129
+ FBR sideline dialogs MUST NOT issue any tellask call (including `tellaskBack({ tellaskContent: "..." })`, `tellask({ ... })`, `tellaskSessionless({ ... })`, or `askHuman({ tellaskContent: "..." })`).
130
130
  If critical context is missing, the FBR sideline should **list the missing items** and why they block reasoning, then return.
131
131
 
132
132
  ### 4.4 Output contract (easy to distill)
@@ -122,7 +122,7 @@ FBR 支线对话的 system prompt 必须明确包含(措辞可不同,但语
122
122
 
123
123
  ### 4.3 诉请限制:一律禁止
124
124
 
125
- FBR 支线对话不得发起任何队友诉请(包括 `tellaskBack({ tellaskContent: "..." })` 或 `askHuman({ tellaskContent: "..." })`)。
125
+ FBR 支线对话不得发起任何 tellask 调用(包括 `tellaskBack({ tellaskContent: "..." })`、`tellask({ ... })`、`tellaskSessionless({ ... })` 或 `askHuman({ tellaskContent: "..." })`)。
126
126
  若关键上下文缺失,应**列出缺口与阻塞原因**,然后直接回复。
127
127
 
128
128
  ### 4.4 输出契约(在 FBR 内部完成去噪)
@@ -109,19 +109,19 @@ That is a workflow break. The model should send the Tellask directly.
109
109
  - Regular completed sideline reply: `【Completed】`
110
110
  - FBR reply: `【FBR-Direct Reply】` or `【FBR-Reasoning Only】`
111
111
  - Chinese work language:
112
- - Ask-back reply: `【TellaskBack】`
113
- - Regular completed sideline reply: `【Completed】`
114
- - FBR reply: `【FBR-Direct Reply】` or `【FBR-Reasoning Only】`
115
- - If the requester defines a “reply format” in tellask body, it must explicitly say “no hand-written markers; Dominds auto-injects markers”; do not require responder-side hand-written markers.
112
+ - Ask-back reply: `【回问诉请】`
113
+ - Regular completed sideline reply: `【最终完成】`
114
+ - FBR reply: `【FBR-直接回复】` or `【FBR-仅推理】`
115
+ - If the requester defines a “reply/delivery format” in tellask body, keep it to the business delivery structure; do not require responder-side hand-written markers, because Dominds runtime injects those markers automatically.
116
116
  - Source-dialog model raw is naturally preserved in source-dialog persistence; inter-dialog transfer must not rewrite or overwrite that source raw.
117
117
  - Template-wrapped transfer is allowed: model output from one dialog can be embedded into a runtime template and sent as another dialog body.
118
118
 
119
119
  **Sideline delivery rule**:
120
120
 
121
121
  - If a sideline dialog has completed all goals and can deliver the final result, it MUST reply directly with the response body; do not use `tellaskBack` to send final delivery.
122
- - Runtime treats that direct reply as the completion delivery to the tellasker dialog and injects the work-language marker automatically (`【Completed】` in English work language, and the localized Chinese completion marker in Chinese work language).
122
+ - Runtime treats that direct reply as the completion delivery to the tellasker dialog and injects the work-language marker automatically (`【Completed】` in English work language, `【最终完成】` in Chinese work language).
123
123
  - If any goal is incomplete, the dialog is blocked, or critical context is missing, it MUST issue `tellaskBack({ tellaskContent: "..." })` before proceeding; do not post plain-text intermediate status updates while unfinished.
124
- - **FBR exception**: FBR forbids all tellasks (including `tellaskBack` / `askHuman`); list missing context + reasoning and return.
124
+ - **FBR exception**: FBR forbids all tellask calls (including `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`); list missing context + reasoning and return.
125
125
  - If a human user inserts a message or asks a follow-up in the sideline: just reply normally; no need to report back to the upstream requester.
126
126
 
127
127
  Note: no extra "Status: ..." line is required; the first-line marker is the stage reminder.
@@ -109,7 +109,7 @@
109
109
  - 回问诉请回贴:`【TellaskBack】`
110
110
  - 常规支线完成回贴:`【Completed】`
111
111
  - FBR 回贴:`【FBR-Direct Reply】` 或 `【FBR-Reasoning Only】`
112
- - 若诉请方在正文中定义“回贴格式”,必须写明“禁止手写标记,由 Dominds 自动注入”;不得要求被诉请者手写任何标记。
112
+ - 若诉请方在正文中定义“回贴格式/交付格式”,只写业务交付结构即可;不得要求被诉请者手写任何标记,这些标记由 Dominds 运行时自动注入。
113
113
  - 源对话模型原始输出(raw)天然保留在源对话持久记录中;跨对话传递不得改写或覆盖该源 raw。
114
114
  - 允许将“某对话的模型原文”拼接进运行时模板后,作为传递到另一对话的正文(模板化传递是规范路径)。
115
115
 
@@ -117,7 +117,7 @@
117
117
 
118
118
  - 只有当所有目标完成时,支线对话才可直接正常回复诉请者对话(直接发正文即可,不需要调用 tellaskBack;运行时自动注入完成标记)。
119
119
  - 若任何目标未完成或关键信息缺失,必须先用 `tellaskBack({ tellaskContent: "..." })` 回问诉请者对话再继续;不得发送普通文本中间汇报。
120
- - **FBR 例外**:FBR 禁止任何诉请(包括 `tellaskBack` / `askHuman`);只列缺口 + 推理与摘要并直接回复。
120
+ - **FBR 例外**:FBR 禁止一切 tellask(包括 `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`);只列缺口 + 推理与摘要并直接回复。
121
121
  - 若人类用户在支线对话中插入消息或补问:直接正常回复,不需要向诉请者汇报。
122
122
 
123
123
  说明:不需要额外的 “Status: …” 行;首行标记即为阶段提醒。
@@ -103,7 +103,7 @@ function buildTeammateTellaskPhaseContract(language) {
103
103
  '- “⏳ 进行中诉请”提醒项只是系统状态窗,不是控制面:内容不可手改;当存在非 0 路进行中诉请时,不可删除,误删会被拒绝并返回引导文案。若某一路诉请需要改要求、提前收口或纠偏,只能更新那一路诉请的“任务安排”(对长线诉请通常复用同一 `sessionSlug` 再发 `tellask`),让对应主理人按最新安排自行最终回复并自然结束。',
104
104
  '- 只有长线诉请(`tellask` + `sessionSlug`)才有“更新任务安排”的通道;一次性诉请(`tellaskSessionless`)没有这个通道。再次发起 `tellaskSessionless` 只会创建新的瞬态支线,不会更新、更不会要求旧支线主理人停止;若你后来发现可能需要改要求/提前收口,一开始就不该选择 `tellaskSessionless`。',
105
105
  '- 能由队友诉请完成的执行性工作,禁止转交 `askHuman` 做“转发员”;当你写“让 @X 执行 Y”时,必须在同一回复内直接发出 `tellask` 或 `tellaskSessionless`。',
106
- `- 当你在诉请正文里定义“回贴格式/交付格式”时,必须明确写入:\`Dominds 会自动注入回贴标记,禁止手写标记\`;不得要求被诉请者手写 \`${runtimeMarkers.finalCompleted}\` / \`${runtimeMarkers.tellaskBack}\` / FBR 标记(\`${runtimeMarkers.fbrDirectReply}\` / \`${runtimeMarkers.fbrReasoningOnly}\`)。`,
106
+ `- 当你在诉请正文里定义“回贴格式/交付格式”时,只写业务交付结构即可;不要要求被诉请者手写 \`${runtimeMarkers.finalCompleted}\` / \`${runtimeMarkers.tellaskBack}\` / FBR 标记(\`${runtimeMarkers.fbrDirectReply}\` / \`${runtimeMarkers.fbrReasoningOnly}\`),这些标记由 Dominds 运行时自动注入。`,
107
107
  '- 当你处于队友诉请触发的支线且需要澄清时,必须使用 `tellaskBack` 回问上游诉请者;`tellaskBack` 不携带 `sessionSlug`。',
108
108
  `- 回贴文本标记由运行时在跨对话传递正文中按语义自动添加(例如 \`${runtimeMarkers.tellaskBack}\` / \`${runtimeMarkers.finalCompleted}\` / FBR 标记 \`${runtimeMarkers.fbrDirectReply}\` / \`${runtimeMarkers.fbrReasoningOnly}\`);该传递正文会进入目标智能体上下文,且 UI 与其一致。你不应手写这些标记。`,
109
109
  ],
@@ -115,7 +115,7 @@ function buildTeammateTellaskPhaseContract(language) {
115
115
  '- The “⏳ In-flight Tellasks” reminder is only a system status window, not a control surface: its content is not hand-editable; while any Tellask is still active, it is not deletable, and mistaken deletion will be rejected with guidance. If one Tellask needs a changed scope, earlier closure, or correction, update that Tellask’s assignment instead (for a sessioned Tellask, usually send another `tellask` with the same `sessionSlug`) so the responder can deliver a final reply naturally under the latest assignment.',
116
116
  '- Only a sessioned Tellask (`tellask` + `sessionSlug`) has an assignment-update channel. A one-shot Tellask (`tellaskSessionless`) has no such channel: another `tellaskSessionless` creates a new transient sideline and does not update, stop, or instruct the earlier one to stop. If you may need later correction or earlier wrap-up, do not choose `tellaskSessionless` in the first place.',
117
117
  '- Do not use `askHuman` as a relay for executable teammate work. If you write “ask @X to do Y”, emit `tellask` or `tellaskSessionless` in the same response.',
118
- `- When you define a “reply/delivery format” inside tellask body, you must explicitly include: \`Dominds auto-injects reply markers; do not hand-write markers\`; do not require the responder to hand-write \`${runtimeMarkers.finalCompleted}\` / \`${runtimeMarkers.tellaskBack}\` / FBR markers (\`${runtimeMarkers.fbrDirectReply}\` / \`${runtimeMarkers.fbrReasoningOnly}\`).`,
118
+ `- When you define a “reply/delivery format” inside tellask body, keep it to the business delivery structure; do not require the responder to hand-write \`${runtimeMarkers.finalCompleted}\` / \`${runtimeMarkers.tellaskBack}\` / FBR markers (\`${runtimeMarkers.fbrDirectReply}\` / \`${runtimeMarkers.fbrReasoningOnly}\`), because Dominds runtime injects those markers automatically.`,
119
119
  '- When you are in a teammate-triggered sideline and need clarification, you MUST issue `tellaskBack` to ask back upstream; `tellaskBack` must not carry `sessionSlug`.',
120
120
  `- Reply markers are auto-added by runtime in the inter-dialog transfer payload (for example \`${runtimeMarkers.tellaskBack}\` / \`${runtimeMarkers.finalCompleted}\` / FBR markers \`${runtimeMarkers.fbrDirectReply}\` / \`${runtimeMarkers.fbrReasoningOnly}\`); that same transfer payload is what the target agent receives in context and what UI shows. Do not hand-write markers.`,
121
121
  ],
@@ -165,7 +165,7 @@ function buildTellaskReplyMarkerScopePolicy(language, dialogScope) {
165
165
  ...pickLocalized(language, {
166
166
  zh: [
167
167
  `- 回贴文本标记由运行时在跨对话传递正文中自动添加(常规完成=${runtimeMarkers.finalCompleted};FBR=${runtimeMarkers.fbrDirectReply} 或 ${runtimeMarkers.fbrReasoningOnly});该正文直接进入上游上下文,且 UI 展示与其一致。你无需、也不应手写标记。`,
168
- '- 若你在正文中给下游写“回贴格式”,必须写明“Dominds 自动注入标记,禁止手写”;不得要求下游手写任何标记。',
168
+ '- 若你在正文中给下游写“回贴格式”,只写业务交付结构;不得要求下游手写任何标记,运行时会自动注入。',
169
169
  '- `tellaskBack` 只允许用于回问/澄清/阻塞说明;禁止用 `tellaskBack` 发送最终结果。',
170
170
  '- 当前支线未完成/不确定/阻塞/需要澄清时:必须调用 `tellaskBack({ tellaskContent: "..." })`,不得发普通文本中间汇报。',
171
171
  `- ${(0, reply_prompt_copy_1.buildSidelineCompletionRule)('zh')}`,
@@ -174,7 +174,7 @@ function buildTellaskReplyMarkerScopePolicy(language, dialogScope) {
174
174
  ],
175
175
  en: [
176
176
  `- Reply markers are runtime-added in the inter-dialog transfer payload (regular completed reply = ${runtimeMarkers.finalCompleted}; FBR = ${runtimeMarkers.fbrDirectReply} or ${runtimeMarkers.fbrReasoningOnly}); this payload is delivered to upstream context and shown identically in UI. Do not hand-write markers.`,
177
- '- If you define a reply format for downstream, you must state “Dominds auto-injects markers; do not hand-write them”; do not require downstream to hand-write any marker.',
177
+ '- If you define a reply format for downstream, keep it to the business delivery structure; do not require downstream to hand-write any marker, because runtime injects markers automatically.',
178
178
  '- `tellaskBack` is allowed only for ask-back / clarification / blocked-state reporting; do not use `tellaskBack` to send final results.',
179
179
  '- If the current sideline is unfinished, uncertain, blocked, or needs clarification: you must call `tellaskBack({ tellaskContent: "..." })` instead of posting a plain-text progress update.',
180
180
  `- ${(0, reply_prompt_copy_1.buildSidelineCompletionRule)('en')}`,
@@ -186,8 +186,8 @@ function buildTellaskReplyMarkerScopePolicy(language, dialogScope) {
186
186
  }
187
187
  return [
188
188
  pickLocalized(language, {
189
- zh: '- 发起 `tellask` / `tellaskSessionless` 时,`tellaskContent` 必须是业务正文,不应手写任何回贴标记;若写回贴格式,必须显式要求“禁止手写,Dominds 自动注入标记”。',
190
- en: '- When initiating `tellask` / `tellaskSessionless`, `tellaskContent` must stay as business body and must not hand-write reply markers; if you specify a reply format, explicitly require “no hand-written markers, Dominds auto-injects markers”.',
189
+ zh: '- 发起 `tellask` / `tellaskSessionless` 时,`tellaskContent` 必须是业务正文,不应手写任何回贴标记;若写回贴格式,只描述业务交付结构即可。',
190
+ en: '- When initiating `tellask` / `tellaskSessionless`, `tellaskContent` must stay as business body and must not hand-write reply markers; if you specify a reply format, describe only the business delivery structure.',
191
191
  }),
192
192
  ];
193
193
  }
@@ -62,6 +62,164 @@ const registry_1 = require("./tools/registry");
62
62
  let dialogsQuarantinedBroadcaster = null;
63
63
  let prepareDialogQuarantineHook = null;
64
64
  let finalizeDialogQuarantineHook = null;
65
+ function captureInvariantWarningStack() {
66
+ const stack = new Error().stack;
67
+ if (typeof stack !== 'string' || stack.trim() === '') {
68
+ return null;
69
+ }
70
+ const frames = stack
71
+ .split('\n')
72
+ .slice(1)
73
+ .map((line) => line.trim())
74
+ .filter((line) => {
75
+ return (line !== '' &&
76
+ !line.includes('captureInvariantWarningStack') &&
77
+ !line.includes('normalizeGeneratingDisplayStateMismatch') &&
78
+ !line.includes('mutateDialogLatest'));
79
+ });
80
+ if (frames.length === 0) {
81
+ return null;
82
+ }
83
+ return frames.slice(0, 8);
84
+ }
85
+ function summarizeLatestProjectionState(latest) {
86
+ return {
87
+ currentCourse: latest.currentCourse,
88
+ lastModified: latest.lastModified,
89
+ status: latest.status,
90
+ messageCount: latest.messageCount ?? null,
91
+ functionCallCount: latest.functionCallCount ?? null,
92
+ subdialogCount: latest.subdialogCount ?? null,
93
+ generating: latest.generating ?? false,
94
+ needsDrive: latest.needsDrive ?? false,
95
+ disableDiligencePush: latest.disableDiligencePush ?? false,
96
+ diligencePushRemainingBudget: latest.diligencePushRemainingBudget ?? null,
97
+ displayState: latest.displayState ?? null,
98
+ executionMarker: latest.executionMarker ?? null,
99
+ pendingCourseStartPromptMsgId: latest.pendingCourseStartPrompt?.msgId ?? null,
100
+ pendingCourseStartPromptOrigin: latest.pendingCourseStartPrompt?.origin ?? null,
101
+ pendingCourseStartPromptGrammar: latest.pendingCourseStartPrompt?.grammar ?? null,
102
+ pendingCourseStartPromptUserLanguageCode: latest.pendingCourseStartPrompt?.userLanguageCode ?? null,
103
+ pendingCourseStartPromptContentLength: latest.pendingCourseStartPrompt?.content.length ?? null,
104
+ pendingCourseStartPromptReplyTargetCallId: latest.pendingCourseStartPrompt?.subdialogReplyTarget?.callId ?? null,
105
+ pendingCourseStartPromptReplyTargetOwnerDialogId: latest.pendingCourseStartPrompt?.subdialogReplyTarget?.ownerDialogId ?? null,
106
+ pendingCourseStartPromptExpectedReplyCallName: latest.pendingCourseStartPrompt?.tellaskReplyDirective?.expectedReplyCallName ?? null,
107
+ pendingCourseStartPromptTargetCallId: latest.pendingCourseStartPrompt?.tellaskReplyDirective?.targetCallId ?? null,
108
+ };
109
+ }
110
+ function summarizeLatestMutationPatch(patch) {
111
+ const keys = Object.keys(patch);
112
+ if (keys.length === 0) {
113
+ return null;
114
+ }
115
+ return {
116
+ keys,
117
+ currentCourse: patch.currentCourse ?? null,
118
+ lastModified: patch.lastModified ?? null,
119
+ status: patch.status ?? null,
120
+ messageCount: patch.messageCount ?? null,
121
+ functionCallCount: patch.functionCallCount ?? null,
122
+ subdialogCount: patch.subdialogCount ?? null,
123
+ generating: patch.generating ?? null,
124
+ needsDrive: patch.needsDrive ?? null,
125
+ disableDiligencePush: patch.disableDiligencePush ?? null,
126
+ diligencePushRemainingBudget: patch.diligencePushRemainingBudget ?? null,
127
+ displayState: patch.displayState ?? null,
128
+ executionMarker: patch.executionMarker ?? null,
129
+ pendingCourseStartPromptMsgId: patch.pendingCourseStartPrompt?.msgId ?? null,
130
+ pendingCourseStartPromptOrigin: patch.pendingCourseStartPrompt?.origin ?? null,
131
+ pendingCourseStartPromptGrammar: patch.pendingCourseStartPrompt?.grammar ?? null,
132
+ pendingCourseStartPromptUserLanguageCode: patch.pendingCourseStartPrompt?.userLanguageCode ?? null,
133
+ pendingCourseStartPromptContentLength: patch.pendingCourseStartPrompt?.content.length ?? null,
134
+ pendingCourseStartPromptReplyTargetOwnerDialogId: patch.pendingCourseStartPrompt?.subdialogReplyTarget?.ownerDialogId ?? null,
135
+ pendingCourseStartPromptReplyTargetCallId: patch.pendingCourseStartPrompt?.subdialogReplyTarget?.callId ?? null,
136
+ pendingCourseStartPromptExpectedReplyCallName: patch.pendingCourseStartPrompt?.tellaskReplyDirective?.expectedReplyCallName ?? null,
137
+ pendingCourseStartPromptTargetCallId: patch.pendingCourseStartPrompt?.tellaskReplyDirective?.targetCallId ?? null,
138
+ };
139
+ }
140
+ function stringifyInvariantWarningDetails(details) {
141
+ try {
142
+ return JSON.stringify(details);
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ function chunkInvariantDiagnosticJson(value, maxChars) {
149
+ if (maxChars <= 0 || value.length <= maxChars) {
150
+ return [value];
151
+ }
152
+ const chunks = [];
153
+ for (let start = 0; start < value.length; start += maxChars) {
154
+ chunks.push(value.slice(start, start + maxChars));
155
+ }
156
+ return chunks;
157
+ }
158
+ function emitInvariantWarning(message, details) {
159
+ const diagnosticJson = stringifyInvariantWarningDetails(details);
160
+ log_1.log.warn(message, undefined, {
161
+ ...details,
162
+ diagnosticJson,
163
+ });
164
+ if (diagnosticJson !== null) {
165
+ const parts = chunkInvariantDiagnosticJson(diagnosticJson, 1600);
166
+ for (const [index, part] of parts.entries()) {
167
+ log_1.log.warn(`${message} FullDiagnosticJsonPart=${index + 1}/${parts.length} ${part}`);
168
+ }
169
+ }
170
+ }
171
+ function normalizeGeneratingDisplayStateMismatch(dialogId, status, previous, latest, context) {
172
+ if (status !== 'running' || latest.generating !== true) {
173
+ return latest;
174
+ }
175
+ const shouldPreserveDeadState = latest.displayState?.kind === 'dead' || latest.executionMarker?.kind === 'dead';
176
+ const hasRunningDisplayState = latest.displayState?.kind === 'proceeding' ||
177
+ latest.displayState?.kind === 'proceeding_stop_requested';
178
+ const hasInterruptedExecutionMarker = latest.executionMarker?.kind === 'interrupted';
179
+ if (hasRunningDisplayState && !hasInterruptedExecutionMarker) {
180
+ return latest;
181
+ }
182
+ const healedDisplayState = hasRunningDisplayState
183
+ ? latest.displayState
184
+ : { kind: 'proceeding' };
185
+ const healingMessage = !hasRunningDisplayState
186
+ ? hasInterruptedExecutionMarker
187
+ ? 'Dialog latest projection invariant warning: generating dialog has non-running run-control projection; healing displayState to proceeding and clearing stale interruption marker'
188
+ : 'Dialog latest projection invariant warning: generating dialog has non-running run-control projection; healing displayState to proceeding'
189
+ : 'Dialog latest projection invariant warning: generating dialog has stale interrupted executionMarker; clearing it while preserving running displayState';
190
+ const warningDetails = {
191
+ trigger: context.trigger,
192
+ mutationKind: context.mutationKind,
193
+ latestSource: context.latestSource,
194
+ latestWriteBackKey: context.latestWriteBackKey,
195
+ patchSummary: context.patchSummary,
196
+ dialogId: dialogId.valueOf(),
197
+ rootId: dialogId.rootId,
198
+ selfId: dialogId.selfId,
199
+ status,
200
+ before: summarizeLatestProjectionState(previous),
201
+ afterBeforeHealing: summarizeLatestProjectionState(latest),
202
+ healingApplied: !shouldPreserveDeadState,
203
+ healedTo: shouldPreserveDeadState
204
+ ? null
205
+ : {
206
+ displayState: healedDisplayState,
207
+ executionMarker: hasInterruptedExecutionMarker ? null : (latest.executionMarker ?? null),
208
+ },
209
+ callStack: captureInvariantWarningStack(),
210
+ };
211
+ emitInvariantWarning(shouldPreserveDeadState
212
+ ? 'Dialog latest projection invariant warning: generating dialog has non-running run-control projection; preserved stronger dead state'
213
+ : healingMessage, warningDetails);
214
+ if (shouldPreserveDeadState) {
215
+ return latest;
216
+ }
217
+ return {
218
+ ...latest,
219
+ displayState: healedDisplayState,
220
+ executionMarker: hasInterruptedExecutionMarker ? undefined : latest.executionMarker,
221
+ };
222
+ }
65
223
  const quarantiningRootDialogs = new Set();
66
224
  const PERSISTABLE_DIALOG_STATUSES = ['running', 'completed', 'archived'];
67
225
  const RUN_STATUS_DIR = 'run';
@@ -2157,6 +2315,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2157
2315
  async startNewCourse(dialog, newCoursePrompt) {
2158
2316
  const previousCourse = dialog.currentCourse;
2159
2317
  const newCourse = previousCourse + 1;
2318
+ const isGenerationActive = dialog.hasActiveGeneration;
2160
2319
  if (newCoursePrompt.origin !== 'runtime') {
2161
2320
  throw new Error(`startNewCourse invariant violation: pending new-course prompt must have runtime origin for dialog=${dialog.id.valueOf()}`);
2162
2321
  }
@@ -2169,15 +2328,19 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2169
2328
  patch: {
2170
2329
  currentCourse: newCourse,
2171
2330
  needsDrive: true,
2172
- displayState: {
2173
- kind: 'stopped',
2174
- reason: { kind: 'pending_course_start' },
2175
- continueEnabled: true,
2176
- },
2177
- executionMarker: {
2178
- kind: 'interrupted',
2179
- reason: { kind: 'pending_course_start' },
2180
- },
2331
+ ...(isGenerationActive
2332
+ ? {}
2333
+ : {
2334
+ displayState: {
2335
+ kind: 'stopped',
2336
+ reason: { kind: 'pending_course_start' },
2337
+ continueEnabled: true,
2338
+ },
2339
+ executionMarker: {
2340
+ kind: 'interrupted',
2341
+ reason: { kind: 'pending_course_start' },
2342
+ },
2343
+ }),
2181
2344
  pendingCourseStartPrompt: {
2182
2345
  content: newCoursePrompt.content,
2183
2346
  msgId: newCoursePrompt.msgId,
@@ -5720,9 +5883,8 @@ class DialogPersistence {
5720
5883
  try {
5721
5884
  this.assertRootDialogWriteBackNotCanceled(effectiveCancellationToken, 'mutateDialogLatest');
5722
5885
  const staged = this.latestWriteBack.get(key);
5723
- const existing = (staged
5724
- ? staged.latest
5725
- : await this.loadDialogLatestFromDisk(dialogId, status)) || {
5886
+ const latestFromDisk = staged ? null : await this.loadDialogLatestFromDisk(dialogId, status);
5887
+ const existing = (staged ? staged.latest : latestFromDisk) || {
5726
5888
  currentCourse: 1,
5727
5889
  lastModified: (0, time_1.formatUnifiedTimestamp)(new Date()),
5728
5890
  status: 'active',
@@ -5749,6 +5911,17 @@ class DialogPersistence {
5749
5911
  const _exhaustive = mutation;
5750
5912
  throw new Error(`Unhandled dialog latest mutation: ${String(_exhaustive)}`);
5751
5913
  }
5914
+ updated = normalizeGeneratingDisplayStateMismatch(dialogId, status, existing, updated, {
5915
+ trigger: 'mutateDialogLatest',
5916
+ mutationKind: mutation.kind,
5917
+ patchSummary: mutation.kind === 'patch'
5918
+ ? summarizeLatestMutationPatch(mutation.patch)
5919
+ : mutation.kind === 'replace'
5920
+ ? summarizeLatestProjectionState(mutation.next)
5921
+ : null,
5922
+ latestSource: staged ? 'staged' : latestFromDisk ? 'disk' : 'default_bootstrap',
5923
+ latestWriteBackKey: key,
5924
+ });
5752
5925
  this.assertRootDialogWriteBackNotCanceled(effectiveCancellationToken, 'mutateDialogLatest:before-stage');
5753
5926
  const pending = this.latestWriteBack.get(key);
5754
5927
  if (!pending) {
@@ -5910,15 +6083,41 @@ class DialogPersistence {
5910
6083
  if (!pending || pending.msgId !== normalizedMsgId) {
5911
6084
  return { kind: 'noop' };
5912
6085
  }
6086
+ const previousDisplayState = previous.displayState;
6087
+ const displayState = previousDisplayState?.kind === 'stopped' &&
6088
+ previousDisplayState.reason.kind === 'pending_course_start'
6089
+ ? previous.generating === true
6090
+ ? (() => {
6091
+ const warningDetails = {
6092
+ trigger: 'clearPendingCourseStartPrompt',
6093
+ dialogId: dialogId.valueOf(),
6094
+ rootId: dialogId.rootId,
6095
+ selfId: dialogId.selfId,
6096
+ status,
6097
+ pendingCourseStartMsgId: normalizedMsgId,
6098
+ previous: summarizeLatestProjectionState(previous),
6099
+ intendedPatch: summarizeLatestMutationPatch({
6100
+ pendingCourseStartPrompt: undefined,
6101
+ needsDrive: false,
6102
+ displayState: { kind: 'proceeding' },
6103
+ executionMarker: previous.executionMarker?.kind === 'interrupted' &&
6104
+ previous.executionMarker.reason.kind === 'pending_course_start'
6105
+ ? undefined
6106
+ : previous.executionMarker,
6107
+ }),
6108
+ callStack: captureInvariantWarningStack(),
6109
+ };
6110
+ emitInvariantWarning('clearPendingCourseStartPrompt invariant warning: generating dialog still projected as pending_course_start; healing displayState to proceeding', warningDetails);
6111
+ return { kind: 'proceeding' };
6112
+ })()
6113
+ : { kind: 'idle_waiting_user' }
6114
+ : previousDisplayState;
5913
6115
  return {
5914
6116
  kind: 'patch',
5915
6117
  patch: {
5916
6118
  pendingCourseStartPrompt: undefined,
5917
6119
  needsDrive: false,
5918
- displayState: previous.displayState?.kind === 'stopped' &&
5919
- previous.displayState.reason.kind === 'pending_course_start'
5920
- ? { kind: 'idle_waiting_user' }
5921
- : previous.displayState,
6120
+ displayState,
5922
6121
  executionMarker: previous.executionMarker?.kind === 'interrupted' &&
5923
6122
  previous.executionMarker.reason.kind === 'pending_course_start'
5924
6123
  ? undefined
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dominds",
3
- "version": "1.17.4",
3
+ "version": "1.17.5",
4
4
  "description": "Dominds CLI and aggregation shell for the LongRun AI kernel/runtime packages.",
5
5
  "type": "commonjs",
6
6
  "publishConfig": {
@@ -52,9 +52,9 @@
52
52
  "ws": "^8.19.0",
53
53
  "yaml": "^2.8.2",
54
54
  "zod": "^4.3.6",
55
- "@longrun-ai/kernel": "1.9.0",
56
- "@longrun-ai/shell": "1.9.0",
57
- "@longrun-ai/codex-auth": "0.12.1"
55
+ "@longrun-ai/shell": "1.9.1",
56
+ "@longrun-ai/codex-auth": "0.12.1",
57
+ "@longrun-ai/kernel": "1.9.1"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/node": "^25.3.5",
@@ -1,5 +1,5 @@
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-B06twih4.js";
2
- import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index-Cyx7eev_.js";
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-CvZnDuif.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-DN9U1zRL.js";
3
3
  var reWhitespace = /\s/;
4
4
  function trimmedEndIndex(string) {
5
5
  var index = string.length;
@@ -193,4 +193,4 @@ export {
193
193
  map as m,
194
194
  toFinite as t
195
195
  };
196
- //# sourceMappingURL=_basePickBy-CgM-M_q8.js.map
196
+ //# sourceMappingURL=_basePickBy-CpHP1wBo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_basePickBy-CpHP1wBo.js","sources":["../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_trimmedEndIndex.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseTrim.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toNumber.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toFinite.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/toInteger.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/flatten.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/defaults.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/last.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_createFind.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/findIndex.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/find.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseMap.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/map.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/has.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseLt.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseExtremum.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/min.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_basePickBy.js"],"sourcesContent":["/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import toNumber from './toNumber.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import toFinite from './toFinite.js';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\n","import baseFlatten from './_baseFlatten.js';\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nexport default flatten;\n","import baseRest from './_baseRest.js';\nimport eq from './eq.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport keysIn from './keysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nexport default defaults;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\n","import baseIteratee from './_baseIteratee.js';\nimport isArrayLike from './isArrayLike.js';\nimport keys from './keys.js';\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nexport default createFind;\n","import baseFindIndex from './_baseFindIndex.js';\nimport baseIteratee from './_baseIteratee.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nexport default findIndex;\n","import createFind from './_createFind.js';\nimport findIndex from './findIndex.js';\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nexport default find;\n","import baseEach from './_baseEach.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nexport default baseMap;\n","import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nexport default map;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nexport default baseHas;\n","import baseHas from './_baseHas.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nexport default has;\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nexport default baseLt;\n","import isSymbol from './isSymbol.js';\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nexport default baseExtremum;\n","import baseExtremum from './_baseExtremum.js';\nimport baseLt from './_baseLt.js';\nimport identity from './identity.js';\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nexport default min;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseGet from './_baseGet.js';\nimport baseSet from './_baseSet.js';\nimport castPath from './_castPath.js';\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nexport default basePickBy;\n"],"names":["objectProto","hasOwnProperty","collection"],"mappings":";;AACA,IAAI,eAAe;AAUnB,SAAS,gBAAgB,QAAQ;AAC/B,MAAI,QAAQ,OAAO;AAEnB,SAAO,WAAW,aAAa,KAAK,OAAO,OAAO,KAAK,CAAC,GAAG;AAAA,EAAC;AAC5D,SAAO;AACT;ACbA,IAAI,cAAc;AASlB,SAAS,SAAS,QAAQ;AACxB,SAAO,SACH,OAAO,MAAM,GAAG,gBAAgB,MAAM,IAAI,CAAC,EAAE,QAAQ,aAAa,EAAE,IACpE;AACN;ACXA,IAAI,MAAM,IAAI;AAGd,IAAI,aAAa;AAGjB,IAAI,aAAa;AAGjB,IAAI,YAAY;AAGhB,IAAI,eAAe;AAyBnB,SAAS,SAAS,OAAO;AACvB,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,SAAS,KAAK,GAAG;AACnB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,KAAK,GAAG;AACnB,QAAI,QAAQ,OAAO,MAAM,WAAW,aAAa,MAAM,QAAO,IAAK;AACnE,YAAQ,SAAS,KAAK,IAAK,QAAQ,KAAM;AAAA,EAC3C;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,UAAU,IAAI,QAAQ,CAAC;AAAA,EAChC;AACA,UAAQ,SAAS,KAAK;AACtB,MAAI,WAAW,WAAW,KAAK,KAAK;AACpC,SAAQ,YAAY,UAAU,KAAK,KAAK,IACpC,aAAa,MAAM,MAAM,CAAC,GAAG,WAAW,IAAI,CAAC,IAC5C,WAAW,KAAK,KAAK,IAAI,MAAM,CAAC;AACvC;AC1DA,IAAI,WAAW,IAAI,GACf,cAAc;AAyBlB,SAAS,SAAS,OAAO;AACvB,MAAI,CAAC,OAAO;AACV,WAAO,UAAU,IAAI,QAAQ;AAAA,EAC/B;AACA,UAAQ,SAAS,KAAK;AACtB,MAAI,UAAU,YAAY,UAAU,CAAC,UAAU;AAC7C,QAAI,OAAQ,QAAQ,IAAI,KAAK;AAC7B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,UAAU,QAAQ,QAAQ;AACnC;ACXA,SAAS,UAAU,OAAO;AACxB,MAAI,SAAS,SAAS,KAAK,GACvB,YAAY,SAAS;AAEzB,SAAO,WAAW,SAAU,YAAY,SAAS,YAAY,SAAU;AACzE;ACjBA,SAAS,QAAQ,OAAO;AACtB,MAAI,SAAS,SAAS,OAAO,IAAI,MAAM;AACvC,SAAO,SAAS,YAAY,KAAQ,IAAI,CAAA;AAC1C;ACbA,IAAIA,gBAAc,OAAO;AAGzB,IAAIC,mBAAiBD,cAAY;AAuB9B,IAAC,WAAW,SAAS,SAAS,QAAQ,SAAS;AAChD,WAAS,OAAO,MAAM;AAEtB,MAAI,QAAQ;AACZ,MAAI,SAAS,QAAQ;AACrB,MAAI,QAAQ,SAAS,IAAI,QAAQ,CAAC,IAAI;AAEtC,MAAI,SAAS,eAAe,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,KAAK,GAAG;AAC1D,aAAS;AAAA,EACX;AAEA,SAAO,EAAE,QAAQ,QAAQ;AACvB,QAAI,SAAS,QAAQ,KAAK;AAC1B,QAAI,QAAQ,OAAO,MAAM;AACzB,QAAI,aAAa;AACjB,QAAI,cAAc,MAAM;AAExB,WAAO,EAAE,aAAa,aAAa;AACjC,UAAI,MAAM,MAAM,UAAU;AAC1B,UAAI,QAAQ,OAAO,GAAG;AAEtB,UAAI,UAAU,UACT,GAAG,OAAOA,cAAY,GAAG,CAAC,KAAK,CAACC,iBAAe,KAAK,QAAQ,GAAG,GAAI;AACtE,eAAO,GAAG,IAAI,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT,CAAC;AC/CD,SAAS,KAAK,OAAO;AACnB,MAAI,SAAS,SAAS,OAAO,IAAI,MAAM;AACvC,SAAO,SAAS,MAAM,SAAS,CAAC,IAAI;AACtC;ACNA,SAAS,WAAW,eAAe;AACjC,SAAO,SAAS,YAAY,WAAW,WAAW;AAChD,QAAI,WAAW,OAAO,UAAU;AAChC,QAAI,CAAC,YAAY,UAAU,GAAG;AAC5B,UAAI,WAAW,aAAa,SAAY;AACxC,mBAAa,KAAK,UAAU;AAC5B,kBAAY,SAAS,KAAK;AAAE,eAAO,SAAS,SAAS,GAAG,GAAG,KAAK,QAAQ;AAAA,MAAG;AAAA,IAC7E;AACA,QAAI,QAAQ,cAAc,YAAY,WAAW,SAAS;AAC1D,WAAO,QAAQ,KAAK,SAAS,WAAW,WAAW,KAAK,IAAI,KAAK,IAAI;AAAA,EACvE;AACF;ACjBA,IAAI,YAAY,KAAK;AAqCrB,SAAS,UAAU,OAAO,WAAW,WAAW;AAC9C,MAAI,SAAS,SAAS,OAAO,IAAI,MAAM;AACvC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,aAAa,OAAO,IAAI,UAAU,SAAS;AACvD,MAAI,QAAQ,GAAG;AACb,YAAQ,UAAU,SAAS,OAAO,CAAC;AAAA,EACrC;AACA,SAAO,cAAc,OAAO,aAAa,SAAY,GAAG,KAAK;AAC/D;ACbG,IAAC,OAAO,WAAW,SAAS;AC5B/B,SAAS,QAAQ,YAAY,UAAU;AACrC,MAAI,QAAQ,IACR,SAAS,YAAY,UAAU,IAAI,MAAM,WAAW,MAAM,IAAI,CAAA;AAElE,WAAS,YAAY,SAAS,OAAO,KAAKC,aAAY;AACpD,WAAO,EAAE,KAAK,IAAI,SAAS,OAAO,KAAKA,WAAU;AAAA,EACnD,CAAC;AACD,SAAO;AACT;AC4BA,SAAS,IAAI,YAAY,UAAU;AACjC,MAAI,OAAO,QAAQ,UAAU,IAAI,WAAW;AAC5C,SAAO,KAAK,YAAY,aAAa,QAAW,CAAC;AACnD;ACjDA,IAAI,cAAc,OAAO;AAGzB,IAAI,iBAAiB,YAAY;AAUjC,SAAS,QAAQ,QAAQ,KAAK;AAC5B,SAAO,UAAU,QAAQ,eAAe,KAAK,QAAQ,GAAG;AAC1D;ACcA,SAAS,IAAI,QAAQ,MAAM;AACzB,SAAO,UAAU,QAAQ,QAAQ,QAAQ,MAAM,OAAO;AACxD;ACvBA,SAAS,OAAO,OAAO,OAAO;AAC5B,SAAO,QAAQ;AACjB;ACCA,SAAS,aAAa,OAAO,UAAU,YAAY;AACjD,MAAI,QAAQ,IACR,SAAS,MAAM;AAEnB,SAAO,EAAE,QAAQ,QAAQ;AACvB,QAAI,QAAQ,MAAM,KAAK,GACnB,UAAU,SAAS,KAAK;AAE5B,QAAI,WAAW,SAAS,aAAa,SAC5B,YAAY,WAAW,CAAC,SAAS,OAAO,IACzC,WAAW,SAAS,QAAQ,IAC7B;AACL,UAAI,WAAW,SACX,SAAS;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;ACPA,SAAS,IAAI,OAAO;AAClB,SAAQ,SAAS,MAAM,SACnB,aAAa,OAAO,UAAU,MAAM,IACpC;AACN;ACVA,SAAS,QAAQ,QAAQ,MAAM,OAAO,YAAY;AAChD,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,WAAO;AAAA,EACT;AACA,SAAO,SAAS,MAAM,MAAM;AAE5B,MAAI,QAAQ,IACR,SAAS,KAAK,QACd,YAAY,SAAS,GACrB,SAAS;AAEb,SAAO,UAAU,QAAQ,EAAE,QAAQ,QAAQ;AACzC,QAAI,MAAM,MAAM,KAAK,KAAK,CAAC,GACvB,WAAW;AAEf,QAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,aAAa;AACvE,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,WAAW;AACtB,UAAI,WAAW,OAAO,GAAG;AACzB,iBAA4D;AAC5D,UAAI,aAAa,QAAW;AAC1B,mBAAW,SAAS,QAAQ,IACxB,WACC,QAAQ,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAA,IAAK;MACvC;AAAA,IACF;AACA,gBAAY,QAAQ,KAAK,QAAQ;AACjC,aAAS,OAAO,GAAG;AAAA,EACrB;AACA,SAAO;AACT;ACnCA,SAAS,WAAW,QAAQ,OAAO,WAAW;AAC5C,MAAI,QAAQ,IACR,SAAS,MAAM,QACf,SAAS,CAAA;AAEb,SAAO,EAAE,QAAQ,QAAQ;AACvB,QAAI,OAAO,MAAM,KAAK,GAClB,QAAQ,QAAQ,QAAQ,IAAI;AAEhC,QAAI,UAAU,OAAO,IAAI,GAAG;AAC1B,cAAQ,QAAQ,SAAS,MAAM,MAAM,GAAG,KAAK;AAAA,IAC/C;AAAA,EACF;AACA,SAAO;AACT;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]}
@@ -1,4 +1,4 @@
1
- import { bh as isObjectLike, bi as baseGetTag, aZ as isArray, bj as Symbol$1, aY as isArrayLike, bk as arrayLikeKeys, bl as baseKeys, bm as memoize, bn as isArguments, bo as copyObject, aW as keysIn, bp as getPrototype, bq as cloneArrayBuffer, br as cloneTypedArray, bs as getTag, bf as baseUnary, bt as nodeUtil, aU as isObject, bu as copyArray, bv as isBuffer, bw as cloneBuffer, bx as initCloneObject, by as Stack, b0 as assignValue, bz as MapCache, aX as eq, bA as Uint8Array, bB as isTypedArray, bC as isLength, a$ as isIndex, a_ as identity, bd as baseFor, bD as Set } from "./index-Cyx7eev_.js";
1
+ import { be as isObjectLike, bf as baseGetTag, aW as isArray, bg as Symbol$1, aV as isArrayLike, bh as arrayLikeKeys, bi as baseKeys, bj as memoize, bk as isArguments, bl as copyObject, aT as keysIn, bm as getPrototype, bn as cloneArrayBuffer, bo as cloneTypedArray, bp as getTag, bc as baseUnary, bq as nodeUtil, aR as isObject, br as copyArray, bs as isBuffer, bt as cloneBuffer, bu as initCloneObject, bv as Stack, aZ as assignValue, bw as MapCache, aU as eq, bx as Uint8Array, by as isTypedArray, bz as isLength, aY as isIndex, aX as identity, ba as baseFor, bA as Set } from "./index-DN9U1zRL.js";
2
2
  var symbolTag$3 = "[object Symbol]";
3
3
  function isSymbol(value) {
4
4
  return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$3;
@@ -833,4 +833,4 @@ export {
833
833
  baseIndexOf as y,
834
834
  getAllKeysIn as z
835
835
  };
836
- //# sourceMappingURL=_baseUniq-B06twih4.js.map
836
+ //# sourceMappingURL=_baseUniq-CvZnDuif.js.map