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.
- package/dist/access-control.js +2 -2
- package/dist/agent-priming.js +826 -92
- package/dist/cli/read.js +406 -12
- package/dist/dialog.js +4 -0
- package/dist/docs/design.md +1 -0
- package/dist/docs/design.zh.md +1 -0
- package/dist/docs/dialog-system.md +12 -7
- package/dist/docs/dialog-system.zh.md +7 -3
- package/dist/docs/dominds-agent-priming.md +10 -1
- package/dist/docs/dominds-agent-priming.zh.md +9 -1
- package/dist/docs/dominds-terminology.md +8 -8
- package/dist/docs/fbr-implementation.md +77 -0
- package/dist/docs/fbr-implementation.zh.md +77 -0
- package/dist/docs/fbr.md +142 -141
- package/dist/docs/fbr.zh.md +129 -123
- package/dist/docs/keep-going.zh.md +162 -0
- package/dist/docs/showing-by-doing.md +208 -0
- package/dist/docs/showing-by-doing.zh.md +177 -0
- package/dist/docs/tellask-collab.md +250 -0
- package/dist/docs/tellask-collab.zh.md +254 -0
- package/dist/docs/txt-editing-tools.md +2 -2
- package/dist/docs/txt-editing-tools.zh.md +2 -2
- package/dist/llm/defaults.yaml +82 -4
- package/dist/llm/driver.js +280 -104
- package/dist/llm/gen/codex.js +49 -2
- package/dist/log.js +385 -30
- package/dist/mcp/supervisor.js +113 -40
- package/dist/minds/builtin/pangu/persona.zh.md +2 -2
- package/dist/minds/load.js +49 -284
- package/dist/minds/minds-i18n.js +2 -2
- package/dist/minds/promptdocs.js +263 -0
- package/dist/minds/system-prompt-parts.js +231 -0
- package/dist/minds/system-prompt.js +190 -223
- package/dist/persistence.js +66 -1
- package/dist/server/websocket-handler.js +14 -0
- package/dist/shared/diligence.js +40 -6
- package/dist/shared/utils/inter-dialog-format.js +3 -5
- package/dist/showing-by-doing.js +34 -31
- package/dist/snippets/README.en.md +3 -0
- package/dist/static/assets/{_baseUniq-C9vbtHF9.js → _baseUniq-C7IpU2Uk.js} +2 -2
- package/dist/static/assets/{_baseUniq-C9vbtHF9.js.map → _baseUniq-C7IpU2Uk.js.map} +1 -1
- package/dist/static/assets/{arc-hulXG01i.js → arc-1bhQqjON.js} +2 -2
- package/dist/static/assets/{arc-hulXG01i.js.map → arc-1bhQqjON.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js → architectureDiagram-VXUJARFQ-CkEi1QpB.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js.map → architectureDiagram-VXUJARFQ-CkEi1QpB.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js → blockDiagram-VD42YOAC-DaBQ5-pY.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js.map → blockDiagram-VD42YOAC-DaBQ5-pY.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js → c4Diagram-YG6GDRKO-ChUgpgkP.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js.map → c4Diagram-YG6GDRKO-ChUgpgkP.js.map} +1 -1
- package/dist/static/assets/{channel-NQehis0Z.js → channel-CxvmwllM.js} +2 -2
- package/dist/static/assets/{channel-NQehis0Z.js.map → channel-CxvmwllM.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js → chunk-4BX2VUAB-CKsrU2yk.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js.map → chunk-4BX2VUAB-CKsrU2yk.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js → chunk-55IACEB6-BAau9SFt.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js.map → chunk-55IACEB6-BAau9SFt.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js → chunk-B4BG7PRW--IiJ7W1m.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js.map → chunk-B4BG7PRW--IiJ7W1m.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js → chunk-DI55MBZ5-B83KrPQj.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js.map → chunk-DI55MBZ5-B83KrPQj.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js → chunk-FMBD7UC4-BlDXzeza.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js.map → chunk-FMBD7UC4-BlDXzeza.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js → chunk-QN33PNHL-B596W_v7.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js.map → chunk-QN33PNHL-B596W_v7.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js → chunk-QZHKN3VN-UBBCxgBb.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js.map → chunk-QZHKN3VN-UBBCxgBb.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js → chunk-TZMSLE5B-D-wCX2wJ.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js.map → chunk-TZMSLE5B-D-wCX2wJ.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js → classDiagram-2ON5EDUG-DvtmzPcu.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js.map → classDiagram-2ON5EDUG-DvtmzPcu.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js → classDiagram-v2-WZHVMYZB-DvtmzPcu.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js.map → classDiagram-v2-WZHVMYZB-DvtmzPcu.js.map} +1 -1
- package/dist/static/assets/{clone-C6mKvxs5.js → clone-DgJ0ZR-k.js} +2 -2
- package/dist/static/assets/{clone-C6mKvxs5.js.map → clone-DgJ0ZR-k.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js → cose-bilkent-S5V4N54A-DXMyFQvy.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js.map → cose-bilkent-S5V4N54A-DXMyFQvy.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js → dagre-6UL2VRFP-BdaUG-j_.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js.map → dagre-6UL2VRFP-BdaUG-j_.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js → diagram-PSM6KHXK-NLiqKBzn.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js.map → diagram-PSM6KHXK-NLiqKBzn.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js → diagram-QEK2KX5R-D-0fyvY_.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js.map → diagram-QEK2KX5R-D-0fyvY_.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js → diagram-S2PKOQOG-BQ_FU59m.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js.map → diagram-S2PKOQOG-BQ_FU59m.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js → erDiagram-Q2GNP2WA-DyftKeuC.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js.map → erDiagram-Q2GNP2WA-DyftKeuC.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js → flowDiagram-NV44I4VS-9SGefONA.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js.map → flowDiagram-NV44I4VS-9SGefONA.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js → ganttDiagram-JELNMOA3-k_WLhf-r.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js.map → ganttDiagram-JELNMOA3-k_WLhf-r.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js → gitGraphDiagram-NY62KEGX-3eoLlCOY.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js.map → gitGraphDiagram-NY62KEGX-3eoLlCOY.js.map} +1 -1
- package/dist/static/assets/{graph-BWoi_FgC.js → graph-vUevIs4s.js} +3 -3
- package/dist/static/assets/{graph-BWoi_FgC.js.map → graph-vUevIs4s.js.map} +1 -1
- package/dist/static/assets/{index-th_praGg.js → index-BNBG2CE1.js} +399 -68
- package/dist/static/assets/index-BNBG2CE1.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js → infoDiagram-WHAUD3N6-CwEhVxkU.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js.map → infoDiagram-WHAUD3N6-CwEhVxkU.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js.map → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js → kanban-definition-3W4ZIXB7-Bli-AycJ.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js.map → kanban-definition-3W4ZIXB7-Bli-AycJ.js.map} +1 -1
- package/dist/static/assets/{layout-BPyT310w.js → layout-CGlA8c09.js} +5 -5
- package/dist/static/assets/{layout-BPyT310w.js.map → layout-CGlA8c09.js.map} +1 -1
- package/dist/static/assets/{linear-xUsVjXWq.js → linear-Da2jDWL3.js} +2 -2
- package/dist/static/assets/{linear-xUsVjXWq.js.map → linear-Da2jDWL3.js.map} +1 -1
- package/dist/static/assets/{min-xFt7zeOd.js → min-Co741hTV.js} +3 -3
- package/dist/static/assets/{min-xFt7zeOd.js.map → min-Co741hTV.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js → mindmap-definition-VGOIOE7T-DvkIjoq8.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js.map → mindmap-definition-VGOIOE7T-DvkIjoq8.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js → pieDiagram-ADFJNKIX-BGuGhTu8.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js.map → pieDiagram-ADFJNKIX-BGuGhTu8.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js → quadrantDiagram-AYHSOK5B-DAZcrJMg.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js.map → quadrantDiagram-AYHSOK5B-DAZcrJMg.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js → requirementDiagram-UZGBJVZJ-CXN0DxZs.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js.map → requirementDiagram-UZGBJVZJ-CXN0DxZs.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js → sankeyDiagram-TZEHDZUN-B7-yAePZ.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js.map → sankeyDiagram-TZEHDZUN-B7-yAePZ.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js → sequenceDiagram-WL72ISMW-DfBNY6h_.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js.map → sequenceDiagram-WL72ISMW-DfBNY6h_.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js → stateDiagram-FKZM4ZOC-BLo1xRVY.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js.map → stateDiagram-FKZM4ZOC-BLo1xRVY.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js.map → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js → timeline-definition-IT6M3QCI-ySWyBF3b.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js.map → timeline-definition-IT6M3QCI-ySWyBF3b.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js → treemap-KMMF4GRG-DOp4sqOh.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js.map → treemap-KMMF4GRG-DOp4sqOh.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js → xychartDiagram-PRI3JC2R-vkmh67qb.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js.map → xychartDiagram-PRI3JC2R-vkmh67qb.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/team.js +29 -6
- package/dist/tool.js +56 -0
- package/dist/tools/builtins.js +4 -2
- package/dist/tools/context-health.js +7 -7
- package/dist/tools/os.js +267 -30
- package/dist/tools/pending-tellask-reminder.js +185 -0
- package/dist/tools/plan.js +1 -0
- package/dist/tools/ripgrep.js +145 -4
- package/dist/tools/shell-tools.js +21 -0
- package/dist/tools/team-mgmt.js +4 -4
- package/dist/tools/toolset-manual.js +74 -0
- package/dist/utils/task-doc.js +16 -16
- package/package.json +1 -1
- package/dist/minds/builtin/cmdr/persona.md +0 -3
- package/dist/minds/builtin/dijiang/knowledge.md +0 -287
- package/dist/minds/builtin/dijiang/persona.md +0 -7
- package/dist/static/assets/index-th_praGg.js.map +0 -1
- package/dist/static/testing/dom-observation-utils.js +0 -425
- package/dist/static/testing/e2e-test-helper.js +0 -3119
package/dist/llm/gen/codex.js
CHANGED
|
@@ -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
|
|
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 (
|
|
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 (
|
|
149
|
-
record.extra =
|
|
440
|
+
if (extraData.length > 0) {
|
|
441
|
+
record.extra = [...extraData];
|
|
150
442
|
}
|
|
151
443
|
return record;
|
|
152
444
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
177
|
-
|
|
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
|
-
|
|
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
|
-
|
|
185
|
-
|
|
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))
|