dominds 0.6.2 → 0.6.4

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 (149) hide show
  1. package/dist/access-control.js +2 -2
  2. package/dist/agent-priming.js +826 -92
  3. package/dist/cli/read.js +406 -12
  4. package/dist/dialog.js +4 -0
  5. package/dist/docs/design.md +1 -0
  6. package/dist/docs/design.zh.md +1 -0
  7. package/dist/docs/dialog-system.md +12 -7
  8. package/dist/docs/dialog-system.zh.md +7 -3
  9. package/dist/docs/dominds-agent-priming.md +10 -1
  10. package/dist/docs/dominds-agent-priming.zh.md +9 -1
  11. package/dist/docs/dominds-terminology.md +8 -8
  12. package/dist/docs/fbr-implementation.md +77 -0
  13. package/dist/docs/fbr-implementation.zh.md +77 -0
  14. package/dist/docs/fbr.md +142 -141
  15. package/dist/docs/fbr.zh.md +129 -123
  16. package/dist/docs/keep-going.zh.md +162 -0
  17. package/dist/docs/showing-by-doing.md +208 -0
  18. package/dist/docs/showing-by-doing.zh.md +177 -0
  19. package/dist/docs/tellask-collab.md +250 -0
  20. package/dist/docs/tellask-collab.zh.md +254 -0
  21. package/dist/docs/txt-editing-tools.md +2 -2
  22. package/dist/docs/txt-editing-tools.zh.md +2 -2
  23. package/dist/llm/defaults.yaml +82 -4
  24. package/dist/llm/driver.js +280 -104
  25. package/dist/llm/gen/codex.js +49 -2
  26. package/dist/log.js +385 -30
  27. package/dist/mcp/supervisor.js +113 -40
  28. package/dist/minds/builtin/pangu/persona.zh.md +2 -2
  29. package/dist/minds/load.js +49 -284
  30. package/dist/minds/minds-i18n.js +2 -2
  31. package/dist/minds/promptdocs.js +263 -0
  32. package/dist/minds/system-prompt-parts.js +231 -0
  33. package/dist/minds/system-prompt.js +190 -223
  34. package/dist/persistence.js +66 -1
  35. package/dist/server/websocket-handler.js +14 -0
  36. package/dist/shared/diligence.js +40 -6
  37. package/dist/shared/utils/inter-dialog-format.js +3 -5
  38. package/dist/showing-by-doing.js +34 -31
  39. package/dist/snippets/README.en.md +3 -0
  40. package/dist/static/assets/{_baseUniq-C9vbtHF9.js → _baseUniq-C7IpU2Uk.js} +2 -2
  41. package/dist/static/assets/{_baseUniq-C9vbtHF9.js.map → _baseUniq-C7IpU2Uk.js.map} +1 -1
  42. package/dist/static/assets/{arc-hulXG01i.js → arc-1bhQqjON.js} +2 -2
  43. package/dist/static/assets/{arc-hulXG01i.js.map → arc-1bhQqjON.js.map} +1 -1
  44. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js → architectureDiagram-VXUJARFQ-CkEi1QpB.js} +6 -6
  45. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js.map → architectureDiagram-VXUJARFQ-CkEi1QpB.js.map} +1 -1
  46. package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js → blockDiagram-VD42YOAC-DaBQ5-pY.js} +7 -7
  47. package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js.map → blockDiagram-VD42YOAC-DaBQ5-pY.js.map} +1 -1
  48. package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js → c4Diagram-YG6GDRKO-ChUgpgkP.js} +3 -3
  49. package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js.map → c4Diagram-YG6GDRKO-ChUgpgkP.js.map} +1 -1
  50. package/dist/static/assets/{channel-NQehis0Z.js → channel-CxvmwllM.js} +2 -2
  51. package/dist/static/assets/{channel-NQehis0Z.js.map → channel-CxvmwllM.js.map} +1 -1
  52. package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js → chunk-4BX2VUAB-CKsrU2yk.js} +2 -2
  53. package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js.map → chunk-4BX2VUAB-CKsrU2yk.js.map} +1 -1
  54. package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js → chunk-55IACEB6-BAau9SFt.js} +2 -2
  55. package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js.map → chunk-55IACEB6-BAau9SFt.js.map} +1 -1
  56. package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js → chunk-B4BG7PRW--IiJ7W1m.js} +5 -5
  57. package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js.map → chunk-B4BG7PRW--IiJ7W1m.js.map} +1 -1
  58. package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js → chunk-DI55MBZ5-B83KrPQj.js} +4 -4
  59. package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js.map → chunk-DI55MBZ5-B83KrPQj.js.map} +1 -1
  60. package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js → chunk-FMBD7UC4-BlDXzeza.js} +2 -2
  61. package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js.map → chunk-FMBD7UC4-BlDXzeza.js.map} +1 -1
  62. package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js → chunk-QN33PNHL-B596W_v7.js} +2 -2
  63. package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js.map → chunk-QN33PNHL-B596W_v7.js.map} +1 -1
  64. package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js → chunk-QZHKN3VN-UBBCxgBb.js} +2 -2
  65. package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js.map → chunk-QZHKN3VN-UBBCxgBb.js.map} +1 -1
  66. package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js → chunk-TZMSLE5B-D-wCX2wJ.js} +2 -2
  67. package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js.map → chunk-TZMSLE5B-D-wCX2wJ.js.map} +1 -1
  68. package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js → classDiagram-2ON5EDUG-DvtmzPcu.js} +6 -6
  69. package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js.map → classDiagram-2ON5EDUG-DvtmzPcu.js.map} +1 -1
  70. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js → classDiagram-v2-WZHVMYZB-DvtmzPcu.js} +6 -6
  71. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js.map → classDiagram-v2-WZHVMYZB-DvtmzPcu.js.map} +1 -1
  72. package/dist/static/assets/{clone-C6mKvxs5.js → clone-DgJ0ZR-k.js} +2 -2
  73. package/dist/static/assets/{clone-C6mKvxs5.js.map → clone-DgJ0ZR-k.js.map} +1 -1
  74. package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js → cose-bilkent-S5V4N54A-DXMyFQvy.js} +2 -2
  75. package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js.map → cose-bilkent-S5V4N54A-DXMyFQvy.js.map} +1 -1
  76. package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js → dagre-6UL2VRFP-BdaUG-j_.js} +7 -7
  77. package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js.map → dagre-6UL2VRFP-BdaUG-j_.js.map} +1 -1
  78. package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js → diagram-PSM6KHXK-NLiqKBzn.js} +7 -7
  79. package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js.map → diagram-PSM6KHXK-NLiqKBzn.js.map} +1 -1
  80. package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js → diagram-QEK2KX5R-D-0fyvY_.js} +6 -6
  81. package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js.map → diagram-QEK2KX5R-D-0fyvY_.js.map} +1 -1
  82. package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js → diagram-S2PKOQOG-BQ_FU59m.js} +6 -6
  83. package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js.map → diagram-S2PKOQOG-BQ_FU59m.js.map} +1 -1
  84. package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js → erDiagram-Q2GNP2WA-DyftKeuC.js} +5 -5
  85. package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js.map → erDiagram-Q2GNP2WA-DyftKeuC.js.map} +1 -1
  86. package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js → flowDiagram-NV44I4VS-9SGefONA.js} +6 -6
  87. package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js.map → flowDiagram-NV44I4VS-9SGefONA.js.map} +1 -1
  88. package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js → ganttDiagram-JELNMOA3-k_WLhf-r.js} +3 -3
  89. package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js.map → ganttDiagram-JELNMOA3-k_WLhf-r.js.map} +1 -1
  90. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js → gitGraphDiagram-NY62KEGX-3eoLlCOY.js} +7 -7
  91. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js.map → gitGraphDiagram-NY62KEGX-3eoLlCOY.js.map} +1 -1
  92. package/dist/static/assets/{graph-BWoi_FgC.js → graph-vUevIs4s.js} +3 -3
  93. package/dist/static/assets/{graph-BWoi_FgC.js.map → graph-vUevIs4s.js.map} +1 -1
  94. package/dist/static/assets/{index-th_praGg.js → index-BNBG2CE1.js} +399 -68
  95. package/dist/static/assets/index-BNBG2CE1.js.map +1 -0
  96. package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js → infoDiagram-WHAUD3N6-CwEhVxkU.js} +5 -5
  97. package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js.map → infoDiagram-WHAUD3N6-CwEhVxkU.js.map} +1 -1
  98. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js} +5 -5
  99. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js.map → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js.map} +1 -1
  100. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js → kanban-definition-3W4ZIXB7-Bli-AycJ.js} +3 -3
  101. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js.map → kanban-definition-3W4ZIXB7-Bli-AycJ.js.map} +1 -1
  102. package/dist/static/assets/{layout-BPyT310w.js → layout-CGlA8c09.js} +5 -5
  103. package/dist/static/assets/{layout-BPyT310w.js.map → layout-CGlA8c09.js.map} +1 -1
  104. package/dist/static/assets/{linear-xUsVjXWq.js → linear-Da2jDWL3.js} +2 -2
  105. package/dist/static/assets/{linear-xUsVjXWq.js.map → linear-Da2jDWL3.js.map} +1 -1
  106. package/dist/static/assets/{min-xFt7zeOd.js → min-Co741hTV.js} +3 -3
  107. package/dist/static/assets/{min-xFt7zeOd.js.map → min-Co741hTV.js.map} +1 -1
  108. package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js → mindmap-definition-VGOIOE7T-DvkIjoq8.js} +4 -4
  109. package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js.map → mindmap-definition-VGOIOE7T-DvkIjoq8.js.map} +1 -1
  110. package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js → pieDiagram-ADFJNKIX-BGuGhTu8.js} +7 -7
  111. package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js.map → pieDiagram-ADFJNKIX-BGuGhTu8.js.map} +1 -1
  112. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js → quadrantDiagram-AYHSOK5B-DAZcrJMg.js} +3 -3
  113. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js.map → quadrantDiagram-AYHSOK5B-DAZcrJMg.js.map} +1 -1
  114. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js → requirementDiagram-UZGBJVZJ-CXN0DxZs.js} +4 -4
  115. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js.map → requirementDiagram-UZGBJVZJ-CXN0DxZs.js.map} +1 -1
  116. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js → sankeyDiagram-TZEHDZUN-B7-yAePZ.js} +2 -2
  117. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js.map → sankeyDiagram-TZEHDZUN-B7-yAePZ.js.map} +1 -1
  118. package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js → sequenceDiagram-WL72ISMW-DfBNY6h_.js} +4 -4
  119. package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js.map → sequenceDiagram-WL72ISMW-DfBNY6h_.js.map} +1 -1
  120. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js → stateDiagram-FKZM4ZOC-BLo1xRVY.js} +9 -9
  121. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js.map → stateDiagram-FKZM4ZOC-BLo1xRVY.js.map} +1 -1
  122. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js} +5 -5
  123. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js.map → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js.map} +1 -1
  124. package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js → timeline-definition-IT6M3QCI-ySWyBF3b.js} +3 -3
  125. package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js.map → timeline-definition-IT6M3QCI-ySWyBF3b.js.map} +1 -1
  126. package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js → treemap-KMMF4GRG-DOp4sqOh.js} +4 -4
  127. package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js.map → treemap-KMMF4GRG-DOp4sqOh.js.map} +1 -1
  128. package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js → xychartDiagram-PRI3JC2R-vkmh67qb.js} +3 -3
  129. package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js.map → xychartDiagram-PRI3JC2R-vkmh67qb.js.map} +1 -1
  130. package/dist/static/index.html +1 -1
  131. package/dist/team.js +29 -6
  132. package/dist/tool.js +56 -0
  133. package/dist/tools/builtins.js +4 -2
  134. package/dist/tools/context-health.js +7 -7
  135. package/dist/tools/os.js +267 -30
  136. package/dist/tools/pending-tellask-reminder.js +185 -0
  137. package/dist/tools/plan.js +1 -0
  138. package/dist/tools/ripgrep.js +145 -4
  139. package/dist/tools/shell-tools.js +21 -0
  140. package/dist/tools/team-mgmt.js +4 -4
  141. package/dist/tools/toolset-manual.js +74 -0
  142. package/dist/utils/task-doc.js +16 -16
  143. package/package.json +1 -1
  144. package/dist/minds/builtin/cmdr/persona.md +0 -3
  145. package/dist/minds/builtin/dijiang/knowledge.md +0 -287
  146. package/dist/minds/builtin/dijiang/persona.md +0 -7
  147. package/dist/static/assets/index-th_praGg.js.map +0 -1
  148. package/dist/static/testing/dom-observation-utils.js +0 -425
  149. package/dist/static/testing/e2e-test-helper.js +0 -3119
