edgeone 1.6.25 → 1.6.26
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/edgeone-dist/cli.js +2111 -352
- package/edgeone-dist/pages/dev/runner-worker.js +2111 -352
- package/edgeone-dist/pages/templates/agent-python/context.py +5 -1
- package/edgeone-dist/pages/templates/agent-python/memory.py +248 -19
- package/edgeone-dist/studio/ui/assets/agent-obs-Dvi4IpEy.js +4 -0
- package/edgeone-dist/studio/ui/assets/agent-obs-qDJCE0TQ.css +1 -0
- package/edgeone-dist/studio/ui/assets/{index-DN8YhmEp.js → index-DD3d108t.js} +1 -1
- package/edgeone-dist/studio/ui/index.html +3 -3
- package/package.json +1 -1
- package/edgeone-dist/studio/ui/assets/agent-obs-BpTIot8x.js +0 -4
- package/edgeone-dist/studio/ui/assets/agent-obs-CEOY4DZz.css +0 -1
|
@@ -307,7 +307,11 @@ class AgentContext:
|
|
|
307
307
|
"通常是因为运行时未设置 store。"
|
|
308
308
|
)
|
|
309
309
|
from .memory import ConversationMemory
|
|
310
|
-
instance = ConversationMemory(
|
|
310
|
+
instance = ConversationMemory(
|
|
311
|
+
self._store_blob,
|
|
312
|
+
self.run_id,
|
|
313
|
+
self.conversation_id,
|
|
314
|
+
)
|
|
311
315
|
object.__setattr__(self, '_store_cached', instance)
|
|
312
316
|
return instance
|
|
313
317
|
|
|
@@ -67,6 +67,11 @@ class MemoryStorageError(MemoryError):
|
|
|
67
67
|
pass
|
|
68
68
|
|
|
69
69
|
|
|
70
|
+
class MemoryCorruptError(MemoryError):
|
|
71
|
+
"""Persisted framework state is malformed or incompatible."""
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
|
|
70
75
|
# ─── Data Model ───
|
|
71
76
|
|
|
72
77
|
|
|
@@ -170,6 +175,48 @@ _MAX_SAFE_INTEGER = 9007199254740991 # JS Number.MAX_SAFE_INTEGER
|
|
|
170
175
|
# update_message 用它来判断 content / metadata 是否被传,对齐 Node 的
|
|
171
176
|
# `input.content === undefined` 判断。
|
|
172
177
|
_UNSET: Any = object()
|
|
178
|
+
_STATE_PREFIX = "state"
|
|
179
|
+
_MAX_STATE_KEY_LEN = 256
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _validate_state_key(key: str) -> None:
|
|
183
|
+
if not isinstance(key, str) or not key:
|
|
184
|
+
raise MemoryValidationError("state key must be a non-empty string")
|
|
185
|
+
if len(key) > _MAX_STATE_KEY_LEN:
|
|
186
|
+
raise MemoryValidationError(
|
|
187
|
+
f"state key exceeds maximum of {_MAX_STATE_KEY_LEN} characters"
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _validate_state_value(value: Any, path: str = "state value", seen=None) -> None:
|
|
192
|
+
if value is None or isinstance(value, (str, bool)):
|
|
193
|
+
return
|
|
194
|
+
if isinstance(value, (int, float)):
|
|
195
|
+
if isinstance(value, float) and (value != value or value in (float("inf"), float("-inf"))):
|
|
196
|
+
raise MemoryValidationError(f"{path} must contain only JSON values")
|
|
197
|
+
return
|
|
198
|
+
if seen is None:
|
|
199
|
+
seen = set()
|
|
200
|
+
if isinstance(value, (list, dict)):
|
|
201
|
+
identity = id(value)
|
|
202
|
+
if identity in seen:
|
|
203
|
+
raise MemoryValidationError(f"{path} must not contain circular references")
|
|
204
|
+
seen.add(identity)
|
|
205
|
+
if isinstance(value, list):
|
|
206
|
+
for index, item in enumerate(value):
|
|
207
|
+
_validate_state_value(item, f"{path}[{index}]", seen)
|
|
208
|
+
else:
|
|
209
|
+
for key, item in value.items():
|
|
210
|
+
if not isinstance(key, str):
|
|
211
|
+
raise MemoryValidationError(f"{path} keys must be strings")
|
|
212
|
+
_validate_state_value(item, f"{path}.{key}", seen)
|
|
213
|
+
seen.remove(identity)
|
|
214
|
+
return
|
|
215
|
+
raise MemoryValidationError(f"{path} must be JSON serializable")
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _state_key(conversation_id: str, key: str) -> str:
|
|
219
|
+
return f"{_STATE_PREFIX}/{_encode_cid(conversation_id)}/{_encode_segment(key)}"
|
|
173
220
|
|
|
174
221
|
|
|
175
222
|
def _json_default(obj: Any) -> Any:
|
|
@@ -310,6 +357,52 @@ def _cursor_sort_key(last_message_at: int, conversation_id: str) -> str:
|
|
|
310
357
|
# ─── ConversationMemory ───
|
|
311
358
|
|
|
312
359
|
|
|
360
|
+
class _ConversationState:
|
|
361
|
+
"""Conversation-bound state facade persisted under the state/ prefix."""
|
|
362
|
+
|
|
363
|
+
def __init__(self, memory: "ConversationMemory") -> None:
|
|
364
|
+
self._memory = memory
|
|
365
|
+
|
|
366
|
+
def _conversation_id(self) -> str:
|
|
367
|
+
conversation_id = self._memory._conversation_id
|
|
368
|
+
if not conversation_id:
|
|
369
|
+
raise MemoryValidationError(
|
|
370
|
+
"State operations require a bound conversation_id"
|
|
371
|
+
)
|
|
372
|
+
self._memory._validate_conversation_id(conversation_id)
|
|
373
|
+
return conversation_id
|
|
374
|
+
|
|
375
|
+
async def get(self, key: str) -> Any:
|
|
376
|
+
_validate_state_key(key)
|
|
377
|
+
conversation_id = self._conversation_id()
|
|
378
|
+
raw = await self._memory._blob_get_text(_state_key(conversation_id, key))
|
|
379
|
+
if raw is None:
|
|
380
|
+
return None
|
|
381
|
+
try:
|
|
382
|
+
return json.loads(raw)
|
|
383
|
+
except (json.JSONDecodeError, TypeError, ValueError) as exc:
|
|
384
|
+
raise MemoryStorageError("Stored state value is invalid JSON") from exc
|
|
385
|
+
|
|
386
|
+
async def set(self, key: str, value: Any) -> None:
|
|
387
|
+
_validate_state_key(key)
|
|
388
|
+
conversation_id = self._conversation_id()
|
|
389
|
+
_validate_state_value(value)
|
|
390
|
+
try:
|
|
391
|
+
payload = json.dumps(
|
|
392
|
+
value, ensure_ascii=False, separators=(",", ":"), allow_nan=False
|
|
393
|
+
)
|
|
394
|
+
await self._memory._blob.set(_state_key(conversation_id, key), payload)
|
|
395
|
+
except MemoryValidationError:
|
|
396
|
+
raise
|
|
397
|
+
except Exception as exc:
|
|
398
|
+
raise MemoryStorageError("Failed to write state value") from exc
|
|
399
|
+
|
|
400
|
+
async def delete(self, key: str) -> None:
|
|
401
|
+
_validate_state_key(key)
|
|
402
|
+
conversation_id = self._conversation_id()
|
|
403
|
+
await self._memory._blob_delete(_state_key(conversation_id, key))
|
|
404
|
+
|
|
405
|
+
|
|
313
406
|
class ConversationMemory:
|
|
314
407
|
"""Conversation message history CRUD, accessed as ctx.store.
|
|
315
408
|
|
|
@@ -317,16 +410,24 @@ class ConversationMemory:
|
|
|
317
410
|
All core methods are async.
|
|
318
411
|
"""
|
|
319
412
|
|
|
320
|
-
def __init__(
|
|
413
|
+
def __init__(
|
|
414
|
+
self,
|
|
415
|
+
blob_store: Any,
|
|
416
|
+
run_id: str,
|
|
417
|
+
conversation_id: Optional[str] = None,
|
|
418
|
+
) -> None:
|
|
321
419
|
"""
|
|
322
420
|
Args:
|
|
323
421
|
blob_store: Raw blob store instance (pages_blob.Store or LocalFileBlobStore).
|
|
324
422
|
Must implement: get(key, type=), set(key, value), delete(key),
|
|
325
423
|
list(prefix=) returning object with .blobs list of objects with .key.
|
|
326
424
|
run_id: Current run ID, auto-injected into message metadata.
|
|
425
|
+
conversation_id: Optional bound conversation for state and default sessions.
|
|
327
426
|
"""
|
|
328
427
|
self._blob = blob_store
|
|
329
428
|
self._run_id = run_id
|
|
429
|
+
self._conversation_id = conversation_id
|
|
430
|
+
self._state_cached = _ConversationState(self)
|
|
330
431
|
|
|
331
432
|
# ─── Validation Helpers ───
|
|
332
433
|
|
|
@@ -400,6 +501,22 @@ class ConversationMemory:
|
|
|
400
501
|
except Exception as e:
|
|
401
502
|
raise MemoryStorageError(f"Failed to read key '{key}': {e}") from e
|
|
402
503
|
|
|
504
|
+
async def _blob_get_json_strict(self, key: str, **kwargs) -> Optional[dict]:
|
|
505
|
+
"""Read JSON and distinguish corrupt state from a missing key."""
|
|
506
|
+
try:
|
|
507
|
+
raw = await self._blob.get(key, type="text", **kwargs)
|
|
508
|
+
if raw is None:
|
|
509
|
+
return None
|
|
510
|
+
return json.loads(raw)
|
|
511
|
+
except (json.JSONDecodeError, TypeError, ValueError) as exc:
|
|
512
|
+
raise MemoryCorruptError(
|
|
513
|
+
f"Persisted framework state is corrupt for key '{key}'"
|
|
514
|
+
) from exc
|
|
515
|
+
except MemoryStorageError:
|
|
516
|
+
raise
|
|
517
|
+
except Exception as e:
|
|
518
|
+
raise MemoryStorageError(f"Failed to read key '{key}': {e}") from e
|
|
519
|
+
|
|
403
520
|
async def _blob_set_json(self, key: str, data: Any) -> None:
|
|
404
521
|
"""Serialize value to JSON and write to blob store.
|
|
405
522
|
|
|
@@ -1196,6 +1313,9 @@ class ConversationMemory:
|
|
|
1196
1313
|
)
|
|
1197
1314
|
|
|
1198
1315
|
if meta_data is None:
|
|
1316
|
+
await self._delete_bound_state(conversation_id)
|
|
1317
|
+
await self._delete_claude_session_for_conversation(conversation_id)
|
|
1318
|
+
await self.langgraph_checkpointer.adelete_thread(conversation_id)
|
|
1199
1319
|
raise MemoryNotFoundError(f"Conversation '{conversation_id}' not found")
|
|
1200
1320
|
|
|
1201
1321
|
meta = ConversationMeta.from_dict(meta_data)
|
|
@@ -1215,6 +1335,12 @@ class ConversationMemory:
|
|
|
1215
1335
|
|
|
1216
1336
|
await asyncio.gather(*delete_ops)
|
|
1217
1337
|
|
|
1338
|
+
# Keep LangGraph Store items intact while removing checkpoints and
|
|
1339
|
+
# conversation-bound state for the current bound conversation.
|
|
1340
|
+
await self._delete_bound_state(conversation_id)
|
|
1341
|
+
await self._delete_claude_session_for_conversation(conversation_id)
|
|
1342
|
+
await self.langgraph_checkpointer.adelete_thread(conversation_id)
|
|
1343
|
+
|
|
1218
1344
|
async def update_conversation(
|
|
1219
1345
|
self, conversation_id: str, metadata: dict
|
|
1220
1346
|
) -> ConversationMeta:
|
|
@@ -1271,6 +1397,46 @@ class ConversationMemory:
|
|
|
1271
1397
|
|
|
1272
1398
|
# ─── Framework Helpers ───
|
|
1273
1399
|
|
|
1400
|
+
@property
|
|
1401
|
+
def state(self) -> _ConversationState:
|
|
1402
|
+
"""Conversation-bound JSON state facade."""
|
|
1403
|
+
return self._state_cached
|
|
1404
|
+
|
|
1405
|
+
async def _delete_bound_state(self, conversation_id: str) -> None:
|
|
1406
|
+
if self._conversation_id != conversation_id:
|
|
1407
|
+
return
|
|
1408
|
+
keys = await self._blob_list_keys(
|
|
1409
|
+
f"{_STATE_PREFIX}/{_encode_cid(conversation_id)}/",
|
|
1410
|
+
consistency="strong",
|
|
1411
|
+
)
|
|
1412
|
+
for key in keys:
|
|
1413
|
+
await self._blob_delete(key)
|
|
1414
|
+
|
|
1415
|
+
async def _delete_claude_session_for_conversation(self, conversation_id: str) -> None:
|
|
1416
|
+
mapping_key = _claude_session_mapping_key(conversation_id)
|
|
1417
|
+
mapping = await self._blob_get_json_strict(mapping_key)
|
|
1418
|
+
session_id: Optional[str] = None
|
|
1419
|
+
if isinstance(mapping, str) and mapping:
|
|
1420
|
+
session_id = mapping
|
|
1421
|
+
elif isinstance(mapping, dict) and isinstance(mapping.get("session_id"), str):
|
|
1422
|
+
session_id = mapping["session_id"]
|
|
1423
|
+
elif isinstance(mapping, dict) and isinstance(mapping.get("sessionId"), str):
|
|
1424
|
+
session_id = mapping["sessionId"]
|
|
1425
|
+
if not session_id:
|
|
1426
|
+
session_id = _normalize_claude_uuid(conversation_id)
|
|
1427
|
+
|
|
1428
|
+
await self._blob_delete(mapping_key)
|
|
1429
|
+
if not session_id:
|
|
1430
|
+
return
|
|
1431
|
+
|
|
1432
|
+
keys = await self._blob_list_keys(f"{_CLAUDE_SESSION_PREFIX}/")
|
|
1433
|
+
encoded_session_id = _encode_segment(session_id)
|
|
1434
|
+
for key in keys:
|
|
1435
|
+
remainder = key[len(f"{_CLAUDE_SESSION_PREFIX}/"):]
|
|
1436
|
+
segments = remainder.split("/")
|
|
1437
|
+
if len(segments) >= 3 and segments[1] == encoded_session_id:
|
|
1438
|
+
await self._blob_delete(key)
|
|
1439
|
+
|
|
1274
1440
|
@staticmethod
|
|
1275
1441
|
def to_openai_input(messages: List[Message]) -> List[dict]:
|
|
1276
1442
|
"""Convert Messages to OpenAI-compatible format.
|
|
@@ -1326,7 +1492,7 @@ class ConversationMemory:
|
|
|
1326
1492
|
self._langgraph_store_cached = adapter
|
|
1327
1493
|
return adapter
|
|
1328
1494
|
|
|
1329
|
-
def openai_session(self, session_id: str, *, max_items: int = 100) -> "_EdgeOneMemorySession":
|
|
1495
|
+
def openai_session(self, session_id: Optional[str] = None, *, max_items: int = 100) -> "_EdgeOneMemorySession":
|
|
1330
1496
|
"""Create an OpenAI Agents SDK Session backed by ctx.store.
|
|
1331
1497
|
|
|
1332
1498
|
Usage with OpenAI Agents SDK::
|
|
@@ -1350,12 +1516,50 @@ class ConversationMemory:
|
|
|
1350
1516
|
session_id: Conversation/session identifier (typically ctx.conversation_id).
|
|
1351
1517
|
max_items: Maximum items to retrieve per get_items() call (default 100).
|
|
1352
1518
|
"""
|
|
1353
|
-
|
|
1519
|
+
resolved_session_id = (
|
|
1520
|
+
session_id if session_id is not None else self._conversation_id
|
|
1521
|
+
)
|
|
1522
|
+
if not resolved_session_id:
|
|
1523
|
+
raise MemoryValidationError(
|
|
1524
|
+
"openai_session requires a session_id or bound conversation_id"
|
|
1525
|
+
)
|
|
1526
|
+
if session_id is None:
|
|
1527
|
+
self._validate_conversation_id(resolved_session_id)
|
|
1528
|
+
return _EdgeOneMemorySession(self, resolved_session_id, max_items=max_items)
|
|
1354
1529
|
|
|
1355
|
-
def session(self, session_id: str, *, max_items: int = 100) -> "_EdgeOneMemorySession":
|
|
1530
|
+
def session(self, session_id: Optional[str] = None, *, max_items: int = 100) -> "_EdgeOneMemorySession":
|
|
1356
1531
|
"""Alias for :meth:`openai_session` (backward compatibility)."""
|
|
1357
1532
|
return self.openai_session(session_id, max_items=max_items)
|
|
1358
1533
|
|
|
1534
|
+
async def claude_session_binding(self, conversation_id: Optional[str] = None) -> str:
|
|
1535
|
+
"""Return a stable Claude SDK UUID for a conversation identifier."""
|
|
1536
|
+
resolved_conversation_id = (
|
|
1537
|
+
conversation_id if conversation_id is not None else self._conversation_id
|
|
1538
|
+
)
|
|
1539
|
+
if not resolved_conversation_id:
|
|
1540
|
+
raise MemoryValidationError(
|
|
1541
|
+
"claude_session_binding requires a conversation_id or bound conversation_id"
|
|
1542
|
+
)
|
|
1543
|
+
self._validate_conversation_id(resolved_conversation_id)
|
|
1544
|
+
mapping_key = _claude_session_mapping_key(resolved_conversation_id)
|
|
1545
|
+
mapping = await self._blob_get_json_strict(mapping_key)
|
|
1546
|
+
if isinstance(mapping, str) and mapping:
|
|
1547
|
+
return mapping
|
|
1548
|
+
if isinstance(mapping, dict):
|
|
1549
|
+
mapped_session_id = mapping.get("session_id") or mapping.get("sessionId")
|
|
1550
|
+
if isinstance(mapped_session_id, str) and mapped_session_id:
|
|
1551
|
+
return mapped_session_id
|
|
1552
|
+
|
|
1553
|
+
session_id = _normalize_claude_uuid(resolved_conversation_id) or str(uuid.uuid4())
|
|
1554
|
+
await self._blob_set_json(
|
|
1555
|
+
mapping_key,
|
|
1556
|
+
{
|
|
1557
|
+
"conversation_id": resolved_conversation_id,
|
|
1558
|
+
"session_id": session_id,
|
|
1559
|
+
},
|
|
1560
|
+
)
|
|
1561
|
+
return session_id
|
|
1562
|
+
|
|
1359
1563
|
def claude_session_store(self) -> "EdgeOneSessionStore":
|
|
1360
1564
|
"""Create a Claude Agent SDK SessionStore backed by EdgeOne blob storage.
|
|
1361
1565
|
|
|
@@ -1878,7 +2082,7 @@ class _LangGraphCheckpointerAdapter(_BaseCheckpointSaver):
|
|
|
1878
2082
|
if not checkpoint_id:
|
|
1879
2083
|
return None
|
|
1880
2084
|
|
|
1881
|
-
data = await self._memory.
|
|
2085
|
+
data = await self._memory._blob_get_json_strict(
|
|
1882
2086
|
self._checkpoint_key(thread_id, str(checkpoint_id), checkpoint_ns),
|
|
1883
2087
|
consistency="strong",
|
|
1884
2088
|
)
|
|
@@ -1926,13 +2130,10 @@ class _LangGraphCheckpointerAdapter(_BaseCheckpointSaver):
|
|
|
1926
2130
|
|
|
1927
2131
|
# Concurrent read all writes
|
|
1928
2132
|
async def _read_write(key: str):
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
return json.loads(raw)
|
|
1934
|
-
except Exception:
|
|
1935
|
-
return None
|
|
2133
|
+
return await self._memory._blob_get_json_strict(
|
|
2134
|
+
key,
|
|
2135
|
+
consistency="strong",
|
|
2136
|
+
)
|
|
1936
2137
|
|
|
1937
2138
|
results = await asyncio.gather(*[_read_write(k) for k in keys])
|
|
1938
2139
|
|
|
@@ -1950,14 +2151,24 @@ class _LangGraphCheckpointerAdapter(_BaseCheckpointSaver):
|
|
|
1950
2151
|
for channel_name, channel_value in writes:
|
|
1951
2152
|
pending_writes.append((task_id, channel_name, channel_value))
|
|
1952
2153
|
continue
|
|
1953
|
-
except Exception:
|
|
1954
|
-
|
|
2154
|
+
except Exception as exc:
|
|
2155
|
+
raise MemoryCorruptError(
|
|
2156
|
+
"LangGraph pending writes are corrupt or incompatible"
|
|
2157
|
+
) from exc
|
|
1955
2158
|
|
|
1956
2159
|
# Legacy format: writes stored as plain JSON
|
|
1957
2160
|
writes_legacy = wd.get("writes")
|
|
1958
2161
|
if writes_legacy:
|
|
1959
|
-
|
|
1960
|
-
|
|
2162
|
+
if not isinstance(writes_legacy, list):
|
|
2163
|
+
raise MemoryCorruptError(
|
|
2164
|
+
"LangGraph pending writes are corrupt or incompatible"
|
|
2165
|
+
)
|
|
2166
|
+
for write in writes_legacy:
|
|
2167
|
+
if not isinstance(write, (list, tuple)) or len(write) < 2:
|
|
2168
|
+
raise MemoryCorruptError(
|
|
2169
|
+
"LangGraph pending writes are corrupt or incompatible"
|
|
2170
|
+
)
|
|
2171
|
+
pending_writes.append((task_id, write[0], write[1]))
|
|
1961
2172
|
|
|
1962
2173
|
return pending_writes
|
|
1963
2174
|
|
|
@@ -2062,7 +2273,7 @@ class _LangGraphCheckpointerAdapter(_BaseCheckpointSaver):
|
|
|
2062
2273
|
keys = keys[:limit]
|
|
2063
2274
|
tuples = []
|
|
2064
2275
|
for key in keys:
|
|
2065
|
-
data = await self._memory.
|
|
2276
|
+
data = await self._memory._blob_get_json_strict(key)
|
|
2066
2277
|
if data is not None:
|
|
2067
2278
|
tuples.append(_to_checkpoint_tuple(data))
|
|
2068
2279
|
return tuples
|
|
@@ -2280,6 +2491,18 @@ class _EdgeOneMemorySession:
|
|
|
2280
2491
|
|
|
2281
2492
|
|
|
2282
2493
|
_CLAUDE_SESSION_PREFIX = "claude_sessions"
|
|
2494
|
+
_CLAUDE_SESSION_MAPPING_PREFIX = "claude_session_mapping"
|
|
2495
|
+
|
|
2496
|
+
|
|
2497
|
+
def _claude_session_mapping_key(conversation_id: str) -> str:
|
|
2498
|
+
return f"{_CLAUDE_SESSION_MAPPING_PREFIX}/{_encode_segment(conversation_id)}"
|
|
2499
|
+
|
|
2500
|
+
|
|
2501
|
+
def _normalize_claude_uuid(value: str) -> Optional[str]:
|
|
2502
|
+
try:
|
|
2503
|
+
return str(uuid.UUID(value)).lower()
|
|
2504
|
+
except (TypeError, ValueError, AttributeError):
|
|
2505
|
+
return None
|
|
2283
2506
|
|
|
2284
2507
|
|
|
2285
2508
|
class EdgeOneSessionStore:
|
|
@@ -2387,14 +2610,20 @@ class EdgeOneSessionStore:
|
|
|
2387
2610
|
entries: list = []
|
|
2388
2611
|
for k in keys:
|
|
2389
2612
|
raw = await self._blob.get(k, type="text")
|
|
2613
|
+
if raw is not None and not isinstance(raw, str):
|
|
2614
|
+
raise MemoryCorruptError(
|
|
2615
|
+
f"Claude session part '{k}' is not valid JSONL text"
|
|
2616
|
+
)
|
|
2390
2617
|
if raw:
|
|
2391
2618
|
for line in raw.split("\n"):
|
|
2392
2619
|
line = line.strip()
|
|
2393
2620
|
if line:
|
|
2394
2621
|
try:
|
|
2395
2622
|
entries.append(json.loads(line))
|
|
2396
|
-
except (json.JSONDecodeError, ValueError):
|
|
2397
|
-
|
|
2623
|
+
except (json.JSONDecodeError, ValueError) as exc:
|
|
2624
|
+
raise MemoryCorruptError(
|
|
2625
|
+
f"Claude session part '{k}' contains malformed JSONL"
|
|
2626
|
+
) from exc
|
|
2398
2627
|
return entries if entries else None
|
|
2399
2628
|
|
|
2400
2629
|
# ─── Optional Methods ───
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{r as nt}from"./react-hnpCyKql.js";import{r as rt,a as lt,l as ut,b as st}from"./tea-Slf_ajmf.js";import{r as ot}from"./moment-BYRO94Ou.js";import{c as it,j as ct}from"./highlight-ClXAL37H.js";var f=nt,k=lt,i=rt,$e=ut,Ke=st,dt=ot,mt=it,ft=ct;function de(e){return e&&e.__esModule?e:{default:e}}var a=de(f),q=de(dt),Ve=de(mt),gt=de(ft);function G(e){return String(e).padStart(2,"0")}function Te(e){const t=new Date(e);return`${G(t.getMonth()+1)}-${G(t.getDate())} ${G(t.getHours())}:${G(t.getMinutes())}:${G(t.getSeconds())}`}function Pe(e){const t=typeof e=="number"?e:Number(String(e).trim());return Number.isFinite(t)?t>=1e12?Te(t):t>=1e9?Te(t*1e3):String(e):String(e)}function ht({dataSource:e,color:t="#5B9DFF",...n}){const r=e.map(l=>Pe(l.Name)),u=[{data:e.map(l=>l.Data)}];return a.default.createElement(Ke.CoreLine,{...n,color:[t],grid:{show:!0,left:0,right:0,top:16,bottom:0},xAxis:{data:r,axisLine:{show:!1,lineStyle:{}},axisTick:{show:!1},axisLabel:{color:"#9CA3AF",margin:10},splitLine:{show:!1}},yAxis:{axisLine:{show:!1,lineStyle:{}},axisTick:{show:!1},axisLabel:{color:"#9CA3AF",formatter:l=>`${l} `},splitLine:{show:!0}},series:u})}function pt({dataSource:e,color:t,...n}){const r=Array.from(new Set(e.map(s=>Pe(s.Name)))),l=Array.from(new Set(e.map(s=>s.Type))).map(s=>({name:s,data:e.filter(o=>o.Type===s).map(o=>o.Data)}));return a.default.createElement(Ke.CompareLine,{...n,color:t,grid:{show:!0,left:0,right:0,top:16,bottom:0},xAxis:{data:r,axisLine:{show:!1,lineStyle:{}},axisTick:{show:!1},axisLabel:{color:"#9CA3AF",margin:10},splitLine:{show:!1}},yAxis:{axisLine:{show:!1,lineStyle:{}},axisTick:{show:!1},axisLabel:{color:"#9CA3AF",formatter:s=>`${s} `},splitLine:{show:!0}},series:l})}function je({children:e,loading:t}){return a.default.createElement("div",{className:"agent-obs-loading"},a.default.createElement("div",{className:"agent-obs-loading-content"},e),a.default.createElement("div",{className:`agent-obs-loading-mask${t?"":" agent-obs-loading-mask--hidden"}`},a.default.createElement(k.Icon,{type:"loading"})))}function Et(){return a.default.createElement("svg",{width:"550",height:"181",viewBox:"0 0 550 181",fill:"none",xmlns:"http://www.w3.org/2000/svg"},a.default.createElement("line",{y1:"90.5",x2:"550",y2:"90.5",stroke:"#F0F0F0"}),a.default.createElement("line",{y1:"180.5",x2:"550",y2:"180.5",stroke:"#F0F0F0"}),a.default.createElement("line",{y1:"0.5",x2:"550",y2:"0.5",stroke:"#F0F0F0"}))}function vt(){return a.default.createElement("div",{className:"agent-obs-empty"},a.default.createElement("div",{className:"agent-obs-empty-bg"},a.default.createElement(Et,null)),a.default.createElement("div",{className:"agent-obs-empty-text"},i.t("暂无数据")))}var Fe=260;function bt({title:e,unit:t,data:n,jumpTo:r,loading:u,isMultiLine:l,openInNewTab:s}){const o=!u&&(!n||n.length===0),c=a.default.createElement("div",{className:"agent-obs-card-header"},a.default.createElement("div",{className:"agent-obs-card-titlebox"},a.default.createElement("div",{className:"agent-obs-card-title"},e),a.default.createElement("div",{className:"agent-obs-card-unit"},t??" ")),r&&a.default.createElement("div",{className:"agent-obs-card-jump"},a.default.createElement($e.ChevronRightIcon,{size:24}))),m=r?a.default.createElement("a",{className:"agent-obs-card-link",href:r,target:s?"_blank":void 0,rel:s?"noopener noreferrer":void 0},c):c,d=()=>{if(!n||n.length===0)return a.default.createElement("div",{className:"agent-obs-card-empty",style:{height:Fe}},o?a.default.createElement(vt,null):null);const g=l?pt:ht;return a.default.createElement(g,{height:Fe,smooth:!0,size:2,dataSource:n})};return a.default.createElement(k.Card,{className:"agent-obs-card",bordered:!1},a.default.createElement(k.Card.Body,{className:"agent-obs-card-body"},m,a.default.createElement("div",{className:"agent-obs-card-chart"},a.default.createElement(je,{loading:u},d()))))}var qe={agent_call:"Agent 调用",model_call:"模型调用",model_error_rate:"模型调用错误率",model_avg_latency:"模型调用平均耗时",token_total:"Token 总消耗",avg_token_per_model:"平均 Token/模型调用",agent_call_chart:"Agent 调用",model_call_chart:"模型调用",model_error_rate_chart:"模型调用错误率",model_avg_latency_chart:"模型调用平均耗时",token_total_chart:"Token 总消耗",avg_token_per_model_chart:"平均 Token/模型调用"},Ae={agent_call:"次",model_call:"次",model_error_rate:"%",model_avg_latency:"s",agent_call_chart:"次",model_call_chart:"次",model_error_rate_chart:"%",model_avg_latency_chart:"s"};function ye(e){if(e)return i.t(e)}function ze(e,t){return ye(qe[e]||t)||e}function Ce(e,t){return e in qe?ye(Ae[e]):ye(Ae[e]||t)}function kt(e,t){if(e===0)return"flat";const n=e>0;return((t??"higherIsBetter")==="higherIsBetter"?n:!n)?"up":"down"}function Q(e){const t=typeof e=="number"?e:Number(e.trim());if(!Number.isFinite(t))return String(e);const n=t.toFixed(2).replace(/\.00$/,"").replace(/(\.\d)0$/,"$1");return n==="-0"?"0":n}var _t=new Set(["token_total","avg_token_per_model"]);function yt(e){const t=typeof e.Value=="number"?e.Value:Number(e.Value.trim());return Number.isFinite(t)&&t===0?{valueText:"-"}:!_t.has(e.Key)||!Number.isFinite(t)?{valueText:Q(e.Value),unit:Ce(e.Key,e.Unit)}:t>=1e8?{valueText:Q(t/1e8),unit:i.t("亿")}:t>=1e4?{valueText:Q(t/1e4),unit:i.t("万")}:{valueText:Q(e.Value),unit:Ce(e.Key,e.Unit)}}function Ct(){return[{Key:"agent_call",Label:i.t("Agent 调用"),Value:"-"},{Key:"model_call",Label:i.t("模型调用"),Value:"-"},{Key:"model_error_rate",Label:i.t("模型调用错误率"),Value:"-",Unit:"%"},{Key:"model_avg_latency",Label:i.t("模型调用平均耗时"),Value:"-",Unit:"s"},{Key:"token_total",Label:i.t("Token 总消耗"),Value:"-"},{Key:"avg_token_per_model",Label:i.t("平均 Token/模型调用"),Value:"-"}]}var wt=new Set(["model_error_rate","model_avg_latency"]);function Nt({item:e}){const t=typeof e.Yoy=="number"&&!wt.has(e.Key),{valueText:n,unit:r}=yt(e);return a.default.createElement("div",{className:"agent-obs-overview-cell"},a.default.createElement("div",{className:"agent-obs-overview-label"},ze(e.Key,e.Label)),a.default.createElement("div",{className:"agent-obs-overview-value-row"},a.default.createElement("span",{className:"agent-obs-overview-value"},n),r&&a.default.createElement("span",{className:"agent-obs-overview-unit"},r)),t&&a.default.createElement("div",{className:"agent-obs-overview-delta"},a.default.createElement("span",{className:"agent-obs-overview-delta-label"},i.t("日同比")),a.default.createElement("span",{className:`agent-obs-overview-delta-value agent-obs-overview-delta-value--${kt(e.Yoy,e.DeltaSemantic)}`},e.Yoy>0?"+":"",Q(e.Yoy),"%")))}function xt({items:e,title:t,loading:n}){const u=!!e&&e.length>0?e:Ct();if(u.length===0)return null;const l=!!n;return a.default.createElement(k.Card,{className:"agent-obs-overview",bordered:!1},a.default.createElement(k.Card.Body,null,a.default.createElement("div",{className:"agent-obs-overview-title"},t?i.t(t):i.t("用量概览")),a.default.createElement("div",{className:l?"agent-obs-overview-grid agent-obs-overview-grid--loading":"agent-obs-overview-grid"},u.map(s=>a.default.createElement(Nt,{key:s.Key,item:s})),l&&a.default.createElement("div",{className:"agent-obs-overview-loading-mask"},a.default.createElement(k.Icon,{type:"loading"})))))}function Ue(e){const[t,n]=f.useState(!1),r=f.useCallback(()=>{t||(n(!0),e().catch(()=>{}).then(()=>n(!1)))},[t,e]);return{refreshing:t,trigger:r}}var me=7;function Tt(){return[{value:"1hour",text:i.t("近1小时")},{value:"6hour",text:i.t("近6小时")},{value:"24hour",text:i.t("近24小时")},{value:"3day",text:i.t("近3天")},{value:"7day",text:i.t("近7天")}]}function Ft(){return[{value:"30min",text:i.t("近30分钟")},{value:"1hour",text:i.t("近1小时")},{value:"6hour",text:i.t("近6小时")},{value:"24hour",text:i.t("近24小时")},{value:"3day",text:i.t("近3天")},{value:"7day",text:i.t("近7天")}]}function At(e){const t=q.default();return{"1hour":[t.clone().subtract(1,"hour"),t.clone()],"6hour":[t.clone().subtract(6,"hours"),t.clone()],"24hour":[t.clone().subtract(24,"hours"),t.clone()],"3day":[t.clone().subtract(3,"days"),t.clone()],"7day":[t.clone().subtract(me,"days"),t.clone()]}[e]||null}function Mt(e){const t=q.default();return{"30min":[t.clone().subtract(30,"minutes"),t.clone()],"1hour":[t.clone().subtract(1,"hour"),t.clone()],"6hour":[t.clone().subtract(6,"hours"),t.clone()],"24hour":[t.clone().subtract(24,"hours"),t.clone()],"3day":[t.clone().subtract(3,"days"),t.clone()],"7day":[t.clone().subtract(me,"days"),t.clone()]}[e]||null}function Ye(e){const t=q.default(),n=t.clone().subtract(me,"days").startOf("day");return!(e.isAfter(t,"day")||e.isBefore(n,"day"))}function We(e,t){const n=q.default(),r=n.clone().subtract(me,"days"),u=n.format("YYYY-MM-DD"),l=r.format("YYYY-MM-DD"),s=e==null?void 0:e[t==="start"?0:1],o=s?s.format("YYYY-MM-DD"):u;return{disabledHours:()=>{const c=[];if(o===u)for(let m=n.hour()+1;m<=23;m++)c.push(m);if(o===l)for(let m=0;m<r.hour();m++)c.push(m);return c},disabledMinutes:c=>{const m=[];if(o===u&&c===n.hour())for(let d=n.minute()+1;d<=59;d++)m.push(d);if(o===l&&c===r.hour())for(let d=0;d<r.minute();d++)m.push(d);return m},disabledSeconds:(c,m)=>{const d=[];if(o===u&&c===n.hour()&&m===n.minute())for(let g=n.second()+1;g<=59;g++)d.push(g);if(o===l&&c===r.hour()&&m===r.minute())for(let g=0;g<r.second();g++)d.push(g);return d}}}var{RangePicker:Lt}=k.DatePicker,St=()=>e=>{const t=q.default();return{"15min":[t.clone().subtract(15,"minutes"),t.clone()],"1hour":[t.clone().subtract(1,"hour"),t.clone()],"6hour":[t.clone().subtract(6,"hours"),t.clone()],"12hour":[t.clone().subtract(12,"hours"),t.clone()],"24hour":[t.clone().subtract(24,"hours"),t.clone()]}[e]||null};function Rt(){return[{value:"15min",text:i.t("近15分钟")},{value:"1hour",text:i.t("近1小时")},{value:"6hour",text:i.t("近6小时")},{value:"12hour",text:i.t("近12小时")},{value:"24hour",text:i.t("近24小时")}]}var It=({onChange:e,defaultValue:t=null,defaultSegmentValue:n="15min",quickOptions:r=Rt(),rangeGenerator:u=St(),className:l,style:s,selectStyle:o,selectClassName:c,rangePickerStyle:m,rangePickerClassName:d,disabledDate:g,disabledTime:h,showTime:v={format:"HH:mm:ss",minuteStep:1,secondStep:1},placeholder:y=[i.t("开始时间"),i.t("结束时间")],selectPlaceholder:C=i.t("请选择时间范围")})=>{const[w,x]=f.useState(n),[A,L]=f.useState(()=>!t&&n?u(n):t);function D(F){const[S,V]=F;return r.reduce((W,P)=>{const p=u(P.value);if(p){const N=V.diff(S,"minutes"),b=p[1].diff(p[0],"minutes");if(Math.abs(N-b)<=1&&V.diff(q.default(),"minutes")<=1)return P.value}return W},null)}const M=F=>{x(F);const S=u(F);S&&(L(S),e==null||e(S,F))},K=F=>{L(F);const S=D(F);x(S),e==null||e(F,S)};return a.default.createElement("div",{className:l,style:s},a.default.createElement(k.Select,{appearance:"button",options:r,value:w||void 0,onChange:M,placeholder:C,className:c,style:o,listWidth:130}),a.default.createElement(Lt,{showTime:v,value:A||void 0,onChange:K,disabledDate:g,disabledTime:h,placeholder:y,className:d,style:m}))},Ge=It;function He(){return[{value:"all",text:i.t("全部环境")},{value:"production",text:i.t("生产环境")},{value:"preview",text:i.t("预览环境")}]}function Dt({selectedEnvironment:e,selectedTimeRange:t,customRange:n,onEnvironmentChange:r,onTimeChange:u,refreshFunction:l}){const s=f.useMemo(He,[]),o=f.useMemo(Ft,[]),{refreshing:c,trigger:m}=Ue(l),d=`${t||"custom"}-${n?n[0].valueOf():"null"}`;return a.default.createElement(k.Card,{className:"agent-obs-filter"},a.default.createElement(k.Card.Body,{className:"agent-obs-filter-body"},a.default.createElement(k.Space,{wrap:!0},a.default.createElement(k.Select,{appearance:"button",options:s,value:e,onChange:g=>r(g),listWidth:130}),a.default.createElement(Ge,{key:d,defaultSegmentValue:t,defaultValue:n,quickOptions:o,rangeGenerator:Mt,disabledDate:Ye,disabledTime:We,onChange:u,className:"quick-date-picker",selectClassName:"time-range-select",selectStyle:{marginRight:"-1px"},rangePickerClassName:"time-range-picker",showTime:{format:"HH:mm:ss",minuteStep:1,secondStep:1},placeholder:[i.t("开始时间"),i.t("结束时间")],selectPlaceholder:i.t("请选择时间范围")}),a.default.createElement(k.Button,{icon:"refresh",className:`agent-obs-filter-refresh${c?" agent-obs-filter-refresh--rotating":""}`,onClick:m}),a.default.createElement(k.Bubble,{content:i.t("数据延迟 < 10min")},a.default.createElement("span",{className:"agent-obs-filter-tip"},a.default.createElement($e.ErrorCircleIcon,null))))))}function Ot(e,t){const n=f.useRef(e);f.useEffect(()=>{const r=n.current;Object.keys(e).some(l=>r[l]!==e[l])&&(n.current=e,t==null||t(e))},[e])}var Bt={environment:"all",timeRange:"24hour",customRange:null};function $t({overview:e,charts:t,loading:n,defaultFilter:r,onFilterChange:u,onRefresh:l,columns:s=2}){const[o,c]=f.useState({...Bt,...r});Ot(o,u);const m=g=>c(h=>({...h,...g})),d=async()=>{l?await l(o):u==null||u(o)};return a.default.createElement("div",{className:"agent-obs"},a.default.createElement(Dt,{selectedEnvironment:o.environment,selectedTimeRange:o.timeRange,customRange:o.customRange,onEnvironmentChange:g=>m({environment:g}),onTimeChange:(g,h)=>{m(h?{timeRange:h,customRange:null}:{customRange:g,timeRange:null})},refreshFunction:d}),a.default.createElement(xt,{items:e,loading:n}),a.default.createElement(Kt,{charts:t??[],columns:s,loading:n}))}function Kt({charts:e,columns:t,loading:n}){const r=Math.max(1,Math.floor(24/t)),u=e.length>0?e:Vt(),l=Pt(u,t);return a.default.createElement(a.default.Fragment,null,l.map((s,o)=>a.default.createElement(k.Row,{key:o},s.map((c,m)=>a.default.createElement(k.Col,{key:c.Key,span:r,style:m%2===0?{paddingLeft:0}:{paddingRight:0}},a.default.createElement(bt,{title:ze(c.Key,c.Title),unit:Ce(c.Key,c.Unit),data:c.Series,isMultiLine:c.IsMultiLine,jumpTo:c.jumpTo,openInNewTab:c.openInNewTab,loading:n}))))))}function Vt(){return[{Key:"agent_call_chart",Title:i.t("Agent 调用"),Unit:i.t("次"),Series:[]},{Key:"model_call_chart",Title:i.t("模型调用"),Unit:i.t("次"),Series:[]},{Key:"model_error_rate_chart",Title:i.t("模型调用错误率"),Unit:"%",Series:[]},{Key:"model_avg_latency_chart",Title:i.t("模型调用平均耗时"),Unit:"s",Series:[]},{Key:"token_total_chart",Title:i.t("Token 总消耗"),Series:[]},{Key:"avg_token_per_model_chart",Title:i.t("平均 Token/模型调用"),Series:[]}]}function Pt(e,t){if(t<=0)return[e];const n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function jt({environment:e,timeRange:t,customRange:n,keyword:r,onEnvironmentChange:u,onTimeChange:l,onKeywordChange:s,onSearchSubmit:o,refreshFunction:c}){const m=f.useMemo(He,[]),d=f.useMemo(Tt,[]),{refreshing:g,trigger:h}=Ue(c),v=`${t||"custom"}-${n?n[0].valueOf():"null"}`;return a.default.createElement(k.Card,{className:"filter-card agent-obs-traces-filter"},a.default.createElement(k.Card.Body,null,a.default.createElement(k.Space,{wrap:!0},a.default.createElement(k.Select,{appearance:"button",options:m,value:e,onChange:y=>u(y),className:"log-filter-select",listWidth:130}),a.default.createElement(Ge,{key:v,defaultSegmentValue:t,defaultValue:n,quickOptions:d,rangeGenerator:At,disabledDate:Ye,disabledTime:We,onChange:l,className:"quick-date-picker",selectClassName:"time-range-select",selectStyle:{marginRight:"-1px"},rangePickerClassName:"time-range-picker",showTime:{format:"HH:mm:ss",minuteStep:1,secondStep:1},placeholder:[i.t("开始时间"),i.t("结束时间")],selectPlaceholder:i.t("请选择时间范围")}),a.default.createElement(k.SearchBox,{className:"traces-filter-search",placeholder:i.t("可根据 run-id 和 conversation-id 搜索"),value:r,onChange:y=>s(y),onSearch:y=>o(y||""),onPressEnter:()=>o(r),onClear:()=>{s(""),o("")}}),a.default.createElement(k.Button,{type:"primary",onClick:h,loading:g},i.t("刷新")))))}var{filterable:qt,stylize:zt}=k.Table.addons,ie="-";function Ut(e){return{all:"",production:i.t("生产"),preview:i.t("预览"),dev:i.t("开发"),development:i.t("开发")}[e]||e}function we(e){return{success:i.t("成功"),failed:i.t("失败")}[e]}function Yt(){return[{value:"success",text:we("success")},{value:"failed",text:we("failed")}]}var Wt={environment:"all",timeRange:"1hour",customRange:null,statuses:[],keyword:"",pageIndex:1,pageSize:10};function Gt(e){return e.HasError?"failed":"success"}function Ht(e){return e??ie}function Xt(e){return e?q.default(e).format("YYYY-MM-DD HH:mm:ss.SSS"):ie}function Qt({rows:e,pagination:t,loading:n,onRowClick:r,onQueryChange:u,defaultQuery:l}){const s=f.useMemo(Yt,[]),[o,c]=f.useState({...Wt,...l}),m=(h,v=!0)=>{c(y=>{const C={...y,...h,...v?{pageIndex:1}:{}};return u==null||u(C),C})},d=f.useMemo(()=>[{key:"traceId",header:i.t("TraceId (run-id)"),width:260,render:h=>a.default.createElement("a",{className:"agent-obs-traces-trace-id",onClick:v=>{v.preventDefault(),r==null||r(h)},href:"#"},h.TraceId)},{key:"env",header:i.t("环境"),width:80,render:h=>{const v=h.Env||"all";if(v==="all")return ie;const y=String(v).replace(/[^a-zA-Z0-9_-]/g,"-");return a.default.createElement(k.Badge,{className:`agent-obs-traces-env agent-obs-traces-env--${y}`},Ut(v))}},{key:"status",header:i.t("状态"),width:100,render:h=>{const v=Gt(h);return a.default.createElement("span",{className:`agent-obs-traces-status agent-obs-traces-status--${v}`},we(v))}},{key:"totalTokens",header:i.t("Total Tokens"),width:140,render:h=>Ht(h.TotalToken)},{key:"durationMs",header:i.t("响应时间(秒)"),width:160,render:h=>h.DurationMs!=null?(Math.ceil(h.DurationMs/100)/10).toFixed(1):ie},{key:"startTime",header:i.t("开始时间"),width:200,render:h=>Xt(h.StartTimeMs)}],[r]),g=()=>{if(n&&e.length===0)return a.default.createElement(k.StatusTip,{status:"loading"});if(!n&&e.length===0)return a.default.createElement(k.StatusTip,{status:"empty"})};return a.default.createElement("div",{className:"agent-obs-traces"},a.default.createElement(k.Card,null,a.default.createElement("div",{className:"agent-obs-traces-wrapper"},a.default.createElement(je,{loading:n&&e.length>0},a.default.createElement(k.Table,{className:"agent-obs-traces-table",records:e,recordKey:h=>h.TraceId,columns:d,bordered:!1,topTip:g(),bottomTip:e.length>0?a.default.createElement(k.Pagination,{recordCount:t.total,pageSizeOptions:[10,20,30,50,100],pageSize:t.pageSize,pageIndex:t.pageIndex,stateTextVisible:!0,pageSizeVisible:!0,pageIndexVisible:!0,jumpVisible:!0,endJumpVisible:!0,disabled:n,onPagingChange:({pageIndex:h,pageSize:v})=>{m({pageIndex:h,pageSize:v},!1)}}):void 0,addons:[qt({type:"multiple",column:"status",value:o.statuses,onChange:h=>m({statuses:h}),all:{value:"__all__",text:i.t("全部")},options:s}),zt({bodyClassName:"agent-obs-traces-table-body",bodyStyle:{borderBottom:"none"}})]})))))}var Zt={environment:"all",timeRange:"24hour",customRange:null,keyword:""};function Jt({rows:e,pagination:t,loading:n,onRowClick:r,defaultFilter:u,onQueryChange:l,onRefresh:s}){const[o,c]=f.useState({...Zt,...u}),[m,d]=f.useState(o.keyword),g=f.useRef({environment:o.environment,timeRange:o.timeRange,customRange:o.customRange,statuses:[],keyword:o.keyword,pageIndex:1,pageSize:t.pageSize}),h=()=>{l==null||l({...g.current,environment:o.environment,timeRange:o.timeRange,customRange:o.customRange,keyword:o.keyword})},v=f.useRef(o);f.useEffect(()=>{const w=v.current;Object.keys(o).some(A=>w[A]!==o[A])&&(v.current=o,g.current={...g.current,pageIndex:1},h())},[o]);const y=w=>c(x=>({...x,...w})),C=async()=>{const w=(m||"").trim();w!==m&&d(w);const x={...g.current,environment:o.environment,timeRange:o.timeRange,customRange:o.customRange,keyword:w,pageIndex:w!==o.keyword?1:g.current.pageIndex};if(w!==o.keyword){const A={...o,keyword:w};v.current=A,g.current={...g.current,pageIndex:1},c(A)}s?await s(x):l==null||l(x)};return a.default.createElement("div",{className:"agent-obs"},a.default.createElement(jt,{environment:o.environment,timeRange:o.timeRange,customRange:o.customRange,keyword:m,onEnvironmentChange:w=>y({environment:w}),onTimeChange:(w,x)=>{y(x?{timeRange:x,customRange:null}:{customRange:w,timeRange:null})},onKeywordChange:d,onSearchSubmit:w=>{const x=(w||"").trim();d(x),x!==o.keyword&&y({keyword:x})},refreshFunction:C}),a.default.createElement(Qt,{rows:e,pagination:t,loading:n,onRowClick:r,defaultQuery:g.current,onQueryChange:w=>{g.current=w,h()}}))}var ea=["AGENT","CHAIN","LLM","TOOL","RETRIEVER","RERANKER","EMBEDDING","EVALUATOR","GUARDRAIL","PROMPT","MANUAL","INTERNAL"];function te(e){if(!e)return null;const t=e.trim().toUpperCase();return t==="GENERATION"?"LLM":ea.includes(t)?t:null}var Z="langfuse.";function B(e,t){var n;const r=`${Z}${t}`,u=(n=e.Tags)==null?void 0:n.find(l=>l.Key===r);return u==null?void 0:u.Value}function Y(e,t){for(const n of t){const r=B(e,n);if(r!==void 0&&r!=="")return r}}function ta(e,t){var n;const r=(n=e.Tags)==null?void 0:n.find(u=>u.Key===t);return r==null?void 0:r.Value}function se(e,t){const n=ta(e,t);return n!==void 0&&n!==""?n:B(e,t)}function aa(e,t){for(const n of t){const r=se(e,n);if(r!==void 0&&r!=="")return r}}function Xe(e){const t=te(B(e,"openinference.span.kind"));if(t)return t;const n=te(B(e,"gen_ai.span.kind"));if(n)return n;const r=B(e,"span.kind"),u=te(r);if(u)return u;for(const s of e.Tags||[]){const o=te(s.Value);if(o)return o}const l=(e.OperationName||"").toLowerCase();return l.includes("chat")||l.includes("llm")||l.includes("openai")?"LLM":l.includes("tool")||l.includes("get_")?"TOOL":l.includes("retriev")?"RETRIEVER":l.includes("embed")?"EMBEDDING":l.includes("prompt")?"PROMPT":l.includes("agent")?"AGENT":"UNKNOWN"}function na(e){const t=ge(e,"openinference.span.kind")||ge(e,"gen_ai.span.kind")||ge(e,"span.kind");return t||Xe(e)}function ge(e,t){const n=B(e,t);if(typeof n!="string")return;const r=n.trim();return r||void 0}function Qe(e){const t=se(e,"error");if(t)return t.toLowerCase()==="true";const n=se(e,"statusCode")||se(e,"otel.status_code");return n?n==="2"||n.toUpperCase()==="ERROR":!1}function ra(e){return aa(e,["exception.message","exception.type","status_message","otel.status_description","error.message"])}function Ze(e){const t=e.StartTime/1e3,n=e.Duration/1e3,r=t+n,u=m=>{if(m===void 0||m==="")return;const d=Number(m);return Number.isFinite(d)?d:void 0},l=u(Y(e,["llm.token_count.prompt","gen_ai.usage.input_tokens","gen_ai.usage.prompt_tokens"])),s=u(Y(e,["llm.token_count.completion","gen_ai.usage.completion_tokens","gen_ai.usage.output_tokens"])),o=u(Y(e,["llm.token_count.total","gen_ai.usage.total_tokens"])),c=o!==void 0?o:l!==void 0||s!==void 0?(l??0)+(s??0):void 0;return{startMs:t,endMs:r,durationMs:n,model:Y(e,["llm.model_name","gen_ai.response.model","gen_ai.request.model"]),inputTokens:l,outputTokens:s,totalTokens:c,cost:u(B(e,"llm.cost"))}}function Me(e,t){const n=e.get(t);if(n)return n;const r={toolCalls:new Map};return e.set(t,r),r}function la(e,t){const n=e.toolCalls.get(t);if(n)return n;const r={};return e.toolCalls.set(t,r),r}function ua(e){const t=e.trim();if(!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.stringify(JSON.parse(t),null,2)}catch{return e}}function Le(e,t){const n=`${Z}${t}`,r=new Map;(e.Tags||[]).forEach(l=>{if(!l.Key.startsWith(`${n}.`)||!l.Value)return;const s=l.Key.slice(n.length+1),o=s.match(/^(\d+)\.message\.(role|content)$/);if(o){const m=Me(r,Number(o[1]));o[2]==="role"&&(m.role=l.Value),o[2]==="content"&&(m.content=l.Value);return}const c=s.match(/^(\d+)\.message\.tool_calls\.(\d+)\.tool_call\.function\.(name|arguments)$/);if(c){const m=Me(r,Number(c[1])),d=la(m,Number(c[2]));c[3]==="name"&&(d.name=l.Value),c[3]==="arguments"&&(d.arguments=l.Value)}});const u=[];return Array.from(r.entries()).sort(([l],[s])=>l-s).forEach(([,l])=>{l.content&&u.push(l.role?`${l.role}: ${l.content}`:l.content),Array.from(l.toolCalls.entries()).sort(([s],[o])=>s-o).forEach(([s,o])=>{const c=[o.name?`Tool: ${o.name}`:`Tool #${s+1}`];o.arguments&&c.push(`Arguments: ${ua(o.arguments)}`),u.push(c.join(`
|
|
2
|
+
`))})}),u.length?u.join(`
|
|
3
|
+
|
|
4
|
+
`):void 0}function sa(e){const t=Le(e,"llm.input_messages"),n=Le(e,"llm.output_messages");return{input:t||Y(e,["input.value","gen_ai.prompt"]),output:n||Y(e,["output.value","gen_ai.completion"])}}function oa(e){const t=new Set(["input.value","output.value","input.mime_type","output.mime_type","tapm.relocated","tapm.source_pipeline","topic.id","index.app.id","time_bucket","peer.service","component","status_code_xx","traceID","origin.operation","service.instance"]),n=["llm.input_messages.","llm.output_messages."],r=new Set(["error","error.message","error.type","error.stack","exception.message","exception.type","exception.stacktrace","statusCode","otel.status_code","otel.status_description","status_message"]),u=[],l=new Set;return(e.Tags||[]).forEach(s=>{if(!s.Key||!s.Key.startsWith(Z))return;const o=s.Key.slice(Z.length);!o||t.has(o)||n.some(c=>o.startsWith(c))||l.has(o)||(l.add(o),u.push({Key:o,Value:s.Value}))}),(e.Tags||[]).forEach(s=>{!s.Key||s.Key.startsWith(Z)||r.has(s.Key)&&(l.has(s.Key)||(l.add(s.Key),u.push({Key:s.Key,Value:s.Value})))}),u}function ia(e){const n=(e.References||[]).find(r=>r.RefType==="CHILD_OF"&&r.SpanId);return(n==null?void 0:n.SpanId)||null}function ca(e){const t=new Map;for(const u of e){const l=Ze(u);t.set(u.SpanId,{span:u,spanId:u.SpanId,parentId:ia(u),kind:Xe(u),children:[],startMs:l.startMs,endMs:l.endMs,durationMs:l.durationMs,hasError:Qe(u)})}const n=[];for(const u of t.values())u.parentId&&t.has(u.parentId)?t.get(u.parentId).children.push(u):n.push(u);const r=u=>{u.sort((l,s)=>l.startMs-s.startMs),u.forEach(l=>r(l.children))};return r(n),n}var O=168,ce=56,Se=56,ae=28,he=48,Re=40;function da(e){const t=[],n=[],r=new Map,u=d=>{if(r.has(d.spanId))return r.get(d.spanId);if(d.children.length===0)return r.set(d.spanId,O),O;const g=d.children.reduce((v,y,C)=>v+u(y)+(C>0?ae:0),0),h=Math.max(O,g);return r.set(d.spanId,h),h},l=(d,g,h)=>{const v=u(d),C=h+v/2-O/2,w=Re+g*(ce+Se);t.push({id:d.spanId,x:C,y:w,level:g,node:d});let x=h+(v-d.children.reduce((L,D,M)=>L+u(D)+(M>0?ae:0),0))/2,A=Number.NEGATIVE_INFINITY;d.children.forEach(L=>{const D=u(L),M=L.startMs<A?"parallel":"seq";l(L,g+1,x),n.push({from:d.spanId,to:L.spanId,label:M,dashed:M==="parallel"||L.kind==="LLM"}),A=Math.max(A,L.endMs),x+=D+ae})};let s=he;e.forEach(d=>{const g=u(d);l(d,0,s),s+=g+ae*2});const o=Math.max(...t.map(d=>d.x+O),he*2)+he,c=Math.max(...t.map(d=>d.level),0),m=Re*2+(c+1)*ce+c*Se;return{nodes:t,edges:n,width:o,height:m}}function fe(e){return!Number.isFinite(e)||e<0?"-":e<1?`${e.toFixed(2)}ms`:e<1e3?`${e.toFixed(e<10?2:1)}ms`:`${(e/1e3).toFixed(2)}s`}function pe(e){return e==null||!Number.isFinite(e)?"-":e.toLocaleString()}function ma(e){if(!e)return"-";const t=new Date(e),n=(r,u=2)=>String(r).padStart(u,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function Je(e){if(!e)return null;const t=e.trim();if(!t.startsWith("{")&&!t.startsWith("["))return null;try{return JSON.parse(t)}catch{return null}}function $({size:e=16,className:t,style:n,label:r,viewBox:u,children:l}){return a.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:e,height:e,viewBox:u,fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-label":i.t(r),className:t,style:n},l)}function fa(e){return a.default.createElement($,{...e,label:"AGENT",viewBox:"2 0.25 20 20"},a.default.createElement("rect",{x:"5",y:"7",width:"14",height:"11",rx:"2.5"}),a.default.createElement("path",{d:"M12 4v3"}),a.default.createElement("circle",{cx:"12",cy:"3.5",r:"1"}),a.default.createElement("circle",{cx:"9.5",cy:"12",r:"1.1"}),a.default.createElement("circle",{cx:"14.5",cy:"12",r:"1.1"}),a.default.createElement("path",{d:"M9.5 15.5h5"}),a.default.createElement("path",{d:"M3.5 12.5v2M20.5 12.5v2"}))}function ga(e){return a.default.createElement($,{...e,label:"CHAIN",viewBox:"2 2 20 20"},a.default.createElement("path",{d:"M9.5 14.5a3.5 3.5 0 0 1 0-4.95l2.12-2.12a3.5 3.5 0 0 1 4.95 4.95l-1.06 1.06"}),a.default.createElement("path",{d:"M14.5 9.5a3.5 3.5 0 0 1 0 4.95l-2.12 2.12a3.5 3.5 0 0 1-4.95-4.95l1.06-1.06"}))}function ha(e){return a.default.createElement($,{...e,label:"EMBEDDING",viewBox:"2.9 2.9 18.2 18.2"},a.default.createElement("circle",{cx:"6",cy:"6",r:"1.6"}),a.default.createElement("circle",{cx:"18",cy:"6",r:"1.6"}),a.default.createElement("circle",{cx:"6",cy:"18",r:"1.6"}),a.default.createElement("circle",{cx:"18",cy:"18",r:"1.6"}),a.default.createElement("circle",{cx:"12",cy:"12",r:"2.2"}),a.default.createElement("path",{d:"M7.4 7.4 10.4 10.4M16.6 7.4l-3 3M7.4 16.6l3-3M16.6 16.6l-3-3"}))}function pa(e){return a.default.createElement($,{...e,label:"EVALUATOR",viewBox:"2.5 2.5 19 19"},a.default.createElement("path",{d:"M12 4v16"}),a.default.createElement("path",{d:"M5 9h14"}),a.default.createElement("path",{d:"M8 9 5 15a3 3 0 0 0 6 0L8 9Z"}),a.default.createElement("path",{d:"M16 9l-3 6a3 3 0 0 0 6 0l-3-6Z"}),a.default.createElement("path",{d:"M8 20h8"}))}function Ea(e){return a.default.createElement($,{...e,label:"GUARDRAIL",viewBox:"1.5 1.5 21 21"},a.default.createElement("path",{d:"M12 3 4 6v6c0 4.5 3.4 8.4 8 9 4.6-.6 8-4.5 8-9V6l-8-3Z"}),a.default.createElement("path",{d:"m9 12 2 2 4-4"}))}function va({size:e=16,className:t,style:n}){return a.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:e,height:e,viewBox:"0 0 16 16",fill:"currentColor",stroke:"none","aria-label":i.t("LLM"),className:t,style:n},a.default.createElement("path",{d:"M6.75098 2.91992C6.96271 2.80436 7.21893 2.80436 7.43066 2.91992C7.6754 3.05361 7.83917 3.54583 8.16699 4.5293L8.38477 5.18262C8.56011 5.70865 8.64848 5.97198 8.79785 6.19043C8.93022 6.38394 9.09751 6.55122 9.29102 6.68359C9.50951 6.83305 9.77263 6.92128 10.2988 7.09668L10.9531 7.31445C11.936 7.64209 12.4277 7.80621 12.5615 8.05078C12.6771 8.26252 12.6771 8.51873 12.5615 8.73047C12.4279 8.9752 11.9364 9.13905 10.9531 9.4668L10.2988 9.68555C9.77276 9.8609 9.50948 9.94826 9.29102 10.0977C9.09752 10.23 8.93022 10.3973 8.79785 10.5908C8.64839 10.8093 8.56016 11.0724 8.38477 11.5986L8.16699 12.2529C7.8393 13.236 7.67528 13.7275 7.43066 13.8613C7.21893 13.9769 6.96271 13.9769 6.75098 13.8613C6.50636 13.7275 6.34234 13.236 6.01465 12.2529L5.79688 11.5986C5.62148 11.0724 5.53325 10.8093 5.38379 10.5908C5.25142 10.3973 5.08412 10.23 4.89062 10.0977C4.67216 9.94826 4.40888 9.8609 3.88281 9.68555L3.22852 9.4668C2.24527 9.13905 1.75373 8.9752 1.62012 8.73047C1.50455 8.51873 1.50455 8.26252 1.62012 8.05078C1.75398 7.80621 2.2456 7.64209 3.22852 7.31445L3.88281 7.09668C4.40901 6.92128 4.67213 6.83305 4.89062 6.68359C5.08413 6.55122 5.25142 6.38394 5.38379 6.19043C5.53316 5.97198 5.62153 5.70865 5.79688 5.18262L6.01465 4.5293C6.34247 3.54583 6.50624 3.05361 6.75098 2.91992ZM12.8184 0.693359C12.9088 0.64411 13.0179 0.64411 13.1084 0.693359C13.2132 0.750535 13.2836 0.961008 13.4238 1.38184L13.5596 1.78809C13.6346 2.01303 13.6724 2.12529 13.7363 2.21875C13.793 2.30158 13.8644 2.37303 13.9473 2.42969C14.0407 2.49361 14.153 2.53147 14.3779 2.60645L14.7842 2.74219C15.205 2.88246 15.4155 2.95286 15.4727 3.05762C15.5219 3.14809 15.5219 3.25719 15.4727 3.34766C15.4155 3.45241 15.205 3.52281 14.7842 3.66309L14.3779 3.79883C14.153 3.87381 14.0407 3.91166 13.9473 3.97559C13.8644 4.03225 13.793 4.10369 13.7363 4.18652C13.6724 4.27998 13.6346 4.39225 13.5596 4.61719L13.4238 5.02344C13.2836 5.44427 13.2132 5.65474 13.1084 5.71191C13.0179 5.76116 12.9088 5.76116 12.8184 5.71191C12.7136 5.65474 12.6432 5.44427 12.5029 5.02344L12.3672 4.61719C12.2922 4.39225 12.2544 4.27998 12.1904 4.18652C12.1338 4.10369 12.0623 4.03225 11.9795 3.97559C11.886 3.91166 11.7738 3.87381 11.5488 3.79883L11.1426 3.66309C10.7218 3.52281 10.5113 3.45241 10.4541 3.34766C10.4049 3.25719 10.4049 3.14809 10.4541 3.05762C10.5113 2.95286 10.7218 2.88246 11.1426 2.74219L11.5488 2.60645C11.7738 2.53147 11.886 2.49361 11.9795 2.42969C12.0623 2.37303 12.1338 2.30158 12.1904 2.21875C12.2544 2.12529 12.2922 2.01303 12.3672 1.78809L12.5029 1.38184C12.6432 0.961008 12.7136 0.750535 12.8184 0.693359Z"}))}function ba(e){return a.default.createElement($,{...e,label:"PROMPT",viewBox:"3.5 2.5 19 19"},a.default.createElement("path",{d:"M5 5h14v10H9l-4 4V5Z"}),a.default.createElement("path",{d:"M8.5 9.5h7M8.5 12h4.5"}),a.default.createElement("path",{d:"m17 17 1.5 1.5L21 16"}))}function ka(e){return a.default.createElement($,{...e,label:"RERANKER",viewBox:"2.5 2 20 20"},a.default.createElement("path",{d:"M4 7h10"}),a.default.createElement("path",{d:"M4 12h7"}),a.default.createElement("path",{d:"M4 17h12"}),a.default.createElement("path",{d:"M18 4v16"}),a.default.createElement("path",{d:"m15 7 3-3 3 3"}),a.default.createElement("path",{d:"m15 17 3 3 3-3"}))}function _a(e){return a.default.createElement($,{...e,label:"RETRIEVER",viewBox:"1.5 1.75 21 21"},a.default.createElement("ellipse",{cx:"9",cy:"6",rx:"6",ry:"2.5"}),a.default.createElement("path",{d:"M3 6v6c0 1.38 2.69 2.5 6 2.5s6-1.12 6-2.5V6"}),a.default.createElement("path",{d:"M3 12v4c0 1.38 2.69 2.5 6 2.5 1 0 1.96-.1 2.82-.28"}),a.default.createElement("circle",{cx:"17",cy:"17",r:"3"}),a.default.createElement("path",{d:"m21 21-1.8-1.8"}))}function ya({size:e=16,className:t,style:n}){return a.default.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:e,height:e,viewBox:"0 0 16 16",fill:"currentColor",stroke:"none","aria-label":i.t("TOOL"),className:t,style:n},a.default.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12.3473 7.71709C11.4282 8.63549 10.0466 8.78881 8.95807 8.20271L4.22084 12.938C3.90023 13.2583 3.38052 13.2583 3.05951 12.938C2.7393 12.6173 2.7393 12.0985 3.05951 11.7778L7.79754 7.04251C7.21188 5.95517 7.36538 4.57517 8.28405 3.65677C8.83493 3.1063 9.55371 2.84447 10.2753 2.83566C9.51933 3.63956 9.52933 4.90145 10.3157 5.68733C11.1016 6.47281 12.3641 6.48282 13.1684 5.72737C13.1596 6.44839 12.8982 7.16662 12.3473 7.71709ZM13.6565 4.14959C13.4542 4.37699 13.1184 4.66644 12.6371 5.10722C12.1274 5.61647 11.4058 5.61647 10.8961 5.10722C10.386 4.59718 10.386 3.87656 10.8961 3.36692C11.3659 2.89731 11.8708 2.34122 11.8628 2.33882C10.4976 1.70907 8.82854 1.95249 7.7036 3.07667C6.6782 4.10116 6.38598 5.57683 6.81733 6.86235L2.47945 11.1981C1.83823 11.8387 1.83823 12.8776 2.47945 13.5181C3.12068 14.1587 4.16007 14.1587 4.80129 13.5181L9.13875 9.18276C10.426 9.61473 11.9023 9.32169 12.9277 8.2972C14.0511 7.17422 14.2846 5.51278 13.6565 4.14959Z"}))}function Ca(e){return a.default.createElement($,{...e,label:"MANUAL",viewBox:"0 0 24 24"},a.default.createElement("path",{d:"M15.5 4.5 19.5 8.5 9 19l-4.5 1L5.5 15.5 15.5 4.5Z"}),a.default.createElement("path",{d:"m13.5 6.5 4 4"}),a.default.createElement("path",{d:"M5.5 15.5 9 19"}))}function Ie(e){return a.default.createElement($,{...e,label:"UNKNOWN",viewBox:"0 0 24 24"},a.default.createElement("path",{d:"M8 4 Q5 4 5 7 L5 10 Q5 12 3 12 Q5 12 5 14 L5 17 Q5 20 8 20"}),a.default.createElement("path",{d:"M16 4 Q19 4 19 7 L19 10 Q19 12 21 12 Q19 12 19 14 L19 17 Q19 20 16 20"}),a.default.createElement("circle",{cx:"12",cy:"12",r:"1.4",fill:"currentColor",stroke:"none"}))}var De={AGENT:fa,CHAIN:ga,LLM:va,TOOL:ya,RETRIEVER:_a,RERANKER:ka,EMBEDDING:ha,EVALUATOR:pa,GUARDRAIL:Ea,PROMPT:ba,MANUAL:Ca,INTERNAL:Ie,UNKNOWN:Ie};function wa({kind:e,...t}){const n=De[e]||De.UNKNOWN;return a.default.createElement(n,{...t})}var J=20,j=32,ne="#A8A29E",Ee=6,ve=16,re=e=>e*J+J/2;function Na({ancestorsIsLast:e,isLast:t,isRoot:n,hasChildren:r,isExpanded:u,onToggle:l}){const s=e.length,c=(s+1)*J,m=j/2,d=[];if(e.forEach((v,y)=>{if(v)return;const C=re(y)+.5;d.push(a.default.createElement("line",{key:`anc-${y}`,x1:C,y1:-.5,x2:C,y2:j+.5,stroke:ne,strokeWidth:1,shapeRendering:"crispEdges"}))}),!n){const v=re(s-1)+.5,y=re(s),C=t?m-Ee:j+.5;d.push(a.default.createElement("line",{key:"vline",x1:v,y1:-.5,x2:v,y2:C,stroke:ne,strokeWidth:1,shapeRendering:"crispEdges"}));const w=`M ${v} ${m-Ee} Q ${v} ${m} ${v+Ee} ${m} L ${y} ${m}`;d.push(a.default.createElement("path",{key:"arc",d:w,fill:"none",stroke:ne,strokeWidth:1}))}if(r&&u){const v=re(s)+.5;d.push(a.default.createElement("line",{key:"vdown",x1:v,y1:m+ve/2,x2:v,y2:j+.5,stroke:ne,strokeWidth:1,shapeRendering:"crispEdges"}))}const g=s*J+(J-ve)/2,h=(j-ve)/2;return a.default.createElement("span",{className:"agent-obs-td-tree-indent",style:{width:c,flex:`0 0 ${c}px`,height:j}},a.default.createElement("svg",{className:"agent-obs-td-tree-lines",width:c,height:j,viewBox:`0 0 ${c} ${j}`,"aria-hidden":"true"},d),a.default.createElement("span",{className:"agent-obs-td-tree-control",style:{left:g,top:h}},r?a.default.createElement("span",{className:`agent-obs-td-tree-expander ${u?"agent-obs-td-tree-expander--expanded":""}`,onClick:v=>{v.stopPropagation(),l()}},a.default.createElement("svg",{width:"10",height:"10",viewBox:"0 0 10 10","aria-hidden":"true"},a.default.createElement("path",{d:"M2.5 3.5 L5 6 L7.5 3.5",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"}))):a.default.createElement("span",{className:"agent-obs-td-tree-leaf-dot"})))}function et(e){const{node:t,depth:n,ancestorsIsLast:r,isLast:u,expanded:l,toggle:s,activeId:o,onActiveChange:c}=e,m=t.children.length>0,d=l.has(t.spanId),g=o===t.spanId;return a.default.createElement(a.default.Fragment,null,a.default.createElement("div",{className:`agent-obs-td-tree-row ${g?"agent-obs-td-tree-row--active":""} ${t.hasError?"agent-obs-td-tree-row--error":""}`,onClick:()=>c(t.spanId)},a.default.createElement(Na,{ancestorsIsLast:r,isLast:u,isRoot:n===0,hasChildren:m,isExpanded:d,onToggle:()=>s(t.spanId)}),a.default.createElement("div",{className:"agent-obs-td-tree-row-content"},a.default.createElement("span",{className:"agent-obs-td-tree-icon"},a.default.createElement(wa,{kind:t.kind,size:t.kind==="UNKNOWN"||t.kind==="INTERNAL"?14:16})),a.default.createElement("span",{className:"agent-obs-td-tree-name",title:t.span.OperationName},t.span.OperationName),a.default.createElement("span",{className:"agent-obs-td-tree-dur"},fe(t.durationMs)))),m&&d&&t.children.map((h,v)=>a.default.createElement(et,{key:h.spanId,node:h,depth:n+1,ancestorsIsLast:[...r,v===t.children.length-1],isLast:v===t.children.length-1,expanded:l,toggle:s,activeId:o,onActiveChange:c})))}function xa(e){const t=[],n=r=>{t.push(r.spanId),r.children.forEach(n)};return e.forEach(n),t}function Ta({roots:e,activeId:t,onActiveChange:n}){const[r,u]=f.useState(()=>new Set(xa(e))),l=s=>{u(o=>{const c=new Set(o);return c.has(s)?c.delete(s):c.add(s),c})};return a.default.createElement("div",{className:"agent-obs-td-tree"},e.map((s,o)=>a.default.createElement(et,{key:s.spanId,node:s,depth:0,ancestorsIsLast:[],isLast:o===e.length-1,expanded:r,toggle:l,activeId:t,onActiveChange:n})))}function Fa(e){const t=[],n=(r,u)=>{t.push({node:r,depth:u}),r.children.forEach(l=>n(l,u+1))};return e.forEach(r=>n(r,0)),t}function Aa(e){return e>3e4?"#F36C06":e>1e4?"#EAB308":e>3e3?"#3B82F6":"#22C55E"}function be(e){if(!Number.isFinite(e)||e<=0)return"0s";const t=e/1e3,n=t<1?t.toFixed(2):t.toFixed(1);return`${parseFloat(n)}s`}var Ma=14;function La({roots:e,activeId:t,onActiveChange:n}){const r=f.useMemo(()=>Fa(e),[e]),{traceStart:u,totalMs:l}=f.useMemo(()=>{if(!r.length)return{traceStart:0,totalMs:0};const c=Math.min(...r.map(d=>d.node.startMs)),m=Math.max(...r.map(d=>d.node.startMs+d.node.durationMs));return{traceStart:c,totalMs:m-c}},[r]),s=[be(0),be(l/2),be(l)],o=["start","mid","end"];return a.default.createElement("div",{className:"agent-obs-td-timeline-wrapper"},a.default.createElement("div",{className:"agent-obs-td-timeline-axis"},a.default.createElement("div",{className:"agent-obs-td-timeline-axis-label"},i.t("Span")),a.default.createElement("div",{className:"agent-obs-td-timeline-axis-track"},s.map((c,m)=>a.default.createElement(k.Text,{key:m,className:`agent-obs-td-timeline-axis-tick agent-obs-td-timeline-axis-tick--${o[m]}`},c))),a.default.createElement("div",{className:"agent-obs-td-timeline-axis-dur"},i.t("Duration"))),a.default.createElement("div",{className:"agent-obs-td-timeline"},r.map(({node:c,depth:m})=>{const d=l>0?(c.startMs-u)/l*100:0,g=l>0?Math.max(c.durationMs/l*100,.2):0,h=t===c.spanId,v=c.hasError?"#e54545":Aa(c.durationMs);return a.default.createElement("div",{key:c.spanId,className:`agent-obs-td-timeline-row ${h?"agent-obs-td-timeline-row--active":""}`,onClick:()=>n(c.spanId)},a.default.createElement("div",{className:"agent-obs-td-timeline-label",style:{paddingLeft:m*Ma}},a.default.createElement("span",{className:"agent-obs-td-timeline-label-op",title:c.span.OperationName},c.span.OperationName)),a.default.createElement("div",{className:"agent-obs-td-timeline-track"},a.default.createElement("div",{className:"agent-obs-td-timeline-track-line"}),a.default.createElement("div",{className:"agent-obs-td-timeline-bar",style:{left:`${d}%`,width:`${g}%`,background:v}})),a.default.createElement("div",{className:"agent-obs-td-timeline-dur"},fe(c.durationMs)))})))}var tt=.25,at=2,le=.1,ue=24;function Sa(e,t=22){return e?e.length>t?`${e.slice(0,t-1)}…`:e:""}function Ra(e,t,n,r){const u=Math.max((r-t)/2,20);return`M ${e} ${t} C ${e} ${t+u}, ${n} ${r-u}, ${n} ${r}`}function ke(e){return Math.min(at,Math.max(tt,e))}function Ia(e){return e==="parallel"?i.t("Parallel"):i.t("Sequential")}function Da({roots:e,activeId:t,onActiveChange:n}){const r=f.useMemo(()=>da(e),[e]),u=f.useMemo(()=>{const p=new Map;return r.nodes.forEach(N=>p.set(N.id,{x:N.x,y:N.y})),p},[r]),l=f.useRef(null),[s,o]=f.useState({w:0,h:0}),[c,m]=f.useState(1),[d,g]=f.useState({x:0,y:0}),[h,v]=f.useState(!1),y=f.useCallback((p,N,b,E)=>{if(p<ue*2+1||N<ue*2+1||!b||!E)return{scale:1,x:0,y:0};const _=ke(Math.min((p-ue*2)/b,(N-ue*2)/E,1));return{scale:_,x:(p-b*_)/2,y:(N-E*_)/2}},[]),C=f.useCallback(()=>{const p=y(s.w,s.h,r.width,r.height);m(p.scale),g({x:p.x,y:p.y})},[y,s.w,s.h,r.width,r.height]),w=f.useRef(""),x=`${r.width}x${r.height}`;f.useLayoutEffect(()=>{const p=l.current;if(!p)return;const N=p.clientWidth,b=p.clientHeight;if(o({w:N,h:b}),N>0&&b>0&&r.width>0&&r.height>0){const T=y(N,b,r.width,r.height);m(T.scale),g({x:T.x,y:T.y}),w.current=x,v(!0)}let E=0;const _=new ResizeObserver(()=>{cancelAnimationFrame(E),E=requestAnimationFrame(()=>{const T=p.clientWidth,I=p.clientHeight;o(R=>R.w===T&&R.h===I?R:{w:T,h:I})})});return _.observe(p),()=>{cancelAnimationFrame(E),_.disconnect()}},[]),f.useEffect(()=>{if(!s.w||!s.h||!r.width||!r.height||w.current===x)return;w.current=x;const p=y(s.w,s.h,r.width,r.height);m(p.scale),g({x:p.x,y:p.y}),v(!0)},[x,s.w,s.h,r.width,r.height,y]);const A=f.useCallback((p,N,b)=>{m(E=>{const _=ke(p);return _===E?E:(g(T=>({x:N-(N-T.x)*(_/E),y:b-(b-T.y)*(_/E)})),_)})},[]),L=()=>A(c+le,s.w/2,s.h/2),D=()=>A(c-le,s.w/2,s.h/2);f.useEffect(()=>{const p=l.current;if(!p)return;const N=b=>{b.preventDefault();const E=p.getBoundingClientRect(),_=b.clientX-E.left,T=b.clientY-E.top,I=b.deltaY<0?1+le:1/(1+le);m(R=>{const z=ke(R*I);return z===R?R:(g(ee=>({x:_-(_-ee.x)*(z/R),y:T-(T-ee.y)*(z/R)})),z)})};return p.addEventListener("wheel",N,{passive:!1}),()=>p.removeEventListener("wheel",N)},[]);const M=f.useRef({active:!1,startX:0,startY:0,originX:0,originY:0}),[K,F]=f.useState(!1),S=p=>{p.button!==0||p.target.closest(".agent-obs-td-graph-node")||(M.current={active:!0,startX:p.clientX,startY:p.clientY,originX:d.x,originY:d.y},F(!0),p.preventDefault())};f.useEffect(()=>{if(!K)return;const p=b=>{if(!M.current.active)return;const E=b.clientX-M.current.startX,_=b.clientY-M.current.startY;g({x:M.current.originX+E,y:M.current.originY+_})},N=()=>{M.current.active=!1,F(!1)};return window.addEventListener("mousemove",p),window.addEventListener("mouseup",N),()=>{window.removeEventListener("mousemove",p),window.removeEventListener("mouseup",N)}},[K]);const V=Math.round(c*100),W=c<at-1e-6,P=c>tt+1e-6;return a.default.createElement("div",{ref:l,className:`agent-obs-td-graph${K?" agent-obs-td-graph--panning":""}`,onMouseDown:S},a.default.createElement("svg",{className:"agent-obs-td-graph-svg",width:s.w||r.width,height:s.h||r.height},h&&a.default.createElement("g",{transform:`translate(${d.x}, ${d.y}) scale(${c})`},a.default.createElement("g",null,r.edges.map((p,N)=>{const b=u.get(p.from),E=u.get(p.to);if(!b||!E)return null;const _=b.x+O/2,T=b.y+ce,I=E.x+O/2,R=E.y,z=(_+I)/2,ee=(T+R)/2;return a.default.createElement("g",{key:`edge-${N}`},a.default.createElement("path",{className:`agent-obs-td-graph-edge ${p.dashed?"agent-obs-td-graph-edge--dashed":""}`,d:Ra(_,T,I,R)}),a.default.createElement("text",{className:"agent-obs-td-graph-edge-label",x:z,y:ee,textAnchor:"middle",dy:"-2"},Ia(p.label)))})),a.default.createElement("g",null,r.nodes.map(p=>{const{x:N,y:b,node:E}=p,_=t===E.spanId;return a.default.createElement("g",{key:E.spanId,className:`agent-obs-td-graph-node agent-obs-td-graph-node--${E.kind}${E.hasError?" agent-obs-td-graph-node--error":""}${_?" agent-obs-td-graph-node--active":""}`,transform:`translate(${N}, ${b})`,onClick:()=>n(E.spanId)},a.default.createElement("rect",{className:"agent-obs-td-graph-node-box",width:O,height:ce,rx:8,ry:8}),a.default.createElement("text",{className:"agent-obs-td-graph-node-op",x:O/2,y:22,textAnchor:"middle"},a.default.createElement("title",null,E.span.OperationName),Sa(E.span.OperationName,22)),a.default.createElement("text",{className:"agent-obs-td-graph-node-dur",x:O/2,y:40,textAnchor:"middle"},fe(E.durationMs)))})))),a.default.createElement("div",{className:"agent-obs-td-graph-toolbar",onMouseDown:p=>p.stopPropagation(),onWheel:p=>p.stopPropagation()},a.default.createElement("button",{type:"button",className:"agent-obs-td-graph-toolbar-btn",onClick:L,disabled:!W,"aria-label":i.t("zoom in")},"+"),a.default.createElement("span",{className:"agent-obs-td-graph-toolbar-percent"},V,"%"),a.default.createElement("button",{type:"button",className:"agent-obs-td-graph-toolbar-btn",onClick:D,disabled:!P,"aria-label":i.t("zoom out")},"−"),a.default.createElement("span",{className:"agent-obs-td-graph-toolbar-divider"}),a.default.createElement("button",{type:"button",className:"agent-obs-td-graph-toolbar-btn agent-obs-td-graph-toolbar-fit",onClick:C,"aria-label":i.t("fit to view")},a.default.createElement("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none"},a.default.createElement("path",{d:"M2 5V2h3M14 5V2h-3M2 11v3h3M14 11v3h-3",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})))))}var Oe=!1;function Oa(){Oe||(Ve.default.registerLanguage("json",gt.default),Oe=!0)}function Ba(e,t=2){const n=JSON.stringify(e,null,t);return Oa(),Ve.default.highlight(n,{language:"json"}).value}function $a({span:e,closeBtn:t,attrsLoading:n,attrsError:r}){if(!e)return a.default.createElement("div",{className:"agent-obs-td-detail"},a.default.createElement("div",{className:"agent-obs-td-detail-header"},a.default.createElement("span",{className:"agent-obs-td-detail-header-title"}),t),a.default.createElement("div",{className:"agent-obs-td-detail-empty"},i.t("请选择左侧节点查看详情")));const u=na(e),l=Ze(e),s=sa(e),o=oa(e),c=Qe(e),m=c?ra(e):void 0,d=B(e,"agent.conversation_id")||B(e,"session.id");return a.default.createElement("div",{className:"agent-obs-td-detail"},a.default.createElement("div",{className:"agent-obs-td-detail-header"},a.default.createElement("span",{className:"agent-obs-td-detail-header-title",title:e.OperationName},e.OperationName),a.default.createElement("span",{className:`agent-obs-td-detail-badge ${c?"agent-obs-td-detail-badge--error":"agent-obs-td-detail-badge--ok"}`},c?i.t("ERROR"):i.t("OK")),t),a.default.createElement("div",{className:"agent-obs-td-detail-metrics"},a.default.createElement(H,{label:i.t("Total Tokens"),value:pe(l.totalTokens)}),a.default.createElement(H,{label:i.t("Tokens in"),value:pe(l.inputTokens)}),a.default.createElement(H,{label:i.t("Tokens out"),value:pe(l.outputTokens)}),a.default.createElement(H,{label:i.t("Duration"),value:fe(l.durationMs)}),a.default.createElement(H,{label:i.t("Model"),value:l.model||"-"})),a.default.createElement("div",{className:"agent-obs-td-detail-info"},a.default.createElement("div",{className:"agent-obs-td-detail-pills"},a.default.createElement(X,{label:i.t("Timestamp"),value:ma(l.startMs)}),a.default.createElement(X,{label:i.t("SpanId"),value:e.SpanId}),a.default.createElement(X,{label:i.t("TraceId"),value:B(e,"traceID")||e.TraceId}),a.default.createElement(X,{label:i.t("SpanKind"),value:u}),a.default.createElement(X,{label:i.t("ConversionID"),value:d??"-"})),s.input&&s.output&&a.default.createElement(a.default.Fragment,null,a.default.createElement(_e,{title:i.t("Input"),value:s.input}),a.default.createElement(_e,{title:i.t("Output"),value:s.output})),m&&a.default.createElement(_e,{title:i.t("Error"),value:m,titleClassName:"agent-obs-td-detail-io-title--error"})),a.default.createElement("div",{className:"agent-obs-td-detail-attrs-wrap"},n?a.default.createElement("div",{className:"agent-obs-td-detail-attrs-loading"},a.default.createElement(k.LoadingTip,null)):r?a.default.createElement(k.Alert,{type:"error"},r):a.default.createElement(qa,{attrs:o,io:s})))}function H({label:e,value:t}){return a.default.createElement("div",{className:"agent-obs-td-detail-metric"},a.default.createElement("div",{className:"agent-obs-td-detail-metric-label"},e),a.default.createElement("div",{className:"agent-obs-td-detail-metric-value",title:typeof t=="string"?t:void 0},t))}function X({label:e,value:t}){return a.default.createElement("div",{className:"agent-obs-td-detail-pill",title:`${e}: ${t}`},a.default.createElement("span",{className:"agent-obs-td-detail-pill-label"},e),a.default.createElement("span",{className:"agent-obs-td-detail-pill-value"},t))}function oe(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function U(e){return typeof e=="string"&&e.trim()?e.trim():void 0}function Ne(e,t=0){if(t>6||e===null||e===void 0)return null;if(Array.isArray(e)){for(const n of e){const r=Ne(n,t+1);if(r)return r}return null}if(!oe(e))return null;if(Array.isArray(e.messages)&&e.messages.length)return e.messages;for(const n of Object.keys(e)){const r=Ne(e[n],t+1);if(r)return r}return null}function Ka(e){if(typeof e=="string")return e.trim()||void 0;if(!oe(e))return;const t=U(e.content)||U(e.text);if(t)return t;const n=oe(e.data)?e.data:null;if(n){const u=U(n.content)||U(n.text);if(u)return u}const r=oe(e.kwargs)?e.kwargs:null;if(r){const u=U(r.content)||U(r.text);if(u)return u}}function Va(e){const t=Je(e);if(t===null)return e;const n=Ne(t);if(n&&n.length)for(let r=n.length-1;r>=0;r-=1){const u=Ka(n[r]);if(u)return u}return e}function _e({title:e,value:t,titleClassName:n}){const r=Va(t);return a.default.createElement("div",{className:"agent-obs-td-detail-io"},a.default.createElement("div",{className:`agent-obs-td-detail-io-title ${n||""}`},e),a.default.createElement("pre",{className:"agent-obs-td-detail-io-content"},r))}var Pa=["llm","gen_ai","openai"];function ja(e,t){return t.some(n=>e===n||e.startsWith(`${n}.`))}function Be(e){return ja(e,Pa)}function qa({attrs:e,io:t}){const n=f.useMemo(()=>{const o=[];return t.input&&o.push({Key:"input.value",Value:t.input}),t.output&&o.push({Key:"output.value",Value:t.output}),o},[t.input,t.output]),r=f.useMemo(()=>e.filter(o=>Be(o.Key)),[e]),u=f.useMemo(()=>e.filter(o=>!Be(o.Key)),[e]),l=r.length>0,s=f.useMemo(()=>[...n,...u],[n,u]);return l?a.default.createElement(za,{llmAttrs:r,otherAttrs:s}):a.default.createElement(k.Tabs,{tabs:[{id:"span",label:i.t("Span Attributes")}],activeId:"span"},a.default.createElement(k.TabPanel,{id:"span"},a.default.createElement(xe,{attrs:s})))}function za({llmAttrs:e,otherAttrs:t}){const[n,r]=f.useState("llm"),u=[{id:"llm",label:i.t("LLM Attributes")},{id:"other",label:i.t("Other Attributes")}];return a.default.createElement(k.Tabs,{tabs:u,activeId:n,onActive:l=>r(l.id)},a.default.createElement(k.TabPanel,{id:"llm"},a.default.createElement(xe,{attrs:e})),a.default.createElement(k.TabPanel,{id:"other"},a.default.createElement(xe,{attrs:t})))}function xe({attrs:e}){return e.length?a.default.createElement("div",{className:"agent-obs-td-detail-attrs"},e.map((t,n)=>a.default.createElement(Ua,{key:`${t.Key}-${n}`,attr:t}))):a.default.createElement("div",{className:"agent-obs-td-detail-attrs-empty"},i.t("无属性"))}function Ua({attr:e}){const[t,n]=f.useState(!1),[r,u]=f.useState(!1),l=f.useRef(null),s=f.useMemo(()=>Je(e.Value),[e.Value]),o=e.Value||"-",c=s!==null;f.useLayoutEffect(()=>{if(t&&!c)return;const h=l.current;if(!h)return;const v=()=>{u(h.scrollWidth>h.clientWidth+1)};if(v(),typeof ResizeObserver>"u")return;const y=new ResizeObserver(v);return y.observe(h),()=>y.disconnect()},[o,t,c]);const m=c||r,d=t&&!c?"agent-obs-td-detail-attr-value--expanded":"",g=!t||c?o:void 0;return a.default.createElement("div",{className:"agent-obs-td-detail-attr"},a.default.createElement("div",{className:"agent-obs-td-detail-attr-main"},m?a.default.createElement("span",{className:`agent-obs-td-detail-attr-caret ${t?"agent-obs-td-detail-attr-caret--expanded":""}`,onClick:()=>n(h=>!h)},"▶"):a.default.createElement("span",{className:"agent-obs-td-detail-attr-caret agent-obs-td-detail-attr-caret--placeholder"}),a.default.createElement("span",{className:"agent-obs-td-detail-attr-key",title:e.Key},e.Key),a.default.createElement("span",{ref:l,className:`agent-obs-td-detail-attr-value ${d}`,title:g},o)),m&&t&&s!==null&&a.default.createElement("pre",{className:"agent-obs-td-detail-attr-json hljs",dangerouslySetInnerHTML:{__html:Ba(s)}}))}function Ya(){return[{id:"tree",label:i.t("Tree")},{id:"timeline",label:i.t("Timeline")},{id:"graph",label:i.t("Graph")}]}function Wa({visible:e,onClose:t,traceId:n,fetchDetail:r,fetchSpanDetail:u,defaultTab:l="tree",width:s="80vw"}){const[o,c]=f.useState(l),[m,d]=f.useState(null),[g,h]=f.useState(!1),[v,y]=f.useState(null),[C,w]=f.useState(null),[x,A]=f.useState(()=>new Map),[L,D]=f.useState(!1),[M,K]=f.useState(null),F=f.useRef(null);f.useEffect(()=>{if(!e||!n)return;let b=!1;return h(!0),y(null),d(null),w(null),A(new Map),D(!1),K(null),F.current=null,r(n).then(E=>{var _;if(!b&&(d(E),(_=E==null?void 0:E.Spans)!=null&&_.length)){const T=E.Spans.reduce((I,R)=>I.StartTime<R.StartTime?I:R);w(T.SpanId)}}).catch(E=>{b||y((E==null?void 0:E.message)||i.t("加载失败"))}).finally(()=>{b||h(!1)}),()=>{b=!0}},[e,n,r]),f.useEffect(()=>{e||c(l)},[e,l]);const{roots:S,spanMap:V}=f.useMemo(()=>{var b;if(!((b=m==null?void 0:m.Spans)!=null&&b.length))return{roots:[],spanMap:new Map};const E=new Map;return m.Spans.forEach(_=>E.set(_.SpanId,_)),{roots:ca(m.Spans),spanMap:E}},[m]),W=f.useMemo(()=>{if(!C)return null;const b=V.get(C)||null;if(!b)return null;const E=x.get(C);return E?{...b,Tags:E.Tags&&E.Tags.length?E.Tags:b.Tags,Logs:E.Logs&&E.Logs.length?E.Logs:b.Logs}:b},[C,V,x]);f.useEffect(()=>{if(!e||!n||!C||!u)return;const b=V.get(C);if(!b||x.has(C)||b.Tags&&b.Tags.length>0)return;F.current=C;let E=!1;return D(!0),K(null),u(n,C).then(_=>{E||F.current!==C||A(T=>{const I=new Map(T);return I.set(C,{Tags:Array.isArray(_==null?void 0:_.Tags)?_.Tags:[],Logs:Array.isArray(_==null?void 0:_.Logs)?_.Logs:[]}),I})}).catch(_=>{E||F.current!==C||K((_==null?void 0:_.message)||i.t("加载失败"))}).finally(()=>{E||F.current!==C||D(!1)}),()=>{E=!0}},[e,n,C,u,V,x]);const P=f.useCallback(b=>{w(b)},[]),p=f.useMemo(Ya,[]),N=()=>g?a.default.createElement("div",{className:"agent-obs-td-drawer-loading"},a.default.createElement(k.LoadingTip,null)):v?a.default.createElement("div",{className:"agent-obs-td-drawer-error"},a.default.createElement(k.Alert,{type:"error"},v)):!m||!S.length?a.default.createElement("div",{className:"agent-obs-td-drawer-empty"},i.t("暂无数据")):o==="tree"?a.default.createElement(Ta,{roots:S,activeId:C,onActiveChange:P}):o==="timeline"?a.default.createElement(La,{roots:S,activeId:C,onActiveChange:P}):a.default.createElement(Da,{roots:S,activeId:C,onActiveChange:P});return a.default.createElement(k.Drawer,{className:"agent-obs-td-drawer",style:{width:s,height:"calc(100vh - 50px)",boxSizing:"border-box"},visible:e,placement:"right",size:"xl",title:null,disableCloseIcon:!0,onClose:t,outerClickClosable:!0,showMask:!0},a.default.createElement("div",{className:"agent-obs-td-drawer-body"},a.default.createElement("div",{className:"agent-obs-td-drawer-left"},a.default.createElement(k.Tabs,{className:"agent-obs-td-drawer-tabs",style:{height:40},variant:"card-outline",tabs:p,animated:!1,defaultActiveId:o,onActive:b=>c(b.id)}),a.default.createElement("div",{style:{paddingLeft:10},className:`agent-obs-td-drawer-view${o==="graph"?" agent-obs-td-drawer-view--graph":""}`},N())),a.default.createElement("div",{className:"agent-obs-td-drawer-right"},g||v?null:a.default.createElement($a,{span:W,attrsLoading:L,attrsError:M,closeBtn:a.default.createElement("button",{type:"button",className:"agent-obs-td-drawer-close",onClick:t,"aria-label":i.t("关闭")},a.default.createElement(k.Icon,{type:"close",size:20}))}))))}var Ga={zh:{k_1vdb2c7:"Agent 调用",k_00hhj74:"ConversionID",k_1opac2j:"Duration",k_03sgcnx:"ERROR",k_037uk0t:"Error",k_030ock3:"Input",k_1l3vgxz:"LLM Attributes",k_1tv2hle:"LLM 调用次数",k_02vcuqy:"Model",k_003hnfl:"OK",k_130omsu:"Other Attributes",k_0sl6zfe:"Output",k_151iedo:"Sequential",k_0yhbajy:"Parallel",k_11rfpuu:"Span Attributes",k_0yisj0j:"Tree",k_01oqkxq:"Timeline",k_02yf5ih:"Graph",k_1len88c:"TraceId (RunId)",k_0yj2fzd:"Span",k_0rakmad:"zoom in",k_0jw4x30:"zoom out",k_04p9rpk:"fit to view",k_03r8nh8:"AGENT",k_03jowco:"CHAIN",k_038v7ai:"EMBEDDING",k_0e3gmau:"EVALUATOR",k_0uolhdi:"GUARDRAIL",k_037699k:"LLM",k_1ga8ach:"PROMPT",k_1sjjr8z:"RERANKER",k_1babzmh:"RETRIEVER",k_0yjq7ul:"TOOL",k_1bemrrz:"MANUAL",k_1a804jx:"UNKNOWN",k_0j7hjgk:"SpanId",k_1dcdm1t:"SpanKind",k_1tkqbyj:"Timestamp",k_16wdblm:"Token 总消耗",k_1087kga:"Tokens in",k_0csyyqr:"Tokens out",k_1pugrjj:"Total Tokens",k_1tn04w9:"TraceId",k_00046ua:"万",k_00046tr:"个",k_00046qi:"亿",k_002r79h:"全部",k_17cbs21:"全部环境",k_002qzi3:"关闭",k_003lxmq:"刷新",k_0f8b3ws:"加载失败",k_003m8qf:"参数",k_0pa2i2z:"可根据 run-id 和 conversation-id 搜索",k_14tn4z1:"响应时间(秒)",k_002umy9:"失败",k_003pmuv:"工具",k_02p3axw:"平均 Token/模型调用",k_003qqk4:"开发",k_0by9bfw:"开始时间",k_003qe0a:"成功",k_1f3mps5:"数据延迟 < 10min",k_03cutj0:"无属性",k_0zn4ylg:"模型调用",k_01fa579:"模型调用错误率",k_07hvn81:"模型调用平均耗时",k_03e5hqz:"日同比",k_13qhqgp:"暂无数据",k_0004138:"次",k_003nzwy:"状态",k_003s37t:"环境",k_003twt9:"生产",k_17bw8lt:"生产环境",k_0fwgfbc:"用量概览",k_0bycnor:"结束时间",k_0mvqrk5:"请选择左侧节点查看详情",k_0ld10w7:"请选择时间范围",k_1gd9xqm:"近12小时",k_0vd4sg9:"近15分钟",k_126g2v0:"近1小时",k_1gd9wh7:"近24小时",k_0vd6ff2:"近30分钟",k_126g2vv:"近6小时",k_03g9k26:"近3天",k_03g9k5m:"近7天",k_002uzrd:"预览",k_17c63b9:"预览环境"},en:{k_1vdb2c7:"Agent Calls",k_00hhj74:"Conversation ID",k_1opac2j:"Duration",k_03sgcnx:"ERROR",k_037uk0t:"Error",k_030ock3:"Input",k_1l3vgxz:"LLM Attributes",k_1tv2hle:"LLM Calls",k_02vcuqy:"Model",k_003hnfl:"OK",k_130omsu:"Other Attributes",k_0sl6zfe:"Output",k_151iedo:"Sequential",k_0yhbajy:"Parallel",k_11rfpuu:"Span Attributes",k_0yisj0j:"Tree",k_01oqkxq:"Timeline",k_02yf5ih:"Graph",k_1len88c:"Trace ID (Run ID)",k_0yj2fzd:"Span",k_0rakmad:"Zoom in",k_0jw4x30:"Zoom out",k_04p9rpk:"Fit to view",k_03r8nh8:"AGENT",k_03jowco:"CHAIN",k_038v7ai:"EMBEDDING",k_0e3gmau:"EVALUATOR",k_0uolhdi:"GUARDRAIL",k_037699k:"LLM",k_1ga8ach:"PROMPT",k_1sjjr8z:"RERANKER",k_1babzmh:"RETRIEVER",k_0yjq7ul:"TOOL",k_1bemrrz:"MANUAL",k_1a804jx:"UNKNOWN",k_0j7hjgk:"Span ID",k_1dcdm1t:"Span Kind",k_1tkqbyj:"Timestamp",k_16wdblm:"Total Token Usage",k_1087kga:"Tokens In",k_0csyyqr:"Tokens Out",k_1pugrjj:"Total Tokens",k_1tn04w9:"Trace ID",k_00046ua:"Ten Thousand",k_00046tr:"items",k_00046qi:"Billion",k_002r79h:"All",k_17cbs21:"All Environments",k_002qzi3:"Close",k_003lxmq:"Refresh",k_0f8b3ws:"Load Failed",k_003m8qf:"Parameters",k_0pa2i2z:"Search by run-id or conversation-id",k_14tn4z1:"Response Time (s)",k_002umy9:"Failed",k_003pmuv:"Tool",k_02p3axw:"Average Tokens per Model Call",k_003qqk4:"Development",k_0by9bfw:"Start Time",k_003qe0a:"Success",k_1f3mps5:"Data latency < 10 min",k_03cutj0:"No attributes",k_0zn4ylg:"Model Calls",k_01fa579:"Model Error Rate",k_07hvn81:"Average Model Latency",k_03e5hqz:"Day-over-day",k_13qhqgp:"No Data",k_0004138:"times",k_003nzwy:"Status",k_003s37t:"Environment",k_003twt9:"Production",k_17bw8lt:"Production Environment",k_0fwgfbc:"Usage Overview",k_0bycnor:"End Time",k_0mvqrk5:"Select a node on the left to view details",k_0ld10w7:"Select a time range",k_1gd9xqm:"Last 12 Hours",k_0vd4sg9:"Last 15 Minutes",k_126g2v0:"Last 1 Hour",k_1gd9wh7:"Last 24 Hours",k_0vd6ff2:"Last 30 Minutes",k_126g2vv:"Last 6 Hours",k_03g9k26:"Last 3 Days",k_03g9k5m:"Last 7 Days",k_002uzrd:"Preview",k_17c63b9:"Preview Environment"}},Ja=$t,en=Jt,tn=Wa,an=Ga;export{Ja as A,tn as T,an as a,en as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.agent-obs-loading{position:relative;width:100%}.agent-obs-loading-content{width:100%}.agent-obs-loading-mask{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#fff9;transition:opacity .3s ease-in;z-index:10;display:flex;justify-content:center;align-items:center}.agent-obs-loading-mask--hidden{opacity:0;pointer-events:none}.agent-obs-empty{width:100%;height:100%;position:relative}.agent-obs-empty-bg{height:100%;padding-top:3px;display:flex;justify-content:center;align-items:center}.agent-obs-empty-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#fff;padding:4px;font-size:12px;color:#888;line-height:1.4}.agent-obs-filter{margin-bottom:10px}.agent-obs-filter-body{position:relative}.agent-obs-filter-tip{position:absolute;right:20px;top:30px;transform:translateY(-50%)}@keyframes agent-obs-filter-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.agent-obs-filter-refresh:hover{background-color:#fff!important}.agent-obs-filter-refresh--rotating{animation:agent-obs-filter-rotate 1s linear infinite}.agent-obs-traces-filter{margin-bottom:20px}.agent-obs-traces-filter .filter-actions{display:inline-flex;align-items:center;gap:8px;flex-wrap:nowrap}.agent-obs-traces-filter .traces-filter-search{width:280px!important}.agent-obs-traces-filter .quick-date-picker{display:inline-flex;align-items:center}.agent-obs-traces-filter .quick-date-picker .time-range-picker [class*=-datetimepicker__input][class*=-datepicker__input--range]{width:315px}.agent-obs-overview{margin-bottom:10px;min-height:160px}.agent-obs-overview-title{font-size:14px;font-weight:600;color:#000;margin-bottom:16px}.agent-obs-overview-grid{position:relative;display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:16px 0}.agent-obs-overview-grid--loading .agent-obs-overview-cell{visibility:hidden}.agent-obs-overview-loading-mask{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center}.agent-obs-overview-cell{position:relative;display:flex;flex-direction:column;gap:8px;padding:0 24px}.agent-obs-overview-cell:after{content:"";position:absolute;right:0;top:8px;bottom:8px;width:1px;background-color:#e5e5e5}.agent-obs-overview-cell:last-child:after{display:none}.agent-obs-overview-cell:first-child{padding-left:0}.agent-obs-overview-label{font-size:14px;color:#000;line-height:1.4}.agent-obs-overview-value-row{display:flex;align-items:baseline}.agent-obs-overview-value{font-size:24px;font-weight:500;color:#000;line-height:1.2}.agent-obs-overview-unit{font-size:14px;color:#888;margin-left:2px}.agent-obs-overview-delta{font-size:12px;line-height:1.4}.agent-obs-overview-delta-label{color:#888;margin-right:6px}.agent-obs-overview-delta-value--up{color:#16a34a}.agent-obs-overview-delta-value--down{color:#e54545}.agent-obs-overview-delta-value--flat{color:#888}.agent-obs-card-body{padding:24px}.agent-obs-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px}.agent-obs-card-titlebox{display:flex;flex-direction:column;gap:6px}.agent-obs-card-title{font-size:14px;font-weight:600;color:#000;line-height:1.4}.agent-obs-card-unit{font-size:12px;color:#888;line-height:1.4}.agent-obs-card-jump{cursor:pointer;display:flex;align-items:center;color:#000}.agent-obs-card-link{text-decoration:none;color:inherit;display:block}.agent-obs-card-chart{margin-top:8px}.agent-obs-card-empty{width:100%;display:flex;justify-content:center;align-items:center}.agent-obs-traces-wrapper{background-color:#fff;padding:16px 20px}.agent-obs-traces-table [class*=-table__header] [class*=-dropdown-filter]{display:flex;align-items:center;padding:0}.agent-obs-traces-table [class*=-table__header] [class*=-dropdown-filter] .ruyi-icon.ruyi-icon-filter{position:static;margin-left:4px;flex:0 0 auto}.agent-obs-traces-trace-id{color:var(--tea-color-text-brand-default, #006eff);cursor:pointer;text-decoration:none}.agent-obs-traces-trace-id:hover{color:var(--tea-color-text-brand-hover, #006eff);text-decoration:none}.agent-obs-traces-trace-id:visited{color:var(--tea-color-text-brand-default, #006eff)}.agent-obs-traces-env--production{background-color:#e8f5ec;color:#16a34a}.agent-obs-traces-env--preview{background-color:#e8f1ff;color:#006eff}.agent-obs-traces-status--success{color:var(--tea-color-text-success-default, #16a34a)}.agent-obs-traces-status--failed,.agent-obs-traces-status--timeout{color:var(--tea-color-text-error-default, #e54545)}.agent-obs-traces-status--running{color:var(--tea-color-text-weak, #888)}.agent-obs-td-drawer [class$=-drawer__body-inner],.agent-obs-td-drawer [class*="-drawer__body-inner "]{height:100%!important}.agent-obs-td-drawer>[class$=-drawer__body],.agent-obs-td-drawer>[class*="-drawer__body "]{padding-top:0!important;padding-left:0!important;padding-right:0!important}.agent-obs-td-drawer [class$=-tabs__tabitem],.agent-obs-td-drawer [class*="-tabs__tabitem "]{margin-right:0!important;line-height:30px!important}.agent-obs-td-drawer-tabs{margin-bottom:12px}.agent-obs-td-drawer-close{flex:0 0 auto;border:none;background:transparent;cursor:pointer;color:#888;padding:8px;display:inline-flex;align-items:center;justify-content:center;border-radius:4px;transition:background .15s}.agent-obs-td-drawer-close:hover{background:#f0f2f5;color:#000}.agent-obs-td-drawer-body{display:flex;height:100%;min-height:0}.agent-obs-td-drawer-left{width:480px;border-right:1px solid #e5e5e5;display:flex;flex-direction:column;min-height:0;overflow:hidden;height:100%}.agent-obs-td-drawer-view{flex:1 1 auto;min-height:0;overflow:auto}.agent-obs-td-drawer-view--graph{overflow:hidden}.agent-obs-td-drawer-right{flex:1;height:100%;overflow:auto;padding:20px 24px;background:#fff;position:relative}.agent-obs-td-drawer-loading,.agent-obs-td-drawer-error,.agent-obs-td-drawer-empty{padding:60px 16px;display:flex;justify-content:center;align-items:center;color:#888;font-size:13px;width:100%}.agent-obs-td-tree{display:flex;flex-direction:column;font-size:13px;color:#000}.agent-obs-td-tree-row{display:flex;align-items:center;height:32px;box-sizing:border-box;padding:0 8px 0 0;cursor:pointer;border-radius:4px;position:relative}.agent-obs-td-tree-row:hover .agent-obs-td-tree-row-content{background:#f0f2f5}.agent-obs-td-tree-row--active .agent-obs-td-tree-row-content{background:#eef3ff}.agent-obs-td-tree-row--active .agent-obs-td-tree-icon{color:#1c66e5}.agent-obs-td-tree-row--active .agent-obs-td-tree-name,.agent-obs-td-tree-row--active .agent-obs-td-tree-dur{color:#006eff}.agent-obs-td-tree-row--error .agent-obs-td-tree-name{color:#e54545}.agent-obs-td-tree-row-content{flex:1 1 auto;min-width:0;display:flex;align-items:center;height:100%;border-radius:4px}.agent-obs-td-tree-indent{position:relative;align-self:stretch;display:block}.agent-obs-td-tree-lines{display:block}.agent-obs-td-tree-control{position:absolute;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center}.agent-obs-td-tree-expander{width:16px;height:16px;border-radius:50%;background:#eceae7;color:#666;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:transform .15s}.agent-obs-td-tree-expander:hover{background:#e0ddda}.agent-obs-td-tree-expander:not(.agent-obs-td-tree-expander--expanded){transform:rotate(-90deg)}.agent-obs-td-tree-leaf-dot{width:6px;height:6px;border-radius:50%;background:#a8a29e;display:inline-block}.agent-obs-td-tree-icon{flex:0 0 auto;display:inline-flex;color:#333;margin-left:6px;margin-right:8px}.agent-obs-td-tree-name{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.agent-obs-td-tree-dur{flex:0 0 auto;font-size:12px;color:#a8a29e;margin-left:auto;padding-left:12px;padding-right:8px;font-variant-numeric:tabular-nums}.agent-obs-td-timeline-wrapper{display:flex;flex-direction:column;font-size:13px}.agent-obs-td-timeline-axis{position:sticky;top:0;z-index:2;background:#fff;display:flex;align-items:center;gap:8px;border-bottom:1px solid #e5e5e5;padding:6px 8px;font-size:12px;color:#a8a29e}.agent-obs-td-timeline-axis-label{flex:0 0 200px}.agent-obs-td-timeline-axis-track{flex:1 1 auto;position:relative;display:flex;font-size:11px}.agent-obs-td-timeline-axis-dur{flex:0 0 70px;text-align:right}.agent-obs-td-timeline-axis-tick{flex:1 1 0}.agent-obs-td-timeline-axis-tick--start{text-align:left}.agent-obs-td-timeline-axis-tick--mid{text-align:center}.agent-obs-td-timeline-axis-tick--end{text-align:right}.agent-obs-td-timeline-row{display:flex;align-items:center;gap:8px;padding:6px 8px;cursor:pointer;border-radius:4px}.agent-obs-td-timeline-row:hover{background:#f0f2f5}.agent-obs-td-timeline-row--active{background:#eef3ff}.agent-obs-td-timeline-label{flex:0 0 200px;display:flex;align-items:center;gap:6px;overflow:hidden}.agent-obs-td-timeline-label-icon{flex:0 0 auto;display:inline-flex;color:#333}.agent-obs-td-timeline-label-op{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-obs-td-timeline-track{flex:1 1 auto;position:relative;height:16px}.agent-obs-td-timeline-track-line{position:absolute;left:0;right:0;top:50%;height:1px;background:#e9ecf1;transform:translateY(-50%)}.agent-obs-td-timeline-bar{position:absolute;top:50%;height:10px;transform:translateY(-50%);border-radius:2px;min-width:2px}.agent-obs-td-timeline-dur{flex:0 0 70px;font-size:12px;color:#a8a29e;text-align:right;font-variant-numeric:tabular-nums}.agent-obs-td-graph{position:relative;width:100%;height:100%;overflow:hidden;background:#fff;cursor:grab;-webkit-user-select:none;user-select:none}.agent-obs-td-graph--panning{cursor:grabbing}.agent-obs-td-graph-svg{display:block;width:100%;height:100%}.agent-obs-td-graph-toolbar{position:absolute;top:12px;right:16px;display:inline-flex;align-items:center;height:36px;padding:0 6px;background:#fff;border:1px solid #e5e5e5;border-radius:8px;box-shadow:0 2px 8px #0000000f;cursor:default;-webkit-user-select:none;user-select:none;z-index:2}.agent-obs-td-graph-toolbar-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:4px;color:#000;font-size:18px;line-height:1;cursor:pointer;transition:background-color .15s}.agent-obs-td-graph-toolbar-btn:hover:not(:disabled){background:#f3f4f6}.agent-obs-td-graph-toolbar-btn:disabled{color:#cbd5e1;cursor:not-allowed}.agent-obs-td-graph-toolbar-percent{min-width:44px;padding:0 4px;color:#000;font-size:13px;font-variant-numeric:tabular-nums;text-align:center}.agent-obs-td-graph-toolbar-divider{width:1px;height:18px;margin:0 4px;background:#e5e5e5}.agent-obs-td-graph-toolbar-fit{color:#006eff}.agent-obs-td-graph-node{cursor:pointer}.agent-obs-td-graph-node-box{fill:#fff;stroke-width:2}.agent-obs-td-graph-node--AGENT .agent-obs-td-graph-node-box{stroke:#4e5ff2;fill:#eef0ff}.agent-obs-td-graph-node--CHAIN .agent-obs-td-graph-node-box,.agent-obs-td-graph-node--TOOL .agent-obs-td-graph-node-box{stroke:#16a34a;fill:#e9f6ef}.agent-obs-td-graph-node--LLM .agent-obs-td-graph-node-box{stroke:#7b61ff;fill:#f1edff}.agent-obs-td-graph-node--RETRIEVER .agent-obs-td-graph-node-box,.agent-obs-td-graph-node--RERANKER .agent-obs-td-graph-node-box{stroke:#0ea5e9;fill:#e6f4fb}.agent-obs-td-graph-node--EMBEDDING .agent-obs-td-graph-node-box{stroke:#f59e0b;fill:#fdf3e1}.agent-obs-td-graph-node--EVALUATOR .agent-obs-td-graph-node-box,.agent-obs-td-graph-node--GUARDRAIL .agent-obs-td-graph-node-box{stroke:#e54545;fill:#fde8e8}.agent-obs-td-graph-node--PROMPT .agent-obs-td-graph-node-box{stroke:#8b5cf6;fill:#f1edff}.agent-obs-td-graph-node--UNKNOWN .agent-obs-td-graph-node-box{stroke:#a8a29e;fill:#f6f7f9}.agent-obs-td-graph-node--error .agent-obs-td-graph-node-box{stroke:#e54545!important}.agent-obs-td-graph-node--active .agent-obs-td-graph-node-box{stroke-width:3}.agent-obs-td-graph-node-op{font-size:13px;font-weight:500;fill:#000}.agent-obs-td-graph-node-dur{font-size:12px;fill:#a8a29e}.agent-obs-td-graph-node--LLM .agent-obs-td-graph-node-op{fill:#7b61ff}.agent-obs-td-graph-edge{stroke:#a8a29e;stroke-width:1.5;fill:none}.agent-obs-td-graph-edge--dashed{stroke-dasharray:4 4;stroke:#7b61ff;opacity:.7}.agent-obs-td-graph-edge-label{font-size:11px;fill:#a8a29e}.agent-obs-td-detail{font-size:13px;color:#000}.agent-obs-td-detail-empty{padding:40px 16px;color:#888;font-size:13px;text-align:center}.agent-obs-td-detail-header{display:flex;align-items:center;gap:8px;margin-bottom:14px}.agent-obs-td-detail-header-icon{flex:0 0 auto;display:inline-flex;color:#7b61ff}.agent-obs-td-detail-header-title{flex:1 1 auto;font-size:16px;font-weight:600;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-obs-td-detail-badge{flex:0 0 auto;padding:2px 10px;border-radius:10px;font-size:12px;font-weight:500}.agent-obs-td-detail-badge--ok{background:#d7f7e3;color:#16a34a}.agent-obs-td-detail-badge--error{background:#fdd7d7;color:#e54545}.agent-obs-td-detail-metrics{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-bottom:14px}.agent-obs-td-detail-metric{background:#f5f6f8;border-radius:4px;padding:10px 12px;min-width:0}.agent-obs-td-detail-metric-label{font-size:12px;color:#888;line-height:1.4;margin-bottom:2px}.agent-obs-td-detail-metric-value{font-size:14px;font-weight:500;color:#000;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-obs-td-detail-info{background-color:#f3f4f7;padding:15px 30px;display:flex;gap:20px;flex-direction:column;margin:0 -24px}.agent-obs-td-detail-pills{display:flex;flex-wrap:wrap;gap:16px}.agent-obs-td-detail-pill{display:inline-flex;align-items:center;gap:8px;background:#d6d3d1;border-radius:4px;padding:4px 10px;font-size:12px;max-width:100%;overflow:hidden}.agent-obs-td-detail-pill-label{color:#888;flex:0 0 auto}.agent-obs-td-detail-pill-value{color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums}.agent-obs-td-detail-io{padding:12px 14px;background-color:#fff}.agent-obs-td-detail-io-title{font-size:12px;color:#888;margin-bottom:8px}.agent-obs-td-detail-io-title--error{color:#e54545}.agent-obs-td-detail-io-content{font-size:13px;color:#000;white-space:pre-wrap;word-break:break-word;max-height:180px;overflow:auto;font-family:Menlo,Consolas,Courier New,monospace;line-height:1.5;margin:0}.agent-obs-td-detail-io-empty{color:#888;font-family:inherit}.agent-obs-td-detail-attrs-wrap{margin-top:16px;padding-top:8px}.agent-obs-td-detail-attrs{display:flex;flex-direction:column}.agent-obs-td-detail-attrs-empty{padding:16px;font-size:12px;color:#888}.agent-obs-td-detail-attrs-loading{padding:24px 16px;display:flex;align-items:center;justify-content:center}.agent-obs-td-detail-attr{border-bottom:1px solid #e5e5e5;padding:8px 0}.agent-obs-td-detail-attr:last-child{border-bottom:none}.agent-obs-td-detail-attr-main{display:flex;align-items:flex-start;gap:8px;font-size:12px;font-family:Menlo,Consolas,Courier New,monospace}.agent-obs-td-detail-attr-caret{flex:0 0 14px;width:14px;height:14px;display:inline-flex;align-items:center;justify-content:center;color:#a8a29e;font-size:8px;cursor:pointer;transition:transform .15s;margin-top:2px}.agent-obs-td-detail-attr-caret--placeholder{cursor:default;visibility:hidden}.agent-obs-td-detail-attr-caret--expanded{transform:rotate(90deg)}.agent-obs-td-detail-attr-key{flex:0 0 280px;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#000}.agent-obs-td-detail-attr-value{flex:1 1 auto;min-width:0;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-obs-td-detail-attr-value--expanded{white-space:pre-wrap;word-break:break-word;overflow:visible}.agent-obs-td-detail-attr-json{margin:8px 0 0 22px;padding:10px 12px;background:#f5f6f8;border-radius:4px;font-size:12px;color:#000;font-family:Menlo,Consolas,Courier New,monospace;white-space:pre;overflow:auto;max-height:300px}.hljs{background:transparent}.hljs .hljs-attr{color:#0550ae}.hljs .hljs-string{color:#0a7b30}.hljs .hljs-number,.hljs .hljs-literal{color:#cf222e}.hljs .hljs-punctuation{color:#57606a}
|