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.
Files changed (259) hide show
  1. package/README.md +86 -28
  2. package/dist/lib/agents/agent-executor.d.ts.map +1 -1
  3. package/dist/lib/agents/agent-executor.js +23 -7
  4. package/dist/lib/agents/agent-executor.js.map +1 -1
  5. package/dist/lib/agents/react-loop.d.ts.map +1 -1
  6. package/dist/lib/agents/react-loop.js +27 -0
  7. package/dist/lib/agents/react-loop.js.map +1 -1
  8. package/dist/lib/functions/simple-function-wrapper.js +3 -3
  9. package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
  10. package/dist/lib/knowledge/knowledge-store.d.ts +1 -1
  11. package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
  12. package/dist/lib/knowledge/knowledge-store.js +25 -4
  13. package/dist/lib/knowledge/knowledge-store.js.map +1 -1
  14. package/dist/lib/knowledge/loaders/file-loaders.d.ts +0 -1
  15. package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
  16. package/dist/lib/knowledge/loaders/file-loaders.js +7 -15
  17. package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
  18. package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -1
  19. package/dist/lib/knowledge/sqlite-store.js +19 -10
  20. package/dist/lib/knowledge/sqlite-store.js.map +1 -1
  21. package/dist/lib/knowledge/types.d.ts +13 -13
  22. package/dist/lib/llm/index.d.ts +1 -1
  23. package/dist/lib/llm/index.d.ts.map +1 -1
  24. package/dist/lib/llm/index.js +1 -1
  25. package/dist/lib/llm/index.js.map +1 -1
  26. package/dist/lib/llm/llm-config.d.ts +51 -8
  27. package/dist/lib/llm/llm-config.d.ts.map +1 -1
  28. package/dist/lib/llm/llm-config.js +161 -17
  29. package/dist/lib/llm/llm-config.js.map +1 -1
  30. package/dist/lib/llm/llm-factory.d.ts +1 -2
  31. package/dist/lib/llm/llm-factory.d.ts.map +1 -1
  32. package/dist/lib/llm/llm-factory.js +41 -8
  33. package/dist/lib/llm/llm-factory.js.map +1 -1
  34. package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -0
  35. package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
  36. package/dist/lib/llm/providers/openai-chat-model.js +37 -5
  37. package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
  38. package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -1
  39. package/dist/lib/llm/providers/openai-embeddings.js +41 -10
  40. package/dist/lib/llm/providers/openai-embeddings.js.map +1 -1
  41. package/dist/lib/local-llm/binary-manager.d.ts +66 -0
  42. package/dist/lib/local-llm/binary-manager.d.ts.map +1 -0
  43. package/dist/lib/local-llm/binary-manager.js +441 -0
  44. package/dist/lib/local-llm/binary-manager.js.map +1 -0
  45. package/dist/lib/local-llm/engine-interface.d.ts +47 -0
  46. package/dist/lib/local-llm/engine-interface.d.ts.map +1 -0
  47. package/dist/lib/local-llm/engine-interface.js +2 -0
  48. package/dist/lib/local-llm/engine-interface.js.map +1 -0
  49. package/dist/lib/local-llm/engine-registry.d.ts +20 -0
  50. package/dist/lib/local-llm/engine-registry.d.ts.map +1 -0
  51. package/dist/lib/local-llm/engine-registry.js +56 -0
  52. package/dist/lib/local-llm/engine-registry.js.map +1 -0
  53. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts +31 -0
  54. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts.map +1 -0
  55. package/dist/lib/local-llm/engines/llama-cpp-engine.js +164 -0
  56. package/dist/lib/local-llm/engines/llama-cpp-engine.js.map +1 -0
  57. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts +31 -0
  58. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts.map +1 -0
  59. package/dist/lib/local-llm/engines/mlx-serve-engine.js +161 -0
  60. package/dist/lib/local-llm/engines/mlx-serve-engine.js.map +1 -0
  61. package/dist/lib/local-llm/gguf-reader.d.ts +20 -0
  62. package/dist/lib/local-llm/gguf-reader.d.ts.map +1 -0
  63. package/dist/lib/local-llm/gguf-reader.js +190 -0
  64. package/dist/lib/local-llm/gguf-reader.js.map +1 -0
  65. package/dist/lib/local-llm/index.d.ts +9 -0
  66. package/dist/lib/local-llm/index.d.ts.map +1 -0
  67. package/dist/lib/local-llm/index.js +6 -0
  68. package/dist/lib/local-llm/index.js.map +1 -0
  69. package/dist/lib/local-llm/llama-server-process.d.ts +42 -0
  70. package/dist/lib/local-llm/llama-server-process.d.ts.map +1 -0
  71. package/dist/lib/local-llm/llama-server-process.js +237 -0
  72. package/dist/lib/local-llm/llama-server-process.js.map +1 -0
  73. package/dist/lib/local-llm/mlx-binary-manager.d.ts +33 -0
  74. package/dist/lib/local-llm/mlx-binary-manager.d.ts.map +1 -0
  75. package/dist/lib/local-llm/mlx-binary-manager.js +211 -0
  76. package/dist/lib/local-llm/mlx-binary-manager.js.map +1 -0
  77. package/dist/lib/local-llm/mlx-server-process.d.ts +26 -0
  78. package/dist/lib/local-llm/mlx-server-process.d.ts.map +1 -0
  79. package/dist/lib/local-llm/mlx-server-process.js +210 -0
  80. package/dist/lib/local-llm/mlx-server-process.js.map +1 -0
  81. package/dist/lib/local-llm/model-manager.d.ts +33 -0
  82. package/dist/lib/local-llm/model-manager.d.ts.map +1 -0
  83. package/dist/lib/local-llm/model-manager.js +591 -0
  84. package/dist/lib/local-llm/model-manager.js.map +1 -0
  85. package/dist/lib/local-llm/types.d.ts +51 -0
  86. package/dist/lib/local-llm/types.d.ts.map +1 -0
  87. package/dist/lib/local-llm/types.js +2 -0
  88. package/dist/lib/local-llm/types.js.map +1 -0
  89. package/dist/lib/logger.d.ts +2 -0
  90. package/dist/lib/logger.d.ts.map +1 -1
  91. package/dist/lib/logger.js +68 -5
  92. package/dist/lib/logger.js.map +1 -1
  93. package/dist/lib/orchestrator.d.ts +9 -0
  94. package/dist/lib/orchestrator.d.ts.map +1 -1
  95. package/dist/lib/orchestrator.js +151 -3
  96. package/dist/lib/orchestrator.js.map +1 -1
  97. package/dist/lib/sandbox/cdp-client.d.ts +2 -1
  98. package/dist/lib/sandbox/cdp-client.d.ts.map +1 -1
  99. package/dist/lib/sandbox/cdp-client.js +33 -7
  100. package/dist/lib/sandbox/cdp-client.js.map +1 -1
  101. package/dist/lib/sandbox/index.d.ts +1 -0
  102. package/dist/lib/sandbox/index.d.ts.map +1 -1
  103. package/dist/lib/sandbox/index.js +1 -0
  104. package/dist/lib/sandbox/index.js.map +1 -1
  105. package/dist/lib/sandbox/page-readiness.d.ts.map +1 -1
  106. package/dist/lib/sandbox/page-readiness.js +33 -0
  107. package/dist/lib/sandbox/page-readiness.js.map +1 -1
  108. package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -1
  109. package/dist/lib/sandbox/sandbox-browser.js +14 -1
  110. package/dist/lib/sandbox/sandbox-browser.js.map +1 -1
  111. package/dist/lib/sandbox/sandbox-container.d.ts +39 -0
  112. package/dist/lib/sandbox/sandbox-container.d.ts.map +1 -0
  113. package/dist/lib/sandbox/sandbox-container.js +176 -0
  114. package/dist/lib/sandbox/sandbox-container.js.map +1 -0
  115. package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -1
  116. package/dist/lib/sandbox/sandbox-file.js +5 -4
  117. package/dist/lib/sandbox/sandbox-file.js.map +1 -1
  118. package/dist/lib/sandbox/sandbox-shell.d.ts +2 -1
  119. package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -1
  120. package/dist/lib/sandbox/sandbox-shell.js +42 -24
  121. package/dist/lib/sandbox/sandbox-shell.js.map +1 -1
  122. package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
  123. package/dist/lib/sandbox/sandbox-web.js +27 -2
  124. package/dist/lib/sandbox/sandbox-web.js.map +1 -1
  125. package/dist/lib/sandbox/vision-browser.d.ts.map +1 -1
  126. package/dist/lib/sandbox/vision-browser.js +9 -0
  127. package/dist/lib/sandbox/vision-browser.js.map +1 -1
  128. package/dist/lib/sea/app-window.d.ts +7 -0
  129. package/dist/lib/sea/app-window.d.ts.map +1 -0
  130. package/dist/lib/sea/app-window.js +95 -0
  131. package/dist/lib/sea/app-window.js.map +1 -0
  132. package/dist/lib/sea/bootstrap.d.ts +18 -0
  133. package/dist/lib/sea/bootstrap.d.ts.map +1 -0
  134. package/dist/lib/sea/bootstrap.js +103 -0
  135. package/dist/lib/sea/bootstrap.js.map +1 -0
  136. package/dist/lib/sea/sqlite-vec-shim.d.ts +3 -0
  137. package/dist/lib/sea/sqlite-vec-shim.d.ts.map +1 -0
  138. package/dist/lib/sea/sqlite-vec-shim.js +10 -0
  139. package/dist/lib/sea/sqlite-vec-shim.js.map +1 -0
  140. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +1 -2
  141. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
  142. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +7 -13
  143. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
  144. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -1
  145. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +2 -4
  146. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -1
  147. package/dist/lib/tools/built-in/knowledge-search.tool.js +4 -4
  148. package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
  149. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
  150. package/dist/lib/tools/built-in/knowledge-sql.tool.js +70 -37
  151. package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
  152. package/dist/lib/tools/built-in/knowledge-tools-factory.js +2 -2
  153. package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -1
  154. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +1 -2
  155. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -1
  156. package/dist/lib/tools/built-in/knowledge-traverse.tool.js +5 -11
  157. package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -1
  158. package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
  159. package/dist/lib/tools/workspace/workspace-tools.js +5 -4
  160. package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
  161. package/dist/lib/types/tool-factory.d.ts.map +1 -1
  162. package/dist/lib/types/tool-factory.js +9 -2
  163. package/dist/lib/types/tool-factory.js.map +1 -1
  164. package/dist/lib/utils/document-extract.d.ts +10 -0
  165. package/dist/lib/utils/document-extract.d.ts.map +1 -0
  166. package/dist/lib/utils/document-extract.js +149 -0
  167. package/dist/lib/utils/document-extract.js.map +1 -0
  168. package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -1
  169. package/dist/lib/workflows/react-workflow-executor.js +20 -14
  170. package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
  171. package/dist/lib/workflows/types.d.ts +71 -45
  172. package/dist/lib/workflows/types.d.ts.map +1 -1
  173. package/dist/lib/workflows/types.js +10 -0
  174. package/dist/lib/workflows/types.js.map +1 -1
  175. package/dist/public/assets/logo.png +0 -0
  176. package/dist/public/chat.html +3 -78
  177. package/dist/public/index.html +3 -330
  178. package/dist/public/src/components/AgentComposer.js +132 -132
  179. package/dist/public/src/components/AgentsView.js +1231 -350
  180. package/dist/public/src/components/AppRoot.js +101 -39
  181. package/dist/public/src/components/GraphView.js +11 -13
  182. package/dist/public/src/components/IdeView.js +133 -98
  183. package/dist/public/src/components/KnowledgeView.js +94 -130
  184. package/dist/public/src/components/LlmView.js +15 -19
  185. package/dist/public/src/components/LocalLlmView.js +2440 -0
  186. package/dist/public/src/components/LogViewer.js +155 -0
  187. package/dist/public/src/components/McpView.js +41 -49
  188. package/dist/public/src/components/MonitorView.js +79 -126
  189. package/dist/public/src/components/NavBar.js +16 -26
  190. package/dist/public/src/components/StandaloneChat.js +136 -150
  191. package/dist/public/src/services/ApiService.js +196 -2
  192. package/dist/public/src/services/SessionStore.js +6 -3
  193. package/dist/public/src/services/StreamManager.js +183 -0
  194. package/dist/public/src/store.js +1 -1
  195. package/dist/public/src/utils/card.js +21 -0
  196. package/dist/public/src/utils/markdown.js +1 -7
  197. package/dist/public/styles.css +2777 -0
  198. package/dist/src/cli/commands/init.d.ts.map +1 -1
  199. package/dist/src/cli/commands/init.js +7 -1
  200. package/dist/src/cli/commands/init.js.map +1 -1
  201. package/dist/src/cli/commands/start.d.ts.map +1 -1
  202. package/dist/src/cli/commands/start.js +28 -5
  203. package/dist/src/cli/commands/start.js.map +1 -1
  204. package/dist/src/cli/index.js +13 -2
  205. package/dist/src/cli/index.js.map +1 -1
  206. package/dist/src/index.js +7 -1
  207. package/dist/src/index.js.map +1 -1
  208. package/dist/src/routes/agents.route.d.ts.map +1 -1
  209. package/dist/src/routes/agents.route.js +2 -0
  210. package/dist/src/routes/agents.route.js.map +1 -1
  211. package/dist/src/routes/chat.route.d.ts.map +1 -1
  212. package/dist/src/routes/chat.route.js +3 -2
  213. package/dist/src/routes/chat.route.js.map +1 -1
  214. package/dist/src/routes/llm.route.d.ts.map +1 -1
  215. package/dist/src/routes/llm.route.js +227 -7
  216. package/dist/src/routes/llm.route.js.map +1 -1
  217. package/dist/src/routes/local-llm.route.d.ts +3 -0
  218. package/dist/src/routes/local-llm.route.d.ts.map +1 -0
  219. package/dist/src/routes/local-llm.route.js +688 -0
  220. package/dist/src/routes/local-llm.route.js.map +1 -0
  221. package/dist/src/routes/logs.route.d.ts +3 -0
  222. package/dist/src/routes/logs.route.d.ts.map +1 -0
  223. package/dist/src/routes/logs.route.js +24 -0
  224. package/dist/src/routes/logs.route.js.map +1 -0
  225. package/dist/src/routes/vnc.route.d.ts +10 -1
  226. package/dist/src/routes/vnc.route.d.ts.map +1 -1
  227. package/dist/src/routes/vnc.route.js +37 -12
  228. package/dist/src/routes/vnc.route.js.map +1 -1
  229. package/dist/src/routes/workflows.route.d.ts.map +1 -1
  230. package/dist/src/routes/workflows.route.js +24 -0
  231. package/dist/src/routes/workflows.route.js.map +1 -1
  232. package/dist/src/server.d.ts.map +1 -1
  233. package/dist/src/server.js +24 -2
  234. package/dist/src/server.js.map +1 -1
  235. package/dist/templates/agents/actor.agent.yaml +34 -0
  236. package/dist/templates/agents/architect.agent.yaml +0 -1
  237. package/dist/templates/agents/chatbot.agent.yaml +0 -1
  238. package/dist/templates/agents/corporate.agent.yaml +0 -1
  239. package/dist/templates/agents/functions.agent.yaml +29 -0
  240. package/dist/templates/agents/investment-analyst.agent.yaml +0 -1
  241. package/dist/templates/agents/music-librarian.agent.yaml +3 -27
  242. package/dist/templates/agents/network-security.agent.yaml +0 -1
  243. package/dist/templates/agents/transport-security.agent.yaml +0 -1
  244. package/dist/templates/agents/web-engineer.agent.yaml +3 -4
  245. package/dist/templates/agents/web-pilot.agent.yaml +0 -1
  246. package/dist/templates/knowledge/patient-records.knowledge.yaml +20 -0
  247. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_0.pdf +0 -0
  248. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_1.pdf +0 -0
  249. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_10.pdf +0 -0
  250. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_11.pdf +0 -0
  251. package/dist/templates/knowledge/web-docs.knowledge.yaml +1 -1
  252. package/dist/templates/llm.json +73 -10
  253. package/dist/templates/skills/orcha-builder/SKILL.md +56 -3
  254. package/dist/templates/workflows/example.workflow.yaml +27 -35
  255. package/dist/templates/workflows/react-example.workflow.yaml +14 -19
  256. package/dist/templates/workflows/team-chat.workflow.yaml +47 -0
  257. package/package.json +14 -6
  258. package/dist/public/src/components/SkillsView.js +0 -137
  259. 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="flex items-center justify-center h-screen text-gray-400">Invalid agent URL</div>';
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="flex items-center justify-center h-screen text-gray-400">Agent not found or not published</div>';
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="flex items-center justify-center h-screen text-gray-400">Failed to load agent</div>';
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="flex items-center justify-center h-screen">
67
- <div class="bg-dark-surface border border-dark-border rounded-2xl p-8 w-[380px] max-w-[90vw] fade-in">
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-gray-500 mb-3"></i>
70
- <h2 class="text-lg font-semibold text-gray-100">${this.escapeHtml(this.agentConfig.name)}</h2>
71
- <p class="text-sm text-gray-400 mt-1">This agent requires a password</p>
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-400 text-center mb-3"></div>
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-gray-500 truncate">${this.escapeHtml(this.agentConfig.description)}</p>`
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="flex flex-col h-screen max-w-4xl mx-auto">
134
+ <div class="standalone-shell">
137
135
  <!-- Header -->