@@ -84,6 +84,43 @@ function funcToolToCodex(funcTool) {
84
84
  parameters,
85
85
  };
86
86
  }
87
+ function resolveCodexWebSearchMode(agent) {
88
+ const codexParams = agent.model_params?.codex ?? agent.model_params?.openai;
89
+ return codexParams?.web_search ?? 'live';
90
+ }
91
+ function buildCodexNativeTools(agent) {
92
+ const webSearchMode = resolveCodexWebSearchMode(agent);
93
+ if (webSearchMode === 'disabled')
94
+ return [];
95
+ const webSearchTool = {
96
+ type: 'web_search',
97
+ external_web_access: webSearchMode === 'live',
98
+ };
99
+ return [webSearchTool];
100
+ }
101
+ function assertNoCodexNativeToolCollisions(funcTools, nativeTools) {
102
+ const names = new Set();
103
+ for (const t of funcTools) {
104
+ names.add(t.name);
105
+ }
106
+ for (const nativeTool of nativeTools) {
107
+ if (nativeTool.type !== 'web_search' && nativeTool.type !== 'local_shell') {
108
+ continue;
109
+ }
110
+ const nativeName = nativeTool.type;
111
+ if (names.has(nativeName)) {
112
+ throw new Error(`Codex native tool name collision: function tool '${nativeName}' conflicts with native '${nativeName}' tool.`);
113
+ }
114
+ }
115
+ }
116
+ function toLlmWebSearchCall(item, phase) {
117
+ return {
118
+ phase,
119
+ itemId: item.id,
120
+ status: item.status,
121
+ action: item.action,
122
+ };
123
+ }
87
124
  function messageItem(role, text) {
88
125
  const contentType = role === 'assistant' ? 'output_text' : 'input_text';
89
126
  return {
@@ -291,11 +328,14 @@ async function buildCodexRequest(agent, instructions, assistantPrelude, funcTool
291
328
  verbosity: codexParams.verbosity,
292
329
  };
293
330
  }
331
+ const nativeTools = buildCodexNativeTools(agent);
332
+ assertNoCodexNativeToolCollisions(funcTools, nativeTools);
333
+ const tools = [...funcTools.map(funcToolToCodex), ...nativeTools];
294
334
  return {
295
335
  model: agent.model,
296
336
  instructions,
297
337
  input,
298
- tools: funcTools.map(funcToolToCodex),
338
+ tools,
299
339
  tool_choice: 'auto',
300
340
  parallel_tool_calls: parallelToolCalls,
301
341
  reasoning,
@@ -455,6 +495,9 @@ class CodexGen {
455
495
  return;
456
496
  }
457
497
  case 'response.output_item.added':
498
+ if (event.item.type === 'web_search_call' && receiver.webSearchCall) {
499
+ await receiver.webSearchCall(toLlmWebSearchCall(event.item, 'added'));
500
+ }
458
501
  return;
459
502
  case 'response.output_item.done': {
460
503
  switch (event.item.type) {
@@ -511,11 +554,15 @@ class CodexGen {
511
554
  case 'function_call_output':
512
555
  case 'custom_tool_call':
513
556
  case 'custom_tool_call_output':
514
- case 'web_search_call':
515
557
  case 'ghost_snapshot':
516
558
  case 'compaction':
517
559
  case 'compaction_summary':
518
560
  return;
561
+ case 'web_search_call':
562
+ if (receiver.webSearchCall) {
563
+ await receiver.webSearchCall(toLlmWebSearchCall(event.item, 'done'));
564
+ }
565
+ return;
519
566
  default: {
520
567
  const _exhaustive = event.item;
521
568
  return _exhaustive;
package/dist/log.js CHANGED
@@ -17,6 +17,299 @@ const levelPriority = {
17
17
  warn: 30,
18
18
  error: 40,
19
19
  };
20
+ const MAX_LOG_LINE_CHARS = 3 * 1024;
21
+ const DETAIL_FALLBACK_BUDGET_CHARS = 512;
22
+ const DETAIL_MIN_BUDGET_CHARS = 48;
23
+ const DETAIL_INSPECT_PROFILES = [
24
+ {
25
+ maxDepth: 6,
26
+ maxObjectKeys: 120,
27
+ maxArrayItems: 160,
28
+ maxMapEntries: 80,
29
+ maxSetEntries: 80,
30
+ maxStringLength: 2048,
31
+ },
32
+ {
33
+ maxDepth: 5,
34
+ maxObjectKeys: 80,
35
+ maxArrayItems: 100,
36
+ maxMapEntries: 40,
37
+ maxSetEntries: 40,
38
+ maxStringLength: 1536,
39
+ },
40
+ {
41
+ maxDepth: 4,
42
+ maxObjectKeys: 50,
43
+ maxArrayItems: 60,
44
+ maxMapEntries: 24,
45
+ maxSetEntries: 24,
46
+ maxStringLength: 1024,
47
+ },
48
+ {
49
+ maxDepth: 3,
50
+ maxObjectKeys: 24,
51
+ maxArrayItems: 30,
52
+ maxMapEntries: 12,
53
+ maxSetEntries: 12,
54
+ maxStringLength: 768,
55
+ },
56
+ {
57
+ maxDepth: 2,
58
+ maxObjectKeys: 12,
59
+ maxArrayItems: 12,
60
+ maxMapEntries: 8,
61
+ maxSetEntries: 8,
62
+ maxStringLength: 512,
63
+ },
64
+ {
65
+ maxDepth: 1,
66
+ maxObjectKeys: 6,
67
+ maxArrayItems: 6,
68
+ maxMapEntries: 4,
69
+ maxSetEntries: 4,
70
+ maxStringLength: 320,
71
+ },
72
+ {
73
+ maxDepth: 0,
74
+ maxObjectKeys: 3,
75
+ maxArrayItems: 3,
76
+ maxMapEntries: 2,
77
+ maxSetEntries: 2,
78
+ maxStringLength: 192,
79
+ },
80
+ ];
81
+ function truncateText(value, maxChars, suffix) {
82
+ if (maxChars <= 0) {
83
+ return { text: '', truncated: value.length > 0 };
84
+ }
85
+ if (value.length <= maxChars) {
86
+ return { text: value, truncated: false };
87
+ }
88
+ const rawSuffix = typeof suffix === 'string' && suffix.trim() !== ''
89
+ ? suffix
90
+ : `...[truncated ${value.length - maxChars} chars]`;
91
+ if (rawSuffix.length >= maxChars) {
92
+ return { text: rawSuffix.slice(0, maxChars), truncated: true };
93
+ }
94
+ const keepLen = maxChars - rawSuffix.length;
95
+ return {
96
+ text: `${value.slice(0, keepLen)}${rawSuffix}`,
97
+ truncated: true,
98
+ };
99
+ }
100
+ function appendSignalWithinBudget(value, signal, maxChars) {
101
+ if (maxChars <= 0)
102
+ return '';
103
+ if (signal.length >= maxChars)
104
+ return signal.slice(0, maxChars);
105
+ if (value.length + signal.length <= maxChars)
106
+ return `${value}${signal}`;
107
+ const keepLen = maxChars - signal.length;
108
+ return `${value.slice(0, keepLen)}${signal}`;
109
+ }
110
+ function getConstructorName(value) {
111
+ const candidate = value.constructor;
112
+ if (typeof candidate === 'function') {
113
+ const named = candidate;
114
+ if (typeof named.name === 'string' && named.name.trim() !== '') {
115
+ return named.name;
116
+ }
117
+ }
118
+ return 'Object';
119
+ }
120
+ function isDateLike(value) {
121
+ return value instanceof Date;
122
+ }
123
+ function isRegExpLike(value) {
124
+ return value instanceof RegExp;
125
+ }
126
+ function isErrorLike(value) {
127
+ return value instanceof Error;
128
+ }
129
+ function pruneForLog(value, profile, depth, seen) {
130
+ if (typeof value === 'string') {
131
+ const truncated = truncateText(value, profile.maxStringLength);
132
+ return { value: truncated.text, pruned: truncated.truncated };
133
+ }
134
+ if (value === null ||
135
+ value === undefined ||
136
+ typeof value === 'number' ||
137
+ typeof value === 'boolean' ||
138
+ typeof value === 'bigint' ||
139
+ typeof value === 'symbol') {
140
+ return { value, pruned: false };
141
+ }
142
+ if (typeof value === 'function') {
143
+ const fnName = value.name && value.name.trim() !== '' ? value.name : 'anonymous';
144
+ return { value: `[Function ${fnName}]`, pruned: false };
145
+ }
146
+ if (isDateLike(value) || isRegExpLike(value)) {
147
+ return { value, pruned: false };
148
+ }
149
+ if (isErrorLike(value)) {
150
+ const name = typeof value.name === 'string' ? value.name : 'Error';
151
+ const msg = typeof value.message === 'string' ? value.message : '';
152
+ const stack = typeof value.stack === 'string' ? value.stack : '';
153
+ const msgShort = truncateText(msg, profile.maxStringLength);
154
+ const stackShort = truncateText(stack, profile.maxStringLength);
155
+ const reduced = {
156
+ name,
157
+ message: msgShort.text,
158
+ };
159
+ if (stackShort.text.trim() !== '') {
160
+ reduced.stack = stackShort.text;
161
+ }
162
+ return { value: reduced, pruned: msgShort.truncated || stackShort.truncated };
163
+ }
164
+ if (typeof value !== 'object') {
165
+ return { value, pruned: false };
166
+ }
167
+ if (seen.has(value)) {
168
+ return { value: '[Circular]', pruned: true };
169
+ }
170
+ if (depth >= profile.maxDepth) {
171
+ const ctorName = getConstructorName(value);
172
+ return { value: `[${ctorName} depth limit reached]`, pruned: true };
173
+ }
174
+ seen.add(value);
175
+ try {
176
+ if (Array.isArray(value)) {
177
+ const out = [];
178
+ let pruned = false;
179
+ const limit = Math.max(0, profile.maxArrayItems);
180
+ const visibleCount = Math.min(value.length, limit);
181
+ for (let i = 0; i < visibleCount; i++) {
182
+ const child = pruneForLog(value[i], profile, depth + 1, seen);
183
+ out.push(child.value);
184
+ pruned = pruned || child.pruned;
185
+ }
186
+ if (value.length > visibleCount) {
187
+ out.push(`[+${value.length - visibleCount} more item(s)]`);
188
+ pruned = true;
189
+ }
190
+ return { value: out, pruned };
191
+ }
192
+ if (value instanceof Map) {
193
+ const entries = [];
194
+ let pruned = false;
195
+ let index = 0;
196
+ for (const [mapKey, mapValue] of value.entries()) {
197
+ if (index >= profile.maxMapEntries) {
198
+ break;
199
+ }
200
+ const keyPruned = pruneForLog(mapKey, profile, depth + 1, seen);
201
+ const valuePruned = pruneForLog(mapValue, profile, depth + 1, seen);
202
+ entries.push([keyPruned.value, valuePruned.value]);
203
+ pruned = pruned || keyPruned.pruned || valuePruned.pruned;
204
+ index++;
205
+ }
206
+ const reduced = {
207
+ __type__: 'Map',
208
+ size: value.size,
209
+ entries,
210
+ };
211
+ if (value.size > entries.length) {
212
+ reduced.__omittedEntries__ = value.size - entries.length;
213
+ pruned = true;
214
+ }
215
+ return { value: reduced, pruned };
216
+ }
217
+ if (value instanceof Set) {
218
+ const entries = [];
219
+ let pruned = false;
220
+ let index = 0;
221
+ for (const setValue of value.values()) {
222
+ if (index >= profile.maxSetEntries) {
223
+ break;
224
+ }
225
+ const valuePruned = pruneForLog(setValue, profile, depth + 1, seen);
226
+ entries.push(valuePruned.value);
227
+ pruned = pruned || valuePruned.pruned;
228
+ index++;
229
+ }
230
+ const reduced = {
231
+ __type__: 'Set',
232
+ size: value.size,
233
+ values: entries,
234
+ };
235
+ if (value.size > entries.length) {
236
+ reduced.__omittedEntries__ = value.size - entries.length;
237
+ pruned = true;
238
+ }
239
+ return { value: reduced, pruned };
240
+ }
241
+ if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {
242
+ if (value instanceof ArrayBuffer) {
243
+ return { value: `[ArrayBuffer byteLength=${value.byteLength}]`, pruned: true };
244
+ }
245
+ const typed = value;
246
+ const byteLen = typeof typed.byteLength === 'number' ? typed.byteLength : 0;
247
+ const ctorName = getConstructorName(value);
248
+ return { value: `[${ctorName} byteLength=${byteLen}]`, pruned: true };
249
+ }
250
+ const source = value;
251
+ const allKeys = Object.keys(source).sort();
252
+ const visibleKeys = allKeys.slice(0, profile.maxObjectKeys);
253
+ const ctorName = getConstructorName(value);
254
+ const reduced = {};
255
+ let pruned = false;
256
+ if (ctorName !== 'Object') {
257
+ reduced.__class__ = ctorName;
258
+ }
259
+ for (const key of visibleKeys) {
260
+ const child = pruneForLog(source[key], profile, depth + 1, seen);
261
+ reduced[key] = child.value;
262
+ pruned = pruned || child.pruned;
263
+ }
264
+ if (allKeys.length > visibleKeys.length) {
265
+ reduced.__omittedKeys__ = allKeys.length - visibleKeys.length;
266
+ pruned = true;
267
+ }
268
+ return { value: reduced, pruned };
269
+ }
270
+ finally {
271
+ seen.delete(value);
272
+ }
273
+ }
274
+ function inspectAdaptive(value, maxChars) {
275
+ if (maxChars <= 0) {
276
+ return { text: '', truncated: true };
277
+ }
278
+ if (typeof value === 'string') {
279
+ return truncateText(value, maxChars);
280
+ }
281
+ let fallback = '';
282
+ for (let idx = 0; idx < DETAIL_INSPECT_PROFILES.length; idx++) {
283
+ const profile = DETAIL_INSPECT_PROFILES[idx];
284
+ const pruned = pruneForLog(value, profile, 0, new WeakSet());
285
+ const rendered = (0, util_1.inspect)(pruned.value, {
286
+ depth: null,
287
+ breakLength: 120,
288
+ compact: false,
289
+ sorted: true,
290
+ maxArrayLength: profile.maxArrayItems,
291
+ maxStringLength: profile.maxStringLength,
292
+ });
293
+ const reducedByProfile = idx > 0 || pruned.pruned;
294
+ const signal = reducedByProfile
295
+ ? ` [details_reduced depth<=${profile.maxDepth}, keys<=${profile.maxObjectKeys}, items<=${profile.maxArrayItems}]`
296
+ : '';
297
+ if (signal === '') {
298
+ if (rendered.length <= maxChars) {
299
+ return { text: rendered, truncated: false };
300
+ }
301
+ fallback = rendered;
302
+ continue;
303
+ }
304
+ const signaledLen = rendered.length + signal.length;
305
+ if (signaledLen <= maxChars) {
306
+ return { text: `${rendered}${signal}`, truncated: true };
307
+ }
308
+ fallback = `${rendered}${signal}`;
309
+ }
310
+ const hard = truncateText(fallback, maxChars, `...[details_truncated >${maxChars} chars after adaptive inspect]`);
311
+ return { text: hard.text, truncated: true };
312
+ }
20
313
  function resolveDefaultLevel() {
21
314
  const envLevel = (process.env.DOMINDS_LOG_LEVEL || '').toLowerCase();
22
315
  if (envLevel && envLevel in levelPriority) {
@@ -37,7 +330,7 @@ function nowTsStr() {
37
330
  function inspectValue(value) {
38
331
  if (typeof value === 'string')
39
332
  return value;
40
- return (0, util_1.inspect)(value, { depth: 5, breakLength: 120, compact: false, sorted: true });
333
+ return inspectAdaptive(value, DETAIL_FALLBACK_BUDGET_CHARS).text;
41
334
  }
42
335
  function extractErrorDetails(error) {
43
336
  if (!error)
@@ -129,7 +422,6 @@ class Logger {
129
422
  }
130
423
  formatRecord(level, message, error, extraData = []) {
131
424
  const timestamp = nowTsStr();
132
- const extraEntries = extraData.map((value) => inspectValue(value));
133
425
  const record = {
134
426
  timestamp,
135
427
  level,
@@ -145,45 +437,108 @@ class Logger {
145
437
  if (error !== undefined && error !== null) {
146
438
  record.error = extractErrorDetails(error);
147
439
  }
148
- if (extraEntries.length > 0) {
149
- record.extra = extraEntries;
440
+ if (extraData.length > 0) {
441
+ record.extra = [...extraData];
150
442
  }
151
443
  return record;
152
444
  }
153
- formatLine(record) {
154
- let errorText = '';
155
- if (record.error) {
156
- const { name, message, stack } = record.error;
157
- if (stack) {
158
- // When an error object is passed, show only the stack trace to avoid duplication
159
- // The log message should already contain the error description
160
- errorText = `\n${stack}`;
445
+ formatErrorText(error, maxChars) {
446
+ if (maxChars <= 0) {
447
+ return { text: '', truncated: true };
448
+ }
449
+ if (error.stack) {
450
+ if (maxChars <= 1) {
451
+ return { text: '\n'.slice(0, maxChars), truncated: true };
161
452
  }
162
- else if (message) {
163
- // Fallback for error objects without stack
164
- if (name && message !== name) {
165
- errorText = ` Error: ${name}: ${message}`;
166
- }
167
- else {
168
- errorText = ` Error: ${message}`;
169
- }
453
+ const rendered = inspectAdaptive(error.stack, maxChars - 1);
454
+ return {
455
+ text: `\n${rendered.text}`,
456
+ truncated: rendered.truncated,
457
+ };
458
+ }
459
+ if (error.message) {
460
+ const head = ' Error: ';
461
+ if (maxChars <= head.length) {
462
+ return { text: truncateText(head, maxChars).text, truncated: true };
170
463
  }
171
- else {
172
- // Fallback to inspect for complex error objects
173
- errorText = ` Error: ${inspectValue(record.error)}`;
464
+ const plain = error.name && error.message !== error.name
465
+ ? `${error.name}: ${error.message}`
466
+ : error.message;
467
+ const rendered = inspectAdaptive(plain, maxChars - head.length);
468
+ return {
469
+ text: `${head}${rendered.text}`,
470
+ truncated: rendered.truncated,
471
+ };
472
+ }
473
+ const head = ' Error: ';
474
+ if (maxChars <= head.length) {
475
+ return { text: truncateText(head, maxChars).text, truncated: true };
476
+ }
477
+ const rendered = inspectAdaptive(error, maxChars - head.length);
478
+ return {
479
+ text: `${head}${rendered.text}`,
480
+ truncated: rendered.truncated,
481
+ };
482
+ }
483
+ formatExtraText(extra, maxChars) {
484
+ if (maxChars <= 0) {
485
+ return '';
486
+ }
487
+ const head = ' Extra: ';
488
+ if (maxChars <= head.length) {
489
+ return truncateText(head, maxChars).text;
490
+ }
491
+ let remaining = maxChars - head.length;
492
+ let renderedEntries = '';
493
+ let usedCount = 0;
494
+ let reduced = false;
495
+ for (let i = 0; i < extra.length; i++) {
496
+ const separator = i === 0 ? '' : '; ';
497
+ if (remaining <= separator.length + 1) {
498
+ reduced = true;
499
+ break;
174
500
  }
501
+ const entriesLeft = extra.length - i;
502
+ const softBudget = Math.max(DETAIL_MIN_BUDGET_CHARS, Math.floor((remaining - separator.length) / entriesLeft));
503
+ const entryBudget = Math.max(1, Math.min(remaining - separator.length, softBudget));
504
+ const rendered = inspectAdaptive(extra[i], entryBudget);
505
+ renderedEntries += `${separator}${rendered.text}`;
506
+ remaining -= separator.length + rendered.text.length;
507
+ usedCount++;
508
+ reduced = reduced || rendered.truncated;
175
509
  }
176
- const extraText = record.extra && record.extra.length > 0
177
- ? ` Extra: ${record.extra.map((entry) => inspectValue(entry)).join('; ')}`
178
- : '';
510
+ if (usedCount < extra.length) {
511
+ reduced = true;
512
+ }
513
+ if (reduced) {
514
+ const omittedItems = Math.max(0, extra.length - usedCount);
515
+ const signal = omittedItems > 0 ? ` [extra_truncated omitted_items=${omittedItems}]` : ' [extra_reduced]';
516
+ renderedEntries = appendSignalWithinBudget(renderedEntries, signal, maxChars - head.length);
517
+ }
518
+ return `${head}${renderedEntries}`;
519
+ }
520
+ formatLine(record) {
521
+ let contentPrefix = '';
179
522
  if (record.location) {
180
- const prefix = `[${record.timestamp}] ${record.tag ? `[${record.tag}] ` : ''}${record.level.toUpperCase()}\n @ ${stripPkgPrefix(record.location.file)}:${record.location.line}:${record.location.column}`;
181
- return `${prefix}\n${record.message}${errorText}${extraText}`;
523
+ contentPrefix = `[${record.timestamp}] ${record.tag ? `[${record.tag}] ` : ''}${record.level.toUpperCase()}\n @ ${stripPkgPrefix(record.location.file)}:${record.location.line}:${record.location.column}\n${record.message}`;
182
524
  }
183
525
  else {
184
- const prefix = `[${record.timestamp}] ${record.tag ? `[${record.tag}] ` : ''}${record.level.toUpperCase()}:`;
185
- return `${prefix} ${record.message}${errorText}${extraText}`;
526
+ contentPrefix = `[${record.timestamp}] ${record.tag ? `[${record.tag}] ` : ''}${record.level.toUpperCase()}: ${record.message}`;
527
+ }
528
+ let line = contentPrefix;
529
+ if (record.error) {
530
+ const maxForError = Math.max(0, MAX_LOG_LINE_CHARS - line.length);
531
+ const renderedError = this.formatErrorText(record.error, maxForError);
532
+ line += renderedError.text;
533
+ }
534
+ if (record.extra && record.extra.length > 0) {
535
+ const maxForExtra = Math.max(0, MAX_LOG_LINE_CHARS - line.length);
536
+ line += this.formatExtraText(record.extra, maxForExtra);
537
+ }
538
+ if (line.length > MAX_LOG_LINE_CHARS) {
539
+ return appendSignalWithinBudget(line, `...[log_line_truncated limit=${MAX_LOG_LINE_CHARS}]`, MAX_LOG_LINE_CHARS);
186
540
  }
541
+ return line;
187
542
  }
188
543
  log(level, message, error, ...extraData) {
189
544
  if (!this.shouldLog(level))