cf-claw 3.0.0

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 (273) hide show
  1. package/dist/agent.d.ts +15 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +262 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/agents.d.ts +51 -0
  6. package/dist/agents.d.ts.map +1 -0
  7. package/dist/agents.js +478 -0
  8. package/dist/agents.js.map +1 -0
  9. package/dist/api/routes.d.ts +3 -0
  10. package/dist/api/routes.d.ts.map +1 -0
  11. package/dist/api/routes.js +491 -0
  12. package/dist/api/routes.js.map +1 -0
  13. package/dist/bot.d.ts +4 -0
  14. package/dist/bot.d.ts.map +1 -0
  15. package/dist/bot.js +295 -0
  16. package/dist/bot.js.map +1 -0
  17. package/dist/canvas.d.ts +37 -0
  18. package/dist/canvas.d.ts.map +1 -0
  19. package/dist/canvas.js +47 -0
  20. package/dist/canvas.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +202 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands.d.ts +6 -0
  26. package/dist/commands.d.ts.map +1 -0
  27. package/dist/commands.js +384 -0
  28. package/dist/commands.js.map +1 -0
  29. package/dist/components/TaskList.d.ts +7 -0
  30. package/dist/components/TaskList.d.ts.map +1 -0
  31. package/dist/components/TaskList.js +37 -0
  32. package/dist/components/TaskList.js.map +1 -0
  33. package/dist/config/encryption.d.ts +10 -0
  34. package/dist/config/encryption.d.ts.map +1 -0
  35. package/dist/config/encryption.js +111 -0
  36. package/dist/config/encryption.js.map +1 -0
  37. package/dist/config/json-config.d.ts +114 -0
  38. package/dist/config/json-config.d.ts.map +1 -0
  39. package/dist/config/json-config.js +388 -0
  40. package/dist/config/json-config.js.map +1 -0
  41. package/dist/config.d.ts +51 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +137 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/context/pruning.d.ts +30 -0
  46. package/dist/context/pruning.d.ts.map +1 -0
  47. package/dist/context/pruning.js +132 -0
  48. package/dist/context/pruning.js.map +1 -0
  49. package/dist/dashboard/404/index.html +1 -0
  50. package/dist/dashboard/404.html +1 -0
  51. package/dist/dashboard/_next/static/chunks/117-c657912d4a6fa056.js +2 -0
  52. package/dist/dashboard/_next/static/chunks/191-a6922264096cb3ad.js +11 -0
  53. package/dist/dashboard/_next/static/chunks/343-71498a8257bc1e81.js +1 -0
  54. package/dist/dashboard/_next/static/chunks/app/_not-found/page-15cbe4395e02a084.js +1 -0
  55. package/dist/dashboard/_next/static/chunks/app/layout-191efbc962809bb4.js +1 -0
  56. package/dist/dashboard/_next/static/chunks/app/manual/page-3c401ecf89979cd7.js +1 -0
  57. package/dist/dashboard/_next/static/chunks/app/page-dff55e58941a3c4d.js +1 -0
  58. package/dist/dashboard/_next/static/chunks/fd9d1056-9583fa19bc194043.js +1 -0
  59. package/dist/dashboard/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
  60. package/dist/dashboard/_next/static/chunks/main-2461f93106bcf687.js +1 -0
  61. package/dist/dashboard/_next/static/chunks/main-app-89f5ec28b3bb0e7f.js +1 -0
  62. package/dist/dashboard/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
  63. package/dist/dashboard/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
  64. package/dist/dashboard/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  65. package/dist/dashboard/_next/static/chunks/webpack-616e068a201ad621.js +1 -0
  66. package/dist/dashboard/_next/static/css/baff0f221c10680b.css +3 -0
  67. package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_buildManifest.js +1 -0
  68. package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_ssgManifest.js +1 -0
  69. package/dist/dashboard/index.html +1 -0
  70. package/dist/dashboard/index.txt +7 -0
  71. package/dist/dashboard/manual/index.html +1 -0
  72. package/dist/dashboard/manual/index.txt +7 -0
  73. package/dist/documents.d.ts +20 -0
  74. package/dist/documents.d.ts.map +1 -0
  75. package/dist/documents.js +227 -0
  76. package/dist/documents.js.map +1 -0
  77. package/dist/embeddings.d.ts +15 -0
  78. package/dist/embeddings.d.ts.map +1 -0
  79. package/dist/embeddings.js +40 -0
  80. package/dist/embeddings.js.map +1 -0
  81. package/dist/factory.d.ts +72 -0
  82. package/dist/factory.d.ts.map +1 -0
  83. package/dist/factory.js +2010 -0
  84. package/dist/factory.js.map +1 -0
  85. package/dist/groups.d.ts +13 -0
  86. package/dist/groups.d.ts.map +1 -0
  87. package/dist/groups.js +42 -0
  88. package/dist/groups.js.map +1 -0
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +223 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/lib/taskStorage.d.ts +4 -0
  94. package/dist/lib/taskStorage.d.ts.map +1 -0
  95. package/dist/lib/taskStorage.js +28 -0
  96. package/dist/lib/taskStorage.js.map +1 -0
  97. package/dist/llm/anthropic.d.ts +13 -0
  98. package/dist/llm/anthropic.d.ts.map +1 -0
  99. package/dist/llm/anthropic.js +96 -0
  100. package/dist/llm/anthropic.js.map +1 -0
  101. package/dist/llm/failover.d.ts +13 -0
  102. package/dist/llm/failover.d.ts.map +1 -0
  103. package/dist/llm/failover.js +42 -0
  104. package/dist/llm/failover.js.map +1 -0
  105. package/dist/llm/google.d.ts +13 -0
  106. package/dist/llm/google.d.ts.map +1 -0
  107. package/dist/llm/google.js +112 -0
  108. package/dist/llm/google.js.map +1 -0
  109. package/dist/llm/groq.d.ts +8 -0
  110. package/dist/llm/groq.d.ts.map +1 -0
  111. package/dist/llm/groq.js +13 -0
  112. package/dist/llm/groq.js.map +1 -0
  113. package/dist/llm/index.d.ts +11 -0
  114. package/dist/llm/index.d.ts.map +1 -0
  115. package/dist/llm/index.js +10 -0
  116. package/dist/llm/index.js.map +1 -0
  117. package/dist/llm/ollama.d.ts +9 -0
  118. package/dist/llm/ollama.d.ts.map +1 -0
  119. package/dist/llm/ollama.js +27 -0
  120. package/dist/llm/ollama.js.map +1 -0
  121. package/dist/llm/openai-compat.d.ts +17 -0
  122. package/dist/llm/openai-compat.d.ts.map +1 -0
  123. package/dist/llm/openai-compat.js +69 -0
  124. package/dist/llm/openai-compat.js.map +1 -0
  125. package/dist/llm/openrouter.d.ts +8 -0
  126. package/dist/llm/openrouter.d.ts.map +1 -0
  127. package/dist/llm/openrouter.js +20 -0
  128. package/dist/llm/openrouter.js.map +1 -0
  129. package/dist/llm/provider.d.ts +41 -0
  130. package/dist/llm/provider.d.ts.map +1 -0
  131. package/dist/llm/provider.js +2 -0
  132. package/dist/llm/provider.js.map +1 -0
  133. package/dist/llm/registry.d.ts +10 -0
  134. package/dist/llm/registry.d.ts.map +1 -0
  135. package/dist/llm/registry.js +90 -0
  136. package/dist/llm/registry.js.map +1 -0
  137. package/dist/llm/thinking.d.ts +7 -0
  138. package/dist/llm/thinking.d.ts.map +1 -0
  139. package/dist/llm/thinking.js +34 -0
  140. package/dist/llm/thinking.js.map +1 -0
  141. package/dist/llm.d.ts +17 -0
  142. package/dist/llm.d.ts.map +1 -0
  143. package/dist/llm.js +184 -0
  144. package/dist/llm.js.map +1 -0
  145. package/dist/logs.d.ts +11 -0
  146. package/dist/logs.d.ts.map +1 -0
  147. package/dist/logs.js +54 -0
  148. package/dist/logs.js.map +1 -0
  149. package/dist/memory/knowledge-graph.d.ts +34 -0
  150. package/dist/memory/knowledge-graph.d.ts.map +1 -0
  151. package/dist/memory/knowledge-graph.js +137 -0
  152. package/dist/memory/knowledge-graph.js.map +1 -0
  153. package/dist/memory.d.ts +73 -0
  154. package/dist/memory.d.ts.map +1 -0
  155. package/dist/memory.js +320 -0
  156. package/dist/memory.js.map +1 -0
  157. package/dist/mesh.d.ts +18 -0
  158. package/dist/mesh.d.ts.map +1 -0
  159. package/dist/mesh.js +120 -0
  160. package/dist/mesh.js.map +1 -0
  161. package/dist/paths.d.ts +11 -0
  162. package/dist/paths.d.ts.map +1 -0
  163. package/dist/paths.js +51 -0
  164. package/dist/paths.js.map +1 -0
  165. package/dist/proactive/heartbeat.d.ts +4 -0
  166. package/dist/proactive/heartbeat.d.ts.map +1 -0
  167. package/dist/proactive/heartbeat.js +56 -0
  168. package/dist/proactive/heartbeat.js.map +1 -0
  169. package/dist/proactive/recap.d.ts +12 -0
  170. package/dist/proactive/recap.d.ts.map +1 -0
  171. package/dist/proactive/recap.js +90 -0
  172. package/dist/proactive/recap.js.map +1 -0
  173. package/dist/proactive/recommendations.d.ts +11 -0
  174. package/dist/proactive/recommendations.d.ts.map +1 -0
  175. package/dist/proactive/recommendations.js +92 -0
  176. package/dist/proactive/recommendations.js.map +1 -0
  177. package/dist/projects.d.ts +44 -0
  178. package/dist/projects.d.ts.map +1 -0
  179. package/dist/projects.js +101 -0
  180. package/dist/projects.js.map +1 -0
  181. package/dist/scheduler/index.d.ts +17 -0
  182. package/dist/scheduler/index.d.ts.map +1 -0
  183. package/dist/scheduler/index.js +116 -0
  184. package/dist/scheduler/index.js.map +1 -0
  185. package/dist/sessions.d.ts +19 -0
  186. package/dist/sessions.d.ts.map +1 -0
  187. package/dist/sessions.js +176 -0
  188. package/dist/sessions.js.map +1 -0
  189. package/dist/skills/index.d.ts +14 -0
  190. package/dist/skills/index.d.ts.map +1 -0
  191. package/dist/skills/index.js +126 -0
  192. package/dist/skills/index.js.map +1 -0
  193. package/dist/swarm.d.ts +18 -0
  194. package/dist/swarm.d.ts.map +1 -0
  195. package/dist/swarm.js +146 -0
  196. package/dist/swarm.js.map +1 -0
  197. package/dist/taskListWidget.d.ts +76 -0
  198. package/dist/taskListWidget.d.ts.map +1 -0
  199. package/dist/taskListWidget.js +312 -0
  200. package/dist/taskListWidget.js.map +1 -0
  201. package/dist/tools/browser.d.ts +5 -0
  202. package/dist/tools/browser.d.ts.map +1 -0
  203. package/dist/tools/browser.js +104 -0
  204. package/dist/tools/browser.js.map +1 -0
  205. package/dist/tools/config-tools.d.ts +4 -0
  206. package/dist/tools/config-tools.d.ts.map +1 -0
  207. package/dist/tools/config-tools.js +154 -0
  208. package/dist/tools/config-tools.js.map +1 -0
  209. package/dist/tools/files.d.ts +3 -0
  210. package/dist/tools/files.d.ts.map +1 -0
  211. package/dist/tools/files.js +208 -0
  212. package/dist/tools/files.js.map +1 -0
  213. package/dist/tools/index.d.ts +11 -0
  214. package/dist/tools/index.d.ts.map +1 -0
  215. package/dist/tools/index.js +1109 -0
  216. package/dist/tools/index.js.map +1 -0
  217. package/dist/tools/mcp-bridge.d.ts +5 -0
  218. package/dist/tools/mcp-bridge.d.ts.map +1 -0
  219. package/dist/tools/mcp-bridge.js +200 -0
  220. package/dist/tools/mcp-bridge.js.map +1 -0
  221. package/dist/tools/shell.d.ts +8 -0
  222. package/dist/tools/shell.d.ts.map +1 -0
  223. package/dist/tools/shell.js +78 -0
  224. package/dist/tools/shell.js.map +1 -0
  225. package/dist/tools/skills-manage.d.ts +25 -0
  226. package/dist/tools/skills-manage.d.ts.map +1 -0
  227. package/dist/tools/skills-manage.js +155 -0
  228. package/dist/tools/skills-manage.js.map +1 -0
  229. package/dist/tools/web-search.d.ts +4 -0
  230. package/dist/tools/web-search.d.ts.map +1 -0
  231. package/dist/tools/web-search.js +60 -0
  232. package/dist/tools/web-search.js.map +1 -0
  233. package/dist/tts.d.ts +6 -0
  234. package/dist/tts.d.ts.map +1 -0
  235. package/dist/tts.js +42 -0
  236. package/dist/tts.js.map +1 -0
  237. package/dist/types/task.d.ts +7 -0
  238. package/dist/types/task.d.ts.map +1 -0
  239. package/dist/types/task.js +2 -0
  240. package/dist/types/task.js.map +1 -0
  241. package/dist/typing.d.ts +18 -0
  242. package/dist/typing.d.ts.map +1 -0
  243. package/dist/typing.js +63 -0
  244. package/dist/typing.js.map +1 -0
  245. package/dist/usage.d.ts +28 -0
  246. package/dist/usage.d.ts.map +1 -0
  247. package/dist/usage.js +69 -0
  248. package/dist/usage.js.map +1 -0
  249. package/dist/voice.d.ts +6 -0
  250. package/dist/voice.d.ts.map +1 -0
  251. package/dist/voice.js +47 -0
  252. package/dist/voice.js.map +1 -0
  253. package/dist/webchat/index.d.ts +3 -0
  254. package/dist/webchat/index.d.ts.map +1 -0
  255. package/dist/webchat/index.js +3 -0
  256. package/dist/webchat/index.js.map +1 -0
  257. package/dist/webchat/public/index.html +344 -0
  258. package/dist/webchat/public/public/index.html +344 -0
  259. package/dist/webchat/public/public/task-list-widget.js +410 -0
  260. package/dist/webchat/public/task-list-widget.js +410 -0
  261. package/dist/webchat/server.d.ts +3 -0
  262. package/dist/webchat/server.d.ts.map +1 -0
  263. package/dist/webchat/server.js +80 -0
  264. package/dist/webchat/server.js.map +1 -0
  265. package/dist/webchat/ws.d.ts +4 -0
  266. package/dist/webchat/ws.d.ts.map +1 -0
  267. package/dist/webchat/ws.js +232 -0
  268. package/dist/webchat/ws.js.map +1 -0
  269. package/dist/webhooks/index.d.ts +14 -0
  270. package/dist/webhooks/index.d.ts.map +1 -0
  271. package/dist/webhooks/index.js +86 -0
  272. package/dist/webhooks/index.js.map +1 -0
  273. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ <!DOCTYPE html><html lang="sv"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/baff0f221c10680b.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-616e068a201ad621.js"/><script src="/_next/static/chunks/fd9d1056-9583fa19bc194043.js" async=""></script><script src="/_next/static/chunks/117-c657912d4a6fa056.js" async=""></script><script src="/_next/static/chunks/main-app-89f5ec28b3bb0e7f.js" async=""></script><script src="/_next/static/chunks/343-71498a8257bc1e81.js" async=""></script><script src="/_next/static/chunks/app/manual/page-3c401ecf89979cd7.js" async=""></script><title>CF Claw Dashboard</title><meta name="description" content="CF Claw AgentOS Dashboard"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#030712] text-slate-300 antialiased"><div class="min-h-screen bg-[#030712]"><div class="mx-auto max-w-4xl px-6 py-8"><header class="mb-8"><a class="mb-6 inline-flex items-center gap-2 rounded-lg border border-slate-700/50 bg-slate-800/40 px-4 py-2 text-sm font-medium text-slate-400 transition-colors hover:border-cyan-500/30 hover:bg-cyan-500/10 hover:text-cyan-400" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left h-4 w-4"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg>Tillbaka till Dashboard</a><div class="mt-6 flex items-center gap-4"><div class="flex h-12 w-12 items-center justify-center rounded-xl bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap h-6 w-6 text-cyan-400" style="filter:drop-shadow(0 0 6px rgba(34,211,238,0.6))"><path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"></path></svg></div><div><h1 class="text-2xl font-bold text-slate-100">CF Claw Dashboard — Manual</h1><p class="text-sm text-slate-500">AgentOS Dashboard v1.0</p></div></div></header><div class="mb-8 rounded-xl border border-cyan-500/20 bg-cyan-500/5 p-5"><h3 class="mb-2 text-sm font-semibold text-cyan-400">Om CF Claw Dashboard</h3><p class="text-sm leading-relaxed text-slate-300">CF Claw Dashboard är webbgränssnittet för din AI-agentplattform. Här kan du hantera projekt, schemalägga uppgifter, chatta med agenter, övervaka minne och kunskaper, samt följa systemets prestanda i realtid. All kommunikation sker via ett autentiserat WebSocket-anslutning mot backend.</p></div><div class="space-y-6"><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-wifi h-4 w-4 text-cyan-400"><path d="M12 20h.01"></path><path d="M2 8.82a15 15 0 0 1 20 0"></path><path d="M5 12.859a10 10 0 0 1 14 0"></path><path d="M8.5 16.429a5 5 0 0 1 7 0"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Anslutning &amp; Autentisering</h2></div><p class="mb-3 text-sm text-slate-400">Dashboarden ansluter automatiskt till backend-servern via WebSocket. Statusen visas i headern på varje sida:</p><div class="space-y-2 text-sm text-slate-400"><div class="flex items-center gap-2"><div class="h-2 w-2 rounded-full bg-emerald-400"></div><span class="text-emerald-400">Connected</span> — API och WebSocket är uppkopplat</div><div class="flex items-center gap-2"><div class="h-2 w-2 rounded-full bg-red-400"></div><span class="text-red-400">Disconnected</span> — Ingen kontakt med backend</div><div class="flex items-center gap-2"><div class="h-2 w-2 animate-pulse rounded-full bg-amber-400"></div><span class="text-amber-400">Connecting...</span> — Försöker ansluta</div></div><div class="mt-3 flex gap-2 rounded-lg border border-amber-500/20 bg-amber-500/5 p-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-lightbulb h-4 w-4 flex-shrink-0 text-amber-400"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"></path><path d="M9 18h6"></path><path d="M10 22h4"></path></svg><p class="text-sm text-amber-200/80">Om du ser &quot;Disconnected&quot;, kontrollera att backend-servern körs och att<code class="mx-1 rounded bg-slate-800 px-1.5 py-0.5 text-xs text-cyan-300">NEXT_PUBLIC_API_BASE</code>är korrekt inställd i din <code class="mx-1 rounded bg-slate-800 px-1.5 py-0.5 text-xs text-cyan-300">.env.local</code>.</p></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield h-4 w-4 text-cyan-400"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Autentisering</h2></div><p class="mb-3 text-sm text-slate-400">Om miljövariabeln<code class="mx-1 rounded bg-slate-800 px-1.5 py-0.5 text-xs text-cyan-300">NEXT_PUBLIC_AUTH_TOKEN</code>är satt skickas en Bearer-token med alla API-anrop och WebSocket-autentisering. Utan token körs dashboarden i öppet läge (endast för utveckling).</p></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-activity h-4 w-4 text-cyan-400"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Platform Overview</h2></div><p class="mb-3 text-sm text-slate-400">Översiktssidan visar systemets hälsostatus och nyckeltal vid en blink.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Statistikkort</span><p class="mt-0.5 text-sm text-slate-400">Visar antal aktiva projekt, cron-jobb, inlärda färdigheter och registrerade agenter.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">System Status</span><p class="mt-0.5 text-sm text-slate-400">Aktiv AI-modell, upptid, WebSocket-status och om schemaläggaren är igång.</p></div></div><div class="mt-3 flex gap-2 rounded-lg border border-amber-500/20 bg-amber-500/5 p-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-lightbulb h-4 w-4 flex-shrink-0 text-amber-400"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"></path><path d="M9 18h6"></path><path d="M10 22h4"></path></svg><p class="text-sm text-amber-200/80">Sidan uppdateras automatiskt när du öppnar den. Statistikkortens data hämtas från flera API:er parallellt.</p></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-factory h-4 w-4 text-cyan-400"><path d="M2 20a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8l-7 5V8l-7 5V4a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z"></path><path d="M17 18h1"></path><path d="M12 18h1"></path><path d="M7 18h1"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Project Factory</h2></div><p class="mb-3 text-sm text-slate-400">Hantera projekt med Kanban-stil uppdelning. Skapa projekt, lägg till uppgifter och flytta dem mellan kolumner.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Projektlistning</span><p class="mt-0.5 text-sm text-slate-400">Välj bland projekt med framstegsindikatorer, team-avatars och status.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Kanban-tavla</span><p class="mt-0.5 text-sm text-slate-400">Fyra kolumner: Backlog, Working, Review och Done. Hovra över en uppgift för att flytta den.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Skapa projekt</span><p class="mt-0.5 text-sm text-slate-400">Klicka &quot;Nytt Projekt&quot; och ange titel, beskrivning och team.</p></div></div><div class="mt-3 flex gap-2 rounded-lg border border-amber-500/20 bg-amber-500/5 p-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-lightbulb h-4 w-4 flex-shrink-0 text-amber-400"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"></path><path d="M9 18h6"></path><path d="M10 22h4"></path></svg><p class="text-sm text-amber-200/80">Uppgifter flyttas optimistic — gränssnittet uppdateras direkt och rullas tillbaka om API-anropet misslyckas.</p></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-calendar h-4 w-4 text-cyan-400"><path d="M8 2v4"></path><path d="M16 2v4"></path><rect width="18" height="18" x="3" y="4" rx="2"></rect><path d="M3 10h18"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Cron Scheduler</h2></div><p class="mb-3 text-sm text-slate-400">Schemalägga återkommande uppgifter med cron-uttryck som skickar prompts till din AI-agent.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Global start/stopp</span><p class="mt-0.5 text-sm text-slate-400">Starta eller stoppa hela schemaläggaren med en knapp.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Skapa cron-jobb</span><p class="mt-0.5 text-sm text-slate-400">Ange namn, cron-uttryck (t.ex. 0 9 * * *) och prompt som ska köras.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Aktivera/inaktivera</span><p class="mt-0.5 text-sm text-slate-400">Pausa enskilda jobb utan att ta bort dem.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Nästa körning</span><p class="mt-0.5 text-sm text-slate-400">Se när varje jobb körs nästa gång.</p></div></div><div class="mt-3 flex gap-2 rounded-lg border border-amber-500/20 bg-amber-500/5 p-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-lightbulb h-4 w-4 flex-shrink-0 text-amber-400"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"></path><path d="M9 18h6"></path><path d="M10 22h4"></path></svg><p class="text-sm text-amber-200/80">Cron-uttryck följer standardformat: minut timme dag-månad månad veckodag. Exempel: <code class="rounded bg-slate-800 px-1.5 py-0.5 text-xs text-cyan-300">0 */2 * * *</code> kör varannan timme.</p></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-message-square h-4 w-4 text-cyan-400"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Agent Chat</h2></div><p class="mb-3 text-sm text-slate-400">Chatta direkt med din AI-agent i realtid med strömmande svar och Markdown-rendering.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Strömmande svar</span><p class="mt-0.5 text-sm text-slate-400">Svaren visas tecken för tecken via WebSocket i realtid.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Modellbyte</span><p class="mt-0.5 text-sm text-slate-400">Välj aktiv AI-modell från en dropdown i chatten. Modeller grupperas per leverantör.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Markdown</span><p class="mt-0.5 text-sm text-slate-400">Assistentens svar renderas med full Markdown-stöd inklusive kodblock.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Stop generation</span><p class="mt-0.5 text-sm text-slate-400">Avbryt en pågående generering med stopp-knappen.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Auto-resize</span><p class="mt-0.5 text-sm text-slate-400">Textrutan växer automatiskt. Skicka med Enter, ny rad med Shift+Enter.</p></div></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-graduation-cap h-4 w-4 text-cyan-400"><path d="M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z"></path><path d="M22 10v6"></path><path d="M6 12.5V16a6 3 0 0 0 12 0v-3.5"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Skills &amp; Learning</h2></div><p class="mb-3 text-sm text-slate-400">Bläddra bland agentens inlärda färdigheter och inbyggda core-skills.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Learned Skills</span><p class="mt-0.5 text-sm text-slate-400">Färdigheter som agenten skapat och sparat. Klicka för att expandera och se innehållet.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Core Skills</span><p class="mt-0.5 text-sm text-slate-400">Inbyggda färdigheter från systemet som inte kan redigeras.</p></div></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-brain-circuit h-4 w-4 text-cyan-400"><path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"></path><path d="M9 13a4.5 4.5 0 0 0 3-4"></path><path d="M6.003 5.125A3 3 0 0 0 6.401 6.5"></path><path d="M3.477 10.896a4 4 0 0 1 .585-.396"></path><path d="M6 18a4 4 0 0 1-1.967-.516"></path><path d="M12 13h4"></path><path d="M12 18h6a2 2 0 0 1 2 2v1"></path><path d="M12 8h8"></path><path d="M16 8V5a2 2 0 0 1 2-2"></path><circle cx="16" cy="13" r=".5"></circle><circle cx="18" cy="3" r=".5"></circle><circle cx="20" cy="21" r=".5"></circle><circle cx="20" cy="8" r=".5"></circle></svg></div><h2 class="text-lg font-semibold text-slate-100">Memory &amp; Graph</h2></div><p class="mb-3 text-sm text-slate-400">Inspektera agentens beständiga minne — automatiska sammanfattningar, extraherade fakta och entitetsgraf.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Auto-Summaries</span><p class="mt-0.5 text-sm text-slate-400">Automatiskt genererade sammanfattningar av konversationer.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Extracted Facts</span><p class="mt-0.5 text-sm text-slate-400">Fakta som agenten extraherat och kategoriserat.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Entity Graph</span><p class="mt-0.5 text-sm text-slate-400">Visualisering av relationer mellan entiteter (subjekt — relation — objekt).</p></div></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-git-merge h-4 w-4 text-cyan-400"><circle cx="18" cy="18" r="3"></circle><circle cx="6" cy="6" r="3"></circle><path d="M6 21V9a9 9 0 0 0 9 9"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Mesh &amp; Swarms</h2></div><p class="mb-3 text-sm text-slate-400">Starta multi-agent arbetsflöden. Mesh delar upp ett mål, Swarm fördelar uppgifter till ett team.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Mesh</span><p class="mt-0.5 text-sm text-slate-400">Ange ett mål — agenten dekomponerar det och distribuerar till flera agenter.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Swarm</span><p class="mt-0.5 text-sm text-slate-400">Ange en uppgift och välj team (default, research, engineering, analysis).</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Live-output</span><p class="mt-0.5 text-sm text-slate-400">Följ arbetsflödets framsteg i realtid med statusindikatorer.</p></div></div><div class="mt-3 flex gap-2 rounded-lg border border-amber-500/20 bg-amber-500/5 p-3"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-lightbulb h-4 w-4 flex-shrink-0 text-amber-400"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"></path><path d="M9 18h6"></path><path d="M10 22h4"></path></svg><p class="text-sm text-amber-200/80">Krver aktiv WebSocket-anslutning. Om du ser en varning, kontrollera anslutningen i headern.</p></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-users h-4 w-4 text-cyan-400"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M22 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Agent Registry</h2></div><p class="mb-3 text-sm text-slate-400">Se alla registrerade AI-agenter grupperade per team.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Team-gruppering</span><p class="mt-0.5 text-sm text-slate-400">Agenter visas i team som content, strategy, design, development, quality, operations och support.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Agentkort</span><p class="mt-0.5 text-sm text-slate-400">Varje agent visar namn, roll, tillgängliga verktyg och taggar.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Aktiv agent</span><p class="mt-0.5 text-sm text-slate-400">Den aktiva agenten markeras med en pulserande cyan-prick.</p></div></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder h-4 w-4 text-cyan-400"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Document Store</h2></div><p class="mb-3 text-sm text-slate-400">Bläddra och hantera dokument med kategorifiltrering.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Kategorifilter</span><p class="mt-0.5 text-sm text-slate-400">Filtrera på: all, general, projects, research, notes, html.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Dokumentlista</span><p class="mt-0.5 text-sm text-slate-400">Visar filtyp, titel, storlek och datum. HTML-filer får en &quot;Canvas Ready&quot;-badge.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Åtgärder</span><p class="mt-0.5 text-sm text-slate-400">Rendera (HTML), redigera eller radera dokument vid hover.</p></div></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-terminal h-4 w-4 text-cyan-400"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" x2="20" y1="19" y2="19"></line></svg></div><h2 class="text-lg font-semibold text-slate-100">System Logs</h2></div><p class="mb-3 text-sm text-slate-400">Realtidsloggvisning med terminalkänsla. Se allt som händer i systemet.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Realtidsuppdateringar</span><p class="mt-0.5 text-sm text-slate-400">Nya loggar strömmar via WebSocket (max 500 rader buffras).</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Färgkodade källor</span><p class="mt-0.5 text-sm text-slate-400">Agent Nudge (lila), Memory (cyan), Factory (indigo), Scheduler (amber), Core (grå).</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Auto-scroll</span><p class="mt-0.5 text-sm text-slate-400">Loggen scrollar automatiskt till botten vid nya inlägg.</p></div></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-dollar-sign h-4 w-4 text-cyan-400"><line x1="12" x2="12" y1="2" y2="22"></line><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Usage &amp; Cost</h2></div><p class="mb-3 text-sm text-slate-400">Övervaka LLM API-användning, kostnader och prestandamätetal.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">24h-statistik</span><p class="mt-0.5 text-sm text-slate-400">Totalt anrop, tokens, kostnad och genomsnittlig latens.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Kostnad per modell</span><p class="mt-0.5 text-sm text-slate-400">Tabell med anrop, tokens och kostnad uppdelat per AI-modell.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Senaste anrop</span><p class="mt-0.5 text-sm text-slate-400">De 10 senaste API-anropen med detaljer om modell, tokens och källa.</p></div></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bell h-4 w-4 text-cyan-400"><path d="M10.268 21a2 2 0 0 0 3.464 0"></path><path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Webhooks</h2></div><p class="mb-3 text-sm text-slate-400">Skapa webhook-endpoints som triggare AI-prompts vid externa händelser.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Skapa webhook</span><p class="mt-0.5 text-sm text-slate-400">Ange namn, path, hemlighet (valfritt) och prompt-mall.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Kopiera URL</span><p class="mt-0.5 text-sm text-slate-400">Kopiera webhook-URL:en till urklipp med ett klick.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Hantera</span><p class="mt-0.5 text-sm text-slate-400">Aktivera, inaktivera eller radera webhooks.</p></div></div></section><section class="rounded-xl border border-slate-800/60 bg-[#0b1120] p-6"><div class="mb-4 flex items-center gap-3"><div class="flex h-8 w-8 items-center justify-center rounded-lg bg-cyan-500/10"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-layers h-4 w-4 text-cyan-400"><path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z"></path><path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12"></path><path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17"></path></svg></div><h2 class="text-lg font-semibold text-slate-100">Sessions</h2></div><p class="mb-3 text-sm text-slate-400">Bläddra bland isolerade sub-agent konversationssessioner.</p><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Sessionlista</span><p class="mt-0.5 text-sm text-slate-400">Vänsterpanelen visar alla sessioner med ID och tidsstämpel.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Meddelandevy</span><p class="mt-0.5 text-sm text-slate-400">Välj en session för att se dess konversation i chat-layout.</p></div></div><div class="flex gap-3 py-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right mt-0.5 h-4 w-4 flex-shrink-0 text-cyan-500"><path d="m9 18 6-6-6-6"></path></svg><div><span class="text-sm font-medium text-slate-200">Rollmarkering</span><p class="mt-0.5 text-sm text-slate-400">Meddelanden färgkodas per roll — user (cyan), assistant/system (mörk).</p></div></div></section></div><footer class="mt-12 border-t border-slate-800/60 pt-6 pb-12 text-center"><p class="text-xs text-slate-600">CF Claw AgentOS Dashboard — Manual v1.0</p><a class="mt-3 inline-flex items-center gap-2 text-sm text-cyan-400 transition-colors hover:text-cyan-300" href="/"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left h-4 w-4"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg>Tillbaka till Dashboard</a></footer></div></div><script src="/_next/static/chunks/webpack-616e068a201ad621.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/baff0f221c10680b.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[9107,[],\"ClientPageRoot\"]\n5:I[8423,[\"343\",\"static/chunks/343-71498a8257bc1e81.js\",\"789\",\"static/chunks/app/manual/page-3c401ecf89979cd7.js\"],\"default\",1]\n6:I[4707,[],\"\"]\n7:I[6423,[],\"\"]\n9:I[1060,[],\"\"]\na:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"pyqPyo6dkz4uTWdfdFAOJ\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"manual\",\"\"],\"initialTree\":[\"\",{\"children\":[\"manual\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"manual\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"$L4\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$5\"}],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"manual\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/baff0f221c10680b.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"sv\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#030712] text-slate-300 antialiased\",\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L8\"],\"globalErrorComponent\":\"$9\",\"missingSlots\":\"$Wa\"}]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"CF Claw Dashboard\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"CF Claw AgentOS Dashboard\"}]]\n3:null\n"])</script></body></html>
