agent-orcha 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -28
- package/dist/lib/agents/agent-executor.d.ts.map +1 -1
- package/dist/lib/agents/agent-executor.js +23 -7
- package/dist/lib/agents/agent-executor.js.map +1 -1
- package/dist/lib/agents/react-loop.d.ts.map +1 -1
- package/dist/lib/agents/react-loop.js +27 -0
- package/dist/lib/agents/react-loop.js.map +1 -1
- package/dist/lib/functions/simple-function-wrapper.js +3 -3
- package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
- package/dist/lib/knowledge/knowledge-store.d.ts +1 -1
- package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
- package/dist/lib/knowledge/knowledge-store.js +25 -4
- package/dist/lib/knowledge/knowledge-store.js.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts +0 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.js +7 -15
- package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
- package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -1
- package/dist/lib/knowledge/sqlite-store.js +19 -10
- package/dist/lib/knowledge/sqlite-store.js.map +1 -1
- package/dist/lib/knowledge/types.d.ts +13 -13
- package/dist/lib/llm/index.d.ts +1 -1
- package/dist/lib/llm/index.d.ts.map +1 -1
- package/dist/lib/llm/index.js +1 -1
- package/dist/lib/llm/index.js.map +1 -1
- package/dist/lib/llm/llm-config.d.ts +51 -8
- package/dist/lib/llm/llm-config.d.ts.map +1 -1
- package/dist/lib/llm/llm-config.js +161 -17
- package/dist/lib/llm/llm-config.js.map +1 -1
- package/dist/lib/llm/llm-factory.d.ts +1 -2
- package/dist/lib/llm/llm-factory.d.ts.map +1 -1
- package/dist/lib/llm/llm-factory.js +41 -8
- package/dist/lib/llm/llm-factory.js.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -0
- package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.js +37 -5
- package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -1
- package/dist/lib/llm/providers/openai-embeddings.js +41 -10
- package/dist/lib/llm/providers/openai-embeddings.js.map +1 -1
- package/dist/lib/local-llm/binary-manager.d.ts +66 -0
- package/dist/lib/local-llm/binary-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/binary-manager.js +441 -0
- package/dist/lib/local-llm/binary-manager.js.map +1 -0
- package/dist/lib/local-llm/engine-interface.d.ts +47 -0
- package/dist/lib/local-llm/engine-interface.d.ts.map +1 -0
- package/dist/lib/local-llm/engine-interface.js +2 -0
- package/dist/lib/local-llm/engine-interface.js.map +1 -0
- package/dist/lib/local-llm/engine-registry.d.ts +20 -0
- package/dist/lib/local-llm/engine-registry.d.ts.map +1 -0
- package/dist/lib/local-llm/engine-registry.js +56 -0
- package/dist/lib/local-llm/engine-registry.js.map +1 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts +31 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts.map +1 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.js +164 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.js.map +1 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts +31 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts.map +1 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.js +161 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.js.map +1 -0
- package/dist/lib/local-llm/gguf-reader.d.ts +20 -0
- package/dist/lib/local-llm/gguf-reader.d.ts.map +1 -0
- package/dist/lib/local-llm/gguf-reader.js +190 -0
- package/dist/lib/local-llm/gguf-reader.js.map +1 -0
- package/dist/lib/local-llm/index.d.ts +9 -0
- package/dist/lib/local-llm/index.d.ts.map +1 -0
- package/dist/lib/local-llm/index.js +6 -0
- package/dist/lib/local-llm/index.js.map +1 -0
- package/dist/lib/local-llm/llama-server-process.d.ts +42 -0
- package/dist/lib/local-llm/llama-server-process.d.ts.map +1 -0
- package/dist/lib/local-llm/llama-server-process.js +237 -0
- package/dist/lib/local-llm/llama-server-process.js.map +1 -0
- package/dist/lib/local-llm/mlx-binary-manager.d.ts +33 -0
- package/dist/lib/local-llm/mlx-binary-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/mlx-binary-manager.js +211 -0
- package/dist/lib/local-llm/mlx-binary-manager.js.map +1 -0
- package/dist/lib/local-llm/mlx-server-process.d.ts +26 -0
- package/dist/lib/local-llm/mlx-server-process.d.ts.map +1 -0
- package/dist/lib/local-llm/mlx-server-process.js +210 -0
- package/dist/lib/local-llm/mlx-server-process.js.map +1 -0
- package/dist/lib/local-llm/model-manager.d.ts +33 -0
- package/dist/lib/local-llm/model-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/model-manager.js +591 -0
- package/dist/lib/local-llm/model-manager.js.map +1 -0
- package/dist/lib/local-llm/types.d.ts +51 -0
- package/dist/lib/local-llm/types.d.ts.map +1 -0
- package/dist/lib/local-llm/types.js +2 -0
- package/dist/lib/local-llm/types.js.map +1 -0
- package/dist/lib/logger.d.ts +2 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +68 -5
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/orchestrator.d.ts +9 -0
- package/dist/lib/orchestrator.d.ts.map +1 -1
- package/dist/lib/orchestrator.js +151 -3
- package/dist/lib/orchestrator.js.map +1 -1
- package/dist/lib/sandbox/cdp-client.d.ts +2 -1
- package/dist/lib/sandbox/cdp-client.d.ts.map +1 -1
- package/dist/lib/sandbox/cdp-client.js +33 -7
- package/dist/lib/sandbox/cdp-client.js.map +1 -1
- package/dist/lib/sandbox/index.d.ts +1 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -1
- package/dist/lib/sandbox/index.js +1 -0
- package/dist/lib/sandbox/index.js.map +1 -1
- package/dist/lib/sandbox/page-readiness.d.ts.map +1 -1
- package/dist/lib/sandbox/page-readiness.js +33 -0
- package/dist/lib/sandbox/page-readiness.js.map +1 -1
- package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-browser.js +14 -1
- package/dist/lib/sandbox/sandbox-browser.js.map +1 -1
- package/dist/lib/sandbox/sandbox-container.d.ts +39 -0
- package/dist/lib/sandbox/sandbox-container.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-container.js +176 -0
- package/dist/lib/sandbox/sandbox-container.js.map +1 -0
- package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-file.js +5 -4
- package/dist/lib/sandbox/sandbox-file.js.map +1 -1
- package/dist/lib/sandbox/sandbox-shell.d.ts +2 -1
- package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-shell.js +42 -24
- package/dist/lib/sandbox/sandbox-shell.js.map +1 -1
- package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-web.js +27 -2
- package/dist/lib/sandbox/sandbox-web.js.map +1 -1
- package/dist/lib/sandbox/vision-browser.d.ts.map +1 -1
- package/dist/lib/sandbox/vision-browser.js +9 -0
- package/dist/lib/sandbox/vision-browser.js.map +1 -1
- package/dist/lib/sea/app-window.d.ts +7 -0
- package/dist/lib/sea/app-window.d.ts.map +1 -0
- package/dist/lib/sea/app-window.js +95 -0
- package/dist/lib/sea/app-window.js.map +1 -0
- package/dist/lib/sea/bootstrap.d.ts +18 -0
- package/dist/lib/sea/bootstrap.d.ts.map +1 -0
- package/dist/lib/sea/bootstrap.js +103 -0
- package/dist/lib/sea/bootstrap.js.map +1 -0
- package/dist/lib/sea/sqlite-vec-shim.d.ts +3 -0
- package/dist/lib/sea/sqlite-vec-shim.d.ts.map +1 -0
- package/dist/lib/sea/sqlite-vec-shim.js +10 -0
- package/dist/lib/sea/sqlite-vec-shim.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +1 -2
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +7 -13
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +2 -4
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-search.tool.js +4 -4
- package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.js +70 -37
- package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-tools-factory.js +2 -2
- package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +1 -2
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js +5 -11
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.js +5 -4
- package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
- package/dist/lib/types/tool-factory.d.ts.map +1 -1
- package/dist/lib/types/tool-factory.js +9 -2
- package/dist/lib/types/tool-factory.js.map +1 -1
- package/dist/lib/utils/document-extract.d.ts +10 -0
- package/dist/lib/utils/document-extract.d.ts.map +1 -0
- package/dist/lib/utils/document-extract.js +149 -0
- package/dist/lib/utils/document-extract.js.map +1 -0
- package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -1
- package/dist/lib/workflows/react-workflow-executor.js +20 -14
- package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
- package/dist/lib/workflows/types.d.ts +71 -45
- package/dist/lib/workflows/types.d.ts.map +1 -1
- package/dist/lib/workflows/types.js +10 -0
- package/dist/lib/workflows/types.js.map +1 -1
- package/dist/public/assets/logo.png +0 -0
- package/dist/public/chat.html +3 -78
- package/dist/public/index.html +3 -330
- package/dist/public/src/components/AgentComposer.js +132 -132
- package/dist/public/src/components/AgentsView.js +1231 -350
- package/dist/public/src/components/AppRoot.js +101 -39
- package/dist/public/src/components/GraphView.js +11 -13
- package/dist/public/src/components/IdeView.js +133 -98
- package/dist/public/src/components/KnowledgeView.js +94 -130
- package/dist/public/src/components/LlmView.js +15 -19
- package/dist/public/src/components/LocalLlmView.js +2440 -0
- package/dist/public/src/components/LogViewer.js +155 -0
- package/dist/public/src/components/McpView.js +41 -49
- package/dist/public/src/components/MonitorView.js +79 -126
- package/dist/public/src/components/NavBar.js +16 -26
- package/dist/public/src/components/StandaloneChat.js +136 -150
- package/dist/public/src/services/ApiService.js +196 -2
- package/dist/public/src/services/SessionStore.js +6 -3
- package/dist/public/src/services/StreamManager.js +183 -0
- package/dist/public/src/store.js +1 -1
- package/dist/public/src/utils/card.js +21 -0
- package/dist/public/src/utils/markdown.js +1 -7
- package/dist/public/styles.css +2777 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +7 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/start.d.ts.map +1 -1
- package/dist/src/cli/commands/start.js +28 -5
- package/dist/src/cli/commands/start.js.map +1 -1
- package/dist/src/cli/index.js +13 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/index.js +7 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/routes/agents.route.d.ts.map +1 -1
- package/dist/src/routes/agents.route.js +2 -0
- package/dist/src/routes/agents.route.js.map +1 -1
- package/dist/src/routes/chat.route.d.ts.map +1 -1
- package/dist/src/routes/chat.route.js +3 -2
- package/dist/src/routes/chat.route.js.map +1 -1
- package/dist/src/routes/llm.route.d.ts.map +1 -1
- package/dist/src/routes/llm.route.js +227 -7
- package/dist/src/routes/llm.route.js.map +1 -1
- package/dist/src/routes/local-llm.route.d.ts +3 -0
- package/dist/src/routes/local-llm.route.d.ts.map +1 -0
- package/dist/src/routes/local-llm.route.js +688 -0
- package/dist/src/routes/local-llm.route.js.map +1 -0
- package/dist/src/routes/logs.route.d.ts +3 -0
- package/dist/src/routes/logs.route.d.ts.map +1 -0
- package/dist/src/routes/logs.route.js +24 -0
- package/dist/src/routes/logs.route.js.map +1 -0
- package/dist/src/routes/vnc.route.d.ts +10 -1
- package/dist/src/routes/vnc.route.d.ts.map +1 -1
- package/dist/src/routes/vnc.route.js +37 -12
- package/dist/src/routes/vnc.route.js.map +1 -1
- package/dist/src/routes/workflows.route.d.ts.map +1 -1
- package/dist/src/routes/workflows.route.js +24 -0
- package/dist/src/routes/workflows.route.js.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +24 -2
- package/dist/src/server.js.map +1 -1
- package/dist/templates/agents/actor.agent.yaml +34 -0
- package/dist/templates/agents/architect.agent.yaml +0 -1
- package/dist/templates/agents/chatbot.agent.yaml +0 -1
- package/dist/templates/agents/corporate.agent.yaml +0 -1
- package/dist/templates/agents/functions.agent.yaml +29 -0
- package/dist/templates/agents/investment-analyst.agent.yaml +0 -1
- package/dist/templates/agents/music-librarian.agent.yaml +3 -27
- package/dist/templates/agents/network-security.agent.yaml +0 -1
- package/dist/templates/agents/transport-security.agent.yaml +0 -1
- package/dist/templates/agents/web-engineer.agent.yaml +3 -4
- package/dist/templates/agents/web-pilot.agent.yaml +0 -1
- package/dist/templates/knowledge/patient-records.knowledge.yaml +20 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_0.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_1.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_10.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_11.pdf +0 -0
- package/dist/templates/knowledge/web-docs.knowledge.yaml +1 -1
- package/dist/templates/llm.json +73 -10
- package/dist/templates/skills/orcha-builder/SKILL.md +56 -3
- package/dist/templates/workflows/example.workflow.yaml +27 -35
- package/dist/templates/workflows/react-example.workflow.yaml +14 -19
- package/dist/templates/workflows/team-chat.workflow.yaml +47 -0
- package/package.json +14 -6
- package/dist/public/src/components/SkillsView.js +0 -137
- package/dist/public/src/components/WorkflowsView.js +0 -568
|
@@ -17,7 +17,7 @@ class StandaloneChat extends HTMLElement {
|
|
|
17
17
|
this.agentName = parts[parts.length - 1] || '';
|
|
18
18
|
|
|
19
19
|
if (!this.agentName) {
|
|
20
|
-
this.innerHTML = '<div class="
|
|
20
|
+
this.innerHTML = '<div class="auth-overlay"><span class="text-secondary">Invalid agent URL</span></div>';
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -43,7 +43,7 @@ class StandaloneChat extends HTMLElement {
|
|
|
43
43
|
try {
|
|
44
44
|
const res = await fetch(`/api/chat/${this.agentName}/config`);
|
|
45
45
|
if (!res.ok) {
|
|
46
|
-
this.innerHTML = '<div class="
|
|
46
|
+
this.innerHTML = '<div class="auth-overlay"><span class="text-secondary">Agent not found or not published</span></div>';
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
this.agentConfig = await res.json();
|
|
@@ -55,7 +55,7 @@ class StandaloneChat extends HTMLElement {
|
|
|
55
55
|
this.renderChat();
|
|
56
56
|
}
|
|
57
57
|
} catch {
|
|
58
|
-
this.innerHTML = '<div class="
|
|
58
|
+
this.innerHTML = '<div class="auth-overlay"><span class="text-secondary">Failed to load agent</span></div>';
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
@@ -63,21 +63,19 @@ class StandaloneChat extends HTMLElement {
|
|
|
63
63
|
|
|
64
64
|
renderPasswordOverlay() {
|
|
65
65
|
this.innerHTML = `
|
|
66
|
-
<div class="
|
|
67
|
-
<div class="
|
|
66
|
+
<div class="auth-overlay">
|
|
67
|
+
<div class="auth-card">
|
|
68
68
|
<div class="text-center mb-6">
|
|
69
|
-
<i class="fas fa-lock text-2xl text-
|
|
70
|
-
<h2 class="text-lg font-semibold text-
|
|
71
|
-
<p class="text-sm text-
|
|
69
|
+
<i class="fas fa-lock text-2xl text-muted mb-3"></i>
|
|
70
|
+
<h2 class="text-lg font-semibold text-primary">${this.escapeHtml(this.agentConfig.name)}</h2>
|
|
71
|
+
<p class="text-sm text-secondary mt-1">This agent requires a password</p>
|
|
72
72
|
</div>
|
|
73
|
-
<div id="authError" class="hidden text-sm text-red
|
|
73
|
+
<div id="authError" class="hidden text-sm text-red text-center mb-3"></div>
|
|
74
74
|
<div class="relative">
|
|
75
|
-
<input id="passwordInput" type="password"
|
|
76
|
-
class="w-full bg-dark-bg border border-dark-border rounded-xl px-4 py-3 text-gray-100 placeholder-gray-500 focus:outline-none focus:border-gray-500 transition-colors"
|
|
75
|
+
<input id="passwordInput" type="password" class="input w-full"
|
|
77
76
|
placeholder="Enter password">
|
|
78
77
|
</div>
|
|
79
|
-
<button id="authBtn"
|
|
80
|
-
class="w-full mt-4 bg-gradient-to-r from-blue-600 to-blue-700 hover:from-blue-500 hover:to-blue-600 text-white py-3 rounded-xl font-medium transition-all">
|
|
78
|
+
<button id="authBtn" class="btn btn-accent w-full mt-4">
|
|
81
79
|
Continue
|
|
82
80
|
</button>
|
|
83
81
|
</div>
|
|
@@ -129,43 +127,39 @@ class StandaloneChat extends HTMLElement {
|
|
|
129
127
|
|
|
130
128
|
renderChat() {
|
|
131
129
|
const desc = this.agentConfig.description
|
|
132
|
-
? `<p class="text-xs text-
|
|
130
|
+
? `<p class="text-xs text-muted truncate">${this.escapeHtml(this.agentConfig.description)}</p>`
|
|
133
131
|
: '';
|
|
134
132
|
|
|
135
133
|
this.innerHTML = `
|
|
136
|
-
<div class="
|
|
134
|
+
<div class="standalone-shell">
|
|
137
135
|
<!-- Header -->
|
|
138
|
-
<div class="
|
|
139
|
-
<i class="fas fa-robot text-
|
|
136
|
+
<div class="standalone-header">
|
|
137
|
+
<i class="fas fa-robot text-accent"></i>
|
|
140
138
|
<div class="min-w-0">
|
|
141
|
-
<h1 class="text-sm font-semibold text-
|
|
139
|
+
<h1 class="text-sm font-semibold text-primary">${this.escapeHtml(this.agentConfig.name)}</h1>
|
|
142
140
|
${desc}
|
|
143
141
|
</div>
|
|
144
142
|
</div>
|
|
145
143
|
|
|
146
144
|
<!-- Messages -->
|
|
147
|
-
<div id="chatMessages" class="
|
|
145
|
+
<div id="chatMessages" class="chat-messages custom-scrollbar">
|
|
148
146
|
${this.renderSampleQuestions()}
|
|
149
147
|
</div>
|
|
150
148
|
|
|
151
149
|
<!-- Input -->
|
|
152
|
-
<div class="
|
|
153
|
-
<div id="attachmentPreview" class="
|
|
154
|
-
<div class="
|
|
155
|
-
<input type="file" id="fileInput" multiple accept="image/*,.pdf" class="hidden">
|
|
150
|
+
<div class="chat-input-area">
|
|
151
|
+
<div id="attachmentPreview" class="attachment-preview"></div>
|
|
152
|
+
<div class="chat-input-wrap">
|
|
153
|
+
<input type="file" id="fileInput" multiple accept="image/*,.pdf,.doc,.docx,.xls,.xlsx,.pptx,.txt,.md,.csv,.json,.yaml,.yml,.xml,.html,.css,.js,.ts,.py,.java,.c,.cpp,.go,.rs,.rb,.php,.sql,.sh,.log,.ini,.toml,.env" class="hidden">
|
|
156
154
|
<textarea id="chatInput" rows="1"
|
|
157
|
-
class="w-full bg-transparent pl-11 pr-14 py-3 text-gray-100 placeholder-gray-500 resize-none focus:outline-none max-h-[200px]"
|
|
158
155
|
placeholder="Type a message..."></textarea>
|
|
159
|
-
<div class="
|
|
160
|
-
<button id="attachBtn" type="button"
|
|
161
|
-
class="text-gray-500 hover:text-gray-300 p-1.5 rounded-lg hover:bg-dark-hover transition-colors"
|
|
162
|
-
title="Attach files">
|
|
156
|
+
<div class="chat-input-actions left">
|
|
157
|
+
<button id="attachBtn" type="button" class="attach-btn" title="Attach files">
|
|
163
158
|
<i class="fas fa-plus text-sm"></i>
|
|
164
159
|
</button>
|
|
165
160
|
</div>
|
|
166
|
-
<div class="
|
|
167
|
-
<button id="sendBtn"
|
|
168
|
-
class="bg-gradient-to-r from-blue-600 to-blue-700 hover:from-blue-500 hover:to-blue-600 disabled:opacity-50 disabled:cursor-not-allowed text-white p-2 rounded-lg transition-all shadow-lg shadow-blue-900/20">
|
|
161
|
+
<div class="chat-input-actions right">
|
|
162
|
+
<button id="sendBtn" class="send-btn">
|
|
169
163
|
<i class="fas fa-paper-plane text-sm"></i>
|
|
170
164
|
</button>
|
|
171
165
|
</div>
|
|
@@ -182,13 +176,13 @@ class StandaloneChat extends HTMLElement {
|
|
|
182
176
|
if (!questions || questions.length === 0) return '';
|
|
183
177
|
|
|
184
178
|
const chips = questions.map(q =>
|
|
185
|
-
`<button class="sample-question-chip
|
|
179
|
+
`<button class="sample-question-chip">${this.escapeHtml(q)}</button>`
|
|
186
180
|
).join('');
|
|
187
181
|
|
|
188
182
|
return `
|
|
189
|
-
<div id="sampleQuestions" class="
|
|
190
|
-
<p class="text-
|
|
191
|
-
<div class="
|
|
183
|
+
<div id="sampleQuestions" class="welcome-container">
|
|
184
|
+
<p class="text-muted text-sm">Try asking</p>
|
|
185
|
+
<div class="sample-questions-wrap">${chips}</div>
|
|
192
186
|
</div>
|
|
193
187
|
`;
|
|
194
188
|
}
|
|
@@ -268,22 +262,22 @@ class StandaloneChat extends HTMLElement {
|
|
|
268
262
|
if (!preview) return;
|
|
269
263
|
|
|
270
264
|
if (this.pendingAttachments.length === 0) {
|
|
271
|
-
preview.classList.
|
|
265
|
+
preview.classList.remove('visible');
|
|
272
266
|
preview.innerHTML = '';
|
|
273
267
|
return;
|
|
274
268
|
}
|
|
275
269
|
|
|
276
|
-
preview.classList.
|
|
270
|
+
preview.classList.add('visible');
|
|
277
271
|
preview.innerHTML = this.pendingAttachments.map((att, i) => {
|
|
278
272
|
const isImage = att.mediaType.startsWith('image/');
|
|
279
273
|
const thumb = isImage
|
|
280
|
-
? `<img src="data:${att.mediaType};base64,${att.data}"
|
|
281
|
-
: `<i class="fas fa-file text-
|
|
274
|
+
? `<img src="data:${att.mediaType};base64,${att.data}">`
|
|
275
|
+
: `<i class="fas fa-file text-secondary text-lg"></i>`;
|
|
282
276
|
return `
|
|
283
|
-
<div class="attachment-pill
|
|
277
|
+
<div class="attachment-pill">
|
|
284
278
|
${thumb}
|
|
285
|
-
<span class="
|
|
286
|
-
<button class="attachment-remove
|
|
279
|
+
<span class="truncate attachment-name">${this.escapeHtml(att.name)}</span>
|
|
280
|
+
<button class="attachment-remove" data-index="${i}">
|
|
287
281
|
<i class="fas fa-xmark text-xs"></i>
|
|
288
282
|
</button>
|
|
289
283
|
</div>
|
|
@@ -376,7 +370,7 @@ class StandaloneChat extends HTMLElement {
|
|
|
376
370
|
const bubble = this.querySelector(`#${responseId}`);
|
|
377
371
|
const contentDiv = bubble.querySelector('.response-content');
|
|
378
372
|
const container = this.querySelector('#chatMessages');
|
|
379
|
-
const thinkingState = { inThinking: false, thinkingSections: [], currentSection: null };
|
|
373
|
+
const thinkingState = { inThinking: false, thinkingSections: [], currentSection: null, thinkingContent: '', thinkingPill: null };
|
|
380
374
|
|
|
381
375
|
let currentContent = '';
|
|
382
376
|
let buffer = '';
|
|
@@ -424,8 +418,7 @@ class StandaloneChat extends HTMLElement {
|
|
|
424
418
|
const loadingDots = contentDiv.querySelector('.loading-dots');
|
|
425
419
|
if (loadingDots) {
|
|
426
420
|
loadingDots.remove();
|
|
427
|
-
bubble.querySelector('.response-bubble-inner').classList.remove('
|
|
428
|
-
bubble.querySelector('.response-bubble-inner').classList.add('py-3');
|
|
421
|
+
bubble.querySelector('.response-bubble-inner').classList.remove('loading');
|
|
429
422
|
contentDiv.classList.remove('flex', 'items-center', 'whitespace-pre-wrap');
|
|
430
423
|
contentDiv.innerHTML = '';
|
|
431
424
|
}
|
|
@@ -451,8 +444,7 @@ class StandaloneChat extends HTMLElement {
|
|
|
451
444
|
this.finalizeThinkingPill(toolsDiv, thinkingState);
|
|
452
445
|
if (loadingDots) {
|
|
453
446
|
loadingDots.remove();
|
|
454
|
-
bubble.querySelector('.response-bubble-inner').classList.remove('
|
|
455
|
-
bubble.querySelector('.response-bubble-inner').classList.add('py-3');
|
|
447
|
+
bubble.querySelector('.response-bubble-inner').classList.remove('loading');
|
|
456
448
|
contentDiv.classList.remove('flex', 'items-center', 'whitespace-pre-wrap');
|
|
457
449
|
contentDiv.innerHTML = '';
|
|
458
450
|
}
|
|
@@ -463,10 +455,10 @@ class StandaloneChat extends HTMLElement {
|
|
|
463
455
|
const toolId = `tool-${event.runId}`;
|
|
464
456
|
const toolEl = document.createElement('div');
|
|
465
457
|
toolEl.id = toolId;
|
|
466
|
-
toolEl.className = 'tool-pill
|
|
458
|
+
toolEl.className = 'tool-pill';
|
|
467
459
|
toolEl.dataset.toolInput = typeof event.input === 'string' ? event.input : JSON.stringify(event.input, null, 2);
|
|
468
460
|
toolEl.innerHTML = `
|
|
469
|
-
<i class="fas fa-circle-notch animate-spin text-blue
|
|
461
|
+
<i class="fas fa-circle-notch animate-spin text-blue text-2xs"></i>
|
|
470
462
|
<span>${this.escapeHtml(event.tool)}</span>
|
|
471
463
|
`;
|
|
472
464
|
toolsDiv.appendChild(toolEl);
|
|
@@ -478,82 +470,56 @@ class StandaloneChat extends HTMLElement {
|
|
|
478
470
|
const toolInput = toolEl.dataset.toolInput || '';
|
|
479
471
|
const toolOutput = typeof event.output === 'string' ? event.output : JSON.stringify(event.output, null, 2);
|
|
480
472
|
|
|
481
|
-
toolEl.className = 'tool-pill
|
|
473
|
+
toolEl.className = 'tool-pill done';
|
|
482
474
|
toolEl.innerHTML = '';
|
|
483
475
|
|
|
484
476
|
const pillContent = document.createElement('span');
|
|
485
|
-
pillContent.className = 'inline-flex items-center gap-1
|
|
477
|
+
pillContent.className = 'inline-flex items-center gap-1';
|
|
486
478
|
pillContent.innerHTML = `
|
|
487
|
-
<i class="fas fa-check text-green
|
|
479
|
+
<i class="fas fa-check text-green text-2xs"></i>
|
|
488
480
|
<span>${this.escapeHtml(event.tool)}</span>
|
|
489
481
|
`;
|
|
490
482
|
toolEl.appendChild(pillContent);
|
|
491
483
|
|
|
492
484
|
const details = document.createElement('div');
|
|
493
|
-
details.className = 'tool-invocation-details
|
|
485
|
+
details.className = 'tool-invocation-details';
|
|
494
486
|
|
|
495
487
|
if (toolInput) {
|
|
496
488
|
const inputSection = document.createElement('div');
|
|
497
|
-
inputSection.className = '
|
|
498
|
-
inputSection.innerHTML = '<
|
|
489
|
+
inputSection.className = 'tool-detail-section';
|
|
490
|
+
inputSection.innerHTML = '<h4>Input</h4>';
|
|
499
491
|
const inputPre = document.createElement('pre');
|
|
500
|
-
inputPre.className = '
|
|
492
|
+
inputPre.className = 'tool-detail-pre custom-scrollbar';
|
|
501
493
|
inputPre.textContent = toolInput;
|
|
502
494
|
inputSection.appendChild(inputPre);
|
|
503
495
|
details.appendChild(inputSection);
|
|
504
496
|
}
|
|
505
497
|
|
|
506
498
|
const outputSection = document.createElement('div');
|
|
507
|
-
outputSection.className = '
|
|
508
|
-
outputSection.innerHTML = '<
|
|
499
|
+
outputSection.className = 'tool-detail-section';
|
|
500
|
+
outputSection.innerHTML = '<h4>Output</h4>';
|
|
509
501
|
const outputPre = document.createElement('pre');
|
|
510
|
-
outputPre.className = '
|
|
502
|
+
outputPre.className = 'tool-detail-pre custom-scrollbar';
|
|
511
503
|
outputPre.textContent = toolOutput;
|
|
512
504
|
outputSection.appendChild(outputPre);
|
|
513
505
|
details.appendChild(outputSection);
|
|
514
506
|
|
|
515
507
|
toolEl.appendChild(details);
|
|
516
508
|
|
|
517
|
-
|
|
518
|
-
if (details.contains(e.target)) return;
|
|
519
|
-
e.preventDefault();
|
|
520
|
-
e.stopPropagation();
|
|
521
|
-
toolsDiv.querySelectorAll('.tool-invocation-details:not(.hidden)').forEach(d => {
|
|
522
|
-
if (d !== details) d.classList.add('hidden');
|
|
523
|
-
});
|
|
524
|
-
const wasHidden = details.classList.contains('hidden');
|
|
525
|
-
details.classList.toggle('hidden');
|
|
526
|
-
if (wasHidden) {
|
|
527
|
-
const pillRect = toolEl.getBoundingClientRect();
|
|
528
|
-
const containerRect = container.getBoundingClientRect();
|
|
529
|
-
const spaceRight = containerRect.right - pillRect.left;
|
|
530
|
-
if (spaceRight < 420) {
|
|
531
|
-
details.style.right = '0';
|
|
532
|
-
details.style.left = 'auto';
|
|
533
|
-
} else {
|
|
534
|
-
details.style.left = '0';
|
|
535
|
-
details.style.right = 'auto';
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
});
|
|
539
|
-
|
|
540
|
-
document.addEventListener('click', (e) => {
|
|
541
|
-
if (!toolEl.contains(e.target)) details.classList.add('hidden');
|
|
542
|
-
}, { capture: true });
|
|
509
|
+
this._attachClickDetails(toolEl, details, toolsDiv, container);
|
|
543
510
|
container.scrollTop = container.scrollHeight;
|
|
544
511
|
}
|
|
545
512
|
} else if (event.type === 'result') {
|
|
546
513
|
if (loadingDots) {
|
|
547
514
|
loadingDots.remove();
|
|
548
|
-
bubble.querySelector('.response-bubble-inner').classList.remove('
|
|
549
|
-
bubble.querySelector('.response-bubble-inner').classList.add('py-3');
|
|
515
|
+
bubble.querySelector('.response-bubble-inner').classList.remove('loading');
|
|
550
516
|
contentDiv.classList.remove('flex', 'items-center', 'whitespace-pre-wrap');
|
|
551
517
|
contentDiv.innerHTML = '';
|
|
552
518
|
}
|
|
553
519
|
const resultContainer = document.createElement('div');
|
|
554
|
-
resultContainer.className = '
|
|
520
|
+
resultContainer.className = 'panel';
|
|
555
521
|
const resultPre = document.createElement('pre');
|
|
556
|
-
resultPre.className = 'text-sm text-
|
|
522
|
+
resultPre.className = 'text-sm text-primary font-mono whitespace-pre-wrap overflow-x-auto';
|
|
557
523
|
resultPre.textContent = JSON.stringify(event.output, null, 2);
|
|
558
524
|
resultContainer.appendChild(resultPre);
|
|
559
525
|
contentDiv.appendChild(resultContainer);
|
|
@@ -561,15 +527,20 @@ class StandaloneChat extends HTMLElement {
|
|
|
561
527
|
} else if (event.type === 'error') {
|
|
562
528
|
if (loadingDots) {
|
|
563
529
|
loadingDots.remove();
|
|
564
|
-
bubble.querySelector('.response-bubble-inner').classList.remove('
|
|
565
|
-
bubble.querySelector('.response-bubble-inner').classList.add('py-3');
|
|
530
|
+
bubble.querySelector('.response-bubble-inner').classList.remove('loading');
|
|
566
531
|
contentDiv.classList.remove('flex', 'items-center', 'whitespace-pre-wrap');
|
|
567
532
|
}
|
|
568
533
|
const errorDiv = document.createElement('div');
|
|
569
|
-
errorDiv.className = 'text-red
|
|
534
|
+
errorDiv.className = 'text-red text-sm';
|
|
570
535
|
errorDiv.textContent = `Error: ${event.error}`;
|
|
571
536
|
contentDiv.appendChild(errorDiv);
|
|
572
537
|
container.scrollTop = container.scrollHeight;
|
|
538
|
+
} else if (event.type === 'warning') {
|
|
539
|
+
const warningDiv = document.createElement('div');
|
|
540
|
+
warningDiv.className = 'text-yellow text-sm';
|
|
541
|
+
warningDiv.textContent = event.message;
|
|
542
|
+
contentDiv.appendChild(warningDiv);
|
|
543
|
+
container.scrollTop = container.scrollHeight;
|
|
573
544
|
} else if (event.type === 'usage') {
|
|
574
545
|
this.streamUsageData = {
|
|
575
546
|
input_tokens: event.input_tokens || 0,
|
|
@@ -610,9 +581,9 @@ class StandaloneChat extends HTMLElement {
|
|
|
610
581
|
|
|
611
582
|
if (!thinkingState.thinkingPill) {
|
|
612
583
|
const pill = document.createElement('div');
|
|
613
|
-
pill.className = '
|
|
584
|
+
pill.className = 'tool-pill thinking';
|
|
614
585
|
pill.innerHTML = `
|
|
615
|
-
<i class="fas fa-brain animate-pulse text-
|
|
586
|
+
<i class="fas fa-brain animate-pulse text-2xs"></i>
|
|
616
587
|
<span>Thinking...</span>
|
|
617
588
|
`;
|
|
618
589
|
toolsDiv.appendChild(pill);
|
|
@@ -621,7 +592,36 @@ class StandaloneChat extends HTMLElement {
|
|
|
621
592
|
}
|
|
622
593
|
}
|
|
623
594
|
|
|
595
|
+
_attachClickDetails(pillEl, detailsEl, toolsDiv, container) {
|
|
596
|
+
pillEl.addEventListener('click', (e) => {
|
|
597
|
+
if (detailsEl.contains(e.target)) return;
|
|
598
|
+
e.preventDefault();
|
|
599
|
+
e.stopPropagation();
|
|
600
|
+
toolsDiv.querySelectorAll('.tool-invocation-details.visible').forEach(d => {
|
|
601
|
+
if (d !== detailsEl) d.classList.remove('visible');
|
|
602
|
+
});
|
|
603
|
+
const wasHidden = !detailsEl.classList.contains('visible');
|
|
604
|
+
detailsEl.classList.toggle('visible');
|
|
605
|
+
if (wasHidden && container) {
|
|
606
|
+
const pillRect = pillEl.getBoundingClientRect();
|
|
607
|
+
const containerRect = container.getBoundingClientRect();
|
|
608
|
+
const spaceRight = containerRect.right - pillRect.left;
|
|
609
|
+
if (spaceRight < 420) {
|
|
610
|
+
detailsEl.style.right = '0';
|
|
611
|
+
detailsEl.style.left = 'auto';
|
|
612
|
+
} else {
|
|
613
|
+
detailsEl.style.left = '0';
|
|
614
|
+
detailsEl.style.right = 'auto';
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
document.addEventListener('click', (e) => {
|
|
619
|
+
if (!pillEl.contains(e.target)) detailsEl.classList.remove('visible');
|
|
620
|
+
}, { capture: true });
|
|
621
|
+
}
|
|
622
|
+
|
|
624
623
|
finalizeThinkingPill(toolsDiv, thinkingState) {
|
|
624
|
+
const container = this.querySelector('#chatMessages');
|
|
625
625
|
const pill = thinkingState.thinkingPill;
|
|
626
626
|
if (!pill) return;
|
|
627
627
|
|
|
@@ -629,40 +629,28 @@ class StandaloneChat extends HTMLElement {
|
|
|
629
629
|
thinkingState.thinkingPill = null;
|
|
630
630
|
thinkingState.thinkingContent = '';
|
|
631
631
|
|
|
632
|
-
pill.className = '
|
|
632
|
+
pill.className = 'tool-pill done thinking';
|
|
633
633
|
pill.innerHTML = '';
|
|
634
634
|
|
|
635
635
|
const pillContent = document.createElement('span');
|
|
636
|
-
pillContent.className = 'inline-flex items-center gap-1
|
|
637
|
-
pillContent.innerHTML =
|
|
638
|
-
<i class="fas fa-brain text-purple-400 text-[10px]"></i>
|
|
639
|
-
<span>Thinking</span>
|
|
640
|
-
`;
|
|
636
|
+
pillContent.className = 'inline-flex items-center gap-1';
|
|
637
|
+
pillContent.innerHTML = '<i class="fas fa-brain text-purple text-2xs"></i><span>Thinking</span>';
|
|
641
638
|
pill.appendChild(pillContent);
|
|
642
639
|
|
|
643
|
-
const
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
const
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
popover.style.top = 'auto';
|
|
658
|
-
if (pillRect.left + 400 > window.innerWidth - 16) {
|
|
659
|
-
popover.style.left = Math.max(8, pillRect.right - 400) + 'px';
|
|
660
|
-
} else {
|
|
661
|
-
popover.style.left = pillRect.left + 'px';
|
|
662
|
-
}
|
|
663
|
-
popover.style.right = 'auto';
|
|
664
|
-
});
|
|
665
|
-
pill.addEventListener('mouseleave', () => popover.classList.add('hidden'));
|
|
640
|
+
const details = document.createElement('div');
|
|
641
|
+
details.className = 'tool-invocation-details';
|
|
642
|
+
|
|
643
|
+
const section = document.createElement('div');
|
|
644
|
+
section.className = 'tool-detail-section';
|
|
645
|
+
const pre = document.createElement('div');
|
|
646
|
+
pre.className = 'tool-detail-pre markdown-content custom-scrollbar';
|
|
647
|
+
pre.innerHTML = this.renderMarkdown(content);
|
|
648
|
+
this.highlightCode(pre);
|
|
649
|
+
section.appendChild(pre);
|
|
650
|
+
details.appendChild(section);
|
|
651
|
+
pill.appendChild(details);
|
|
652
|
+
|
|
653
|
+
this._attachClickDetails(pill, details, toolsDiv, container);
|
|
666
654
|
}
|
|
667
655
|
|
|
668
656
|
// --- Bubble rendering ---
|
|
@@ -676,18 +664,18 @@ class StandaloneChat extends HTMLElement {
|
|
|
676
664
|
if (attachments && attachments.length > 0) {
|
|
677
665
|
const thumbs = attachments.map(att => {
|
|
678
666
|
if (att.mediaType.startsWith('image/')) {
|
|
679
|
-
return `<img src="data:${att.mediaType};base64,${att.data}" class="
|
|
667
|
+
return `<img src="data:${att.mediaType};base64,${att.data}" class="attachment-thumb">`;
|
|
680
668
|
}
|
|
681
|
-
return `<div class="
|
|
669
|
+
return `<div class="attachment-pill">
|
|
682
670
|
<i class="fas fa-file"></i>
|
|
683
|
-
<span class="
|
|
671
|
+
<span class="truncate attachment-name">${this.escapeHtml(att.name)}</span>
|
|
684
672
|
</div>`;
|
|
685
673
|
}).join('');
|
|
686
674
|
attachmentHtml = `<div class="flex flex-wrap gap-2 mb-2">${thumbs}</div>`;
|
|
687
675
|
}
|
|
688
676
|
|
|
689
677
|
div.innerHTML = `
|
|
690
|
-
<div class="
|
|
678
|
+
<div class="user-bubble">
|
|
691
679
|
${attachmentHtml}
|
|
692
680
|
<div class="whitespace-pre-wrap">${this.escapeHtml(content)}</div>
|
|
693
681
|
</div>
|
|
@@ -706,29 +694,27 @@ class StandaloneChat extends HTMLElement {
|
|
|
706
694
|
div.id = id;
|
|
707
695
|
div.className = 'flex justify-start';
|
|
708
696
|
div.innerHTML = `
|
|
709
|
-
<div class="response-bubble-inner
|
|
697
|
+
<div class="response-bubble-inner loading group">
|
|
710
698
|
<div class="response-content whitespace-pre-wrap flex items-center">
|
|
711
|
-
<div class="loading-dots
|
|
712
|
-
<div
|
|
713
|
-
<div
|
|
714
|
-
<div
|
|
699
|
+
<div class="loading-dots">
|
|
700
|
+
<div></div>
|
|
701
|
+
<div></div>
|
|
702
|
+
<div></div>
|
|
715
703
|
</div>
|
|
716
704
|
</div>
|
|
717
|
-
<div class="tool-invocations
|
|
705
|
+
<div class="tool-invocations"></div>
|
|
718
706
|
</div>
|
|
719
707
|
`;
|
|
720
708
|
|
|
721
709
|
wrapper.appendChild(div);
|
|
722
710
|
|
|
723
711
|
const statusBar = document.createElement('div');
|
|
724
|
-
statusBar.className = 'stream-status-bar
|
|
712
|
+
statusBar.className = 'stream-status-bar';
|
|
725
713
|
statusBar.innerHTML = `
|
|
726
|
-
<div class="
|
|
714
|
+
<div class="status-dot-pulse"></div>
|
|
727
715
|
<span class="stream-status-text">Generating...</span>
|
|
728
|
-
<span class="stream-elapsed text-
|
|
729
|
-
<button class="stream-cancel-btn
|
|
730
|
-
Stop
|
|
731
|
-
</button>
|
|
716
|
+
<span class="stream-elapsed text-muted">0.0s</span>
|
|
717
|
+
<button class="stream-cancel-btn">Stop</button>
|
|
732
718
|
`;
|
|
733
719
|
wrapper.appendChild(statusBar);
|
|
734
720
|
|
|
@@ -737,15 +723,15 @@ class StandaloneChat extends HTMLElement {
|
|
|
737
723
|
});
|
|
738
724
|
|
|
739
725
|
const statsBar = document.createElement('div');
|
|
740
|
-
statsBar.className = 'stream-stats-bar
|
|
726
|
+
statsBar.className = 'stream-stats-bar';
|
|
741
727
|
statsBar.innerHTML = `
|
|
742
728
|
<span class="flex items-center gap-1"><i class="far fa-clock"></i><span class="stats-elapsed"></span></span>
|
|
743
|
-
<span class="
|
|
744
|
-
<span class="flex items-center gap-1"><i class="fas fa-arrow-up text-
|
|
745
|
-
<span class="
|
|
746
|
-
<span class="flex items-center gap-1"><i class="fas fa-arrow-down text-
|
|
747
|
-
<span class="
|
|
748
|
-
<span class="flex items-center gap-1"><i class="fas fa-bolt text-
|
|
729
|
+
<span class="divider">|</span>
|
|
730
|
+
<span class="flex items-center gap-1"><i class="fas fa-arrow-up text-2xs"></i><span class="stats-input-tokens"></span></span>
|
|
731
|
+
<span class="divider">|</span>
|
|
732
|
+
<span class="flex items-center gap-1"><i class="fas fa-arrow-down text-2xs"></i><span class="stats-output-tokens"></span></span>
|
|
733
|
+
<span class="divider">|</span>
|
|
734
|
+
<span class="flex items-center gap-1"><i class="fas fa-bolt text-2xs"></i><span class="stats-tps"></span></span>
|
|
749
735
|
`;
|
|
750
736
|
wrapper.appendChild(statsBar);
|
|
751
737
|
|
|
@@ -756,7 +742,7 @@ class StandaloneChat extends HTMLElement {
|
|
|
756
742
|
updateResponseError(id, errorMsg) {
|
|
757
743
|
const bubble = this.querySelector(`#${id}`);
|
|
758
744
|
if (bubble) {
|
|
759
|
-
bubble.querySelector('.response-content').innerHTML = `<span class="text-red
|
|
745
|
+
bubble.querySelector('.response-content').innerHTML = `<span class="text-red">${this.escapeHtml(errorMsg)}</span>`;
|
|
760
746
|
}
|
|
761
747
|
}
|
|
762
748
|
|
|
@@ -802,7 +788,7 @@ class StandaloneChat extends HTMLElement {
|
|
|
802
788
|
const statusBar = wrapper.querySelector('.stream-status-bar');
|
|
803
789
|
const statsBar = wrapper.querySelector('.stream-stats-bar');
|
|
804
790
|
|
|
805
|
-
if (statusBar) statusBar.
|
|
791
|
+
if (statusBar) statusBar.remove();
|
|
806
792
|
|
|
807
793
|
if (statsBar) {
|
|
808
794
|
const elapsedEl = statsBar.querySelector('.stats-elapsed');
|
|
@@ -829,12 +815,12 @@ class StandaloneChat extends HTMLElement {
|
|
|
829
815
|
|
|
830
816
|
if (wasCancelled) {
|
|
831
817
|
const badge = document.createElement('span');
|
|
832
|
-
badge.className = '
|
|
818
|
+
badge.className = 'badge badge-amber';
|
|
833
819
|
badge.textContent = 'Cancelled';
|
|
834
820
|
statsBar.appendChild(badge);
|
|
835
821
|
}
|
|
836
822
|
|
|
837
|
-
statsBar.classList.
|
|
823
|
+
statsBar.classList.add('visible');
|
|
838
824
|
}
|
|
839
825
|
}
|
|
840
826
|
|