138
- <div class="flex-shrink-0 flex items-center gap-3 px-5 py-4 border-b border-dark-border/40">
139
- <i class="fas fa-robot text-blue-400"></i>
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-gray-100">${this.escapeHtml(this.agentConfig.name)}</h1>
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="flex-1 overflow-y-auto space-y-4 p-4 pr-2 pb-6">
145
+ <div id="chatMessages" class="chat-messages custom-scrollbar">
148
146
  ${this.renderSampleQuestions()}
149
147
  </div>
150
148
 
151
149
  <!-- Input -->
152
- <div class="p-3 pt-0">
153
- <div id="attachmentPreview" class="hidden flex flex-wrap gap-2 px-2 pb-2"></div>
154
- <div class="relative bg-dark-surface border border-dark-border/60 rounded-2xl focus-within:border-gray-500 transition-colors">
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="absolute bottom-2 left-2 flex items-center">
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="absolute bottom-2 right-2 flex items-center gap-2">
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 bg-dark-surface border border-dark-border/60 hover:border-gray-500 text-gray-300 text-sm px-4 py-2 rounded-2xl transition-colors text-left">${this.escapeHtml(q)}</button>`
179
+ `<button class="sample-question-chip">${this.escapeHtml(q)}</button>`
186
180
  ).join('');
