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.
@@ -307,7 +307,11 @@ class AgentContext:
307
307
  "通常是因为运行时未设置 store。"
308
308
  )
309
309
  from .memory import ConversationMemory
310
- instance = ConversationMemory(self._store_blob, self.run_id)
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__(self, blob_store: Any, run_id: str) -> None:
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
- return _EdgeOneMemorySession(self, session_id, max_items=max_items)
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._blob_get_json(
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
- try:
1930
- raw = await self._memory._blob.get(key, type="text", consistency="strong")
1931
- if raw is None:
1932
- return None
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
- pass
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
- for channel_name, channel_value in writes_legacy:
1960
- pending_writes.append((task_id, channel_name, channel_value))
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._blob_get_json(key)
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
- continue
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}