@@ -0,0 +1,7 @@
1
+ 2:I[9107,[],"ClientPageRoot"]
2
+ 3:I[8423,["343","static/chunks/343-71498a8257bc1e81.js","789","static/chunks/app/manual/page-3c401ecf89979cd7.js"],"default",1]
3
+ 4:I[4707,[],""]
4
+ 5:I[6423,[],""]
5
+ 0:["pyqPyo6dkz4uTWdfdFAOJ",[[["",{"children":["manual",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["manual",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","manual","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/baff0f221c10680b.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"sv","children":["$","body",null,{"className":"bg-[#030712] text-slate-300 antialiased","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
6
+ 6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"CF Claw Dashboard"}],["$","meta","3",{"name":"description","content":"CF Claw AgentOS Dashboard"}]]
7
+ 1:null
@@ -0,0 +1,20 @@
1
+ export interface Document {
2
+ id: number;
3
+ title: string;
4
+ filename: string;
5
+ category: string;
6
+ tags: string[];
7
+ summary: string;
8
+ filePath: string;
9
+ fileExt: string;
10
+ sizeBytes: number;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ }
14
+ export declare function docSave(title: string, content: string, category?: string, tags?: string[], fileExt?: string): Promise<Document>;
15
+ export declare function docList(category?: string): Document[];
16
+ export declare function docRead(id: number): string | null;
17
+ export declare function docReadByFilename(filename: string): string | null;
18
+ export declare function docDelete(id: number): boolean;
19
+ export declare function docSearch(query: string, limit?: number): Promise<Document[]>;
20
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"AA4EA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwBD,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAkB,EAC5B,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,QAAQ,CAAC,CAkEnB;AAED,wBAAgB,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAiBrD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQjD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQjE;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAU7C;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA+CtF"}
@@ -0,0 +1,227 @@
1
+ import Database from "better-sqlite3";
2
+ import * as sqliteVec from "sqlite-vec";
3
+ import path from "node:path";
4
+ import fs from "node:fs";
5
+ import { embed, vecToBuffer, EMBEDDING_DIM } from "./embeddings.js";
6
+ import { chatCompletion as registryChatCompletion } from "./llm/index.js";
7
+ import { getDataDir } from "./paths.js";
8
+ const DATA_DIR = getDataDir();
9
+ const DOCS_DIR = path.join(DATA_DIR, "documents");
10
+ fs.mkdirSync(DOCS_DIR, { recursive: true });
11
+ const DB_PATH = path.join(DATA_DIR, "cf-claw.db");
12
+ const db = new Database(DB_PATH);
13
+ db.pragma("journal_mode = WAL");
14
+ sqliteVec.load(db);
15
+ db.exec(`
16
+ CREATE TABLE IF NOT EXISTS documents (
17
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18
+ title TEXT NOT NULL,
19
+ filename TEXT NOT NULL,
20
+ category TEXT DEFAULT 'general',
21
+ tags TEXT DEFAULT '[]',
22
+ summary TEXT,
23
+ file_path TEXT NOT NULL,
24
+ file_ext TEXT DEFAULT '.md',
25
+ size_bytes INTEGER DEFAULT 0,
26
+ embedding BLOB,
27
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
28
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
29
+ );
30
+
31
+ CREATE VIRTUAL TABLE IF NOT EXISTS documents_vec USING vec0(
32
+ embedding float[${EMBEDDING_DIM}]
33
+ );
34
+
35
+ CREATE VIRTUAL TABLE IF NOT EXISTS documents_fts USING fts5(
36
+ title, summary, tags
37
+ );
38
+ `);
39
+ const insertDoc = db.prepare("INSERT INTO documents (title, filename, category, tags, summary, file_path, file_ext, size_bytes, embedding) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
40
+ const insertDocVec = db.prepare("INSERT INTO documents_vec (rowid, embedding) VALUES (?, ?)");
41
+ const insertDocFts = db.prepare("INSERT INTO documents_fts (rowid, title, summary, tags) VALUES (?, ?, ?, ?)");
42
+ const getAllDocs = db.prepare("SELECT id, title, filename, category, tags, summary, file_path, file_ext, size_bytes, created_at, updated_at FROM documents ORDER BY updated_at DESC");
43
+ const getDocById = db.prepare("SELECT * FROM documents WHERE id = ?");
44
+ const getDocByFilename = db.prepare("SELECT * FROM documents WHERE filename = ?");
45
+ const deleteDocStmt = db.prepare("DELETE FROM documents WHERE id = ?");
46
+ const deleteDocVec = db.prepare("DELETE FROM documents_vec WHERE rowid = ?");
47
+ const deleteDocFtsStmt = db.prepare("INSERT INTO documents_fts(documents_fts, rowid, title, summary, tags) VALUES ('delete', ?, ?, ?, ?)");
48
+ const updateDocStmt = db.prepare("UPDATE documents SET title = ?, category = ?, tags = ?, summary = ?, file_path = ?, size_bytes = ?, embedding = ?, updated_at = datetime('now') WHERE id = ?");
49
+ const updateDocVec = db.prepare("UPDATE documents_vec SET embedding = ? WHERE rowid = ?");
50
+ const docsByCategory = db.prepare("SELECT id, title, filename, category, tags, summary, size_bytes, created_at, updated_at FROM documents WHERE category = ? ORDER BY updated_at DESC");
51
+ function slugify(text) {
52
+ return text
53
+ .toLowerCase()
54
+ .replace(/[^a-z0-9]+/g, "-")
55
+ .replace(/^-|-$/g, "")
56
+ .substring(0, 60);
57
+ }
58
+ async function generateSummary(content) {
59
+ try {
60
+ const result = await registryChatCompletion({
61
+ messages: [{
62
+ role: "user",
63
+ content: `Summarize this document in 1-2 sentences. Return ONLY the summary:\n\n${content.substring(0, 3000)}`,
64
+ }],
65
+ });
66
+ return result.content?.trim() || "No summary available.";
67
+ }
68
+ catch {
69
+ return content.substring(0, 200);
70
+ }
71
+ }
72
+ export async function docSave(title, content, category = "general", tags = [], fileExt = ".md") {
73
+ const slug = slugify(title);
74
+ const ext = fileExt.startsWith(".") ? fileExt : `.${fileExt}`;
75
+ const catDir = path.join(DOCS_DIR, category);
76
+ fs.mkdirSync(catDir, { recursive: true });
77
+ const existing = getDocByFilename.get(`${slug}${ext}`);
78
+ if (existing) {
79
+ const filePath = existing.file_path;
80
+ fs.writeFileSync(filePath, content, "utf-8");
81
+ const summary = await generateSummary(content);
82
+ const vec = await embed(`${title} ${summary}`);
83
+ const buf = vecToBuffer(vec);
84
+ updateDocStmt.run(title, category, JSON.stringify(tags), summary, filePath, Buffer.byteLength(content), buf, existing.id);
85
+ updateDocVec.run(buf, existing.id);
86
+ try {
87
+ deleteDocFtsStmt.run(existing.id, existing.title, existing.summary, existing.tags);
88
+ }
89
+ catch { }
90
+ insertDocFts.run(existing.id, title, summary, tags.join(" "));
91
+ return {
92
+ id: existing.id,
93
+ title,
94
+ filename: `${slug}${ext}`,
95
+ category,
96
+ tags,
97
+ summary,
98
+ filePath,
99
+ fileExt: ext,
100
+ sizeBytes: Buffer.byteLength(content),
101
+ createdAt: existing.created_at,
102
+ updatedAt: new Date().toISOString(),
103
+ };
104
+ }
105
+ const filename = `${slug}${ext}`;
106
+ const filePath = path.join(catDir, filename);
107
+ fs.writeFileSync(filePath, content, "utf-8");
108
+ const summary = await generateSummary(content);
109
+ const vec = await embed(`${title} ${summary}`);
110
+ const buf = vecToBuffer(vec);
111
+ const result = insertDoc.run(title, filename, category, JSON.stringify(tags), summary, filePath, ext, Buffer.byteLength(content), buf);
112
+ const rowid = Number(result.lastInsertRowid);
113
+ insertDocVec.run(BigInt(rowid), buf);
114
+ insertDocFts.run(rowid, title, summary, tags.join(" "));
115
+ return {
116
+ id: rowid,
117
+ title,
118
+ filename,
119
+ category,
120
+ tags,
121
+ summary,
122
+ filePath,
123
+ fileExt: ext,
124
+ sizeBytes: Buffer.byteLength(content),
125
+ createdAt: new Date().toISOString(),
126
+ updatedAt: new Date().toISOString(),
127
+ };
128
+ }
129
+ export function docList(category) {
130
+ const rows = category
131
+ ? docsByCategory.all(category)
132
+ : getAllDocs.all();
133
+ return rows.map((r) => ({
134
+ id: r.id,
135
+ title: r.title,
136
+ filename: r.filename,
137
+ category: r.category,
138
+ tags: JSON.parse(r.tags || "[]"),
139
+ summary: r.summary || "",
140
+ filePath: r.file_path,
141
+ fileExt: r.file_ext,
142
+ sizeBytes: r.size_bytes,
143
+ createdAt: r.created_at,
144
+ updatedAt: r.updated_at,
145
+ }));
146
+ }
147
+ export function docRead(id) {
148
+ const row = getDocById.get(id);
149
+ if (!row)
150
+ return null;
151
+ try {
152
+ return fs.readFileSync(row.file_path, "utf-8");
153
+ }
154
+ catch {
155
+ return null;
156
+ }
157
+ }
158
+ export function docReadByFilename(filename) {
159
+ const row = getDocByFilename.get(filename);
160
+ if (!row)
161
+ return null;
162
+ try {
163
+ return fs.readFileSync(row.file_path, "utf-8");
164
+ }
165
+ catch {
166
+ return null;
167
+ }
168
+ }
169
+ export function docDelete(id) {
170
+ const row = getDocById.get(id);
171
+ if (!row)
172
+ return false;
173
+ try {
174
+ fs.unlinkSync(row.file_path);
175
+ }
176
+ catch { }
177
+ deleteDocStmt.run(id);
178
+ deleteDocVec.run(id);
179
+ try {
180
+ deleteDocFtsStmt.run(id, row.title, row.summary, row.tags);
181
+ }
182
+ catch { }
183
+ return true;
184
+ }
185
+ export async function docSearch(query, limit = 10) {
186
+ const queryVec = await embed(query);
187
+ const queryBuf = vecToBuffer(queryVec);
188
+ const vecResults = db.prepare("SELECT rowid, distance FROM documents_vec WHERE embedding MATCH ? ORDER BY distance LIMIT ?").all(queryBuf, limit * 2);
189
+ let ftsResults = [];
190
+ try {
191
+ const ftsQuery = query.split(/\s+/).filter((w) => w.length > 1).map((w) => `"${w}"*`).join(" OR ");
192
+ if (ftsQuery) {
193
+ ftsResults = db.prepare("SELECT rowid, rank FROM documents_fts WHERE documents_fts MATCH ? ORDER BY rank LIMIT ?").all(ftsQuery, limit * 2);
194
+ }
195
+ }
196
+ catch { }
197
+ const scoreMap = new Map();
198
+ for (const r of vecResults) {
199
+ scoreMap.set(r.rowid, (scoreMap.get(r.rowid) || 0) + (1 - r.distance));
200
+ }
201
+ for (const r of ftsResults) {
202
+ scoreMap.set(r.rowid, (scoreMap.get(r.rowid) || 0) + Math.max(0, 1 + r.rank * 0.1));
203
+ }
204
+ const sorted = [...scoreMap.entries()].sort((a, b) => b[1] - a[1]).slice(0, limit);
205
+ const results = [];
206
+ for (const [rowid] of sorted) {
207
+ const row = getDocById.get(rowid);
208
+ if (row) {
209
+ results.push({
210
+ id: row.id,
211
+ title: row.title,
212
+ filename: row.filename,
213
+ category: row.category,
214
+ tags: JSON.parse(row.tags || "[]"),
215
+ summary: row.summary || "",
216
+ filePath: row.file_path,
217
+ fileExt: row.file_ext,
218
+ sizeBytes: row.size_bytes,
219
+ createdAt: row.created_at,
220
+ updatedAt: row.updated_at,
221
+ });
222
+ }
223
+ }
224
+ return results;
225
+ }
226
+ process.on("exit", () => db.close());
227
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const EMBEDDING_DIM = 384;
2
+ /**
3
+ * Generate a 384-dimensional embedding vector for the given text.
4
+ * Returns a Float32Array suitable for sqlite-vec storage.
5
+ */
6
+ export declare function embed(text: string): Promise<Float32Array>;
7
+ /**
8
+ * Convert a Float32Array to a Buffer for SQLite BLOB storage.
9
+ */
10
+ export declare function vecToBuffer(vec: Float32Array): Buffer;
11
+ /**
12
+ * Convert a Buffer from SQLite back to Float32Array.
13
+ */
14
+ export declare function bufferToVec(buf: Buffer): Float32Array;
15
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,MAAM,CAAC;AAkBjC;;;GAGG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAI/D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAGrD"}
@@ -0,0 +1,40 @@
1
+ import { pipeline } from "@xenova/transformers";
2
+ const MODEL_NAME = "Xenova/all-MiniLM-L6-v2";
3
+ export const EMBEDDING_DIM = 384;
4
+ let embedder = null;
5
+ /**
6
+ * Lazily loads the embedding model on first use (~80MB download, cached).
7
+ */
8
+ async function getEmbedder() {
9
+ if (!embedder) {
10
+ console.log("🧠 Loading embedding model (first time may take a moment)…");
11
+ embedder = await pipeline("feature-extraction", MODEL_NAME, {
12
+ quantized: true,
13
+ });
14
+ console.log("🧠 Embedding model ready.");
15
+ }
16
+ return embedder;
17
+ }
18
+ /**
19
+ * Generate a 384-dimensional embedding vector for the given text.
20
+ * Returns a Float32Array suitable for sqlite-vec storage.
21
+ */
22
+ export async function embed(text) {
23
+ const model = await getEmbedder();
24
+ const output = await model(text, { pooling: "mean", normalize: true });
25
+ return new Float32Array(output.data);
26
+ }
27
+ /**
28
+ * Convert a Float32Array to a Buffer for SQLite BLOB storage.
29
+ */
30
+ export function vecToBuffer(vec) {
31
+ return Buffer.from(vec.buffer, vec.byteOffset, vec.byteLength);
32
+ }
33
+ /**
34
+ * Convert a Buffer from SQLite back to Float32Array.
35
+ */
36
+ export function bufferToVec(buf) {
37
+ const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
38
+ return new Float32Array(ab);
39
+ }
40
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkC,MAAM,sBAAsB,CAAC;AAEhF,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AAEjC,IAAI,QAAQ,GAAqC,IAAI,CAAC;AAEtD;;GAEG;AACH,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,QAAQ,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,UAAU,EAAE;YAC1D,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAyB,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAiB;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7E,OAAO,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,72 @@
1
+ export type TaskStatus = "backlog" | "in_progress" | "review" | "done" | "failed" | "human_intervention";
2
+ export type ProjectStatus = "planning" | "running" | "paused" | "completed" | "failed";
3
+ declare const AGENT_PHASES: Record<string, string>;
4
+ declare const PHASE_ORDER: string[];
5
+ export { AGENT_PHASES, PHASE_ORDER };
6
+ export interface FactoryProject {
7
+ id: number;
8
+ title: string;
9
+ description: string;
10
+ status: ProjectStatus;
11
+ workspacePath: string;
12
+ taskCount: number;
13
+ completedTasks: number;
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ }
17
+ export type FactoryRestartMode = "partial" | "full";
18
+ export interface FactoryRestartResult {
19
+ ok: boolean;
20
+ projectId: number;
21
+ mode: FactoryRestartMode;
22
+ resetTasks: number;
23
+ workspacePath: string;
24
+ message: string;
25
+ }
26
+ export interface FactoryTask {
27
+ id: number;
28
+ projectId: number;
29
+ title: string;
30
+ description: string;
31
+ assignedAgent: string;
32
+ reviewerAgent: string | null;
33
+ status: TaskStatus;
34
+ phase: string | null;
35
+ dependencies: number[];
36
+ retryCount: number;
37
+ maxRetries: number;
38
+ contextPayload: Record<string, unknown>;
39
+ result: string | null;
40
+ startedAt: string | null;
41
+ completedAt: string | null;
42
+ createdAt: string;
43
+ updatedAt: string;
44
+ }
45
+ export declare function getAgentPipelineRoles(agentName: string): string[];
46
+ export declare function createFactoryProject(title: string, description: string): FactoryProject;
47
+ export declare function listFactoryProjects(): FactoryProject[];
48
+ export declare function getFactoryProject(id: number): FactoryProject | null;
49
+ export declare function setProjectStatus(id: number, status: ProjectStatus): boolean;
50
+ export declare function getFactoryTasks(projectId: number): FactoryTask[];
51
+ export declare function getFactoryTask(taskId: number): FactoryTask | null;
52
+ export declare function forceRetryTask(taskId: number): boolean;
53
+ export declare function switchProjectProfile(projectId: number, newProfile: string): {
54
+ ok: boolean;
55
+ message: string;
56
+ injectedTasks: number;
57
+ };
58
+ export declare function listFactoryProfiles(): Array<{
59
+ id: string;
60
+ mandatoryStages: string[];
61
+ optionalStages: string[];
62
+ }>;
63
+ export declare function restartFactoryProject(projectId: number, mode?: FactoryRestartMode): FactoryRestartResult;
64
+ export declare function factoryCreate(description: string): Promise<{
65
+ project: FactoryProject;
66
+ tasks: FactoryTask[];
67
+ }>;
68
+ export declare function wasProjectAutoNormalized(projectId: number): boolean;
69
+ export declare function tickFactory(): Promise<void>;
70
+ export declare function startFactory(): void;
71
+ export declare function stopFactory(): void;
72
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}