|
6 | 6 | import { instances, refreshState } from "$lib/stores/app.svelte"; |
7 | 7 | import { onMount } from "svelte"; |
8 | 8 |
|
9 | | - const apiUrl = browser ? window.location.origin.replace("localhost", "127.0.0.1") : "http://127.0.0.1:52415"; |
| 9 | + const apiUrl = browser |
| 10 | + ? window.location.origin.replace("localhost", "127.0.0.1") |
| 11 | + : "http://127.0.0.1:52415"; |
10 | 12 |
|
11 | 13 | const instancesData = $derived(instances()); |
12 | 14 |
|
|
195 | 197 | { |
196 | 198 | id: openClawModel, |
197 | 199 | name: "exo local", |
198 | | - input: (modelCapabilities[openClawModel] || []).includes("vision") |
| 200 | + input: (modelCapabilities[openClawModel] || []).includes( |
| 201 | + "vision", |
| 202 | + ) |
199 | 203 | ? ["text", "image"] |
200 | 204 | : ["text"], |
201 | 205 | }, |
|
259 | 263 | ].join("\n"), |
260 | 264 | ); |
261 | 265 |
|
| 266 | + const firefoxConfig = $derived( |
| 267 | + [ |
| 268 | + `1. Open about:config in Firefox`, |
| 269 | + `2. Set browser.ml.chat.enabled to true`, |
| 270 | + `3. Set browser.ml.chat.hideLocalhost to false`, |
| 271 | + `4. Set browser.ml.chat.provider to: ${apiUrl}/`, |
| 272 | + ].join("\n"), |
| 273 | + ); |
| 274 | +
|
262 | 275 | const tabs = [ |
263 | 276 | "Claude Code", |
264 | 277 | "OpenCode", |
265 | 278 | "Codex", |
266 | 279 | "OpenClaw", |
267 | 280 | "Open WebUI", |
268 | 281 | "n8n", |
| 282 | + "Firefox", |
269 | 283 | ] as const; |
270 | 284 | type Tab = (typeof tabs)[number]; |
271 | 285 | const stored = browser ? localStorage.getItem("exo-integrations-tab") : null; |
|
477 | 491 | {:else if activeTab === "OpenClaw"} |
478 | 492 | {#if runningModels.length > 1} |
479 | 493 | <div class="text-xs"> |
480 | | - <span class="text-exo-light-gray/50 text-[10px] uppercase tracking-wider block mb-1">Model</span> |
| 494 | + <span |
| 495 | + class="text-exo-light-gray/50 text-[10px] uppercase tracking-wider block mb-1" |
| 496 | + >Model</span |
| 497 | + > |
481 | 498 | <select bind:value={openClawModel} class={selectClass}> |
482 | 499 | {#each runningModels as model} |
483 | 500 | <option value={model}>{model.split("/").pop()}</option> |
|
547 | 564 | description="Create a workflow that uses your exo-powered model." |
548 | 565 | config={n8nWorkflowSteps} |
549 | 566 | /> |
| 567 | + {:else if activeTab === "Firefox"} |
| 568 | + <IntegrationCard |
| 569 | + title="Firefox AI Chatbot" |
| 570 | + subtitle="about:config" |
| 571 | + description="Use the exo dashboard as Firefox's built-in AI chatbot. Requires Firefox 130+." |
| 572 | + config={firefoxConfig} |
| 573 | + /> |
550 | 574 | {/if} |
551 | 575 | </div> |
552 | 576 | </main> |
|
0 commit comments