-
-
Notifications
You must be signed in to change notification settings - Fork 410
pull fork #208
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
pull fork #208
Conversation
chore: remove duplicate files and deprecated
…s-generator fix: better model names/ids generated
✅ Deploy Preview for clara-ollama ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
WalkthroughIntroduces a Docusaurus-based docs site and built assets; overhauls Electron app startup UX with a new LoadingScreen and splash; expands LlamaSwapService with GPU-aware config, custom model paths, health and performance settings; adds WatchdogService and robust update services; enables remote MCP servers; updates platform/binary management; revises configs and metadata. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User
participant App as Electron App
participant Load as LoadingScreen (Renderer)
participant Main as Main Process
participant LSwap as LlamaSwapService
participant WD as WatchdogService
participant Upd as UpdateService
Note over App,Load: Startup
User->>App: Launch
App->>Load: Create fullscreen loading window
Load-->>Main: ready-to-show
Main->>Load: status("Initializing…")
Main->>LSwap: init(load perf settings, custom paths)
LSwap-->>Main: progress callbacks (model/binary checks)
Main->>Load: status/progress updates
Main->>WD: start(health checks)
WD-->>Main: service status events
Main->>Upd: setupAutoUpdater()
alt Critical settings changed
Main->>LSwap: regenerate config + restart
else Hot settings
Main->>LSwap: apply hot config
end
Main->>Load: hide + close (when ready)
Main->>App: show main window
Note over Main,LSwap: Runtime
App-->>Main: IPC (gpu diagnostics, perf save/load, model paths, health)
Main->>LSwap: handle requests
WD-->>Main: failure/restore notifications
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120+ minutes Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✨ Finishing touches
🧪 Generate unit tests
Tip 👮 Agentic pre-merge checks are now available in preview!Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.
Please see the documentation for more information. Example: reviews:
pre_merge_checks:
custom_checks:
- name: "Undocumented Breaking Changes"
mode: "warning"
instructions: |
Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).Please share your feedback with us on this Discord post. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
| GitGuardian id | GitGuardian status | Secret | Commit | Filename | |
|---|---|---|---|---|---|
| 17477437 | Triggered | JSON Web Token | d517510 | src/supabaseClient.ts | View secret |
🛠 Guidelines to remediate hardcoded secrets
- Understand the implications of revoking this secret by investigating where it is used in your code.
- Replace and store your secret safely. Learn here the best practices.
- Revoke and rotate this secret.
- If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.
To avoid such incidents in the future consider
- following these best practices for managing and storing secrets including API keys and other credentials
- install secret detection on pre-commit to catch secret before it leaves your machine and ease remediation.
🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
|
pull |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 42
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (14)
.gitignore (1)
58-68: Fix ineffective patterns with leading./.Git ignores treat
./literally; these entries won’t match. Anchor to repo root with a leading/.Apply this diff:
-/Support -./py_backend/__pycache__ -./py_backend/cache -./py_backend/python-env -./py_backend/python-env/cache -./py_backend/python-env/pip-cache -./py_backend/python-env/python-env +/Support +/py_backend/__pycache__ +/py_backend/cache +/py_backend/python-env +/py_backend/python-env/cache +/py_backend/python-env/pip-cache +/py_backend/python-env/python-envelectron/dockerSetup.cjs (4)
91-112: Blocking: exec used without import (ReferenceError at runtime).execAsync calls exec but child_process.exec isn’t imported.
Apply this diff to import exec (and net for a later fix):
const { EventEmitter } = require('events'); const Docker = require('dockerode'); const path = require('path'); const fs = require('fs'); const os = require('os'); const { app } = require('electron'); const tar = require('tar-fs'); const http = require('http'); +const { exec } = require('child_process'); +const net = require('net');Also applies to: 1-9
114-124: Cross‑platform bug: lsof-based port checks fail on Windows and can mis-detect availability.Use a TCP bind probe with net instead of relying on lsof.
Apply this diff:
- async findAvailablePort(startPort, endPort = startPort + 100) { - for (let port = startPort; port <= endPort; port++) { - try { - await this.execAsync(`lsof -i :${port}`); - } catch (error) { - // If lsof fails, it means the port is available - return port; - } - } - throw new Error(`No available ports found between ${startPort} and ${endPort}`); - } + async findAvailablePort(startPort, endPort = startPort + 100) { + for (let port = startPort; port <= endPort; port++) { + const inUse = await this.isPortInUse(port); + if (!inUse) return port; + } + throw new Error(`No available ports found between ${startPort} and ${endPort}`); + } - async isPortInUse(port) { - try { - await this.execAsync(`lsof -i :${port}`); - return true; - } catch (error) { - return false; - } - } + async isPortInUse(port) { + return new Promise((resolve) => { + const server = net.createServer() + .once('error', () => resolve(true)) + .once('listening', () => server.once('close', () => resolve(false)).close()) + .listen(port, '127.0.0.1'); + }); + }Also applies to: 126-134
25-47: Removed Ollama container, but Python container still points to non-existent clara_ollama host.Hard-coded OLLAMA_BASE_URL=http://clara_ollama:11434 will fail now. Use host.docker.internal (macOS/Windows) or 172.17.0.1 (Linux), and pass env per-container.
Apply this diff:
- this.containers = { + const ollamaHost = + process.platform === 'linux' + ? 'http://172.17.0.1:11434' + : 'http://host.docker.internal:11434'; + this.containers = { python: { name: 'clara_python', image: 'clara17verse/clara-backend:latest', port: 5001, internalPort: 5000, healthCheck: this.isPythonRunning.bind(this), volumes: [ `${this.appDataPath}:/root/.clara` ] + , + env: [ + 'PYTHONUNBUFFERED=1', + `OLLAMA_BASE_URL=${ollamaHost}` + ] }, n8n: { name: 'clara_n8n', image: 'n8nio/n8n', port: 5678, internalPort: 5678, healthCheck: this.checkN8NHealth.bind(this), volumes: [ `${path.join(this.appDataPath, 'n8n')}:/home/node/.n8n` ] } };- Env: [ - 'PYTHONUNBUFFERED=1', - 'OLLAMA_BASE_URL=http://clara_ollama:11434' - ] + Env: config.env || []Also applies to: 393-397
1-21: Don't hard-code Docker CLI path — resolve from PATH with fallbacksHard-coding /usr/local/bin/docker is brittle; the verification run returned "which: command not found" and no docker path (process.platform=linux x64).
File: electron/dockerSetup.cjs — lines 1-21 (also applies to 91-112)
- Use runtime resolution (command -v docker or fs checks on PATH) and prefer whatever is on PATH.
- Fall back to common locations: /opt/homebrew/bin/docker, /usr/local/bin/docker, /usr/bin/docker, and Docker Desktop's CLI if present.
- Support an override via env/config (e.g., DOCKER_PATH).
- If CLI not found, fall back to dockerode via socket (/var/run/docker.sock) or emit a clear error/event.
electron/llamacpp-binaries/config.yaml (1)
2-101: Remove machine-specific config from VCS; replace with a templated example.This file leaks local paths (/Users/temme), OS-specific env (DYLD_LIBRARY_PATH), and port assumptions. Keep only a config-example.yaml with env/placeholders and ignore the real file.
+.gitignore +electron/llamacpp-binaries/config.yamlTemplate snippet to commit instead:
# electron/llamacpp-binaries/config-example.yaml # Models directory: ${CLARA_HOME}/llama-models models: "qwen3:8b": proxy: "http://127.0.0.1:${LLAMA_PORT:-9999}" cmd: | "${BIN_DIR}/llama-server" -m "${CLARA_HOME}/llama-models/Qwen3-8B-Q4_K_M.gguf" --port ${LLAMA_PORT:-9999} --jinja --n-gpu-layers ${GPU_LAYERS:-40} --threads ${THREADS:-5} --ctx-size ${CTX_SIZE:-8192} --batch-size ${BATCH:-256} --ubatch-size ${UBATCH:-256} --keep ${KEEP:-1024} --defrag-thold ${DEFRAG:-0.1} --mlock --parallel ${PARALLEL:-1} --flash-attn --cont-batching env: - "DYLD_LIBRARY_PATH=${BIN_DIR}:" ttl: 300electron/mcpService.cjs (1)
770-897: Stdio JSON-RPC framing and logging.
- Multiple listeners plus line-based parsing is fragile. Consider a JSON-RPC framing library or per-call line buffer with stricter matching.
- Redact args/content in logs; log IDs and statuses only.
package.json (2)
40-44: Standardize Docker image name/tag.Scripts still refer to “clara-ollama”. If the project is “clara-verse”, consider renaming image and pushing versioned tags.
- "docker:build": "if [ -z \"$DOCKER_USERNAME\" ] ; then docker build -t clara-ollama:latest .; else docker build -t $DOCKER_USERNAME/clara-ollama:latest .; fi", - "docker:run": "if [ -z \"$DOCKER_USERNAME\" ] ; then docker run -p 8069:8069 clara-ollama:latest; else docker run -p 8069:8069 $DOCKER_USERNAME/clara-ollama:latest; fi", - "docker:push": "npm run docker:check-env && docker push $DOCKER_USERNAME/clara-ollama:latest", + "docker:build": "if [ -z \"$DOCKER_USERNAME\" ]; then docker build -t clara-verse:latest .; else docker build -t $DOCKER_USERNAME/clara-verse:latest .; fi", + "docker:run": "if [ -z \"$DOCKER_USERNAME\" ]; then docker run -p 8069:8069 clara-verse:latest; else docker run -p 8069:8069 $DOCKER_USERNAME/clara-verse:latest; fi", + "docker:push": "npm run docker:check-env && docker push $DOCKER_USERNAME/clara-verse:latest",
316-332: Move Vite build config from package.json into vite.config.tspackage.json (lines 315–332) contains build.chunkSizeWarningLimit: 6000 and rollupOptions.manualChunks (vendor: react, react-dom, langchain, @langchain/core, openai). vite.config.ts (build block at ~lines 100–111) currently defines manualChunks vendor:['react','react-dom'] and pdfjs only and does not include chunkSizeWarningLimit or the extra vendor entries — merge these settings into vite.config.ts (set build.chunkSizeWarningLimit and add the additional vendor modules to manualChunks) so Vite actually applies them.
electron/platformManager.cjs (1)
136-139: Bug: fs.constants read from promises API (undefined)fs here is fs.promises; fs.constants is undefined and will throw. Use the sync import’s constants.
- await fs.access(binaryPath, fs.constants.F_OK | fs.constants.X_OK); + await fs.access(binaryPath, fsSync.constants.F_OK | fsSync.constants.X_OK);electron/preload.cjs (1)
43-49:app.getVersion()is not available in preload.The
appmodule cannot be used from the renderer/preload; this will throw. Expose version via IPC or useprocess.versions.Apply either fix; IPC-based shown here:
- getAppVersion: () => app.getVersion(), + getAppVersion: () => ipcRenderer.invoke('get-app-version'),And register in main:
+ipcMain.handle('get-app-version', () => app.getVersion());electron/llamaSwapService.cjs (1)
249-258:fs.promises.accesscalled withfs.constantsfrom the wrong module.
fs.promisesdoesn’t exposeconstants. Userequire('fs').constants(orfsSync.constants).- await fs.access(llamaSwap, fs.constants.F_OK | fs.constants.X_OK); - await fs.access(llamaServer, fs.constants.F_OK | fs.constants.X_OK); + const { constants } = require('fs'); + await fs.access(llamaSwap, constants.FOK | constants.X_OK); + await fs.access(llamaServer, constants.F_OK | constants.X_OK);Note:
F_OKnotFOK. Ensure exact constant names.electron/main.cjs (1)
1971-1983: Fullscreen+webview+permissive permission handler: revisit defaults.Granting all permissions to
file://and dev server is broad. Combined withwebviewTag: trueandsandbox: false, this increases risk if any XSS lands.
- Narrow permissions to those you actually need.
- Consider
sandbox: truefor webviews and disable Node in webviews with dedicated preload.- Gate dev-mode relaxations behind
NODE_ENV === 'development'.electron/llamacpp-binaries/darwin-arm64/ggml-metal.metal (1)
3353-3360: Vector zeroing likely wrong type (MSL may not allow scalar-to-vector implicit cast)
sq4[j*DK4 + i] = 0;assigns a scalar 0 toq4_t(vector). MSL typically requires explicit construction for vectors/matrices.Apply this diff to avoid a compile-time error and make intent explicit:
- sq4[j*DK4 + i] = 0; + sq4[j*DK4 + i] = (q4_t) 0.0f; // or q4_t(0.0f)
🧹 Nitpick comments (130)
public/documentation/build/assets/js/aba21aa0.f0a1b06a.js (1)
1-1: Confirm policy on committing built docs; mark as generated to cut PR noiseIf build artifacts are intentionally versioned, mark them as generated so they don’t distract code reviews and diffs.
Apply in repo root:
+public/documentation/build/** linguist-generated=truePlace the above in .gitattributes. Optionally, build docs in CI and attach as artifacts or deploy (e.g., GitHub Pages) instead of committing bundles.
public/documentation/build/assets/js/main.a25a12dc.js.LICENSE.txt (1)
1-62: Consider not committing hashed build outputs.If GitHub Pages isn’t consuming this path directly, prefer building in CI and deploying artifacts, not committing them. Reduces repo churn from hash changes and large diffs.
Is this path required for a static hosting workflow? If yes, ignore.
example-flows/simple-llm-flow.json (1)
25-27: Optional: cap tokens/temperature for snappier UX (non-blocking).If this runs in a UI demo, consider maxTokens 256 and temperature 0.5 to reduce latency and variance.
- "temperature": 0.7, - "maxTokens": 500 + "temperature": 0.5, + "maxTokens": 256example-flows/research-assistant-flow.json (4)
30-41: URL-encode topic to avoid malformed requests.As written, spaces and special chars in {{topic}} may break the URL.
If templating supports filters, apply urlencode:
- "url": "https://api.duckduckgo.com/?q={{topic}}&format=json&no_html=1&skip_disambig=1", + "url": "https://api.duckduckgo.com/?q={{topic | urlencode}}&format=json&no_html=1&skip_disambig=1",If filters aren’t supported, confirm whether the API node auto-encodes query params; otherwise consider a params field if available.
46-52: Provide a default for optional depth to avoid literal “undefined/empty” in prompts.This input is not required; guard the prompt.
If default/filtering is supported:
- "prompt": "You are a research analyst. I've gathered some information about: {{topic}}\n\nSearched data: {{searchResults}}\n\nAnalysis depth requested: {{depth}}\n\nPlease provide a comprehensive analysis of this topic based on the available information. Structure your response with:\n1. Key findings\n2. Important insights\n3. Practical implications\n4. Recommendations for further research\n\nTailor the depth of analysis to the requested level.", + "prompt": "You are a research analyst. I've gathered some information about: {{topic}}\n\nSearched data: {{searchResults}}\n\nAnalysis depth requested: {{depth | default('Basic')}}\n\nPlease provide a comprehensive analysis of this topic based on the available information. Structure your response with:\n1. Key findings\n2. Important insights\n3. Practical implications\n4. Recommendations for further research\n\nTailor the depth of analysis to the requested level.",
30-41: Consider timeouts/retries on the API node (if supported).Avoids hanging flows and adds resilience to transient failures.
"data": { "label": "Search API", "url": "https://api.duckduckgo.com/?q={{topic | urlencode}}&format=json&no_html=1&skip_disambig=1", "method": "GET", "headers": { "User-Agent": "Clara Research Assistant" - } + }, + "timeoutMs": 10000, + "retry": { "maxAttempts": 2, "backoffMs": 500 } }
4-6: Privacy note: external call transmits user input.Document this behavior and provide a local-only mode toggle if the app claims offline defaults.
clear_storage.js (3)
41-44: Await async work before announcing success.The final message can print before IndexedDB cleanup finishes. Await it.
Apply this diff:
-clearIndexedDB(); - -console.log('🔄 Storage cleared! Refresh the page to simulate first-time user experience.'); -console.log('💡 Tip: Open DevTools Console to see provider initialization logs.'); +(async () => { + await clearIndexedDB(); + console.log('🔄 Storage cleared! Refresh the page to simulate first-time user experience.'); + console.log('💡 Tip: Open DevTools Console to see provider initialization logs.'); +})();
1-44: Optional: also clear CacheStorage and unregister Service Workers for a true “first‑time” state.Many apps persist via Cache Storage and SWs. Consider adding:
async function clearCacheStorage() { if (!('caches' in window)) return; const keys = await caches.keys(); await Promise.all(keys.map(k => caches.delete(k))); console.log('✅ CacheStorage cleared'); } async function unregisterServiceWorkers() { if (!('serviceWorker' in navigator)) return; const regs = await navigator.serviceWorker.getRegistrations(); await Promise.all(regs.map(r => r.unregister())); console.log('✅ Service Workers unregistered'); } // Then call alongside clearIndexedDB(): (async () => { await Promise.allSettled([clearIndexedDB(), clearCacheStorage(), unregisterServiceWorkers()]); console.log('🔄 Storage cleared! Refresh the page to simulate first-time user experience.'); })();
22-39: Harden IndexedDB cleanup: add cross‑browser guard, handle onblocked, use Promise.allSettled, and per‑DB logs.
indexedDB.databases() is widely supported (Chrome 72+, Safari 14+, Firefox 126+) but keep the feature‑detect guard for older/embedded browsers; implement req.onblocked and per‑DB success/error logs instead of relying on deleteReq.result.public/documentation/build/assets/js/5e95c892.05456d1d.js (1)
1-1: Harden againste.route/e.route.routesbeing undefined.This chunk assumes
e.route.routesexists; if absent, it’ll throw at runtime. Please address in the source (not the built file) with defensive access or prop validation.Example (in the source component):
- Use optional chaining and a fallback:
renderRoutes(props.route?.routes ?? []).- Add PropTypes/TS types to enforce shape at compile time.
installer.nsh (1)
40-43: Optional: add custom pages/macros only when needed.customWelcomePage/customInstallMode are supported if you later need assisted installs or per‑machine selection.
electron/llamacpp-binaries/version.txt (1)
1-1: Add trailing newline and clarify version semantics.End the file with a newline and document (in packaging notes/README) what "b5581" refers to (llama.cpp git sha? build id?) to avoid ambiguity across platforms.
documentation/tsconfig.json (1)
1-8: LGTM for editor-only tsconfig.Extends Docusaurus base correctly; exclude set is fine. If you reference Node globals in configs, consider
"types": ["node"]to quiet editors..github/FUNDING.yml (1)
3-3: Confirm intent to clear GitHub Sponsors handle.Empty
github:disables the GitHub sponsor button. If intentional (using Buy Me a Coffee only), all good; otherwise set your handle or remove the key.documentation/src/pages/markdown-page.md (1)
1-8: LGTM: sample Markdown page.Front‑matter and content render fine in Docusaurus. Optional: add
slugif you need a stable URL.documentation/.gitignore (1)
1-21: Expand ignores for common local artifacts.Consider adding a few safe extras frequently generated by Docusaurus/Node dev flows.
# Misc .DS_Store +.idea/ +.vscode/ +.eslintcache +.stylelintcache +.cache +.parcel-cache .env.local .env.development.local .env.test.local .env.production.local + +npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-debug.log* +coverage/ +.turbo/electron/llamacpp-binaries/linux-x64/LICENSE-linenoise (1)
1-27: BSD‑2‑Clause text looks correct; add a consolidated THIRD_PARTY_NOTICES.A single aggregated THIRD_PARTY_NOTICES file referencing each component/license eases compliance for downstreams.
electron/llamacpp-binaries/performance-settings.json (1)
1-10: Default tuning may oversubscribe CPUs; prefer “auto”/env‑driven values.Hard‑coding threads: 8 and parallelSequences: 4 can degrade perf on low‑core machines. If the loader allows, support “auto” and derive from logical cores; otherwise document that these are safe defaults and are overridden elsewhere.
{ - "flashAttention": false, - "autoOptimization": true, - "maxContextSize": 2048, - "aggressiveOptimization": false, - "prioritizeSpeed": true, - "threads": 8, - "parallelSequences": 4, - "optimizeFirstToken": true + "flashAttention": false, + "autoOptimization": true, + "maxContextSize": 2048, + "aggressiveOptimization": false, + "prioritizeSpeed": true, + "threads": "auto", + "parallelSequences": 1, + "optimizeFirstToken": true }If string values aren’t supported today, I can patch the loader to resolve "auto" → os.cpus().length and clamp.
documentation/src/css/custom.css (2)
8-18: Use Infima tokens where possible to inherit theme updates.Where feasible, map brand color to --ifm-color-primary without redefining the entire shade ladder; it reduces maintenance drift during Docusaurus upgrades.
21-30: Contrast check for dark mode code highlights.rgba(0,0,0,0.3) on dark backgrounds can be low contrast; consider rgba(255,255,255,0.06–0.08) to keep subtle yet visible.
-[data-theme='dark'] { +[data-theme='dark'] { --ifm-color-primary: #25c2a0; ... - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.08); }documentation/README.md (3)
5-9: Document required Node/Yarn versions.Pin engines to avoid “works on my machine” issues and CI mismatches.
## Installation +Requires Node 18+ (LTS) and Yarn 1.x or Berry; see package.json "engines".yarn
21-26: Add note about baseUrl for GitHub Pages.Remind contributors to set url/baseUrl in docusaurus.config when deploying to org/user pages.
27-42: Clarify deploy prerequisites.Call out that GIT_USER needs a token with repo scope, and that USE_SSH requires SSH keys configured.
documentation/src/pages/index.module.css (2)
6-17: Responsive tweak: keep vertical rhythm on small screens.Use symmetric padding to avoid crowding; also consider var(--ifm-spacing-vertical) for consistency with theme spacing.
.heroBanner { - padding: 4rem 0; + padding: 4rem 0; text-align: center; position: relative; overflow: hidden; } @media screen and (max-width: 996px) { .heroBanner { - padding: 2rem; + padding: 2rem 0; } }
19-23: Leverage gap for button spacing.Simplifies child spacing without extra margins on items.
.buttons { display: flex; align-items: center; justify-content: center; + gap: 0.75rem; }electron/dockerSetup.cjs (5)
69-73: Stray ports.ollama entry without container; align or remove.Either use this.ports.ollama for availability checks or drop it to avoid confusion.
Apply this diff to actually use it (paired with another comment below):
- n8n: 5678, - ollama: 11434 + n8n: 5678, + ollama: 11434…and reference it in checkOllamaAvailability.
700-715: Return a boolean from checkN8NHealth for consistency.startContainer treats healthCheck as boolean; returning objects logs [object Object].
Apply this diff:
async checkN8NHealth() { try { - const response = await new Promise((resolve, reject) => { + const ok = await new Promise((resolve, reject) => { http.get(`http://localhost:${this.ports.n8n}/healthz`, (res) => { if (res.statusCode === 200) { - resolve({ success: true }); + resolve(true); } else { reject(new Error(`N8N health check failed with status ${res.statusCode}`)); } }).on('error', (error) => reject(error)); }); - return response; + return ok; } catch (error) { - return { success: false, error: error.message }; + return false; } }
552-577: User experience: actionable Docker install message per CPU arch.For macOS, prefer linking x64 vs arm64 based on process.arch.
Example tweak (pseudo):
- If process.platform === 'darwin' and process.arch === 'arm64' use arm64 dmg; else use Intel dmg.
536-550: Dead code: shouldPullImage returns a Promise but isn’t async nor used.Either make it async and use it, or remove it.
79-81: Unused: containerNames.If not read elsewhere, remove to reduce drift.
documentation/blog/tags.yml (1)
1-20: Tag permalinks likely conflict with top-level routes.Docusaurus tag pages usually live under /blog/tags/. Suggest aligning permalinks or omit custom permalinks to use defaults.
Apply this diff style:
-facebook: - label: Facebook - permalink: /facebook +facebook: + label: Facebook + permalink: /blog/tags/facebook @@ -hello: +hello: label: Hello - permalink: /hello + permalink: /blog/tags/hello @@ -docusaurus: +docusaurus: label: Docusaurus - permalink: /docusaurus + permalink: /blog/tags/docusaurus @@ -hola: +hola: label: Hola - permalink: /hola + permalink: /blog/tags/holadocs/PUBLISHING_GUIDE.md (1)
36-51: Add files and publishConfig for safer npm publishes.Prevent publishing unintended files and ensure public access for scoped packages.
Apply to the example:
{ "name": "clara-flow-sdk", "version": "1.0.0", "description": "Lightweight JavaScript SDK for running Clara Agent Studio flows", + "files": ["dist", "README.md", "LICENSE"], + "publishConfig": { "access": "public" }, "author": "Your Name <[email protected]>",public/documentation/build/assets/js/17896441.6a858ead.js (1)
1-1: Exclude built artifacts from linting and (optionally) from VCS.Static-analysis hooks are hitting minified bundles in public/documentation/build (du => 920K). Root .gitignore does not ignore that path and no .eslintignore was found; ESLint is configured (eslint.config.js) and package.json's "lint" runs "eslint .", so the build output is being linted.
- Add public/documentation/build to the linter ignore (create .eslintignore with that path or add it to ESLint's ignore patterns in eslint.config.js).
- If build artifacts shouldn't be committed, add public/documentation/build to .gitignore (or remove the dir from the repo).
docs/QUICK_START_GUIDE.md (5)
31-46: Clarify CLI aliases and keep them consistent (g vs generate; create-node vs g).You use both
clara-studio generateandclara-studio g, and laterbatch-generatevsbg. If these are aliases, note it once and use one form consistently to avoid user confusion.
84-93: Add fenced language to directory tree for markdownlint (MD040).Use a non-highlighting language like
text.-``` +```text generated-nodes/ ├── email-validator/ │ ├── email-validator.definition.ts # Node configuration │ ├── EmailValidatorNode.tsx # React component │ ├── email-validator.executor.ts # Business logic │ ├── email-validator.test.ts # Unit tests │ ├── email-validator.md # Documentation │ └── package.json # Plugin manifest--- `189-222`: **Guard against runtime errors in example executor.** If `inputs.email` is missing or not a string, `split('@')[1]` can throw. Add a simple validation in the sample to avoid copy‑pasted bugs. ```diff - const { email } = inputs; + const { email } = inputs; + if (typeof email !== 'string') { + logger.warn('Email Validator: missing or invalid email input'); + return { isValid: false, isDisposable: false }; + }
330-340: Standardize batch command name.You use
bghere but earlier usedbatch-generate. Add a one‑liner thatbgis an alias, or use a single canonical command.-# Generate from descriptions file -clara-studio bg node-ideas.txt +# Generate from descriptions file (alias: bg) +clara-studio batch-generate node-ideas.txt
386-392: Replace bare contact placeholders with confirmed channels.If “Discord Community” and [email protected] aren’t live yet, annotate as “coming soon” or provide working links to avoid dead-ends.
public/documentation/build/assets/js/a94703ab.55d3118f.js (2)
1-1: Do not commit built artifacts unless required.If GitHub Pages serves from this repo, keeping build outputs is fine; otherwise, exclude
/public/documentation/build/**via .gitignore and build in CI/CD.
1-1: Source maps and license headers.Ensure source maps are published for easier debugging, and that bundled third‑party licenses are tracked to satisfy attribution obligations.
FIXES_SUMMARY.md (2)
31-42: Edge case: distinguish 0 from undefined for gpuLayers.Your snippet handles
undefined/null, but 0 is a valid explicit override (force CPU). Ensure0isn’t treated as “unset”.-if (globalPerfSettings.gpuLayers !== undefined && globalPerfSettings.gpuLayers !== null) { +if (globalPerfSettings.hasOwnProperty('gpuLayers')) {
58-66: Document platform paths and persistence location.Mention Windows/macOS equivalents to
~/.clara/settings/performance-settings.jsonto help users find the file across OSes.docs/PUBLISHING_CHECKLIST.md (4)
81-96: Fix nested fenced blocks in Markdown example.The README snippet shows a fenced block inside a fenced block; switch inner fences to indentation or escape to avoid rendering issues.
-```markdown -## 📦 Installing the SDK - -```bash -npm install clara-flow-sdk -``` -``` +```markdown +## 📦 Installing the SDK + + ```bash + npm install clara-flow-sdk + ``` +```
120-124: Avoid bare URLs (MD034).Wrap the npm URL in angle brackets or as a Markdown link.
-- ✅ Package appears at https://www.npmjs.com/package/clara-flow-sdk +- ✅ Package appears at <https://www.npmjs.com/package/clara-flow-sdk>
141-146: Avoid bare URLs (MD034).Same for this section; use angle brackets.
-- **npm stats**: https://www.npmjs.com/package/clara-flow-sdk +- **npm stats**: <https://www.npmjs.com/package/clara-flow-sdk>
12-20: Recommend 2FA for npm publishing.Add a note to enable npm 2FA (auth-only or auth-and-writes) to protect the package.
RELEASE_SUMMARY.md (2)
159-166: Validate existence of migration command.Ensure
npm run migration-wizardexists in the repo’s scripts and is documented; otherwise provide the actual command or remove.
124-142: Metrics need sourcing or disclaimers.Numbers like downloads, stars, and users should cite a date/source or be clearly marked as illustrative to avoid misleading readers.
docs/REACTFLOW_IMPLEMENTATION.md (2)
86-108: Add fenced language to directory tree (MD040).Use
textfor the file tree block.-``` +```text src/ ├── components/ │ ├── AgentStudio.tsx # Main agent builder UI ...--- `146-159`: **Include drag/drop MIME type and drop position calc details.** Consider adding a note about calculating canvas coordinates from screen coords and the MIME type you standardize on (`application/reactflow`) for interoperability. </blockquote></details> <details> <summary>RELEASE_NOTES_0.1.0.md (1)</summary><blockquote> `165-178`: **Add fenced language to architecture diagram (MD040).** Mark as `text` to satisfy linters and improve readability. ```diff -``` +```text Frontend (React + TypeScript) ├── Components (UI elements) ...</blockquote></details> <details> <summary>docs/AGENT_BUILDER_README.md (2)</summary><blockquote> `48-68`: **Add fenced language to directory tree (MD040).** Use `text` for the tree. ```diff -``` +```text src/ ├── components/ │ ├── AgentStudio.tsx # Main component ...--- `141-178`: **Roadmap checkboxes vs. “Foundation Complete”.** Top section says “Foundation Complete” while Phase 1 checklist is unchecked. Consider clarifying scope (e.g., “foundation scaffolding complete; features in progress”). </blockquote></details> <details> <summary>docs/clipboard-fix.md (3)</summary><blockquote> `18-19`: **Document the limitations of execCommand fallback.** execCommand('copy') is deprecated and requires a focused, editable element; it may fail in cross-origin/unsandboxed contexts. Add a brief caution and indicate it’s disabled on non-secure origins. Apply this diff to add a note: ```diff 3. **Has legacy fallback** - Uses `document.execCommand('copy')` as last resort + - Note: `execCommand('copy')` is deprecated and may fail without focus or on non‑secure origins; use only as a last resort.
54-61: Use stable import paths in examples.The relative path may be incorrect depending on caller location. Prefer an alias (e.g., @/utils/clipboard) or a repo‑root path used across the codebase to avoid confusion.
Apply this diff if you have a TS path alias:
-import { copyToClipboard } from '../utils/clipboard'; +import { copyToClipboard } from '@/utils/clipboard';
37-43: Verify test helpers exist and are dev‑only.testClipboard() and testCodeBlockCopy() should be available in dev builds only and excluded from production bundles.
I can generate a tiny dev‑only module and a Vite alias to gate these helpers behind import.meta.env.DEV.
README.md (4)
16-18: Add rel="noopener noreferrer" to external links opened in new tabs.Prevents reverse‑tabnabbing and improves security.
Apply this diff:
- <a href="https://clara.badboysm890.in/" target="_blank"><strong>🌐 Try Clara Online</strong></a> • - <a href="https://github.com/badboysm890/ClaraVerse/releases" target="_blank"><strong>⬇️ Download Desktop App</strong></a> + <a href="https://clara.badboysm890.in/" target="_blank" rel="noopener noreferrer"><strong>🌐 Try Clara Online</strong></a> • + <a href="https://github.com/badboysm890/ClaraVerse/releases" target="_blank" rel="noopener noreferrer"><strong>⬇️ Download Desktop App</strong></a>
13-13: Verify the version badge source of truth."Clara-1.2.61" should match your release/versioning. Consider automating the badge via CI or pulling from package.json.
204-204: Fix markdownlint MD036 (emphasis as heading).Convert emphasized line to a heading to satisfy linting and improve structure.
Apply this diff:
-**Clara's your rocket. Light it up. 🚀** +## Clara's your rocket. Light it up. 🚀
33-38: Tone/claims check: “100% offline” vs cloud provider setup.The README advertises 100% offline while docs include OpenAI/Anthropic setup. Add a brief qualifier (offline by default; cloud optional) to avoid confusion.
public/documentation/build/assets/js/237.4c6cf70c.js (1)
1-1: Do not commit built documentation artifacts.Generated bundles bloat the repo and create merge noise. Build them in CI and deploy (e.g., GitHub Pages) from an artifact or a dedicated gh-pages branch; add public/documentation/build to .gitignore.
CHANGELOG.md (2)
8-8: Follow Keep a Changelog semantics for “Unreleased”.Use a standalone “## [Unreleased]” section; create “## [0.1.2] - YYYY-MM-DD” on release. Avoid mixing both in one header.
Apply this diff:
-## [Unreleased] - 0.1.2 +## [Unreleased] + +## [0.1.2] - 2025-09-14
141-143: Verify Docker image name and port mapping.Ensure clara-ollama:latest exists in your registry or provide build instructions. Confirm 8069 is the intended port.
docs/MODEL_PRELOADING.md (3)
69-77: Throttle by model/provider and session.Add a short TTL cache (e.g., 2–5 min) keyed by provider+model to avoid repeated preloads across quick focus changes or multi‑tab usage.
14-17: Clarify local‑only detection edge cases.If a local server is behind a custom domain or reverse proxy, URL checks may misclassify. Document that a manual override/allowlist exists.
78-86: Guard against concurrent send.Explicitly state preloading is skipped if isLoading=true or a send is in flight to avoid double work.
public/documentation/build/assets/js/22dd74f7.b7744690.js (1)
1-1: Generated docs runtime data should not be versioned.Keep this out of git; produce at build time to reduce churn.
docs/smooth-scroll-fix.md (2)
68-83: Avoid magic numbers; centralize timings.Expose constants (e.g., DEFAULT_STREAM_DEBOUNCE_MS, STREAM_END_DELAY_MS) from the hook to keep components consistent and configurable.
95-101: Only scroll if content is out of view.Add an IntersectionObserver/in-view check to skip scrolls when the target is already visible, reducing work during streaming.
RELEASE_NOTES_0.1.1.md (1)
125-141: Add fenced code language for the ASCII-architecture block to satisfy markdownlint (MD040).Use a neutral language like "text".
-``` +```text New Architecture (v0.1.1): ├── Electron Main Process ...</blockquote></details> <details> <summary>PERFORMANCE_IMPROVEMENTS.md (1)</summary><blockquote> `78-86`: **Use deep comparison for structured settings in sample.** The example uses strict inequality; arrays/objects (e.g., nested config) will be missed. ```diff -const requiresRestart = (newSettings, oldSettings) => { - return RESTART_REQUIRED_SETTINGS.some(setting => - newSettings[setting] !== oldSettings[setting] - ); -}; +const requiresRestart = (next, prev) => + RESTART_REQUIRED_SETTINGS.some(k => !deepEqual(next[k], prev[k]));If you prefer avoiding extra deps, document that only scalar keys belong in RESTART_REQUIRED_SETTINGS.
docs/PRODUCTION_READY_AGENT_STUDIO.md (1)
355-358: Avoid non-existent registry URLs in examples.Replace or clearly flag external registry placeholders (e.g., registry.clara.ai) to prevent user confusion.
REAL_EXECUTION_GUIDE.md (2)
176-195: Use headings instead of bold sentences (MD036).Convert emphasized phrases to subheadings.
-**"Flow execution failed"** +#### Flow execution failed ... -**"Unknown node type"** +#### Unknown node type ... -**"Network timeout"** +#### Network timeout
120-129: Redact sensitive data in logs.Execution logs may include prompts, API payloads, or keys. Add a note that secrets are redacted and ensure the implementation mirrors that.
electron/mcpService.cjs (5)
296-312: Consider configurable timeouts for stdio tool calls.Hard-coded timeouts appear later (30s/10s). Centralize via a constant or config.
354-361: Avoid logging full stdout at info level.Downgrade to debug or redact to prevent PII leakage and noisy logs.
492-504: testServer(remote): add timeout and catch network errors.Same AbortController pattern as startServer; return a clear timeout error.
684-691: Duplicate template name ‘sqlite’.Two entries named sqlite will collide. Remove one or rename.
- { - name: 'sqlite', + { + name: 'sqlite-alt', displayName: 'SQLite Database',
191-252: Optionally surface versions in diagnoseNodeInstallation().Return node/npm/npx versions for better diagnostics.
RELEASE_NOTES_0.1.2.md (3)
169-179: Sync dependency versions with package.json.Electron is listed here as ^35.0.1, but package.json uses ^36.4.0. Please align all versions in this block with the actual package.json to avoid drift.
349-356: Remove or substantiate awards/press claims.These assertions read as marketing placeholders. Either add citations/links or remove to keep release notes factual.
399-400: Qualify “No cloud dependencies” claim.The codebase includes optional cloud/remote integrations (e.g., @supabase/supabase-js, remote MCP, provider switching). Consider softening to “no mandatory cloud dependencies; all cloud features are opt‑in.”
-**Your privacy and local control remain at the heart... No cloud dependencies, no data collection...** +**Your privacy and local control remain at the heart... No mandatory cloud dependencies; optional online features are opt‑in and disabled by default. No telemetry.**package.json (1)
68-74: Testing/types packages should be devDependencies only.Duplicates exist in both dependencies and devDependencies, increasing bundle size and risking version conflicts. Keep them only in devDependencies.
- "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^14.5.2", - "@types/jest": "^27.5.2", - "@types/node": "^20.0.0", - "@types/react": "^18.2.42", - "@types/react-dom": "^18.2.17", + // moved to devDependenciesAlso applies to: 76-82
docker-compose.yml (3)
10-13: Mounted volume path is unused.The container serves from /usr/share/nginx/html; mounting to /app has no effect. Remove the volume or map it to the served path only if needed.
- volumes: - - clara-verse:/app + # No runtime data to persist for a static Nginx container
12-17: Traefik/networking and envs need validation.
- You join an external traefik_default but provide no Traefik labels; routing may not work.
- The N8N env vars won’t be consumed by a static Nginx image.
Add Traefik labels and remove unused envs or switch to a runtime that reads them.
19-20: External network prerequisite.Document creating the external traefik_default network or the compose up will fail.
docker network create traefik_defaultpublic/documentation/build/404.html (1)
6-8: Replace placeholder domains/links.Update og: tags and GitHub links from clara-docs.example.com and your-org/clara to the project’s real URLs.
-<meta ... content="https://clara-docs.example.com/img/clara-social-card.jpg"> +<meta ... content="https://clara.badboysm890.in/img/clara-social-card.jpg"> -<a href="https://github.com/your-org/clara" ... +<a href="https://github.com/badboysm890/ClaraVerse" ...Also applies to: 14-14
documentation/blog/2019-05-28-first-blog-post.md (1)
2-6: Starter authors/tags.If this will ship publicly, replace Docusaurus starter authors/tags with Clara authors or mark as “Example”.
documentation/blog/2019-05-29-long-blog-post.md (1)
2-6: Starter content.Same note as above—swap placeholder authors/tags or keep these posts under an “Examples”/“Playground” section so the site doesn’t look like a template.
documentation/src/components/HomepageFeatures/styles.module.css (2)
1-6: Avoid unexpected flex interactions with Docusaurus gridThe section already wraps a .container/.row grid; making the section a flex container can introduce layout quirks. Consider constraining the flex context.
.features { - display: flex; - align-items: center; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; padding: 2rem 0; width: 100%; }
8-11: Make feature SVG sizing responsiveFixed 200×200 can overflow on small screens. Prefer a max width with auto height.
.featureSvg { - height: 200px; - width: 200px; + width: 100%; + max-width: 200px; + height: auto; }electron/platformManager.cjs (1)
243-246: CPU feature detection likely ineffectiveos.cpus() objects don’t expose flags; this will never detect AVX. Consider parsing /proc/cpuinfo on Linux or a small native/JS helper for CPUID.
electron/splash.cjs (1)
18-20: Full-screen + alwaysOnTop UXConsider gating alwaysOnTop/fullscreen behind an env/config for multi‑monitor and kiosk‑sensitive setups.
public/documentation/build/getting-started/quick-start/index.html (1)
6-6: Placeholder domains/linksReplace clara-docs.example.com and github.com/your-org/clara with your real domain/repo to avoid user confusion.
Also applies to: 27-27, 149-151, 155-157, 160-160
public/documentation/build/assets/js/a7bd4aaa.5897cde4.js (1)
1-1: Avoid committing compiled bundlesBundle churn obscures reviews and bloats the repo. Prefer building in CI and deploying artifacts, not versioning them.
electron/loading.html (2)
635-651: Store and clear the shooting-star interval on teardown.- setInterval(() => { + window.__shootingInterval = setInterval(() => { if (Math.random() < 0.3) { // 30% chance every interval ... } }, 2000);And in
fadeOut()(or after fade completes), clear it:- return gsap.to("#loadingContainer", { + return gsap.to("#loadingContainer", { opacity: 0, scale: 0.9, duration: 1, ease: "power2.inOut" - }); + }).then(() => { + if (window.__shootingInterval) clearInterval(window.__shootingInterval); + if (window.__progressTimeout) clearTimeout(window.__progressTimeout); + gsap.globalTimeline?.clear(); + });Also assign the timeout from
updateProgress()towindow.__progressTimeout.
567-570: Avoid inline event handlers and innerHTML on error.Move the fallback into JS to keep CSP strict and reduce XSS surface.
- <img src="../assets/icons/256x256.png" alt="Clara" onerror="this.style.display='none'; this.parentElement.innerHTML='<div style=\'font-size: 48px; font-weight: 700; color: white;\'>C</div>'"> + <img id="logoImg" src="../assets/icons/256x256.png" alt="Clara">And in script:
document.getElementById('logoImg')?.addEventListener('error', (e) => { const parent = (e.target as HTMLImageElement).parentElement!; (e.target as HTMLImageElement).style.display = 'none'; const fallback = document.createElement('div'); fallback.textContent = 'C'; fallback.style.cssText = 'font-size:48px;font-weight:700;color:#fff;'; parent.appendChild(fallback); });documentation/src/components/HomepageFeatures/index.tsx (2)
49-55: SVG accessibility: provide a title/label or hide from AT.Add
aria-label={title}oraria-hiddenif purely decorative.- <Svg className={styles.featureSvg} role="img" /> + <Svg className={styles.featureSvg} role="img" aria-label={title} />
64-66: Prefer stable keys over array index.Use
titleas the key to avoid reconciliation issues.- <Feature key={idx} {...props} /> + <Feature key={props.title} {...props} />public/documentation/build/getting-started/introduction/index.html (3)
6-6: Placeholder domain in canonical/OG tags.
clara-docs.example.comshould be updated or omitted to avoid misleading links.
10-10: GitHub link points to a placeholder.Update
https://github.com/your-org/clarato the actual repo.- <a href="https://github.com/your-org/clara" + <a href="https://github.com/badboysm890/ClaraVerse"
1-134: Consider not committing built docs to git.Ship docs via release artifacts or generate at build time to keep the repo lean; if offline docs are required, place them under a dedicated assets package with clear update steps.
documentation/docusaurus.config.ts (5)
7-11: Replace template branding with project values.Update title/tagline/favicon to Clara branding.
- title: 'My Site', - tagline: 'Dinosaurs are cool', - favicon: 'img/favicon.ico', + title: 'Clara Documentation', + tagline: 'Beautiful AI that works', + favicon: 'img/logo.svg',
17-27: Set real site URL/base and repo metadata.These placeholders affect links and edit URLs.
- url: 'https://your-docusaurus-site.example.com', + url: 'https://docs.clara.example.com', ... - organizationName: 'facebook', - projectName: 'docusaurus', + organizationName: 'badboysm890', + projectName: 'ClaraVerse',If serving under a subpath in-app (e.g.,
/documentation/), set:- baseUrl: '/', + baseUrl: '/documentation/',Then rebuild. Please confirm the intended mount path.
43-49: Fix edit URLs to this repo.- editUrl: - 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', + editUrl: 'https://github.com/badboysm890/ClaraVerse/edit/main/documentation/',Apply the same change in the
blog.editUrlif the blog remains enabled.
72-95: Navbar labels/links still reference Docusaurus template.Rename “Tutorial” to “Documentation”, and point GitHub to this project.
- title: 'My Site', + title: 'Clara', ... - label: 'Tutorial', + label: 'Documentation', ... - {to: '/blog', label: 'Blog', position: 'left'}, + // {to: '/blog', label: 'Blog', position: 'left'}, // enable if used ... - href: 'https://github.com/facebook/docusaurus', + href: 'https://github.com/badboysm890/ClaraVerse',
96-145: Footer links and social image should match Clara.- image: 'img/docusaurus-social-card.jpg', + image: 'img/clara-social-card.jpg', ... - to: '/docs/intro', + to: '/getting-started/introduction',Also update Community links if you have Discord/Forum; otherwise consider removing the section.
electron/splash.html (4)
419-448: Throttle particle count on low-power devices.Fifty perpetual GSAP tweens can be heavy on integrated GPUs. Gate count by
prefers-reduced-motionand/or reduce for DPR < 1.5.- const particleCount = 50; + const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; + const particleCount = reduce ? 0 : (window.devicePixelRatio > 1.25 ? 40 : 25);
611-619: Support fractional progress percentages.Regex only matches integers. Allow decimals.
- const match = message.match(/(\d+)%/); + const match = message.match(/(\d+(?:\.\d+)?)%/);
409-412: Drop unused GSAP TextPlugin include.
textplugin.min.jsisn’t used here; remove to shave startup time.- <script src="./vendor/textplugin.min.js"></script>
385-385: Verify packaged asset path for splash logoassets/icons/png/256x256.png exists, but electron/splash.html uses a relative src (line ~384: <img src="../../assets/icons/png/256x256.png" ...>), which can break when packaged into an ASAR — set the img src at runtime using a resolved URL (e.g., new URL(..., import.meta.url) in bundled JS) or pass a resolved file:// path from main via preload.
public/documentation/build/getting-started/installation/index.html (4)
6-6: Fix canonical/OG URLs; avoid example domains.Hard-coded
clara-docs.example.comwill hurt SEO and may mislead users.Set these via env at build time (Docusaurus
url/baseUrl) and regenerate.
7-8: Absolute asset paths may break under file:// or non-root serving.References like
/assets/js/...assume server root. If embedded in Electron or served under a subpath, these won’t resolve.Confirm your docs are served from site root. Otherwise, set
baseUrland use relative paths; or serve/public/documentation/buildat/.
14-14: Replace placeholder GitHub links.Links to
https://github.com/your-org/clarashould point to the actual repository.
55-60: Gate package manager commands behind availability.
choco install clara,brew install --cask clara, andsnap install claralikely aren’t published yet.Mark as “Coming soon” or provide tap/channel details; otherwise users will fail installations.
electron/loadingScreen.cjs (1)
65-71: IPC channel naming consistency.This class sends
hide-loading/main-window-ready. Confirm the renderer listens to these (naming differs from splash.html’shide/show).public/documentation/build/assets/js/9ff4038f.324fa7bc.js (1)
1-1: Exclude built docs bundles from linting and reviews.This is a compiled Docusaurus chunk. The “hooks at top level” lint (Biome) is a false positive here; treat build output as artifacts.
Add a lint ignore for
public/documentation/build/**and commit only sources (/documentation/**). Regenerate bundles in CI.public/documentation/build/assets/js/c377a04b.13d25506.js (1)
1-1: Same as above: ignore compiled artifacts; verify lints target sources only.Built MDX runtime uses React hooks via wrappers; linters may misfire.
Exclude
public/documentation/build/**from Biome/ESLint and validate the source MDX instead.electron/updateService.cjs (2)
49-62: Broaden version validation to proper semver (pre-release/build metadata).The current regex rejects common tags like
v1.2.3-beta.1+build.5. This can mark valid GitHub tags as invalid.Use a semver-capable regex, or better, a small semver parser. Minimal regex fix:
- const versionRegex = /^\d+(\.\d+){0,3}(-[a-zA-Z0-9-]+)?$/; + const versionRegex = /^\d+(\.\d+){0,3}(-[0-9A-Za-z-\.]+)?(\+[0-9A-Za-z-\.]+)?$/;Optionally, depend on a lightweight semver lib for correctness.
563-580:update-not-availablehandler assumes a non-existent parameter.electron-updater’s
update-not-availableevent does not passisManualCheck. The conditional gating the “No Updates Available” dialog will always be false.Either track manual invocations yourself (e.g., pass a flag when calling
checkForUpdates) or always suppress the dialog.- autoUpdater.on('update-not-available', (info, isManualCheck) => { + let lastUpdateCheckWasManual = false; + autoUpdater.on('update-not-available', (info) => { @@ - if (isManualCheck) { + if (lastUpdateCheckWasManual) {Set
lastUpdateCheckWasManualin your manualcheckForUpdatespath.electron/watchdogService.cjs (2)
329-366: Notifications may spam or be suppressed forever; tighten behavior.Current logic shows on 1st and every 3rd failure up to
maxNotificationAttempts, but success notifications are always shown. Consider capping success notifications too and resetting per service on restore.Add a per-service
notificationShownCountand reset it inhandleServiceHealthy. Also guardnew Notification(...)behindapp.isReady().
199-257: Await the restart attempt call to avoid overlapping restarts.
this.attemptServiceRestart(...)isn’tawaited, so multiple loops could queue concurrent restarts if checks run quickly.- this.attemptServiceRestart(serviceKey, service); + await this.attemptServiceRestart(serviceKey, service);If you intentionally wanted fire-and-forget, add a per-service promise to serialize attempts.
electron/llamaSwapService.cjs (3)
1025-1040: Duplicate progress parsing on stdout.
parseProgressFromOutput(output)is invoked twice in the same handler, emitting duplicate progress events.- // Parse progress information for UI feedback - this.parseProgressFromOutput(output); @@ - this.parseProgressFromOutput(output); + // Parse progress information for UI feedback + this.parseProgressFromOutput(output);Remove one of the calls.
1948-1964:flashAttention: this.forceFlashAttention || trueis alwaystrue.The
|| truemakes the flag always enabled, ignoringforceFlashAttention=false.- flashAttention: this.forceFlashAttention || true, + flashAttention: this.forceFlashAttention ? true : true, // always true by designIf you intend to allow disabling, use:
+ flashAttention: this.forceFlashAttention ?? true,
1408-1461: GPU detection fallbacks can overestimate capabilities.Heuristics (Apple Silicon and integrated GPUs) may produce optimistic memory, influencing
--n-gpu-layers. Consider clamping with a conservative upper bound and surfacing a UI override.Add a cap like
Math.min(gpuMemoryMB, 12288)and persist a user override to fully disable GPU offload.electron/main.cjs (1)
183-206: CPU percent calc may divide by zero.
systemCpuDeltacan be 0; guard to avoidNaN.- const cpuPercent = (cpuDelta / systemCpuDelta) * cpuCount * 100; + const cpuPercent = systemCpuDelta > 0 ? (cpuDelta / systemCpuDelta) * cpuCount * 100 : 0;electron/llamacpp-binaries/darwin-arm64/ggml-metal.metal (3)
3701-3714: Final rescale reads from sf: barrier placement is critical
- The barrier before introducing
sfensures the first-SG writes tossare visible to all SGs. Good.- Minor:
sfaliases the sgitg==0 scratch. Add a short comment to document that coupling; it’s easy to miss during future refactors.
3860-3866: flash_attn_ext_vec shared-memory remap: check overlap math
- New ss/ss4/sm/sr4 bases depend on SH=4*C and DK being in half units. Since all derive from
shmem_f16, please confirm no aliasing withsq4for DK not divisible by 4, and that sr4 has enough space for DV4 per query.- Consider documenting SH layout (C logits | C logits | mask | results) to reduce future footguns.
3706-3713: Final write path uses so4 with scalar S: OK; add explicit type castNit:
Sis float;so4[...]is float4. The multiply relies on vector-scalar broadcast. It’s clearer (and avoids accidental type shifts) to cast explicitly.Apply this minimal diff:
- dst4[i] = (float4) so4[j*DV4 + i]*S; + dst4[i] = ((float4)so4[j*DV4 + i]) * (float)S;
| ### 4. Fire-and-Forget | ||
| The warmup request is sent asynchronously and errors are silently handled. The goal is just to trigger model loading, not to get a meaningful response. | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Ensure warmup requests don’t pollute chat history or analytics.
Send preloads with a “noHistory/noTelemetry” flag or separate session so 'Hi' isn’t stored, summarized, or shown to the user.
🤖 Prompt for AI Agents
In docs/MODEL_PRELOADING.md around lines 35 to 37, the guidance needs to
explicitly prevent warmup requests from being recorded or analyzed; update
implementation instructions to send warmup/preload requests with a noHistory and
noTelemetry flag (or use a dedicated ephemeral session) and ensure
middleware/controllers respect these flags by bypassing chat-history
persistence, analytics events, summaries, and UI rendering; also ensure any
logging excludes user-visible content or is scrubbed and that the warmup flow
cannot surface messages to users or be included in transcripts.
| ### ✅ **Smart Timing** | ||
| - **Streaming start**: Immediate scroll (0ms) | ||
| - **During streaming**: Adaptive scroll (100-400ms based on frequency) | ||
| - **Streaming end**: Immediate scroll (50ms delay for rendering) | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Respect prefers-reduced-motion now, not later.
Gate smooth scrolling behind a user/system setting immediately to meet a11y expectations.
Apply this diff to the guidance:
-**Streaming end**: Immediate scroll (50ms delay for rendering)
+**Streaming end**: Immediate scroll (50ms delay for rendering), unless `prefers-reduced-motion` is enabled, in which case use instant jump or skip.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ### ✅ **Smart Timing** | |
| - **Streaming start**: Immediate scroll (0ms) | |
| - **During streaming**: Adaptive scroll (100-400ms based on frequency) | |
| - **Streaming end**: Immediate scroll (50ms delay for rendering) | |
| ### ✅ **Smart Timing** | |
| - **Streaming start**: Immediate scroll (0ms) | |
| - **During streaming**: Adaptive scroll (100-400ms based on frequency) | |
| - **Streaming end**: Immediate scroll (50ms delay for rendering), unless `prefers-reduced-motion` is enabled, in which case use instant jump or skip. |
🤖 Prompt for AI Agents
In docs/smooth-scroll-fix.md around lines 52 to 56, the guidance schedules
smooth scrolling timings but fails to immediately respect the user/system
prefers-reduced-motion setting; update the guidance to state that all automatic
smooth scrolling behaviors must be disabled if prefers-reduced-motion is enabled
(or user has reduced motion preference) rather than applied later. Modify the
section to explicitly gate "Streaming start", "During streaming", and "Streaming
end" behaviors behind a check for prefers-reduced-motion and recommend using
instant (no smooth) scrolling when the preference is set, and include a note to
use CSS media query prefers-reduced-motion and equivalent JS check (matchMedia)
to implement the gate.
| <Link | ||
| className="button button--secondary button--lg" | ||
| to="/docs/intro"> | ||
| Docusaurus Tutorial - 5min ⏱️ | ||
| </Link> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Broken CTA link to /docs/intro
Your docs are routed under /getting-started/* (routeBasePath likely '/'). Update the CTA path.
- to="/docs/intro">
- Docusaurus Tutorial - 5min ⏱️
+ to="/getting-started/introduction">
+ Get Started — 5 min ⏱️📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <Link | |
| className="button button--secondary button--lg" | |
| to="/docs/intro"> | |
| Docusaurus Tutorial - 5min ⏱️ | |
| </Link> | |
| <Link | |
| className="button button--secondary button--lg" | |
| to="/getting-started/introduction"> | |
| Get Started — 5 min ⏱️ | |
| </Link> |
🤖 Prompt for AI Agents
In documentation/src/pages/index.tsx around lines 21 to 25 the CTA Link points
to "/docs/intro" which is incorrect because the docs are routed under
"/getting-started/*"; update the Link's to prop to the correct path (e.g.
"/getting-started/intro" or the appropriate route under "/getting-started") so
the button navigates to the actual docs location and verify the path includes
the proper trailing slash if your router expects it.
| async checkOllamaAvailability() { | ||
| try { | ||
| // First check if Ollama is running on the system | ||
| const response = await new Promise((resolve, reject) => { | ||
| const req = http.get('http://localhost:11434/api/tags', (res) => { | ||
| if (res.statusCode === 200) { | ||
| resolve(true); | ||
| } else { | ||
| reject(new Error(`HTTP status ${res.statusCode}`)); | ||
| } | ||
| }); | ||
|
|
||
| req.on('error', () => resolve(false)); | ||
|
|
||
| // Add timeout to avoid hanging | ||
| req.setTimeout(2000, () => { | ||
| req.destroy(); | ||
| resolve(false); | ||
| }); | ||
| }); | ||
|
|
||
| if (response) { | ||
| console.log('Found Ollama running on system'); | ||
| return true; | ||
| } | ||
|
|
||
| // If not running on system, check container | ||
| try { | ||
| const container = await this.docker.getContainer('clara_ollama'); | ||
| const info = await container.inspect(); | ||
| return info.State.Running; | ||
| } catch (error) { | ||
| return false; | ||
| } | ||
| } catch (error) { | ||
| return false; | ||
| } | ||
| } | ||
|
|
||
| async isInterpreterRunning() { | ||
| try { | ||
| const response = await new Promise((resolve, reject) => { | ||
| const req = http.get(`http://localhost:${this.ports.interpreter}/health`, (res) => { | ||
| if (res.statusCode === 200) { | ||
| let data = ''; | ||
| res.on('data', chunk => { data += chunk; }); | ||
| res.on('end', () => { | ||
| try { | ||
| const jsonResponse = JSON.parse(data); | ||
| const isHealthy = jsonResponse.status === 'healthy'; | ||
| resolve(isHealthy); | ||
| } catch (e) { | ||
| resolve(false); | ||
| } | ||
| }); | ||
| } else { | ||
| resolve(false); | ||
| } | ||
| }); | ||
|
|
||
| req.on('error', () => resolve(false)); | ||
|
|
||
| req.setTimeout(5000, () => { | ||
| // Add timeout to avoid hanging | ||
| req.setTimeout(3000, () => { | ||
| req.destroy(); | ||
| resolve(false); | ||
| }); | ||
| }); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Use configured Ollama port; add scheme/host flexibility.
Hard-coded localhost:11434; prefer this.ports.ollama and allow override via env.
Apply this diff:
async checkOllamaAvailability() {
try {
const response = await new Promise((resolve, reject) => {
- const req = http.get('http://localhost:11434/api/tags', (res) => {
+ const base = process.env.OLLAMA_BASE_URL || `http://localhost:${this.ports.ollama}`;
+ const req = http.get(`${base.replace(/\/+$/, '')}/api/tags`, (res) => {
if (res.statusCode === 200) {
resolve(true);
} else {
resolve(false);
}
});
req.on('error', () => resolve(false));
// Add timeout to avoid hanging
req.setTimeout(3000, () => {
req.destroy();
resolve(false);
});
});📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| async checkOllamaAvailability() { | |
| try { | |
| // First check if Ollama is running on the system | |
| const response = await new Promise((resolve, reject) => { | |
| const req = http.get('http://localhost:11434/api/tags', (res) => { | |
| if (res.statusCode === 200) { | |
| resolve(true); | |
| } else { | |
| reject(new Error(`HTTP status ${res.statusCode}`)); | |
| } | |
| }); | |
| req.on('error', () => resolve(false)); | |
| // Add timeout to avoid hanging | |
| req.setTimeout(2000, () => { | |
| req.destroy(); | |
| resolve(false); | |
| }); | |
| }); | |
| if (response) { | |
| console.log('Found Ollama running on system'); | |
| return true; | |
| } | |
| // If not running on system, check container | |
| try { | |
| const container = await this.docker.getContainer('clara_ollama'); | |
| const info = await container.inspect(); | |
| return info.State.Running; | |
| } catch (error) { | |
| return false; | |
| } | |
| } catch (error) { | |
| return false; | |
| } | |
| } | |
| async isInterpreterRunning() { | |
| try { | |
| const response = await new Promise((resolve, reject) => { | |
| const req = http.get(`http://localhost:${this.ports.interpreter}/health`, (res) => { | |
| if (res.statusCode === 200) { | |
| let data = ''; | |
| res.on('data', chunk => { data += chunk; }); | |
| res.on('end', () => { | |
| try { | |
| const jsonResponse = JSON.parse(data); | |
| const isHealthy = jsonResponse.status === 'healthy'; | |
| resolve(isHealthy); | |
| } catch (e) { | |
| resolve(false); | |
| } | |
| }); | |
| } else { | |
| resolve(false); | |
| } | |
| }); | |
| req.on('error', () => resolve(false)); | |
| req.setTimeout(5000, () => { | |
| // Add timeout to avoid hanging | |
| req.setTimeout(3000, () => { | |
| req.destroy(); | |
| resolve(false); | |
| }); | |
| }); | |
| async checkOllamaAvailability() { | |
| try { | |
| const response = await new Promise((resolve, reject) => { | |
| const base = process.env.OLLAMA_BASE_URL || `http://localhost:${this.ports.ollama}`; | |
| const req = http.get(`${base.replace(/\/+$/, '')}/api/tags`, (res) => { | |
| if (res.statusCode === 200) { | |
| resolve(true); | |
| } else { | |
| resolve(false); | |
| } | |
| }); | |
| req.on('error', () => resolve(false)); | |
| // Add timeout to avoid hanging | |
| req.setTimeout(3000, () => { | |
| req.destroy(); | |
| resolve(false); | |
| }); | |
| }); |
| "/Users/temme/Documents/ClaraVerse/electron/llamacpp-binaries/darwin-arm64/llama-server" | ||
| -m "/Users/temme/.clara/llama-models/DeepSeek-R1-0528-Qwen3-8B-IQ4_NL.gguf" | ||
| --port 9999 --jinja --n-gpu-layers 40 --threads 5 --ctx-size 8192 --batch-size 512 --ubatch-size 128 --keep 1024 --defrag-thold 0.1 --mlock --parallel 1 --flash-attn --cont-batching | ||
| env: | ||
| - "DYLD_LIBRARY_PATH=/Users/temme/Documents/ClaraVerse/electron/llamacpp-binaries/darwin-arm64:" | ||
| ttl: 300 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Avoid committing user-specific absolute paths; use placeholders or env vars.
Hard-coded /Users/temme/... makes the example non-portable and leaks local paths.
Suggested pattern:
- Replace “/Users/temme/Documents/ClaraVerse/electron/llamacpp-binaries/darwin-arm64/llama-server” with “${LLAMA_BIN_DIR}/llama-server”.
- Replace model paths with “${CLARA_MODELS_DIR}/...”.
- Replace DYLD_LIBRARY_PATH with “DYLD_LIBRARY_PATH=${LLAMA_BIN_DIR}:”.
If you prefer a concrete example, I can push an edited file using ${...} placeholders throughout.
Also applies to: 21-26
🤖 Prompt for AI Agents
In electron/llamacpp-binaries/config-example.yaml around lines 11-16 (and
similarly 21-26), replace user-specific absolute paths with placeholders/env
vars: change the llama-server binary path to use ${LLAMA_BIN_DIR}/llama-server,
change model paths to ${CLARA_MODELS_DIR}/<model-file> (or a generic
${MODEL_FILE} placeholder), and set DYLD_LIBRARY_PATH to
DYLD_LIBRARY_PATH=${LLAMA_BIN_DIR}: so the example is portable; keep existing
flags and ttl intact and update any other absolute paths in the file to use the
same placeholder pattern.
| @@ -0,0 +1 @@ | |||
| "use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[324],{3014:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"getting-started/quick-start","title":"Quick Start Guide","description":"Get up and running with Clara in minutes","source":"@site/docs/getting-started/quick-start.md","sourceDirName":"getting-started","slug":"/getting-started/quick-start","permalink":"/getting-started/quick-start","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Quick Start Guide","description":"Get up and running with Clara in minutes","sidebar_position":3},"sidebar":"docsSidebar","previous":{"title":"Installation","permalink":"/getting-started/installation"}}');var r=i(4848),l=i(8453);const t={title:"Quick Start Guide",description:"Get up and running with Clara in minutes",sidebar_position:3},a="\ud83d\ude80 Quick Start Guide",o={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Option 1: Download Release (Recommended)",id:"option-1-download-release-recommended",level:3},{value:"Option 2: Build from Source",id:"option-2-build-from-source",level:3},{value:"First Launch Setup",id:"first-launch-setup",level:2},{value:"1. Welcome Screen",id:"1-welcome-screen",level:3},{value:"2. AI Provider Configuration",id:"2-ai-provider-configuration",level:3},{value:"OpenAI Setup",id:"openai-setup",level:4},{value:"Anthropic Setup",id:"anthropic-setup",level:4},{value:"Ollama Setup (Local)",id:"ollama-setup-local",level:4},{value:"3. Verify Installation",id:"3-verify-installation",level:3},{value:"Essential First Steps",id:"essential-first-steps",level:2},{value:"\ud83e\udd16 Try the AI Assistant",id:"-try-the-ai-assistant",level:3},{value:"\ud83c\udfa8 Generate Your First Image",id:"-generate-your-first-image",level:3},{value:"\u26a1 Build Your First Agent",id:"-build-your-first-agent",level:3},{value:"Quick Tips for Success",id:"quick-tips-for-success",level:2},{value:"Next Steps",id:"next-steps",level:2},{value:"\ud83d\udd27 <strong>Configuration</strong>",id:"-configuration",level:3},{value:"\ud83d\udcd6 <strong>Learn More</strong>",id:"-learn-more",level:3},{value:"\ud83d\udcda <strong>Installation Details</strong>",id:"-installation-details",level:3},{value:"Getting Help",id:"getting-help",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"-quick-start-guide",children:"\ud83d\ude80 Quick Start Guide"})}),"\n",(0,r.jsx)(n.p,{children:"Get Clara up and running in just a few minutes! This guide will walk you through the essentials to start using Clara's powerful AI-powered workspace."}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"Before you begin, make sure you have:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Node.js"})," (version 18 or higher)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"A modern web browser"})," (Chrome, Firefox, Safari, Edge)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"An AI provider API key"})," (OpenAI, Anthropic, or local Ollama)"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.h3,{id:"option-1-download-release-recommended",children:"Option 1: Download Release (Recommended)"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Visit the ",(0,r.jsx)(n.a,{href:"https://github.com/your-org/clara/releases",children:"Clara Releases"})," page"]}),"\n",(0,r.jsxs)(n.li,{children:["Download the latest version for your platform:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Windows"}),": ",(0,r.jsx)(n.code,{children:"Clara-Setup-x.x.x.exe"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"macOS"}),": ",(0,r.jsx)(n.code,{children:"Clara-x.x.x.dmg"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Linux"}),": ",(0,r.jsx)(n.code,{children:"Clara-x.x.x.AppImage"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:"Install and launch Clara"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"option-2-build-from-source",children:"Option 2: Build from Source"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Clone the repository\ngit clone https://github.com/your-org/clara.git\ncd clara\n\n# Install dependencies\nnpm install\n\n# Start development server\nnpm run dev\n"})}),"\n",(0,r.jsx)(n.h2,{id:"first-launch-setup",children:"First Launch Setup"}),"\n",(0,r.jsx)(n.p,{children:"When you first open Clara, you'll be guided through a quick onboarding process:"}),"\n",(0,r.jsx)(n.h3,{id:"1-welcome-screen",children:"1. Welcome Screen"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Enter your name for personalization"}),"\n",(0,r.jsx)(n.li,{children:"Choose your preferred theme (Light/Dark)"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"2-ai-provider-configuration",children:"2. AI Provider Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Choose and configure your AI provider:"}),"\n",(0,r.jsx)(n.h4,{id:"openai-setup",children:"OpenAI Setup"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Required: Your OpenAI API key\nAPI_KEY=sk-your-openai-api-key-here\n"})}),"\n",(0,r.jsx)(n.h4,{id:"anthropic-setup",children:"Anthropic Setup"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Required: Your Anthropic API key \nAPI_KEY=sk-ant-your-anthropic-api-key-here\n"})}),"\n",(0,r.jsx)(n.h4,{id:"ollama-setup-local",children:"Ollama Setup (Local)"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Install Ollama first\ncurl -fsSL https://ollama.ai/install.sh | sh\n\n# Pull a model\nollama pull llama2\n\n# Clara will auto-detect local Ollama\n"})}),"\n",(0,r.jsx)(n.h3,{id:"3-verify-installation",children:"3. Verify Installation"}),"\n",(0,r.jsx)(n.p,{children:"After setup, test your installation:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Open Clara Assistant"})," - Click the chat icon in the sidebar"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Send a test message"}),' - Try: "Hello Clara, tell me about your features"']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Check response"})," - You should get a helpful response about Clara's capabilities"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"essential-first-steps",children:"Essential First Steps"}),"\n",(0,r.jsx)(n.h3,{id:"-try-the-ai-assistant",children:"\ud83e\udd16 Try the AI Assistant"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Access the Assistant"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Click the ",(0,r.jsx)(n.strong,{children:"Bot"})," icon in the sidebar"]}),"\n",(0,r.jsxs)(n.li,{children:["Or use the keyboard shortcut ",(0,r.jsx)(n.code,{children:"Ctrl+Shift+A"})," (Windows/Linux) or ",(0,r.jsx)(n.code,{children:"Cmd+Shift+A"})," (macOS)"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Start a Conversation"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Hello Clara! What can you help me with today?\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Explore Capabilities"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Ask questions about any topic"}),"\n",(0,r.jsx)(n.li,{children:"Request code assistance"}),"\n",(0,r.jsx)(n.li,{children:"Get help with writing and analysis"}),"\n",(0,r.jsx)(n.li,{children:"Use tools and integrations"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"-generate-your-first-image",children:"\ud83c\udfa8 Generate Your First Image"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Open Image Generation"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.strong,{children:"Image"})," in the sidebar"]}),"\n",(0,r.jsx)(n.li,{children:"Or navigate to the Image Generation tab"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Create an Image"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"A serene Japanese garden with cherry blossoms in full bloom, \nsoft pink petals falling, peaceful zen atmosphere, \nhigh quality, detailed\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Customize Settings"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Adjust image size and quality"}),"\n",(0,r.jsx)(n.li,{children:"Try different art styles"}),"\n",(0,r.jsx)(n.li,{children:"Experiment with prompts"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"-build-your-first-agent",children:"\u26a1 Build Your First Agent"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Access Agent Studio"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.strong,{children:"Agents"})," in the sidebar"]}),"\n",(0,r.jsx)(n.li,{children:'Start with the "Create New Agent" button'}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Use the Visual Builder"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Drag and drop nodes to create workflows"}),"\n",(0,r.jsx)(n.li,{children:"Connect inputs and outputs"}),"\n",(0,r.jsx)(n.li,{children:"Configure node parameters"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Test Your Agent"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use the built-in testing tools"}),"\n",(0,r.jsx)(n.li,{children:"Debug workflows step by step"}),"\n",(0,r.jsx)(n.li,{children:"Export and share your agents"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"quick-tips-for-success",children:"Quick Tips for Success"}),"\n",(0,r.jsx)(n.admonition,{title:"Pro Tips",type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Explore the Dashboard"}),": Get familiar with the overview and quick actions"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Check Settings"}),": Customize Clara to match your workflow preferences"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Use Keyboard Shortcuts"}),": Speed up your workflow with built-in shortcuts"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Save Frequently"}),": Your work is automatically saved, but manual saves are good practice"]}),"\n"]})}),"\n",(0,r.jsx)(n.admonition,{title:"Common Issues",type:"warning",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"API Keys"}),": Make sure your AI provider API keys are valid and have sufficient credits"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Network"}),": Clara requires internet connectivity for cloud AI providers"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Memory"}),": For local models (Ollama), ensure you have sufficient RAM"]}),"\n"]})}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsx)(n.p,{children:"Now that Clara is running, explore these features:"}),"\n",(0,r.jsxs)(n.h3,{id:"-configuration",children:["\ud83d\udd27 ",(0,r.jsx)(n.strong,{children:"Configuration"})]}),"\n",(0,r.jsx)(n.p,{children:"Customize Clara's behavior, themes, and integrations through the Settings page"}),"\n",(0,r.jsxs)(n.h3,{id:"-learn-more",children:["\ud83d\udcd6 ",(0,r.jsx)(n.strong,{children:"Learn More"})]}),"\n",(0,r.jsxs)(n.p,{children:["Read the ",(0,r.jsx)(n.a,{href:"/getting-started/introduction",children:"Introduction Guide"})," to understand Clara's full capabilities"]}),"\n",(0,r.jsxs)(n.h3,{id:"-installation-details",children:["\ud83d\udcda ",(0,r.jsx)(n.strong,{children:"Installation Details"})]}),"\n",(0,r.jsxs)(n.p,{children:["Check the complete ",(0,r.jsx)(n.a,{href:"/getting-started/installation",children:"Installation Guide"})," for advanced setup options"]}),"\n",(0,r.jsx)(n.h2,{id:"getting-help",children:"Getting Help"}),"\n",(0,r.jsx)(n.p,{children:"If you run into any issues:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documentation"}),": Browse our comprehensive guides"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"GitHub Issues"}),": Report bugs or request features"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Community"}),": Join discussions and get help from other users"]}),"\n"]}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Congratulations!"})," \ud83c\udf89 You're now ready to explore Clara's full potential. The AI-powered workspace is at your fingertips!"]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>a});var s=i(6540);const r={},l=s.createContext(r);function t(e){const n=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(l.Provider,{value:n},e.children)}}}]); No newline at end of file | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Do not commit built documentation bundles.
Built artifacts cause noisy diffs and false-positive lints (e.g., hooks warnings). Exclude the docs build output from Git and produce it in CI.
+.gitignore
+public/documentation/build/📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[324],{3014:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"getting-started/quick-start","title":"Quick Start Guide","description":"Get up and running with Clara in minutes","source":"@site/docs/getting-started/quick-start.md","sourceDirName":"getting-started","slug":"/getting-started/quick-start","permalink":"/getting-started/quick-start","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Quick Start Guide","description":"Get up and running with Clara in minutes","sidebar_position":3},"sidebar":"docsSidebar","previous":{"title":"Installation","permalink":"/getting-started/installation"}}');var r=i(4848),l=i(8453);const t={title:"Quick Start Guide",description:"Get up and running with Clara in minutes",sidebar_position:3},a="\ud83d\ude80 Quick Start Guide",o={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installation",id:"installation",level:2},{value:"Option 1: Download Release (Recommended)",id:"option-1-download-release-recommended",level:3},{value:"Option 2: Build from Source",id:"option-2-build-from-source",level:3},{value:"First Launch Setup",id:"first-launch-setup",level:2},{value:"1. Welcome Screen",id:"1-welcome-screen",level:3},{value:"2. AI Provider Configuration",id:"2-ai-provider-configuration",level:3},{value:"OpenAI Setup",id:"openai-setup",level:4},{value:"Anthropic Setup",id:"anthropic-setup",level:4},{value:"Ollama Setup (Local)",id:"ollama-setup-local",level:4},{value:"3. Verify Installation",id:"3-verify-installation",level:3},{value:"Essential First Steps",id:"essential-first-steps",level:2},{value:"\ud83e\udd16 Try the AI Assistant",id:"-try-the-ai-assistant",level:3},{value:"\ud83c\udfa8 Generate Your First Image",id:"-generate-your-first-image",level:3},{value:"\u26a1 Build Your First Agent",id:"-build-your-first-agent",level:3},{value:"Quick Tips for Success",id:"quick-tips-for-success",level:2},{value:"Next Steps",id:"next-steps",level:2},{value:"\ud83d\udd27 <strong>Configuration</strong>",id:"-configuration",level:3},{value:"\ud83d\udcd6 <strong>Learn More</strong>",id:"-learn-more",level:3},{value:"\ud83d\udcda <strong>Installation Details</strong>",id:"-installation-details",level:3},{value:"Getting Help",id:"getting-help",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"-quick-start-guide",children:"\ud83d\ude80 Quick Start Guide"})}),"\n",(0,r.jsx)(n.p,{children:"Get Clara up and running in just a few minutes! This guide will walk you through the essentials to start using Clara's powerful AI-powered workspace."}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(n.p,{children:"Before you begin, make sure you have:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Node.js"})," (version 18 or higher)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"A modern web browser"})," (Chrome, Firefox, Safari, Edge)"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"An AI provider API key"})," (OpenAI, Anthropic, or local Ollama)"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,r.jsx)(n.h3,{id:"option-1-download-release-recommended",children:"Option 1: Download Release (Recommended)"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Visit the ",(0,r.jsx)(n.a,{href:"https://github.com/your-org/clara/releases",children:"Clara Releases"})," page"]}),"\n",(0,r.jsxs)(n.li,{children:["Download the latest version for your platform:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Windows"}),": ",(0,r.jsx)(n.code,{children:"Clara-Setup-x.x.x.exe"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"macOS"}),": ",(0,r.jsx)(n.code,{children:"Clara-x.x.x.dmg"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Linux"}),": ",(0,r.jsx)(n.code,{children:"Clara-x.x.x.AppImage"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.li,{children:"Install and launch Clara"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"option-2-build-from-source",children:"Option 2: Build from Source"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Clone the repository\ngit clone https://github.com/your-org/clara.git\ncd clara\n\n# Install dependencies\nnpm install\n\n# Start development server\nnpm run dev\n"})}),"\n",(0,r.jsx)(n.h2,{id:"first-launch-setup",children:"First Launch Setup"}),"\n",(0,r.jsx)(n.p,{children:"When you first open Clara, you'll be guided through a quick onboarding process:"}),"\n",(0,r.jsx)(n.h3,{id:"1-welcome-screen",children:"1. Welcome Screen"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Enter your name for personalization"}),"\n",(0,r.jsx)(n.li,{children:"Choose your preferred theme (Light/Dark)"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"2-ai-provider-configuration",children:"2. AI Provider Configuration"}),"\n",(0,r.jsx)(n.p,{children:"Choose and configure your AI provider:"}),"\n",(0,r.jsx)(n.h4,{id:"openai-setup",children:"OpenAI Setup"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Required: Your OpenAI API key\nAPI_KEY=sk-your-openai-api-key-here\n"})}),"\n",(0,r.jsx)(n.h4,{id:"anthropic-setup",children:"Anthropic Setup"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Required: Your Anthropic API key \nAPI_KEY=sk-ant-your-anthropic-api-key-here\n"})}),"\n",(0,r.jsx)(n.h4,{id:"ollama-setup-local",children:"Ollama Setup (Local)"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# Install Ollama first\ncurl -fsSL https://ollama.ai/install.sh | sh\n\n# Pull a model\nollama pull llama2\n\n# Clara will auto-detect local Ollama\n"})}),"\n",(0,r.jsx)(n.h3,{id:"3-verify-installation",children:"3. Verify Installation"}),"\n",(0,r.jsx)(n.p,{children:"After setup, test your installation:"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Open Clara Assistant"})," - Click the chat icon in the sidebar"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Send a test message"}),' - Try: "Hello Clara, tell me about your features"']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Check response"})," - You should get a helpful response about Clara's capabilities"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"essential-first-steps",children:"Essential First Steps"}),"\n",(0,r.jsx)(n.h3,{id:"-try-the-ai-assistant",children:"\ud83e\udd16 Try the AI Assistant"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Access the Assistant"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Click the ",(0,r.jsx)(n.strong,{children:"Bot"})," icon in the sidebar"]}),"\n",(0,r.jsxs)(n.li,{children:["Or use the keyboard shortcut ",(0,r.jsx)(n.code,{children:"Ctrl+Shift+A"})," (Windows/Linux) or ",(0,r.jsx)(n.code,{children:"Cmd+Shift+A"})," (macOS)"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Start a Conversation"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"Hello Clara! What can you help me with today?\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Explore Capabilities"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Ask questions about any topic"}),"\n",(0,r.jsx)(n.li,{children:"Request code assistance"}),"\n",(0,r.jsx)(n.li,{children:"Get help with writing and analysis"}),"\n",(0,r.jsx)(n.li,{children:"Use tools and integrations"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"-generate-your-first-image",children:"\ud83c\udfa8 Generate Your First Image"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Open Image Generation"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.strong,{children:"Image"})," in the sidebar"]}),"\n",(0,r.jsx)(n.li,{children:"Or navigate to the Image Generation tab"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Create an Image"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"A serene Japanese garden with cherry blossoms in full bloom, \nsoft pink petals falling, peaceful zen atmosphere, \nhigh quality, detailed\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Customize Settings"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Adjust image size and quality"}),"\n",(0,r.jsx)(n.li,{children:"Try different art styles"}),"\n",(0,r.jsx)(n.li,{children:"Experiment with prompts"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"-build-your-first-agent",children:"\u26a1 Build Your First Agent"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Access Agent Studio"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Click ",(0,r.jsx)(n.strong,{children:"Agents"})," in the sidebar"]}),"\n",(0,r.jsx)(n.li,{children:'Start with the "Create New Agent" button'}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Use the Visual Builder"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Drag and drop nodes to create workflows"}),"\n",(0,r.jsx)(n.li,{children:"Connect inputs and outputs"}),"\n",(0,r.jsx)(n.li,{children:"Configure node parameters"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Test Your Agent"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use the built-in testing tools"}),"\n",(0,r.jsx)(n.li,{children:"Debug workflows step by step"}),"\n",(0,r.jsx)(n.li,{children:"Export and share your agents"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"quick-tips-for-success",children:"Quick Tips for Success"}),"\n",(0,r.jsx)(n.admonition,{title:"Pro Tips",type:"tip",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Explore the Dashboard"}),": Get familiar with the overview and quick actions"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Check Settings"}),": Customize Clara to match your workflow preferences"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Use Keyboard Shortcuts"}),": Speed up your workflow with built-in shortcuts"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Save Frequently"}),": Your work is automatically saved, but manual saves are good practice"]}),"\n"]})}),"\n",(0,r.jsx)(n.admonition,{title:"Common Issues",type:"warning",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"API Keys"}),": Make sure your AI provider API keys are valid and have sufficient credits"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Network"}),": Clara requires internet connectivity for cloud AI providers"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Memory"}),": For local models (Ollama), ensure you have sufficient RAM"]}),"\n"]})}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next Steps"}),"\n",(0,r.jsx)(n.p,{children:"Now that Clara is running, explore these features:"}),"\n",(0,r.jsxs)(n.h3,{id:"-configuration",children:["\ud83d\udd27 ",(0,r.jsx)(n.strong,{children:"Configuration"})]}),"\n",(0,r.jsx)(n.p,{children:"Customize Clara's behavior, themes, and integrations through the Settings page"}),"\n",(0,r.jsxs)(n.h3,{id:"-learn-more",children:["\ud83d\udcd6 ",(0,r.jsx)(n.strong,{children:"Learn More"})]}),"\n",(0,r.jsxs)(n.p,{children:["Read the ",(0,r.jsx)(n.a,{href:"/getting-started/introduction",children:"Introduction Guide"})," to understand Clara's full capabilities"]}),"\n",(0,r.jsxs)(n.h3,{id:"-installation-details",children:["\ud83d\udcda ",(0,r.jsx)(n.strong,{children:"Installation Details"})]}),"\n",(0,r.jsxs)(n.p,{children:["Check the complete ",(0,r.jsx)(n.a,{href:"/getting-started/installation",children:"Installation Guide"})," for advanced setup options"]}),"\n",(0,r.jsx)(n.h2,{id:"getting-help",children:"Getting Help"}),"\n",(0,r.jsx)(n.p,{children:"If you run into any issues:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documentation"}),": Browse our comprehensive guides"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"GitHub Issues"}),": Report bugs or request features"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Community"}),": Join discussions and get help from other users"]}),"\n"]}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Congratulations!"})," \ud83c\udf89 You're now ready to explore Clara's full potential. The AI-powered workspace is at your fingertips!"]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>a});var s=i(6540);const r={},l=s.createContext(r);function t(e){const n=s.useContext(l);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(l.Provider,{value:n},e.children)}}}]); | |
| public/documentation/build/ |
🧰 Tools
🪛 Biome (2.1.2)
[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.
This is the call path until the hook.
For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level
(lint/correctness/useHookAtTopLevel)
[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.
This is the call path until the hook.
For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level
(lint/correctness/useHookAtTopLevel)
🤖 Prompt for AI Agents
In public/documentation/build/assets/js/588bd741.b044c04e.js around lines 1-1, a
built documentation bundle was committed; remove the generated build output from
the repo, stop tracking it, and add the docs build output path (e.g.,
public/documentation/build/ or the exact build directory) to .gitignore so
future builds are not committed; update CI/docs pipeline to produce the build
artifact during CI instead of committing it, and create a commit that removes
the file from git history/tracking (git rm --cached or equivalent) so diffs and
lint noise are eliminated.
| @@ -0,0 +1 @@ | |||
| "use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[647],{7121:(e,s,n)=>{n.r(s),n.d(s,{default:()=>d});n(6540);var r=n(4164),t=n(5500),u=n(7559),a=n(2831),c=n(1656),o=n(4848);function d(e){return(0,o.jsx)(t.e3,{className:(0,r.A)(u.G.wrapper.docsPages),children:(0,o.jsx)(c.A,{children:(0,a.v)(e.route.routes)})})}}}]); No newline at end of file | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
❓ Verification inconclusive
Don’t commit built docs artifacts; exclude public/documentation/build and deploy via CI instead.
Minified bundles are not reviewable, bloat the repo, and cause noisy diffs/merges. Commit the source (Docusaurus config, MDX, etc.) and have CI build/deploy (e.g., to GitHub Pages). Add ignores and drop these files from the PR.
Apply to .gitignore:
+# Docusaurus build outputs
+public/documentation/build/
+public/documentation/.docusaurus/I can also generate a minimal GitHub Actions workflow to build and publish public/documentation to gh-pages if you want.
Remove committed Docusaurus build artifacts; add to .gitignore and deploy via CI
Remove the minified outputs under public/documentation/build from this PR, commit only source (Docusaurus config/MDX), and configure CI to build and publish the docs (e.g., GitHub Actions → gh-pages).
Apply to .gitignore:
+# Docusaurus build outputs
+public/documentation/build/
+public/documentation/.docusaurus/I can generate a minimal GitHub Actions workflow to build and publish public/documentation to gh-pages.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[647],{7121:(e,s,n)=>{n.r(s),n.d(s,{default:()=>d});n(6540);var r=n(4164),t=n(5500),u=n(7559),a=n(2831),c=n(1656),o=n(4848);function d(e){return(0,o.jsx)(t.e3,{className:(0,r.A)(u.G.wrapper.docsPages),children:(0,o.jsx)(c.A,{children:(0,a.v)(e.route.routes)})})}}}]); | |
| # .gitignore — append | |
| # Docusaurus build outputs | |
| public/documentation/build/ | |
| public/documentation/.docusaurus/ |
🤖 Prompt for AI Agents
In public/documentation/build/assets/js/5e95c892.05456d1d.js around lines 1 to
1: this is a built/minified Docusaurus artifact that should not be committed;
remove all files under public/documentation/build from the PR, add the
public/documentation/build path to .gitignore, commit only the docs source
(Docusaurus config and MDX), and update CI to perform the build and deploy the
generated public/documentation output (for example add a GitHub Actions workflow
that installs deps, runs the Docusaurus build, and publishes
public/documentation to gh-pages). Ensure you remove the files from the repo
history/index so they won’t be reintroduced and include the CI workflow file in
the commit.
| <body class="navigation-with-keyboard"> | ||
| <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs> | ||
| <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> | ||
| </defs></svg> | ||
| <script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/logo.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.svg" alt="Clara Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/logo.svg" alt="Clara Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Clara</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/">Documentation</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/your-org/clara" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/">Clara Documentation</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/getting-started/introduction">Getting Started</a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/getting-started/introduction">Introduction to Clara</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/getting-started/installation">Installation</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/getting-started/quick-start">Quick Start Guide</a></li></ul></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Getting Started</span></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Introduction to Clara</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Welcome to Clara 🌸</h1></header> | ||
| <p><strong>Clara</strong> is a revolutionary AI-powered workspace designed to enhance productivity, creativity, and collaboration through intelligent automation and intuitive interfaces. Built with modern technologies and a focus on user experience, Clara brings the power of AI to your fingertips in a beautiful, easy-to-use application.</p> | ||
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-clara">What is Clara?<a href="#what-is-clara" class="hash-link" aria-label="Direct link to What is Clara?" title="Direct link to What is Clara?"></a></h2> | ||
| <p>Clara is more than just an AI assistant – it's a complete workspace that combines:</p> | ||
| <ul> | ||
| <li><strong>🤖 Intelligent AI Assistant</strong> with multi-provider support</li> | ||
| <li><strong>🎨 Advanced Image Generation</strong> with creative tools</li> | ||
| <li><strong>⚡ Visual Workflow Builder</strong> for custom automation</li> | ||
| <li><strong>🔗 Seamless Integrations</strong> with popular services</li> | ||
| <li><strong>🛠️ Developer-Friendly APIs</strong> for extensibility</li> | ||
| </ul> | ||
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-choose-clara">Why Choose Clara?<a href="#why-choose-clara" class="hash-link" aria-label="Direct link to Why Choose Clara?" title="Direct link to Why Choose Clara?"></a></h2> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-beautiful--intuitive-design">🌸 Beautiful & Intuitive Design<a href="#-beautiful--intuitive-design" class="hash-link" aria-label="Direct link to 🌸 Beautiful & Intuitive Design" title="Direct link to 🌸 Beautiful & Intuitive Design"></a></h3> | ||
| <p>Clara features a clean, modern interface with our signature <strong>sakura (cherry blossom) theme</strong>. Every interaction is designed to be delightful and productive.</p> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-multi-provider-ai-support">🧠 Multi-Provider AI Support<a href="#-multi-provider-ai-support" class="hash-link" aria-label="Direct link to 🧠 Multi-Provider AI Support" title="Direct link to 🧠 Multi-Provider AI Support"></a></h3> | ||
| <p>Unlike other solutions that lock you into a single AI provider, Clara supports:</p> | ||
| <ul> | ||
| <li><strong>OpenAI</strong> (GPT-3.5, GPT-4, GPT-4 Vision)</li> | ||
| <li><strong>Anthropic</strong> (Claude models)</li> | ||
| <li><strong>Ollama</strong> (Local models for privacy)</li> | ||
| <li><strong>Open WebUI</strong> (Self-hosted solutions)</li> | ||
| </ul> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-privacy-first-approach">🔒 Privacy-First Approach<a href="#-privacy-first-approach" class="hash-link" aria-label="Direct link to 🔒 Privacy-First Approach" title="Direct link to 🔒 Privacy-First Approach"></a></h3> | ||
| <p>Your data stays with you:</p> | ||
| <ul> | ||
| <li><strong>Local storage</strong> by default</li> | ||
| <li><strong>Optional cloud features</strong> with transparent data handling</li> | ||
| <li><strong>Open source core</strong> for full transparency</li> | ||
| <li><strong>No vendor lock-in</strong> - your data remains yours</li> | ||
| </ul> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-production-ready">🚀 Production Ready<a href="#-production-ready" class="hash-link" aria-label="Direct link to 🚀 Production Ready" title="Direct link to 🚀 Production Ready"></a></h3> | ||
| <p>Built with enterprise-grade technologies:</p> | ||
| <ul> | ||
| <li><strong>TypeScript</strong> for reliability and type safety</li> | ||
| <li><strong>React</strong> for responsive, modern UI</li> | ||
| <li><strong>Electron</strong> for cross-platform compatibility</li> | ||
| <li><strong>Comprehensive testing</strong> and quality assurance</li> | ||
| </ul> | ||
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id="core-features-overview">Core Features Overview<a href="#core-features-overview" class="hash-link" aria-label="Direct link to Core Features Overview" title="Direct link to Core Features Overview"></a></h2> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="ai-assistant-">AI Assistant 🤖<a href="#ai-assistant-" class="hash-link" aria-label="Direct link to AI Assistant 🤖" title="Direct link to AI Assistant 🤖"></a></h3> | ||
| <p>Engage in intelligent conversations with:</p> | ||
| <ul> | ||
| <li><strong>Context-aware responses</strong> that remember your conversation history</li> | ||
| <li><strong>Tool integration</strong> for enhanced capabilities</li> | ||
| <li><strong>Multi-modal support</strong> including text and image understanding</li> | ||
| <li><strong>Customizable prompts</strong> and behavior settings</li> | ||
| </ul> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="image-generation-">Image Generation 🎨<a href="#image-generation-" class="hash-link" aria-label="Direct link to Image Generation 🎨" title="Direct link to Image Generation 🎨"></a></h3> | ||
| <p>Create stunning visuals with:</p> | ||
| <ul> | ||
| <li><strong>Multiple AI models</strong> for different art styles</li> | ||
| <li><strong>Advanced prompting</strong> with style presets</li> | ||
| <li><strong>Batch generation</strong> for efficiency</li> | ||
| <li><strong>Integration with ComfyUI</strong> for advanced workflows</li> | ||
| </ul> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="agent-studio-">Agent Studio ⚡<a href="#agent-studio-" class="hash-link" aria-label="Direct link to Agent Studio ⚡" title="Direct link to Agent Studio ⚡"></a></h3> | ||
| <p>Build custom workflows with:</p> | ||
| <ul> | ||
| <li><strong>Visual drag-and-drop interface</strong> for easy creation</li> | ||
| <li><strong>Pre-built node library</strong> for common tasks</li> | ||
| <li><strong>Custom node development</strong> for specialized needs</li> | ||
| <li><strong>Testing and debugging tools</strong> for reliable workflows</li> | ||
| </ul> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="integrations-">Integrations 🔗<a href="#integrations-" class="hash-link" aria-label="Direct link to Integrations 🔗" title="Direct link to Integrations 🔗"></a></h3> | ||
| <p>Connect with your favorite tools:</p> | ||
| <ul> | ||
| <li><strong>N8N workflows</strong> for automation</li> | ||
| <li><strong>Server management</strong> for infrastructure</li> | ||
| <li><strong>API integrations</strong> for external services</li> | ||
| <li><strong>Plugin system</strong> for extensibility</li> | ||
| </ul> | ||
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id="who-is-clara-for">Who Is Clara For?<a href="#who-is-clara-for" class="hash-link" aria-label="Direct link to Who Is Clara For?" title="Direct link to Who Is Clara For?"></a></h2> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-developers">👩💻 Developers<a href="#-developers" class="hash-link" aria-label="Direct link to 👩💻 Developers" title="Direct link to 👩💻 Developers"></a></h3> | ||
| <ul> | ||
| <li>Build AI-powered applications</li> | ||
| <li>Automate development workflows</li> | ||
| <li>Integrate with existing tools</li> | ||
| <li>Create custom solutions</li> | ||
| </ul> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-creators">🎨 Creators<a href="#-creators" class="hash-link" aria-label="Direct link to 🎨 Creators" title="Direct link to 🎨 Creators"></a></h3> | ||
| <ul> | ||
| <li>Generate AI artwork and content</li> | ||
| <li>Automate creative workflows</li> | ||
| <li>Collaborate on projects</li> | ||
| <li>Manage creative assets</li> | ||
| </ul> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-teams">🏢 Teams<a href="#-teams" class="hash-link" aria-label="Direct link to 🏢 Teams" title="Direct link to 🏢 Teams"></a></h3> | ||
| <ul> | ||
| <li>Streamline collaboration</li> | ||
| <li>Automate repetitive tasks</li> | ||
| <li>Centralize AI capabilities</li> | ||
| <li>Scale productivity</li> | ||
| </ul> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-researchers">🔬 Researchers<a href="#-researchers" class="hash-link" aria-label="Direct link to 🔬 Researchers" title="Direct link to 🔬 Researchers"></a></h3> | ||
| <ul> | ||
| <li>Experiment with AI models</li> | ||
| <li>Process data efficiently</li> | ||
| <li>Document findings</li> | ||
| <li>Share methodologies</li> | ||
| </ul> | ||
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started">Getting Started<a href="#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started"></a></h2> | ||
| <p>Ready to dive in? Here's your path to mastery:</p> | ||
| <ol> | ||
| <li><strong><a href="/getting-started/installation">Installation</a></strong> - Get Clara running on your system</li> | ||
| <li><strong><a href="/getting-started/quick-start">Quick Start</a></strong> - Essential first steps and setup</li> | ||
| </ol> | ||
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id="philosophy--values">Philosophy & Values<a href="#philosophy--values" class="hash-link" aria-label="Direct link to Philosophy & Values" title="Direct link to Philosophy & Values"></a></h2> | ||
| <p>Clara is built on these core principles:</p> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-user-centric-design">🎯 User-Centric Design<a href="#-user-centric-design" class="hash-link" aria-label="Direct link to 🎯 User-Centric Design" title="Direct link to 🎯 User-Centric Design"></a></h3> | ||
| <p>Every feature is designed with the user experience in mind. We believe powerful tools should also be beautiful and intuitive.</p> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-open--transparent">🔓 Open & Transparent<a href="#-open--transparent" class="hash-link" aria-label="Direct link to 🔓 Open & Transparent" title="Direct link to 🔓 Open & Transparent"></a></h3> | ||
| <p>We're committed to open source development and transparent practices. You always know what's happening with your data.</p> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-continuous-innovation">🌱 Continuous Innovation<a href="#-continuous-innovation" class="hash-link" aria-label="Direct link to 🌱 Continuous Innovation" title="Direct link to 🌱 Continuous Innovation"></a></h3> | ||
| <p>The AI landscape evolves rapidly, and so do we. Clara is designed to adapt and grow with new technologies.</p> | ||
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id="-community-driven">🤝 Community-Driven<a href="#-community-driven" class="hash-link" aria-label="Direct link to 🤝 Community-Driven" title="Direct link to 🤝 Community-Driven"></a></h3> | ||
| <p>Our community drives development priorities. Features are built based on real user needs and feedback.</p> | ||
| <hr> | ||
| <p><strong>Ready to transform your workflow?</strong> Let's get started with <a href="/getting-started/installation">installing Clara</a> and exploring what's possible with AI-powered productivity.</p> | ||
| <p><em>Clara: Where AI meets beautiful design</em> ✨</p></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Clara Documentation</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/getting-started/installation"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Installation</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#what-is-clara" class="table-of-contents__link toc-highlight">What is Clara?</a></li><li><a href="#why-choose-clara" class="table-of-contents__link toc-highlight">Why Choose Clara?</a><ul><li><a href="#-beautiful--intuitive-design" class="table-of-contents__link toc-highlight">🌸 Beautiful & Intuitive Design</a></li><li><a href="#-multi-provider-ai-support" class="table-of-contents__link toc-highlight">🧠 Multi-Provider AI Support</a></li><li><a href="#-privacy-first-approach" class="table-of-contents__link toc-highlight">🔒 Privacy-First Approach</a></li><li><a href="#-production-ready" class="table-of-contents__link toc-highlight">🚀 Production Ready</a></li></ul></li><li><a href="#core-features-overview" class="table-of-contents__link toc-highlight">Core Features Overview</a><ul><li><a href="#ai-assistant-" class="table-of-contents__link toc-highlight">AI Assistant 🤖</a></li><li><a href="#image-generation-" class="table-of-contents__link toc-highlight">Image Generation 🎨</a></li><li><a href="#agent-studio-" class="table-of-contents__link toc-highlight">Agent Studio ⚡</a></li><li><a href="#integrations-" class="table-of-contents__link toc-highlight">Integrations 🔗</a></li></ul></li><li><a href="#who-is-clara-for" class="table-of-contents__link toc-highlight">Who Is Clara For?</a><ul><li><a href="#-developers" class="table-of-contents__link toc-highlight">👩💻 Developers</a></li><li><a href="#-creators" class="table-of-contents__link toc-highlight">🎨 Creators</a></li><li><a href="#-teams" class="table-of-contents__link toc-highlight">🏢 Teams</a></li><li><a href="#-researchers" class="table-of-contents__link toc-highlight">🔬 Researchers</a></li></ul></li><li><a href="#getting-started" class="table-of-contents__link toc-highlight">Getting Started</a></li><li><a href="#philosophy--values" class="table-of-contents__link toc-highlight">Philosophy & Values</a><ul><li><a href="#-user-centric-design" class="table-of-contents__link toc-highlight">🎯 User-Centric Design</a></li><li><a href="#-open--transparent" class="table-of-contents__link toc-highlight">🔓 Open & Transparent</a></li><li><a href="#-continuous-innovation" class="table-of-contents__link toc-highlight">🌱 Continuous Innovation</a></li><li><a href="#-community-driven" class="table-of-contents__link toc-highlight">🤝 Community-Driven</a></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/getting-started/introduction">Getting Started</a></li><li class="footer__item"><a class="footer__link-item" href="/getting-started/installation">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/getting-started/quick-start">Quick Start</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Clara</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/your-org/clara" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2025 Clara. Built with ❤️ and Docusaurus.</div></div></div></footer></div> | ||
| </body> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Root-absolute asset paths may break when served under a subpath or file://.
All /assets/*, /img/*, and doc links are absolute. If these ship inside the Electron app under /documentation/, adjust Docusaurus baseUrl or serve at root.
Expect 0 if paths are relative. If non-zero, consider setting baseUrl and rebuilding.
🏁 Script executed:
#!/bin/bash
rg -nP '\s(href|src)="/(assets|img|getting-started)/' public/documentation/build | wc -lLength of output: 2
Use relative asset/doc paths or set Docusaurus baseUrl to the app subpath and rebuild.
33 occurrences found in public/documentation/build matching href/src starting with '/assets', '/img', or '/getting-started' — either set baseUrl: '/documentation/' in docusaurus.config.js and rebuild, or change leading‑slash links to relative paths.
🤖 Prompt for AI Agents
In public/documentation/build/getting-started/introduction/index.html lines
10-133 there are ~33 href/src values starting with leading slashes (e.g.
"/assets", "/img", "/getting-started") which break when the site is served under
the /documentation subpath; fix by either (A) set baseUrl: '/documentation/' in
docusaurus.config.js and rebuild the site so absolute paths resolve correctly,
or (B) convert those leading-slash references to relative paths (remove the
leading '/' or prefix with './' or the correct relative folder) or use
Docusaurus helpers (useBaseUrl/@site/static) when regenerating the pages, then
rebuild to ensure all asset and doc links point to the correct subpath.
| <title data-rh="true">Quick Start Guide | Clara Documentation</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://clara-docs.example.com/img/clara-social-card.jpg"><meta data-rh="true" name="twitter:image" content="https://clara-docs.example.com/img/clara-social-card.jpg"><meta data-rh="true" property="og:url" content="https://clara-docs.example.com/getting-started/quick-start"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Quick Start Guide | Clara Documentation"><meta data-rh="true" name="description" content="Get up and running with Clara in minutes"><meta data-rh="true" property="og:description" content="Get up and running with Clara in minutes"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://clara-docs.example.com/getting-started/quick-start"><link data-rh="true" rel="alternate" href="https://clara-docs.example.com/getting-started/quick-start" hreflang="en"><link data-rh="true" rel="alternate" href="https://clara-docs.example.com/getting-started/quick-start" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Quick Start Guide","item":"https://clara-docs.example.com/getting-started/quick-start"}]}</script><link rel="stylesheet" href="/assets/css/styles.d4e08c71.css"> | ||
| <script src="/assets/js/runtime~main.63bcd324.js" defer="defer"></script> | ||
| <script src="/assets/js/main.a25a12dc.js" defer="defer"></script> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Absolute asset paths will break when served from a subpath/file://
Links like href="/assets/…" and src="/img/…" assume site root “/”. If these docs ship inside the app or at a subpath, set baseUrl in docusaurus.config.ts (e.g., '/documentation/' or '.') and rebuild for relative URLs.
Also applies to: 14-14, 41-41, 161-161
🤖 Prompt for AI Agents
In public/documentation/build/getting-started/quick-start/index.html around
lines 6-8 (and also at 14, 41, 161) the asset links use absolute paths
(href="/assets/…" and src="/img/…") which will break when the site is served
from a subpath or file://; update the Docusaurus build configuration to set
baseUrl to your deployment subpath (e.g., '/documentation/' or '.') in
docusaurus.config.ts and rebuild so generated assets use the correct base, and
if needed update source docs to use Docusaurus helpers (useBaseUrl or proper
relative paths) so produced HTML does not contain leading-slash absolute URLs.
| # Download from GitHub Releases: | ||
| # - Windows: Clara-0.1.2-win-x64.exe | ||
| # - macOS: Clara-0.1.2-mac-universal.dmg | ||
| # - Linux: Clara-0.1.2-linux-x86_64.AppImage | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Installer names/arch don’t match build config.
Docs advertise a macOS “universal” dmg, but package.json builds mac arm64-only with artifactName including “-arm64”. Update the artifact names/arches here (and Windows naming) to match the current electron-builder config.
-# - macOS: Clara-0.1.2-mac-universal.dmg
+# - macOS: Clara-0.1.2-mac-arm64.dmg📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| # Download from GitHub Releases: | |
| # - Windows: Clara-0.1.2-win-x64.exe | |
| # - macOS: Clara-0.1.2-mac-universal.dmg | |
| # - Linux: Clara-0.1.2-linux-x86_64.AppImage | |
| # Download from GitHub Releases: | |
| # - Windows: Clara-0.1.2-win-x64.exe | |
| # - macOS: Clara-0.1.2-mac-arm64.dmg | |
| # - Linux: Clara-0.1.2-linux-x86_64.AppImage | |
🤖 Prompt for AI Agents
In RELEASE_NOTES_0.1.2.md around lines 186 to 190, the listed installer
names/architectures (macOS "universal" dmg and Windows naming) do not match the
current electron-builder/package.json settings; update these entries to exactly
match the artifactName and target architectures from package.json (e.g., use the
mac arm64 dmg name that includes "-arm64" and the Windows artifact name/arch as
specified in the build config) so the release notes reflect the actual built
artifacts.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review continued from previous batch...
| const short TS = nsg*SH; // shared memory size per query in (s_t == float) | ||
| const short T = 2*DK + 2*TS; // shared memory size per query in (half) | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Host TG memory calc: include KV scratch (sk/sv) type width
sk/sv bases are computed off shmem_f16 but are typed as k_t/v_t which may differ in size from half on some tuples. The offset arithmetic is in half elements; that’s fine so long as k_t/v_t are 2-byte (half/bfloat). If any variant switches k_t/v_t to float, this will misalign.
- Add a compile-time assert that sizeof(k_t)==2 && sizeof(v_t)==2 for the FA_TYPES/FA_TYPES_BF sets used here.
- Or compute these regions off a
threadgroup char*base with byte offsets to avoid size-coupling. I can draft that change if you want.
Also applies to: 3340-3345
🤖 Prompt for AI Agents
In electron/llamacpp-binaries/darwin-arm64/ggml-metal.metal around lines
3331-3333 (and similarly 3340-3345), the shared-memory offset arithmetic assumes
k_t and v_t are 2-byte types which can misalign if those types become float; add
a compile-time check and make the offset arithmetic size-independent: add a
static_assert (or compile-time assert macro) that sizeof(k_t)==2 &&
sizeof(v_t)==2 for the FA_TYPES/FA_TYPES_BF configurations used here, and/or
refactor the threadgroup region calculations to use a threadgroup char* (byte
pointer) base and compute all offsets in bytes rather than half-elements so KV
scratch regions never depend on k_t/v_t element size.
| // Watchdog service API | ||
| invoke: (channel, ...args) => ipcRenderer.invoke(channel, ...args), | ||
| on: (channel, callback) => { | ||
| const subscription = (event, ...args) => callback(event, ...args); | ||
| ipcRenderer.on(channel, subscription); | ||
| return () => ipcRenderer.removeListener(channel, subscription); | ||
| }, | ||
| removeAllListeners: (channel) => ipcRenderer.removeAllListeners(channel) | ||
| }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Arbitrary IPC bridge bypasses channel allowlist.
electronAPI.invoke/on/removeAllListeners expose unrestricted channels to the renderer, undermining the validChannels guard and broadening the attack surface (XSS → privileged IPC).
- Introduce an allowlist for these generic helpers or remove them.
- Prefer explicit, narrowly-scoped bridges.
Example tightening:
- invoke: (channel, ...args) => ipcRenderer.invoke(channel, ...args),
- on: (channel, callback) => {
- const subscription = (event, ...args) => callback(event, ...args);
- ipcRenderer.on(channel, subscription);
- return () => ipcRenderer.removeListener(channel, subscription);
- },
- removeAllListeners: (channel) => ipcRenderer.removeAllListeners(channel)
+ invoke: (channel, ...args) => {
+ const allowed = new Set([
+ 'get-containers','container-action','create-container','get-container-stats','get-container-logs',
+ 'search-huggingface-models','download-huggingface-model','stop-download',
+ 'get-local-models','delete-local-model',
+ 'mcp-get-servers','mcp-add-server','mcp-remove-server','mcp-update-server','mcp-start-server',
+ 'mcp-stop-server','mcp-restart-server','mcp-get-server-status','mcp-test-server','mcp-get-templates',
+ 'mcp-start-all-enabled','mcp-stop-all','mcp-import-claude-config','mcp-start-previously-running',
+ 'mcp-save-running-state','mcp-execute-tool','mcp-diagnose-node'
+ ]);
+ if (!allowed.has(channel)) throw new Error(`Disallowed channel: ${channel}`);
+ return ipcRenderer.invoke(channel, ...args);
+ },
+ on: (channel, callback) => {
+ const allowed = new Set(validChannels);
+ if (!allowed.has(channel)) throw new Error(`Disallowed channel: ${channel}`);
+ const subscription = (event, ...args) => callback(event, ...args);
+ ipcRenderer.on(channel, subscription);
+ return () => ipcRenderer.removeListener(channel, subscription);
+ },
+ removeAllListeners: (channel) => {
+ if (validChannels.includes(channel)) ipcRenderer.removeAllListeners(channel);
+ }📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // Watchdog service API | |
| invoke: (channel, ...args) => ipcRenderer.invoke(channel, ...args), | |
| on: (channel, callback) => { | |
| const subscription = (event, ...args) => callback(event, ...args); | |
| ipcRenderer.on(channel, subscription); | |
| return () => ipcRenderer.removeListener(channel, subscription); | |
| }, | |
| removeAllListeners: (channel) => ipcRenderer.removeAllListeners(channel) | |
| }); | |
| // Watchdog service API | |
| invoke: (channel, ...args) => { | |
| const allowed = new Set([ | |
| 'get-containers','container-action','create-container','get-container-stats','get-container-logs', | |
| 'search-huggingface-models','download-huggingface-model','stop-download', | |
| 'get-local-models','delete-local-model', | |
| 'mcp-get-servers','mcp-add-server','mcp-remove-server','mcp-update-server','mcp-start-server', | |
| 'mcp-stop-server','mcp-restart-server','mcp-get-server-status','mcp-test-server','mcp-get-templates', | |
| 'mcp-start-all-enabled','mcp-stop-all','mcp-import-claude-config','mcp-start-previously-running', | |
| 'mcp-save-running-state','mcp-execute-tool','mcp-diagnose-node' | |
| ]); | |
| if (!allowed.has(channel)) throw new Error(`Disallowed channel: ${channel}`); | |
| return ipcRenderer.invoke(channel, ...args); | |
| }, | |
| on: (channel, callback) => { | |
| const allowed = new Set(validChannels); | |
| if (!allowed.has(channel)) throw new Error(`Disallowed channel: ${channel}`); | |
| const subscription = (event, ...args) => callback(event, ...args); | |
| ipcRenderer.on(channel, subscription); | |
| return () => ipcRenderer.removeListener(channel, subscription); | |
| }, | |
| removeAllListeners: (channel) => { | |
| if (validChannels.includes(channel)) ipcRenderer.removeAllListeners(channel); | |
| } | |
| }); |
🤖 Prompt for AI Agents
In electron/preload.cjs around lines 128 to 136, the generic
invoke/on/removeAllListeners bridge methods expose unrestricted IPC channels and
bypass the existing validChannels guard; update these helpers to consult an
allowlist (e.g., validChannels array) before forwarding calls or remove the
generic helpers and replace them with explicit, narrowly-scoped bridge
functions. Specifically, validate the provided channel against the allowlist at
the start of each helper and either throw or return a no-op when the channel is
not allowed; for on(), only register and return a remover when channel is
allowed; for invoke() and removeAllListeners() perform the same check. Ensure
the allowlist is imported/defined in this file and add unit tests or usage
comments showing permitted channels.
|
hey @gemvn90, we cant able to see what you have done with this PR since you did not merge with upstream/main before pushing your changes, kindly check from your side or just sync upstream/main changes, then apply your commits |
Summary by CodeRabbit
New Features
Improvements
Bug Fixes
Documentation
Chores