187
181
 
188
182
  return `
189
- <div id="sampleQuestions" class="flex-1 flex flex-col items-center justify-center gap-4">
190
- <p class="text-gray-500 text-sm">Try asking</p>
191
- <div class="flex flex-wrap justify-center gap-2 max-w-2xl px-4">${chips}</div>
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.add('hidden');
265
+ preview.classList.remove('visible');
272
266
  preview.innerHTML = '';
273
267
  return;
274
268
  }
275
269
 
276
- preview.classList.remove('hidden');
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}" class="w-10 h-10 object-cover rounded">`
281
- : `<i class="fas fa-file text-gray-400 text-lg"></i>`;
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 flex items-center gap-2 bg-dark-bg/60 border border-dark-border/50 rounded-lg px-2 py-1.5 text-xs text-gray-400">
277
+ <div class="attachment-pill">
284
278
  ${thumb}
285
- <span class="max-w-[120px] truncate">${this.escapeHtml(att.name)}</span>
286
- <button class="attachment-remove text-gray-500 hover:text-gray-300 ml-1" data-index="${i}">
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('py-4');
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('py-4');
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 inline-flex items-center gap-1.5 bg-dark-bg/50 border border-dark-border/60 rounded-full px-2.5 py-1 text-xs text-gray-400 font-mono';
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-400 text-[10px]"></i>
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 relative inline-flex items-center gap-1.5 bg-dark-bg/30 border border-dark-border/50 rounded-full px-2.5 py-1 text-xs text-gray-500 font-mono cursor-pointer hover:bg-dark-bg/60 hover:border-dark-border transition-colors';
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.5';
477
+ pillContent.className = 'inline-flex items-center gap-1';
486
478
  pillContent.innerHTML = `
487
- <i class="fas fa-check text-green-500 text-[10px]"></i>
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 hidden absolute bottom-full mb-1 z-50 bg-dark-surface border border-dark-border rounded-lg shadow-xl w-[400px] max-w-[90vw]';
485
+ details.className = 'tool-invocation-details';
494
486
 
495
487
  if (toolInput) {
496
488
  const inputSection = document.createElement('div');
497
- inputSection.className = 'p-3 border-b border-dark-border/50';
498
- inputSection.innerHTML = '<div class="text-xs font-semibold text-gray-400 mb-1">Input</div>';
489
+ inputSection.className = 'tool-detail-section';
490
+ inputSection.innerHTML = '<h4>Input</h4>';
499
491
  const inputPre = document.createElement('pre');
500
- inputPre.className = 'text-xs text-gray-400 bg-dark-bg/60 rounded-md p-2 overflow-x-auto max-h-48 overflow-y-auto whitespace-pre-wrap break-all';
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 = 'p-3';
508
- outputSection.innerHTML = '<div class="text-xs font-semibold text-gray-400 mb-1">Output</div>';
499
+ outputSection.className = 'tool-detail-section';
500
+ outputSection.innerHTML = '<h4>Output</h4>';
509
501
  const outputPre = document.createElement('pre');
510
- outputPre.className = 'text-xs text-gray-400 bg-dark-bg/60 rounded-md p-2 overflow-x-auto max-h-48 overflow-y-auto whitespace-pre-wrap break-all';
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
- toolEl.addEventListener('click', (e) => {
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('py-4');
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 = 'bg-dark-bg/50 border border-dark-border rounded-lg p-4';
520
+ resultContainer.className = 'panel';
555
521
  const resultPre = document.createElement('pre');
556
- resultPre.className = 'text-sm text-gray-300 font-mono whitespace-pre-wrap overflow-x-auto';
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('py-4');
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-400 text-sm mt-2';
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 = 'thinking-pill tool-pill inline-flex items-center gap-1.5 bg-dark-bg/50 border border-dark-border/60 rounded-full px-2.5 py-1 text-xs text-purple-400 font-mono';
584
+ pill.className = 'tool-pill thinking';
614
585
  pill.innerHTML = `
