Commit Graph
26 Commits
Author SHA1 Message Date
evandro 541aefd7e4 feat: check the server on launch and remember the selected model
The chat showed 'Server offline' until the user opened Settings, and the selected model was forgotten on every restart. useAutoConnect fetches the models once after the persisted settings are restored; activeModelId is now persisted.
2026-10-10 04:31:21 -03:00
evandro 1a3ce9ccec fix(chat): do not delete the answer when regenerating without a selected model
regenerateResponse removed the previous answer before checking for a model and then returned silently, leaving the conversation without a reply. It now checks first and explains that a model is required, like sendMessage. The duplicated streaming code in sendMessage and regenerateResponse is now a single streamAnswer helper.
2026-10-10 04:31:21 -03:00
evandro b441339bb4 feat(a11y): label icon-only buttons and inputs for screen readers
Header, message action, send/stop, history, model selector and dark-mode controls had no accessible name (icon-only buttons). Adds roles/labels and selected/disabled state; no visual change.
2026-10-10 04:29:33 -03:00
evandro 0e5b38fd15 perf(chat): debounce persisted writes and re-render only the streaming message
- the Zustand persist middleware serialized every saved session and wrote to AsyncStorage on each streamed token (appendToMessage -> set); writes are now debounced (400 ms) and flushed when the app leaves the foreground
- every token re-rendered every MessageBubble, re-parsing the Markdown of the whole conversation; rows are memoized so only the changed message renders (covered by MessageList.test.tsx)
2026-10-10 04:28:38 -03:00
evandro 200fb6afd7 chore: remove unused Expo template files and dependencies, add CI workflow
- 17 files unreferenced by the app (knip): hello-wave, parallax-scroll-view, themed-*, icon-symbol, Button, GlassCard, ScreenWrapper, Models catalog, duplicated theme/color-scheme hooks
- scripts/reset-project.js and its npm script: it moves app/ to app-example and would wipe the project
- dependencies only used by those files: expo-image, expo-symbols, expo-web-browser, react-native-sse, @babel/plugin-transform-runtime
- GitHub Actions workflow running typecheck, lint, tests and the web export
2026-10-10 04:26:21 -03:00
evandro 7ee78af76d chore(deps): align packages with Expo SDK 54 (react 19.1.0, expo-clipboard 8.x, patch bumps)
- react was ^19.1.0 and resolved to 19.3.0 while react-dom and the React Native renderer are 19.1.0; pin 19.1.0
- expo-clipboard ^55 is the SDK 55 release; SDK 54 expects ~8.0.8 (npx expo install --check)
- patch bumps for expo, expo-router, expo-constants, expo-font, expo-linking, expo-web-browser
- babel-preset-expo is required by babel.config.js, so declare it
2026-10-10 04:24:40 -03:00
evandro 2a294f1f87 refactor(chat): split MessageBubble into avatar, content and code block components
MessageBubble CC 19 -> below 10. The fence and indented code block rules were identical and are now one CodeBlock component; the Markdown style map lives in markdownStyles.ts. Adds characterization tests for the bubble (roles, actions visibility, edited badge, copy feedback).
2026-10-10 04:20:59 -03:00
evandro 434cba2a69 refactor(settings): split SettingsScreen into section components and pure helpers
SettingsScreen CC 23 -> below 10. Form parsing, change detection and the dark-theme check moved to utils/ with unit tests; the dark switch now reads the OS scheme instead of comparing the background colour. Adds characterization tests for the screen.
2026-10-10 04:18:40 -03:00
evandro cb6eda0562 refactor(chat): split ChatScreen and reuse regenerateResponse after editing a message
The edit path duplicated the streaming flow with inline require() calls; it now reuses regenerateResponse, which also fixes:
- edited conversations were never saved to History
- the answer generated after an edit could not be stopped (no abort handle kept)
Stopping a stream now saves the partial conversation, like finishing or failing does.
Adds characterization tests for ChatScreen and useLMStudio.
2026-10-10 04:16:29 -03:00
evandro 808cb1610b fix(api): handle hosts starting with http, HTTP errors on XHR and clearer connection errors
- buildBaseUrl treated any host starting with 'http' (e.g. httpbin.local) as having a scheme
- native streaming finished silently on 4xx/5xx; it now reports the status
- network failures now explain how to fix the connection instead of 'XHR streaming failed: 0'
- testConnection left its 5 s timer running on failure
- SSE parser accepts 'data:' without a space, as the spec allows
2026-10-10 04:12:13 -03:00
evandro 37dfa265f5 test: set up jest-expo and cover the Zustand store 2026-10-10 04:12:13 -03:00
Evandro Fonseca Junior 1e0490b1f7 docs: rewrite README with verified setup, web deploy and limitations
Documents only what was executed on Linux (Node 24, npm): install, tsc, expo lint,
web export and a headless-browser E2E against a mock of the LM Studio /v1 API.
Also fixes the clone URL, which pointed at the old LocalAiApp repository name.
2026-09-14 07:55:37 -03:00
Evandro Fonseca Junior 7c624cdce8 chore: drop committed junk files and ignore python caches
- remove the stray '1.2.0' file at the root, an npm install log committed by accident.
- remove the committed __pycache__/*.pyc binaries and ignore __pycache__/ and *.pyc.
- add .gitattributes marking .agent/** as vendored/documentation so GitHub stops
  reporting the repository as Python when the app is TypeScript.
2026-09-14 07:55:33 -03:00
Evandro Fonseca Junior 4cc1addb3c fix: make the web bundle run and repair broken route declarations
- add babel.config.js with unstable_transformImportMeta: zustand/middleware ships
  import.meta.env, which the Metro web bundle (a classic script) cannot parse, so
  every page threw 'SyntaxError: Cannot use import.meta outside a module' and the
  app never hydrated after the static export.
- declare the settings screen as 'settings/index' in the root stack: the old name
  'settings' matched no route, so the modal presentation and the 'Settings' title
  were silently dropped (expo-router logged 'No route named settings exists').
- add the missing app/+not-found.tsx that the root layout already referenced.
- update the About label from LocalAiApp to LocalMind.
2026-09-14 07:55:29 -03:00
Evandro Fonseca Junior ac215b4229 Rename project from Local AI Companion to LocalMind
Updated project name and adjusted badges in README.
2026-03-05 01:20:53 -03:00
Evandro Fonseca Junior 6ec3445fc7 feat: Revamp README with detailed project information and add initial design system documentation. 2026-03-05 00:08:46 -03:00
Evandro Fonseca Junior 7303d568f4 feat: Implement local chat saving and history management using Zustand and AsyncStorage. 2026-03-04 23:51:24 -03:00
Evandro Fonseca Junior 5fd7f7d2ed feat: Implement a settings screen for server connection configuration and theme preferences, supported by new color definitions. 2026-03-04 17:13:30 -03:00
Evandro Fonseca Junior 0297db110a feat: Implement core chat functionality with LM Studio integration and theme management. 2026-03-04 16:56:45 -03:00
Evandro Fonseca Junior 93df87d7e9 feat: Introduce a comprehensive set of AI agent skills, agents, and workflows, along with new UI components and application structure. 2026-03-04 05:01:34 -03:00
Evandro Fonseca Junior a2a512d41d feat: initialize Tauri application with Preact framework
- Added main application logic in `src-tauri/src/lib.rs` and `src-tauri/src/main.rs`.
- Configured Tauri settings in `tauri.conf.json`.
- Created basic styling in `src/App.css`.
- Implemented main application component in `src/App.tsx` with greeting functionality.
- Included Preact logo in `src/assets/preact.svg`.
- Set up rendering in `src/main.tsx`.
- Defined TypeScript environment in `vite-env.d.ts` and configured TypeScript settings in `tsconfig.json` and `tsconfig.node.json`.
- Configured Vite for Tauri development in `vite.config.ts`.
2026-01-15 00:11:55 -03:00
Evandro Fonseca Junior 08e154894a feat: enhance application functionality and telemetry monitoring
- Added new scripts in `package.json` for Python dependency installation and sidecar compilation.
- Integrated telemetry fetching in `src/App.tsx` to monitor CPU, RAM, GPU, and disk usage.
- Implemented model downloading functionality with progress tracking in `src/App.tsx`.
- Updated `Footer` and `Header` components to display telemetry data and settings options.
- Enhanced Tauri configuration for sidecar execution and application window settings.
- Updated Python requirements in `requirements.txt` to include additional dependencies for improved functionality.
2026-01-14 23:57:14 -03:00
Evandro Fonseca Junior 482b28513e chore: update .gitignore to include additional dependencies and environment files
- Added entries for Node.js, Python, Rust, and various build outputs.
- Included patterns for machine learning model files and environment variable files.
- Updated IDE and OS-specific files to improve project cleanliness.
2026-01-14 23:08:13 -03:00
Evandro Fonseca Junior fb37807c31 feat: enhance UI with MUI and Tailwind integration
- Updated `package.json` to include new dependencies: Emotion, MUI Joy, Lucide React, and Tailwind CSS.
- Refactored `src/App.tsx` to implement a new layout with a sidebar and chat interface using MUI components.
- Added Tailwind CSS import in `src/App.css` for styling.
- Improved user interaction elements with icons and tooltips for a better user experience.
2026-01-14 23:04:33 -03:00
Evandro Fonseca Junior ce33464c6e feat: initialize Tauri application with Preact framework
- Added main application logic in `src-tauri/src/lib.rs` and `src-tauri/src/main.rs`.
- Configured Tauri settings in `tauri.conf.json`.
- Created basic styling in `src/App.css`.
- Implemented main application component in `src/App.tsx` with greeting functionality.
- Included Preact logo in `src/assets/preact.svg`.
- Set up rendering in `src/main.tsx`.
- Defined TypeScript environment in `vite-env.d.ts` and configured TypeScript settings in `tsconfig.json` and `tsconfig.node.json`.
- Configured Vite for Tauri development in `vite.config.ts`.
2026-01-09 17:25:23 -03:00
Evandro Fonseca Junior 98fde58d77 Initial commit 2026-01-06 20:40:21 -03:00