agentbridge-cli 0.1.11__py3-none-any.whl

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.
@@ -0,0 +1,142 @@
1
+ <div class="detail-shell">
2
+ <header class="detail-header">
3
+ <div class="request-icon" aria-hidden="true">
4
+ <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
5
+ <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"></path>
6
+ <path d="m3.3 7 8.7 5 8.7-5"></path>
7
+ <path d="M12 22V12"></path>
8
+ </svg>
9
+ </div>
10
+ <div class="detail-heading">
11
+ <h3>
12
+ {{ request_id }}
13
+ {% if is_active %}
14
+ <span class="badge badge-active">streaming</span>
15
+ {% elif error %}
16
+ <span class="badge badge-err">error</span>
17
+ {% else %}
18
+ <span class="badge badge-ok">ok</span>
19
+ {% endif %}
20
+ <span class="badge badge-model">{{ model }}</span>
21
+ </h3>
22
+ <div class="detail-subline">
23
+ <span>{{ duration_ms }}ms</span>
24
+ {% if input_tokens is not none or output_tokens is not none %}
25
+ <span>{{ (input_tokens|default(0, true)) + (output_tokens|default(0, true)) }} tokens</span>
26
+ {% endif %}
27
+ {% if is_active %}<span>Live Stream</span>{% endif %}
28
+ </div>
29
+ </div>
30
+ <div class="detail-actions">
31
+ <button class="action-button" type="button" data-copy="{{ request_id }}">
32
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg>
33
+ Copy ID
34
+ </button>
35
+ {% if not is_active %}
36
+ <a class="action-button" href="/dashboard/log/{{ request_id }}" target="_blank" rel="noopener">
37
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg>
38
+ Open Log
39
+ </a>
40
+ {% endif %}
41
+ </div>
42
+ </header>
43
+
44
+ <section class="meta-grid" aria-label="Request metadata">
45
+ <div class="meta-item">
46
+ <div class="meta-label">Started</div>
47
+ <div class="meta-value">{{ timestamp or "Active" }}</div>
48
+ </div>
49
+ <div class="meta-item">
50
+ <div class="meta-label">Duration</div>
51
+ <div class="meta-value">{{ duration_ms }}ms</div>
52
+ </div>
53
+ <div class="meta-item">
54
+ <div class="meta-label">Prompt Tokens</div>
55
+ <div class="meta-value">{{ input_tokens|default("-", true) }}</div>
56
+ </div>
57
+ <div class="meta-item">
58
+ <div class="meta-label">Completion Tokens</div>
59
+ <div class="meta-value">{{ output_tokens|default("-", true) }}</div>
60
+ </div>
61
+ <div class="meta-item">
62
+ <div class="meta-label">Total Tokens</div>
63
+ <div class="meta-value">{% if input_tokens is not none or output_tokens is not none %}{{ (input_tokens|default(0, true)) + (output_tokens|default(0, true)) }}{% else %}-{% endif %}</div>
64
+ </div>
65
+ </section>
66
+
67
+ <section class="detail-grid">
68
+ <div class="panel">
69
+ <div class="panel-header">
70
+ <div class="panel-title">Messages</div>
71
+ {% if messages %}<span class="count-pill">{{ messages|length }}</span>{% endif %}
72
+ </div>
73
+ <div class="panel-body">
74
+ {% if messages %}
75
+ {% for msg in messages %}
76
+ <details class="message message--{{ msg.role }}" open>
77
+ <summary>
78
+ <span>{{ msg.role }}</span>
79
+ <span>{% if timestamp %}{{ timestamp[11:19] }}{% endif %}</span>
80
+ </summary>
81
+ <pre>{{ msg.content }}</pre>
82
+ </details>
83
+ {% endfor %}
84
+ {% else %}
85
+ <p class="empty-state">No messages captured for this request.</p>
86
+ {% endif %}
87
+
88
+ {% if is_active %}
89
+ <div class="live-stream" hx-ext="sse" sse-connect="/dashboard/stream/{{ request_id }}" sse-swap="chunk" hx-swap="beforeend">
90
+ <div class="live-stream-title">
91
+ <span class="status-dot idle"></span>
92
+ Live Stream
93
+ </div>
94
+ <pre id="stream-output">{{ buffered_text }}</pre>
95
+ <div hx-get="/dashboard/request/{{ request_id }}"
96
+ hx-trigger="sse:done delay:500ms, sse:error delay:500ms"
97
+ hx-target="#detail"
98
+ hx-swap="innerHTML"
99
+ style="display:none"></div>
100
+ </div>
101
+ {% endif %}
102
+ </div>
103
+ </div>
104
+
105
+ <div class="panel">
106
+ <div class="panel-header">
107
+ <div class="panel-title">Response</div>
108
+ </div>
109
+ <div class="panel-body">
110
+ {% if error %}
111
+ <div class="error-card">
112
+ <div class="error-card-header">
113
+ <div class="error-title">
114
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m21.73 18-8-14a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg>
115
+ <span>Server error<small>{{ error }}</small></span>
116
+ </div>
117
+ <div class="error-actions">
118
+ <button class="action-button" type="button" data-copy="{{ error }}">Copy details</button>
119
+ <button class="action-button" type="button" onclick="location.reload()">Retry</button>
120
+ </div>
121
+ </div>
122
+ <pre class="error-pre">{
123
+ "error": {
124
+ "message": {{ error|tojson }},
125
+ "type": {{ (exception_type or "server_error")|tojson }},
126
+ "code": {{ (exception_type or "server_error")|tojson }}
127
+ },
128
+ "request_id": {{ request_id|tojson }},
129
+ "status": "error"
130
+ }</pre>
131
+ </div>
132
+ {% elif response %}
133
+ <pre class="response-pre">{{ response }}</pre>
134
+ {% elif is_active %}
135
+ <p class="empty-state">Streaming response will appear in the live stream panel.</p>
136
+ {% else %}
137
+ <p class="empty-state">No response body captured for this request.</p>
138
+ {% endif %}
139
+ </div>
140
+ </div>
141
+ </section>
142
+ </div>