@agentdeck/shared 0.1.0 → 0.2.3
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/LICENSE +21 -0
- package/dist/adapter.d.ts +18 -3
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +62 -0
- package/dist/adapter.js.map +1 -1
- package/dist/command-builders.d.ts +35 -0
- package/dist/command-builders.d.ts.map +1 -0
- package/dist/command-builders.js +75 -0
- package/dist/command-builders.js.map +1 -0
- package/dist/connection-status.d.ts +42 -0
- package/dist/connection-status.d.ts.map +1 -0
- package/dist/connection-status.js +52 -0
- package/dist/connection-status.js.map +1 -0
- package/dist/d200h-layout.d.ts +131 -0
- package/dist/d200h-layout.d.ts.map +1 -0
- package/dist/d200h-layout.js +627 -0
- package/dist/d200h-layout.js.map +1 -0
- package/dist/design-tokens.d.ts +259 -0
- package/dist/design-tokens.d.ts.map +1 -0
- package/dist/design-tokens.js +156 -0
- package/dist/design-tokens.js.map +1 -0
- package/dist/eval-schema.d.ts +235 -0
- package/dist/eval-schema.d.ts.map +1 -0
- package/dist/eval-schema.js +23 -0
- package/dist/eval-schema.js.map +1 -0
- package/dist/format-utils.d.ts +52 -0
- package/dist/format-utils.d.ts.map +1 -0
- package/dist/format-utils.js +165 -0
- package/dist/format-utils.js.map +1 -0
- package/dist/gateway-protocol.d.ts +391 -0
- package/dist/gateway-protocol.d.ts.map +1 -0
- package/dist/gateway-protocol.js +19 -0
- package/dist/gateway-protocol.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/llm-settings.d.ts +52 -0
- package/dist/llm-settings.d.ts.map +1 -0
- package/dist/llm-settings.js +118 -0
- package/dist/llm-settings.js.map +1 -0
- package/dist/net-utils.d.ts +2 -1
- package/dist/net-utils.d.ts.map +1 -1
- package/dist/net-utils.js +100 -3
- package/dist/net-utils.js.map +1 -1
- package/dist/pricing.d.ts +45 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +93 -0
- package/dist/pricing.js.map +1 -0
- package/dist/protocol.d.ts +496 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +30 -1
- package/dist/protocol.js.map +1 -1
- package/dist/sample.d.ts +152 -0
- package/dist/sample.d.ts.map +1 -0
- package/dist/sample.js +22 -0
- package/dist/sample.js.map +1 -0
- package/dist/session-utils.d.ts +142 -0
- package/dist/session-utils.d.ts.map +1 -0
- package/dist/session-utils.js +304 -0
- package/dist/session-utils.js.map +1 -0
- package/dist/state-colors.d.ts +16 -0
- package/dist/state-colors.d.ts.map +1 -0
- package/dist/state-colors.js +48 -0
- package/dist/state-colors.js.map +1 -0
- package/dist/states.d.ts +2 -0
- package/dist/states.d.ts.map +1 -1
- package/dist/states.js +6 -1
- package/dist/states.js.map +1 -1
- package/dist/svg-renderers/agent-logos.d.ts +45 -0
- package/dist/svg-renderers/agent-logos.d.ts.map +1 -0
- package/dist/svg-renderers/agent-logos.js +238 -0
- package/dist/svg-renderers/agent-logos.js.map +1 -0
- package/dist/svg-renderers/index.d.ts +4 -0
- package/dist/svg-renderers/index.d.ts.map +1 -0
- package/dist/svg-renderers/index.js +4 -0
- package/dist/svg-renderers/index.js.map +1 -0
- package/dist/svg-renderers/session-slot-renderer.d.ts +78 -0
- package/dist/svg-renderers/session-slot-renderer.d.ts.map +1 -0
- package/dist/svg-renderers/session-slot-renderer.js +506 -0
- package/dist/svg-renderers/session-slot-renderer.js.map +1 -0
- package/dist/svg-renderers/text-utils.d.ts +29 -0
- package/dist/svg-renderers/text-utils.d.ts.map +1 -0
- package/dist/svg-renderers/text-utils.js +122 -0
- package/dist/svg-renderers/text-utils.js.map +1 -0
- package/dist/telemetry-envelope.d.ts +108 -0
- package/dist/telemetry-envelope.d.ts.map +1 -0
- package/dist/telemetry-envelope.js +34 -0
- package/dist/telemetry-envelope.js.map +1 -0
- package/dist/timeline-icons.d.ts +70 -0
- package/dist/timeline-icons.d.ts.map +1 -0
- package/dist/timeline-icons.js +161 -0
- package/dist/timeline-icons.js.map +1 -0
- package/dist/timeline-label.d.ts +38 -0
- package/dist/timeline-label.d.ts.map +1 -0
- package/dist/timeline-label.js +95 -0
- package/dist/timeline-label.js.map +1 -0
- package/dist/timeline-markdown.d.ts +80 -0
- package/dist/timeline-markdown.d.ts.map +1 -0
- package/dist/timeline-markdown.js +221 -0
- package/dist/timeline-markdown.js.map +1 -0
- package/dist/timeline-summarizer.d.ts +37 -0
- package/dist/timeline-summarizer.d.ts.map +1 -0
- package/dist/timeline-summarizer.js +125 -0
- package/dist/timeline-summarizer.js.map +1 -0
- package/dist/timeline.d.ts +135 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +633 -0
- package/dist/timeline.js.map +1 -0
- package/dist/voice-paths.d.ts +4 -0
- package/dist/voice-paths.d.ts.map +1 -1
- package/dist/voice-paths.js +5 -0
- package/dist/voice-paths.js.map +1 -1
- package/package.json +9 -3
package/dist/timeline.js
ADDED
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared timeline types and log parser for OpenClaw mode.
|
|
3
|
+
* Used by both bridge (BridgeLogStream) and plugin (LogStream).
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract a human-readable summary from a raw OpenClaw log message.
|
|
7
|
+
* Strips JSON prefixes, key=value noise, and extracts error descriptions.
|
|
8
|
+
*/
|
|
9
|
+
function extractReadableMessage(message) {
|
|
10
|
+
let cleaned = message;
|
|
11
|
+
// If entire message is a JSON object, extract error field
|
|
12
|
+
if (cleaned.startsWith('{') && cleaned.endsWith('}')) {
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(cleaned);
|
|
15
|
+
if (parsed.error)
|
|
16
|
+
cleaned = String(parsed.error);
|
|
17
|
+
else
|
|
18
|
+
cleaned = JSON.stringify(parsed).slice(0, 200);
|
|
19
|
+
}
|
|
20
|
+
catch { /* not valid JSON, continue with regex strip */ }
|
|
21
|
+
}
|
|
22
|
+
// Strip leading JSON object fragments: {"subsystem":"diagnostic"} ...
|
|
23
|
+
cleaned = cleaned.replace(/^\{[^}]*\}\s*/, '');
|
|
24
|
+
// Strip [subsystem] prefix: "[tools] read failed..." → "read failed..."
|
|
25
|
+
const bracketMatch = cleaned.match(/^\[(\w+)\]\s*(.*)/);
|
|
26
|
+
const contextTag = bracketMatch ? bracketMatch[1] : null;
|
|
27
|
+
if (bracketMatch)
|
|
28
|
+
cleaned = bracketMatch[2];
|
|
29
|
+
// Extract error= quoted value if present: error="FailoverError: LLM request timed out."
|
|
30
|
+
const errorMatch = cleaned.match(/error="([^"]+)"/);
|
|
31
|
+
if (errorMatch) {
|
|
32
|
+
// Also extract lane/context if available
|
|
33
|
+
const laneMatch = cleaned.match(/lane=(\S+)/);
|
|
34
|
+
const lane = laneMatch ? `[${laneMatch[1]}] ` : (contextTag ? `[${contextTag}] ` : '');
|
|
35
|
+
cleaned = `${lane}${errorMatch[1]}`;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// For ENOENT/file errors: extract the file path and simplify
|
|
39
|
+
const enoentMatch = cleaned.match(/ENOENT:.*?['"]([^'"]+)['"]/);
|
|
40
|
+
if (enoentMatch) {
|
|
41
|
+
const filePath = enoentMatch[1];
|
|
42
|
+
// Show just filename or last 2 path components
|
|
43
|
+
const shortPath = filePath.split('/').slice(-2).join('/');
|
|
44
|
+
cleaned = `파일 없음: ${shortPath}`;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Strip key=value pairs that are noise (conn=..., durationMs=...)
|
|
48
|
+
cleaned = cleaned
|
|
49
|
+
.replace(/\b(conn|durationMs|stateVersion|seq)=\S+/g, '')
|
|
50
|
+
.replace(/\s{2,}/g, ' ')
|
|
51
|
+
.trim();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Truncate
|
|
55
|
+
if (cleaned.length > 500)
|
|
56
|
+
cleaned = cleaned.slice(0, 497) + '...';
|
|
57
|
+
return cleaned || message.slice(0, 500);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Prepare a chat-response body for storage as `entry.detail` while keeping
|
|
61
|
+
* markdown intact. Use this on chat_response / chat_end emit paths so the
|
|
62
|
+
* client renderer can apply heading / bullet / table / inline span styles —
|
|
63
|
+
* `cleanDetailText` would have stripped all of that before it ever reached
|
|
64
|
+
* the dashboard.
|
|
65
|
+
*
|
|
66
|
+
* Filters and caps:
|
|
67
|
+
* - System JSON blobs (`{"connectionId": ...}` etc.) → empty
|
|
68
|
+
* - Error JSON (`{"error": ...}`) → the error string
|
|
69
|
+
* - Other JSON object → compact stringified form (200 char cap)
|
|
70
|
+
* - Otherwise → original text with 3+ blank lines collapsed to 2, trimmed
|
|
71
|
+
*
|
|
72
|
+
* Markdown markers (`**`, `##`, `|`, `` ` ``, `[text](url)`, etc.) are
|
|
73
|
+
* preserved verbatim so the client `parseTimelineMarkdown` /
|
|
74
|
+
* `parseInlineSpans` can do their job.
|
|
75
|
+
*/
|
|
76
|
+
export function prepareMarkdownDetail(text) {
|
|
77
|
+
if (!text)
|
|
78
|
+
return text;
|
|
79
|
+
if (typeof text !== 'string')
|
|
80
|
+
return '';
|
|
81
|
+
const trimmed = text.trim();
|
|
82
|
+
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
|
83
|
+
try {
|
|
84
|
+
const parsed = JSON.parse(trimmed);
|
|
85
|
+
if (parsed.connectionId || parsed.stateVersion || parsed.seq)
|
|
86
|
+
return '';
|
|
87
|
+
if (parsed.error)
|
|
88
|
+
return String(parsed.error);
|
|
89
|
+
return JSON.stringify(parsed).slice(0, 200);
|
|
90
|
+
}
|
|
91
|
+
catch { /* not valid JSON, fall through */ }
|
|
92
|
+
}
|
|
93
|
+
// Preserve markdown — only collapse runs of blank lines + trim ends.
|
|
94
|
+
return text.replace(/\n{3,}/g, '\n\n').trim();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Clean detail text — strip markdown artifacts, JSON blobs, and system noise.
|
|
98
|
+
* Applied to timeline entry `detail` fields before storage on **non-chat**
|
|
99
|
+
* paths (tool errors, system log lines). Chat response detail should go
|
|
100
|
+
* through `prepareMarkdownDetail` instead so the dashboard can render the
|
|
101
|
+
* markdown.
|
|
102
|
+
*/
|
|
103
|
+
export function cleanDetailText(text) {
|
|
104
|
+
if (!text)
|
|
105
|
+
return text;
|
|
106
|
+
if (typeof text !== 'string')
|
|
107
|
+
return '';
|
|
108
|
+
// If entire text is a JSON object, extract readable message
|
|
109
|
+
const trimmed = text.trim();
|
|
110
|
+
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
|
111
|
+
try {
|
|
112
|
+
const parsed = JSON.parse(trimmed);
|
|
113
|
+
// System JSON blobs (connectionId, status codes, etc.) → filter
|
|
114
|
+
if (parsed.connectionId || parsed.stateVersion || parsed.seq)
|
|
115
|
+
return '';
|
|
116
|
+
if (parsed.error)
|
|
117
|
+
return String(parsed.error);
|
|
118
|
+
// Other JSON → compact readable form
|
|
119
|
+
return JSON.stringify(parsed).slice(0, 200);
|
|
120
|
+
}
|
|
121
|
+
catch { /* not valid JSON, continue */ }
|
|
122
|
+
}
|
|
123
|
+
let cleaned = text;
|
|
124
|
+
// Strip code fences: ```lang\n...\n``` → contents
|
|
125
|
+
cleaned = cleaned.replace(/```[\w]*\n?([\s\S]*?)```/g, '$1');
|
|
126
|
+
// Strip bold: **text** → text
|
|
127
|
+
cleaned = cleaned.replace(/\*\*([^*]+)\*\*/g, '$1');
|
|
128
|
+
// Strip italic: *text* or _text_ (but not __dunder__)
|
|
129
|
+
cleaned = cleaned.replace(/(?<!\*)\*([^*\n]+)\*(?!\*)/g, '$1');
|
|
130
|
+
// Strip headings: ## heading → heading
|
|
131
|
+
cleaned = cleaned.replace(/^#{1,6}\s+/gm, '');
|
|
132
|
+
// Strip blockquotes: > text → text
|
|
133
|
+
cleaned = cleaned.replace(/^>\s+/gm, '');
|
|
134
|
+
// Strip markdown links: [text](url) → text
|
|
135
|
+
cleaned = cleaned.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
|
|
136
|
+
// Strip list markers: - item or * item → item (only at line start)
|
|
137
|
+
cleaned = cleaned.replace(/^[-*]\s+/gm, '');
|
|
138
|
+
// Strip inline code backticks: `code` → code
|
|
139
|
+
cleaned = cleaned.replace(/`([^`]+)`/g, '$1');
|
|
140
|
+
// Collapse multiple blank lines
|
|
141
|
+
cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
|
|
142
|
+
return cleaned.trim();
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Strip inline markdown from raw text (lightweight version of cleanDetailText).
|
|
146
|
+
* Handles: **bold**, # heading, `code`, [text](url).
|
|
147
|
+
*/
|
|
148
|
+
export function cleanRawText(text) {
|
|
149
|
+
if (!text)
|
|
150
|
+
return text;
|
|
151
|
+
if (typeof text !== 'string')
|
|
152
|
+
return '';
|
|
153
|
+
return text
|
|
154
|
+
.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
155
|
+
.replace(/^#{1,6}\s+/gm, '')
|
|
156
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
|
|
157
|
+
.replace(/`([^`]+)`/g, '$1')
|
|
158
|
+
.trim();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Remove NOP/NOOP markers from text.
|
|
162
|
+
* Applied to both raw and detail fields.
|
|
163
|
+
*/
|
|
164
|
+
export function cleanNopMarkers(text) {
|
|
165
|
+
if (!text)
|
|
166
|
+
return text;
|
|
167
|
+
return text
|
|
168
|
+
.replace(/\bN[Oo][Oo]?[Pp]\b\s*/g, '')
|
|
169
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
170
|
+
.trim();
|
|
171
|
+
}
|
|
172
|
+
export function isAssistantProgressUpdate(text) {
|
|
173
|
+
if (!text)
|
|
174
|
+
return false;
|
|
175
|
+
const trimmed = text.trim();
|
|
176
|
+
if (!trimmed)
|
|
177
|
+
return false;
|
|
178
|
+
const head = trimmed.slice(0, 800);
|
|
179
|
+
const lower = head.toLowerCase();
|
|
180
|
+
const explicitProgress = /\b(still|currently|continues? to|is|are)\s+(running|building|installing|executing|processing|waiting)\b/.test(lower) ||
|
|
181
|
+
/\b(still running|still building|build is running|is still running|are still running)\b/.test(lower) ||
|
|
182
|
+
/\b(waiting for|wait until|once (?:the )?.*(?:finishes|completes|arrives)|continue once|will continue once|i.ll continue once)\b/.test(lower) ||
|
|
183
|
+
/\b(no interim lines|buffers? output until completion|tail buffers output)\b/.test(lower) ||
|
|
184
|
+
/(아직|계속)\s*(실행|진행|빌드|설치)\s*중/.test(head) ||
|
|
185
|
+
/(완료|끝나|도착)면\s*(계속|이어)/.test(head) ||
|
|
186
|
+
/(기다리는 중|대기 중)/.test(head);
|
|
187
|
+
if (!explicitProgress)
|
|
188
|
+
return false;
|
|
189
|
+
const startsAsFinal = /^(done|completed|complete|fixed|merged|verified|all done)\b/i.test(trimmed) ||
|
|
190
|
+
/^(완료|수정 완료|검증 완료|반영 완료|머지 완료)/.test(trimmed);
|
|
191
|
+
return !startsAsFinal;
|
|
192
|
+
}
|
|
193
|
+
export function detailHasRealSignal(detail) {
|
|
194
|
+
if (!detail)
|
|
195
|
+
return false;
|
|
196
|
+
for (const line of detail.split(/\r?\n/)) {
|
|
197
|
+
const trimmed = line.trim();
|
|
198
|
+
if (!trimmed)
|
|
199
|
+
continue;
|
|
200
|
+
if (!trimmed.toLowerCase().startsWith('status:'))
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
export function isOpenClawPlaceholderRaw(raw) {
|
|
206
|
+
const normalized = raw.trim().toLowerCase();
|
|
207
|
+
return normalized === 'tool' || normalized.startsWith('tool \u00b7 ');
|
|
208
|
+
}
|
|
209
|
+
export function isTaskNotificationChatStart(entry) {
|
|
210
|
+
if (entry.type !== 'chat_start')
|
|
211
|
+
return false;
|
|
212
|
+
const raw = entry.raw.trim().toLowerCase();
|
|
213
|
+
const detail = entry.detail?.trim().toLowerCase() ?? '';
|
|
214
|
+
return raw.startsWith('<task-notification>') || detail.startsWith('<task-notification>');
|
|
215
|
+
}
|
|
216
|
+
function hasOpenClawNotificationFailureSignal(text) {
|
|
217
|
+
return /\b(line|notification|userid|target id|target issue)\b/i.test(text) &&
|
|
218
|
+
/\b(fail(?:ed|ure)?|missing|unconfigured|notified|needed|pending)\b/i.test(text) ||
|
|
219
|
+
/(LINE|알림|userId|사용자 ID|대상 ID).*(실패|미등록|미설정|구성되지|필요|대기)/i.test(text);
|
|
220
|
+
}
|
|
221
|
+
export function isOpenClawLowSignalResponse(entry) {
|
|
222
|
+
if (entry.agentType !== 'openclaw')
|
|
223
|
+
return false;
|
|
224
|
+
const isResponse = entry.type === 'chat_response' || entry.type === 'model_response';
|
|
225
|
+
const isAutomatedStart = entry.type === 'chat_start' && entry.automated === true;
|
|
226
|
+
if (!isResponse && !isAutomatedStart)
|
|
227
|
+
return false;
|
|
228
|
+
const text = `${entry.raw}\n${entry.detail ?? ''}`.trim();
|
|
229
|
+
if (!text)
|
|
230
|
+
return false;
|
|
231
|
+
if (hasOpenClawNotificationFailureSignal(text))
|
|
232
|
+
return false;
|
|
233
|
+
const lower = text.toLowerCase();
|
|
234
|
+
const hasNoReply = /\bno_reply\b/.test(lower);
|
|
235
|
+
const looksLikePolling = /\bstill translating\b/.test(lower) ||
|
|
236
|
+
/\btranslation still in progress\b/.test(lower) ||
|
|
237
|
+
/\bnot all .*?(terminal|published|failed|complete|completed)\b/.test(lower) ||
|
|
238
|
+
/\b(in progress|still active|no action needed|nothing to notify yet)\b/.test(lower) ||
|
|
239
|
+
/\bcron job (?:stays|retained|active)\b/.test(lower) ||
|
|
240
|
+
/\bpipeline still active\b/.test(lower) ||
|
|
241
|
+
/(아직|여전히|계속).*(번역|진행)\s*중/.test(text) ||
|
|
242
|
+
/알릴 필요 없음|수행할 작업이 없음|대기합니다/.test(text);
|
|
243
|
+
if (isAutomatedStart)
|
|
244
|
+
return looksLikePolling;
|
|
245
|
+
return looksLikePolling && (hasNoReply || /no action needed|nothing to notify yet|알릴 필요 없음/.test(lower));
|
|
246
|
+
}
|
|
247
|
+
export function isOpenClawCronPrompt(text) {
|
|
248
|
+
return !!text && text.trimStart().startsWith('[cron:');
|
|
249
|
+
}
|
|
250
|
+
export function summarizeOpenClawCronPrompt(text) {
|
|
251
|
+
if (!text)
|
|
252
|
+
return '자동 작업';
|
|
253
|
+
const trimmed = text.trimStart();
|
|
254
|
+
const m = trimmed.match(/^\[cron:[^\s\]]+\s+([^\]]+)\]/);
|
|
255
|
+
if (!m)
|
|
256
|
+
return '자동 작업';
|
|
257
|
+
const job = m[1]
|
|
258
|
+
.replace(/[-_]+/g, ' ')
|
|
259
|
+
.replace(/\s+/g, ' ')
|
|
260
|
+
.trim();
|
|
261
|
+
if (!job)
|
|
262
|
+
return '자동 작업';
|
|
263
|
+
const capped = job.length > 64 ? `${job.slice(0, 61)}...` : job;
|
|
264
|
+
return `자동 작업 \u00b7 ${capped}`;
|
|
265
|
+
}
|
|
266
|
+
export function shouldDropLowSignalTimelineEntry(entry) {
|
|
267
|
+
if (isTaskNotificationChatStart(entry))
|
|
268
|
+
return true;
|
|
269
|
+
if (isOpenClawLowSignalResponse(entry))
|
|
270
|
+
return true;
|
|
271
|
+
const lowSignalTypes = new Set(['tool_exec', 'tool_request', 'tool_resolved']);
|
|
272
|
+
if (!lowSignalTypes.has(entry.type))
|
|
273
|
+
return false;
|
|
274
|
+
// Codex tool hooks are extremely high volume (Bash/MCP start+complete for
|
|
275
|
+
// every internal action). Keep them available to APME ingestion, but do not
|
|
276
|
+
// persist them into the bounded user-facing timeline buffer.
|
|
277
|
+
if ((entry.agentType === 'codex-cli' || entry.agentType === 'codex-app') && entry.type === 'tool_exec') {
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
if (detailHasRealSignal(entry.detail))
|
|
281
|
+
return false;
|
|
282
|
+
const raw = entry.raw.trim().toLowerCase();
|
|
283
|
+
if ((entry.agentType === 'codex-cli' || entry.agentType === 'codex-app') && entry.sessionId === 'codex:otel-active') {
|
|
284
|
+
return new Set(['tool', 'tool completed', 'unknown', 'unknown completed', 'exec', 'exec completed']).has(raw);
|
|
285
|
+
}
|
|
286
|
+
if (entry.agentType === 'openclaw') {
|
|
287
|
+
return isOpenClawPlaceholderRaw(raw);
|
|
288
|
+
}
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
export function normalizeTimelineEntryForStorage(entry) {
|
|
292
|
+
if (shouldDropLowSignalTimelineEntry(entry))
|
|
293
|
+
return null;
|
|
294
|
+
if (entry.agentType === 'openclaw' &&
|
|
295
|
+
entry.type === 'model_call' &&
|
|
296
|
+
(entry.automated || isOpenClawCronPrompt(entry.raw) || isOpenClawCronPrompt(entry.detail)) &&
|
|
297
|
+
(isOpenClawCronPrompt(entry.raw) || isOpenClawCronPrompt(entry.detail))) {
|
|
298
|
+
const source = isOpenClawCronPrompt(entry.raw) ? entry.raw : entry.detail;
|
|
299
|
+
return {
|
|
300
|
+
...entry,
|
|
301
|
+
raw: summarizeOpenClawCronPrompt(source),
|
|
302
|
+
detail: undefined,
|
|
303
|
+
automated: true,
|
|
304
|
+
summaryKind: entry.summaryKind ?? 'heuristic',
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
return entry;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Extract the semantic core of a timeline entry for dedup comparison.
|
|
311
|
+
* For chat_end: strip duration/tool suffix (everything after first ' · ').
|
|
312
|
+
* For chat_start: use full raw text.
|
|
313
|
+
*/
|
|
314
|
+
export function extractSemanticCore(raw, type) {
|
|
315
|
+
if (type === 'chat_end') {
|
|
316
|
+
const sepIdx = raw.indexOf(' \u00b7 ');
|
|
317
|
+
return sepIdx >= 0 ? raw.slice(0, sepIdx).trim() : raw.trim();
|
|
318
|
+
}
|
|
319
|
+
return raw.trim();
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Normalize a semantic core for fuzzy comparison.
|
|
323
|
+
* Extracts sorted unique keywords, stripping punctuation and common suffixes.
|
|
324
|
+
* "WhatsApp 연결 상태 확인 완료, 정상 작동" → "whatsapp 연결 상태 완료 작동 정상 확인"
|
|
325
|
+
*/
|
|
326
|
+
function normalizeCore(core) {
|
|
327
|
+
return core
|
|
328
|
+
.toLowerCase()
|
|
329
|
+
.replace(/[.,!?·✓✅:…""''`\n]+/g, ' ')
|
|
330
|
+
.replace(/\s+/g, ' ')
|
|
331
|
+
.trim();
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Extract a keyword bag from text for similarity comparison.
|
|
335
|
+
* Strips Korean verb/adjective endings and common fillers.
|
|
336
|
+
*/
|
|
337
|
+
function extractKeywords(text) {
|
|
338
|
+
const normalized = normalizeCore(text);
|
|
339
|
+
const words = normalized.split(' ').filter(w => w.length >= 2);
|
|
340
|
+
// Strip common Korean verbal endings for stemming
|
|
341
|
+
const stemmed = words.map(w => w.replace(/(하겠습니다|합니다|합니다|한다|시작|완료|중|확인됨|됨|했습니다)$/, '')
|
|
342
|
+
.replace(/(을|를|이|가|의|에|에서|으로|로|는|은|도|만|까지)$/, '')).filter(w => w.length >= 2);
|
|
343
|
+
// Remove common filler words
|
|
344
|
+
const fillers = new Set(['시작', '완료', '중', '및', '조치', '불필요', '정상', 'completed', 'prompt', 'sent', 'noop', 'nop']);
|
|
345
|
+
return new Set(stemmed.filter(w => !fillers.has(w)));
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Check if two semantic cores are similar enough to be considered duplicates.
|
|
349
|
+
* Uses keyword overlap — if 60%+ of smaller keyword set overlaps, it's a dupe.
|
|
350
|
+
*/
|
|
351
|
+
function isSimilarCore(a, b) {
|
|
352
|
+
const na = normalizeCore(a);
|
|
353
|
+
const nb = normalizeCore(b);
|
|
354
|
+
if (na === nb)
|
|
355
|
+
return true;
|
|
356
|
+
// Keyword-based similarity
|
|
357
|
+
const ka = extractKeywords(a);
|
|
358
|
+
const kb = extractKeywords(b);
|
|
359
|
+
if (ka.size === 0 || kb.size === 0)
|
|
360
|
+
return false;
|
|
361
|
+
const smaller = ka.size <= kb.size ? ka : kb;
|
|
362
|
+
const larger = ka.size > kb.size ? ka : kb;
|
|
363
|
+
let overlap = 0;
|
|
364
|
+
for (const w of smaller) {
|
|
365
|
+
if (larger.has(w))
|
|
366
|
+
overlap++;
|
|
367
|
+
}
|
|
368
|
+
// 60% overlap of the smaller set → similar
|
|
369
|
+
return overlap >= smaller.size * 0.6 && overlap >= 2;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Check if an entry is repetitive compared to recent entries.
|
|
373
|
+
* Returns the index of the matching entry in recentEntries, or -1 if not repetitive.
|
|
374
|
+
*/
|
|
375
|
+
export function isRepetitiveEntry(entry, recentEntries, windowMs = 3_600_000) {
|
|
376
|
+
if (entry.type !== 'chat_end' &&
|
|
377
|
+
entry.type !== 'chat_start' &&
|
|
378
|
+
entry.type !== 'error' &&
|
|
379
|
+
entry.type !== 'chat_response') {
|
|
380
|
+
return -1;
|
|
381
|
+
}
|
|
382
|
+
// Automated entries (cron/channel-initiated): 8h window, any automated pair is a dupe
|
|
383
|
+
const effectiveWindowMs = entry.automated ? 8 * 3_600_000 : windowMs;
|
|
384
|
+
const core = extractSemanticCore(entry.raw, entry.type);
|
|
385
|
+
if (!core)
|
|
386
|
+
return -1;
|
|
387
|
+
for (let i = recentEntries.length - 1; i >= 0; i--) {
|
|
388
|
+
const e = recentEntries[i];
|
|
389
|
+
if (entry.ts - e.ts > effectiveWindowMs)
|
|
390
|
+
break;
|
|
391
|
+
if (e.type !== entry.type)
|
|
392
|
+
continue;
|
|
393
|
+
// Automated entries: content-agnostic dedup (any two automated chats collapse)
|
|
394
|
+
if (entry.automated && e.automated)
|
|
395
|
+
return i;
|
|
396
|
+
const eCore = extractSemanticCore(e.raw, e.type);
|
|
397
|
+
if (isSimilarCore(core, eCore))
|
|
398
|
+
return i;
|
|
399
|
+
}
|
|
400
|
+
return -1;
|
|
401
|
+
}
|
|
402
|
+
export function deduplicateEntry(entry, entries) {
|
|
403
|
+
// 1. Clean text artifacts
|
|
404
|
+
if (entry.raw)
|
|
405
|
+
entry = { ...entry, raw: cleanNopMarkers(cleanRawText(entry.raw)) };
|
|
406
|
+
if (entry.detail)
|
|
407
|
+
entry = { ...entry, detail: cleanNopMarkers(entry.detail) };
|
|
408
|
+
// Task hierarchy entries bypass dedup — they're hierarchy markers keyed by
|
|
409
|
+
// taskId, not content. Two adjacent task_starts are legitimately distinct,
|
|
410
|
+
// and two `task_milestone` rows carrying identical raw ("Todos done") but
|
|
411
|
+
// different taskIds within the 8s exact-dedup window must not collapse.
|
|
412
|
+
if (entry.type === 'task_start' || entry.type === 'task_end' || entry.type === 'task_milestone') {
|
|
413
|
+
return { action: 'add', entry };
|
|
414
|
+
}
|
|
415
|
+
// 2. Exact dedup: skip if same type + raw within 8 seconds
|
|
416
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
417
|
+
const e = entries[i];
|
|
418
|
+
if (entry.ts - e.ts > 8_000)
|
|
419
|
+
break;
|
|
420
|
+
if (e.type === entry.type && e.raw === entry.raw)
|
|
421
|
+
return { action: 'skip' };
|
|
422
|
+
}
|
|
423
|
+
// 3. Repetitive entry dedup (1h window)
|
|
424
|
+
const repIdx = isRepetitiveEntry(entry, entries);
|
|
425
|
+
if (repIdx >= 0) {
|
|
426
|
+
let removeChatStartIndex;
|
|
427
|
+
// For chat_end dedup, find paired chat_start that's also repetitive
|
|
428
|
+
if (entry.type === 'chat_end') {
|
|
429
|
+
for (let j = entries.length - 1; j >= 0; j--) {
|
|
430
|
+
const cs = entries[j];
|
|
431
|
+
if (cs.type !== 'chat_start')
|
|
432
|
+
continue;
|
|
433
|
+
if (entry.ts - cs.ts > 3_600_000)
|
|
434
|
+
break;
|
|
435
|
+
if (isRepetitiveEntry(cs, entries.slice(0, j)) >= 0) {
|
|
436
|
+
removeChatStartIndex = j;
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return { action: 'merge', index: repIdx, removeChatStartIndex };
|
|
442
|
+
}
|
|
443
|
+
return { action: 'add', entry };
|
|
444
|
+
}
|
|
445
|
+
/** Parse a single JSON log line into a TimelineEntry, or null if unrecognized. */
|
|
446
|
+
export function parseLogLine(json) {
|
|
447
|
+
if (!json || typeof json !== 'object')
|
|
448
|
+
return null;
|
|
449
|
+
const obj = json;
|
|
450
|
+
// ===== OpenClaw logs --json format =====
|
|
451
|
+
// { type: "log", time: "ISO", level: "info|debug", message: "...", subsystem?: "...", module?: "...", raw: "..." }
|
|
452
|
+
const message = obj.message || obj.msg || '';
|
|
453
|
+
const subsystem = obj.subsystem;
|
|
454
|
+
const module_ = obj.module;
|
|
455
|
+
// Parse timestamp: ISO string (OpenClaw) or numeric
|
|
456
|
+
let ts;
|
|
457
|
+
const timeStr = obj.time;
|
|
458
|
+
if (timeStr && typeof timeStr === 'string') {
|
|
459
|
+
const parsed = new Date(timeStr).getTime();
|
|
460
|
+
ts = isNaN(parsed) ? Date.now() : parsed;
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
ts = obj.ts || obj.timestamp || Date.now();
|
|
464
|
+
}
|
|
465
|
+
// ===== Legacy structured format (backward compat) =====
|
|
466
|
+
const action = obj.action;
|
|
467
|
+
const model = obj.model;
|
|
468
|
+
const tool = obj.tool;
|
|
469
|
+
const component = obj.component;
|
|
470
|
+
const tokens = obj.tokens;
|
|
471
|
+
// Model inference start/complete (legacy structured) — suppressed
|
|
472
|
+
// Adapter generates richer chat_start/chat_end with prompt, duration, tool summary
|
|
473
|
+
if (model && (action === 'start' || action === 'request' || action === 'complete' || action === 'done' || action === 'response')) {
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
// Memory / recall (legacy structured)
|
|
477
|
+
if (component === 'memory' || action === 'recall' || action === 'search') {
|
|
478
|
+
const query = obj.query || message || 'memory search';
|
|
479
|
+
return {
|
|
480
|
+
ts, type: 'memory_recall',
|
|
481
|
+
raw: `Memory: ${query}`,
|
|
482
|
+
detail: query.length > 50 ? query : undefined,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
// Tool execution (legacy structured)
|
|
486
|
+
if (tool || (component === 'tool' && action)) {
|
|
487
|
+
const toolName = tool || action || 'tool';
|
|
488
|
+
const toolDetail = obj.detail || obj.command || '';
|
|
489
|
+
const toolRaw = toolDetail ? `${toolName}: ${toolDetail}` : toolName;
|
|
490
|
+
return {
|
|
491
|
+
ts, type: 'tool_exec',
|
|
492
|
+
raw: toolRaw.length > 500 ? toolRaw.slice(0, 497) + '...' : toolRaw,
|
|
493
|
+
detail: toolDetail.length > 100 ? (toolDetail.length > 1000 ? toolDetail.slice(0, 997) + '...' : toolDetail) : undefined,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
// ===== OpenClaw message-text based matching =====
|
|
497
|
+
if (!message)
|
|
498
|
+
return null;
|
|
499
|
+
// Skip very short messages (JSON fragments, truncated output)
|
|
500
|
+
if (message.length < 5)
|
|
501
|
+
return null;
|
|
502
|
+
// Gateway WS subsystem: all RPC events are redundant with adapter-generated timeline
|
|
503
|
+
// (chat.send → chat_start, chat.abort → chat_end, exec.approval.resolve → tool_resolved)
|
|
504
|
+
if (subsystem === 'gateway/ws')
|
|
505
|
+
return null;
|
|
506
|
+
// Cron list table rows: UUID-prefixed lines from `openclaw cron list` output
|
|
507
|
+
// Keep error rows as summarized entries; skip ok/skipped rows
|
|
508
|
+
const cronRowMatch = message.match(/^[0-9a-f]{8}-[0-9a-f]{4}-\S+\s+(\S+(?:\.\.\.)?\S*)\s+.*?\b(error|ok|skipped)\b/i);
|
|
509
|
+
if (cronRowMatch) {
|
|
510
|
+
const [, jobName, status] = cronRowMatch;
|
|
511
|
+
if (status.toLowerCase() !== 'error')
|
|
512
|
+
return null; // ok/skipped → skip
|
|
513
|
+
// Extract human-readable job name (strip trailing ...)
|
|
514
|
+
const name = jobName.replace(/\.{3}$/, '').replace(/-/g, ' ');
|
|
515
|
+
return { ts, type: 'error', raw: `Cron error: ${name}` };
|
|
516
|
+
}
|
|
517
|
+
// Skip cron module noise and JSON blobs (internal state, not user-facing)
|
|
518
|
+
if (module_ === 'cron' || subsystem === 'cron')
|
|
519
|
+
return null;
|
|
520
|
+
if (/^"jobs"\s*:\s*\[|^\{"jobs":/i.test(message))
|
|
521
|
+
return null;
|
|
522
|
+
// Skip noisy infrastructure messages
|
|
523
|
+
if (message.startsWith('- agent:main:') && message.includes(' ago)'))
|
|
524
|
+
return null;
|
|
525
|
+
if (message.startsWith('Agents:') || message.startsWith('Session store'))
|
|
526
|
+
return null;
|
|
527
|
+
if (message.startsWith('Heartbeat interval:') || message.startsWith('WhatsApp:') || message.startsWith('LINE:'))
|
|
528
|
+
return null;
|
|
529
|
+
if (message.startsWith('Web Channel:') || message.startsWith('Run "openclaw'))
|
|
530
|
+
return null;
|
|
531
|
+
if (message.includes('web gateway heartbeat') || module_ === 'web-heartbeat')
|
|
532
|
+
return null;
|
|
533
|
+
// Skip hook registration and session setup noise
|
|
534
|
+
if (/\bRegistered hook\b/i.test(message))
|
|
535
|
+
return null;
|
|
536
|
+
if (/\bSession (store|restored|loaded)\b/i.test(message))
|
|
537
|
+
return null;
|
|
538
|
+
// Skip diagnostic noise, but keep errors
|
|
539
|
+
if (subsystem === 'diagnostic' && !/\b(error|fail|timed?\s*out)\b/i.test(message))
|
|
540
|
+
return null;
|
|
541
|
+
// Skip transient/retriable errors that agents handle internally
|
|
542
|
+
if (/\b(web_fetch|http_request|fetch)\b/i.test(message) &&
|
|
543
|
+
/\b(timed?\s*out|ECONNREFUSED|ECONNRESET|ETIMEDOUT|retry|retrying)\b/i.test(message)) {
|
|
544
|
+
return null;
|
|
545
|
+
}
|
|
546
|
+
// Skip web_fetch/browser tool failures (404, generic fetch, tab errors) — agents handle internally
|
|
547
|
+
if (/\bweb_fetch failed\b/i.test(message) && /\b(404|403)\b/.test(message)) {
|
|
548
|
+
return null;
|
|
549
|
+
}
|
|
550
|
+
if (/\bweb_fetch failed:\s*fetch failed\b/i.test(message)) {
|
|
551
|
+
return null;
|
|
552
|
+
}
|
|
553
|
+
if (/\bbrowser failed:\s*tab not found\b/i.test(message)) {
|
|
554
|
+
return null;
|
|
555
|
+
}
|
|
556
|
+
// Skip browser sandbox configuration messages (setting issue, not runtime error)
|
|
557
|
+
if (/\bSandbox browser is unavailable\b/i.test(message)) {
|
|
558
|
+
return null;
|
|
559
|
+
}
|
|
560
|
+
// Skip tool errors that agents retry internally (edit mismatch, EISDIR, ENOENT on memory)
|
|
561
|
+
if (/\bedit failed:\s*Could not find the exact text\b/i.test(message)) {
|
|
562
|
+
return null;
|
|
563
|
+
}
|
|
564
|
+
if (/\bread failed\b/i.test(message) && /\bEISDIR\b/.test(message)) {
|
|
565
|
+
return null;
|
|
566
|
+
}
|
|
567
|
+
if (/\bread failed\b/i.test(message) && /\bENOENT\b/.test(message) &&
|
|
568
|
+
/workspace\/memory\//i.test(message)) {
|
|
569
|
+
return null;
|
|
570
|
+
}
|
|
571
|
+
// Skip failover cascade noise — the initial timeout/error is already shown
|
|
572
|
+
if (/\bProfile\s+\S+\s+timed out\b/i.test(message) ||
|
|
573
|
+
/\bFailoverError:\s+LLM request timed out\b/i.test(message)) {
|
|
574
|
+
return null;
|
|
575
|
+
}
|
|
576
|
+
// Messaging channel infrastructure detection — only filter when from known infra subsystems/modules
|
|
577
|
+
// (avoid filtering user-facing messages that mention "whatsapp" etc.)
|
|
578
|
+
const isChannelInfra = subsystem === 'channel' || module_ === 'whatsapp' || module_ === 'line'
|
|
579
|
+
|| module_ === 'web-channel' || subsystem === 'messaging';
|
|
580
|
+
// Skip transient network_error — only from known infra subsystems (not user-facing tool errors)
|
|
581
|
+
if (/\bnetwork_error\b/i.test(message) &&
|
|
582
|
+
(subsystem === 'gateway/ws' || subsystem === 'diagnostic' || module_ === 'web-heartbeat' || isChannelInfra)) {
|
|
583
|
+
return null;
|
|
584
|
+
}
|
|
585
|
+
if (/\bembedded run agent end\b/i.test(message) && /\berror=500\b/.test(message)) {
|
|
586
|
+
return null;
|
|
587
|
+
}
|
|
588
|
+
if (isChannelInfra) {
|
|
589
|
+
// Auto-reconnect, retry, connection status — all infra noise
|
|
590
|
+
if (/\b(Web connection closed|Retry \d+\/\d+|reconnect|heartbeat)\b/i.test(message)) {
|
|
591
|
+
return null;
|
|
592
|
+
}
|
|
593
|
+
if (/\bWebSocket error\b/i.test(message)) {
|
|
594
|
+
return null;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
// Skip raw JSON blobs — connection status, event payloads, cron state
|
|
598
|
+
if (/^\{"connectionId":/i.test(message)) {
|
|
599
|
+
return null;
|
|
600
|
+
}
|
|
601
|
+
if (/^\{"event":/i.test(message)) {
|
|
602
|
+
return null;
|
|
603
|
+
}
|
|
604
|
+
// Skip delivery retry noise (infrastructure auto-recovery)
|
|
605
|
+
if (/\bDelivery\b.*\bexceeded max retries\b/i.test(message)) {
|
|
606
|
+
return null;
|
|
607
|
+
}
|
|
608
|
+
if (/\bDelivery recovery complete\b/i.test(message)) {
|
|
609
|
+
return null;
|
|
610
|
+
}
|
|
611
|
+
if (/\bRetry failed for delivery\b/i.test(message)) {
|
|
612
|
+
return null;
|
|
613
|
+
}
|
|
614
|
+
// Skip model_fallback_decision JSON blobs (internal routing noise)
|
|
615
|
+
if (/model_fallback_decision/i.test(message)) {
|
|
616
|
+
return null;
|
|
617
|
+
}
|
|
618
|
+
// --- Error patterns FIRST (before model/tool matching to avoid misclassification) ---
|
|
619
|
+
if (obj.level === 'error' || /\b(error|fail(?:ed|ure)?|exception|timed?\s*out|ENOENT|EACCES)\b/i.test(message)) {
|
|
620
|
+
// Extract meaningful error description from structured messages
|
|
621
|
+
const errorRaw = extractReadableMessage(message);
|
|
622
|
+
return { ts, type: 'error', raw: errorRaw };
|
|
623
|
+
}
|
|
624
|
+
// Model/inference patterns: suppressed — adapter generates richer chat_start/chat_end
|
|
625
|
+
// (these broad patterns match too many internal logs: "inference completed", "thinking process", etc.)
|
|
626
|
+
if (/\b(inference|model|llm)\b.*\b(start|request|call|complet|done|response|finish)\b/i.test(message)) {
|
|
627
|
+
return null;
|
|
628
|
+
}
|
|
629
|
+
// Anything else — skip. Real chat/tool/error activity flows through the
|
|
630
|
+
// OpenClaw Gateway adapter's RPC events, not heuristic log parsing.
|
|
631
|
+
return null;
|
|
632
|
+
}
|
|
633
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
|