615
- <i class="fas fa-brain animate-pulse text-[10px]"></i>
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 = 'thinking-pill tool-pill relative inline-flex items-center gap-1.5 bg-dark-bg/30 border border-dark-border/50 rounded-full px-2.5 py-1 text-xs text-gray-500 font-mono cursor-pointer hover:bg-dark-bg/60 hover:border-dark-border transition-colors';
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.5';
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 popover = document.createElement('div');
644
- popover.className = 'hidden fixed z-50 bg-dark-surface border border-dark-border rounded-lg shadow-xl w-[400px] max-w-[90vw] p-3';
645
-
646
- const popoverContent = document.createElement('div');
647
- popoverContent.className = 'text-xs text-gray-400 max-h-64 overflow-y-auto markdown-content custom-scrollbar';
648
- popoverContent.innerHTML = this.renderMarkdown(content);
649
- this.highlightCode(popoverContent);
650
- popover.appendChild(popoverContent);
651
- pill.appendChild(popover);
652
-
653
- pill.addEventListener('mouseenter', () => {
654
- popover.classList.remove('hidden');
655
- const pillRect = pill.getBoundingClientRect();
656
- popover.style.bottom = (window.innerHeight - pillRect.top + 4) + 'px';
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="w-16 h-16 object-cover rounded-lg border border-dark-border/50">`;
667
+ return `<img src="data:${att.mediaType};base64,${att.data}" class="attachment-thumb">`;
680
668
  }
681
- return `<div class="flex items-center gap-1.5 bg-dark-bg/60 border border-dark-border/50 rounded-lg px-2 py-1.5 text-xs text-gray-400">
669
+ return `<div class="attachment-pill">
682
670
  <i class="fas fa-file"></i>
683
- <span class="max-w-[100px] truncate">${this.escapeHtml(att.name)}</span>
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="max-w-4xl bg-dark-surface border border-transparent rounded-3xl px-5 py-3 text-gray-100 text-[15px] leading-relaxed">
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 max-w-4xl bg-dark-surface border border-dark-border rounded-3xl px-5 py-4 text-gray-100 text-[15px] leading-relaxed relative group">
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 flex gap-1">
712
- <div class="w-2 h-2 bg-blue-500 rounded-full animate-bounce"></div>
713
- <div class="w-2 h-2 bg-blue-500 rounded-full animate-bounce animation-delay-200"></div>
714
- <div class="w-2 h-2 bg-blue-500 rounded-full animate-bounce animation-delay-400"></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 flex flex-wrap gap-1.5 mt-2"></div>
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 flex items-center gap-2 mt-1.5 ml-1 text-xs text-gray-400';
712
+ statusBar.className = 'stream-status-bar';
725
713
  statusBar.innerHTML = `
726
- <div class="w-2 h-2 bg-blue-500 rounded-full animate-pulse-dot"></div>
714
+ <div class="status-dot-pulse"></div>
727
715
  <span class="stream-status-text">Generating...</span>
728
- <span class="stream-elapsed text-gray-500">0.0s</span>
729
- <button class="stream-cancel-btn ml-auto text-gray-500 hover:text-gray-300 text-xs px-2 py-0.5 rounded border border-dark-border hover:border-gray-500 transition-colors">
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 hidden flex items-center gap-3 mt-1.5 ml-1 text-xs text-gray-500';
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="text-dark-border">|</span>
744
- <span class="flex items-center gap-1"><i class="fas fa-arrow-up text-[9px]"></i><span class="stats-input-tokens"></span></span>
745
- <span class="text-dark-border">|</span>
746
- <span class="flex items-center gap-1"><i class="fas fa-arrow-down text-[9px]"></i><span class="stats-output-tokens"></span></span>
747
- <span class="text-dark-border">|</span>
748
- <span class="flex items-center gap-1"><i class="fas fa-bolt text-[9px]"></i><span class="stats-tps"></span></span>
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-400">${this.escapeHtml(errorMsg)}</span>`;
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.classList.add('hidden');
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 = 'text-xs text-amber-400 font-medium ml-2';
818
+ badge.className = 'badge badge-amber';
833
819
  badge.textContent = 'Cancelled';
834
820
  statsBar.appendChild(badge);
835
821
  }
836
822
 
837
- statsBar.classList.remove('hidden');
823
+ statsBar.classList.add('visible');
838
824
  }
839
825
  }
840
826