diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 6edc1ebe..00000000 --- a/.dockerignore +++ /dev/null @@ -1,13 +0,0 @@ -# Ignore node_modules since they are installed during build process -**/node_modules - -# Ignore any other local configuration or documentation files that aren't necessary for production -**/README.md -.dockerignore -**/Dockerfile -.git -**/.gitignore -**/.gitattributes -prettierrc -**/docker-compose.yml -**/update.sh diff --git a/apps/app/.editorconfig b/.editorconfig similarity index 100% rename from apps/app/.editorconfig rename to .editorconfig diff --git a/apps/app/.env.example b/.env.example similarity index 100% rename from apps/app/.env.example rename to .env.example diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5a31f245..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,17 +0,0 @@ -import { config as baseConfig } from "./packages/eslint-config/base.js"; -import tseslint from "typescript-eslint"; - -/** @type {import("eslint").Linter.Config} */ -export default tseslint.config( - ...baseConfig, - { - ignores: ["apps/**", "packages/**"], - }, - { - files: ["**/*.ts", "**/*.tsx"], - parserOptions: { - project: true, - tsconfigRootDir: import.meta.dirname, - }, - }, -); \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c771add6..5338ce77 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,8 +24,8 @@ jobs: - name: Verify tag matches app version run: | TAG="${GITHUB_REF_NAME#v}" - PKG=$(node -p "require('./apps/app/package.json').version") - test "$TAG" = "$PKG" || { echo "::error::Tag v$TAG does not match apps/app/package.json version $PKG"; exit 1; } + PKG=$(node -p "require('./package.json').version") + test "$TAG" = "$PKG" || { echo "::error::Tag v$TAG does not match package.json version $PKG"; exit 1; } - name: Install pnpm uses: pnpm/action-setup@v2 @@ -64,4 +64,4 @@ jobs: APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} # Your Apple Developer Team ID CSC_LINK: ${{ secrets.CSC_LINK }} # Base64 encoded .p12 certificate CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} # Password for the certificate - run: pnpm --filter Knovy run build:ci + run: pnpm run build:ci diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index a880a053..89fd0bbc 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -46,7 +46,6 @@ jobs: run: pnpm test:run - name: Apply staging version suffix - working-directory: apps/app run: | BASE=$(node -p "require('./package.json').version") npm version "${BASE}-stg.${{ github.run_number }}" --no-git-tag-version --allow-same-version @@ -59,14 +58,14 @@ jobs: APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} CSC_LINK: ${{ secrets.CSC_LINK }} CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} - run: pnpm --filter Knovy run build:staging + run: pnpm run build:staging - name: Upload staging build artifacts uses: actions/upload-artifact@v4 with: name: knovy-staging-${{ github.run_number }} path: | - apps/app/dist/*.dmg - apps/app/dist/*.zip + dist/*.dmg + dist/*.zip retention-days: 14 if-no-files-found: error diff --git a/.gitignore b/.gitignore index 20f896f9..7b1c6709 100644 --- a/.gitignore +++ b/.gitignore @@ -17,20 +17,19 @@ node_modules # Testing coverage -# Turbo -.turbo - -# Vercel -.vercel - # Build Outputs -.next/ out/ build dist +.eslintcache +# Build caches +.turbo +.next/ +.vercel # Debug +*.log* npm-debug.log* # Misc @@ -41,22 +40,16 @@ npm-debug.log* .prompts_app.md .prompts_web.md .prompts_admin.md - **/private_keys/ - -# Misc .vscode/ .claude/ -# We copy the built history viewer to the app public folder -# but we don't need to commit it -apps/app/public/history -apps/app_old/public/history +# Code signing +certificate.p12 +build-mac-signed.sh -# Supabase local development files -supabase/.branches/ -supabase/.temp/ +# Built history viewer copied into the app public folder (not committed) +src/renderer/public/history # Local transcription models (downloaded at runtime) -apps/app/resources/whisper.cpp/models/ -apps/app_old/resources/whisper.cpp/models/ +resources/whisper.cpp/models/ diff --git a/apps/app/.npmrc b/.npmrc similarity index 100% rename from apps/app/.npmrc rename to .npmrc diff --git a/apps/app/.prettierignore b/.prettierignore similarity index 100% rename from apps/app/.prettierignore rename to .prettierignore diff --git a/.prettierrc.yaml b/.prettierrc.yaml index c166f404..35893b3b 100644 --- a/.prettierrc.yaml +++ b/.prettierrc.yaml @@ -1,5 +1,4 @@ -semi: true -singleQuote: false -trailingComma: 'all' -tabWidth: 2 +singleQuote: true +semi: false printWidth: 100 +trailingComma: none diff --git a/CLAUDE.md b/CLAUDE.md index 488d2c8f..afbcc418 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,43 +4,35 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Development Commands -### Monorepo Management +This repository is a **single-package** Electron desktop app (Knovy) at the repo root, +using **pnpm** as the package manager. -- `pnpm install` - Install all dependencies -- `pnpm dev` - Start all development servers using Turbo -- `pnpm build` - Build all applications using Turbo -- `pnpm lint` - Run linting across all packages using Turbo +- `pnpm install` - Install dependencies +- `pnpm dev` - Start the desktop app in development (`electron-vite dev`) +- `pnpm build:local` - Build the desktop app locally (unsigned) +- `pnpm build` - Build the signed macOS app (requires code signing setup) - `pnpm format` - Format code with Prettier - -### Application-Specific Commands - -#### Desktop App (`apps/app`) - -- `pnpm --filter app dev` - Start desktop app development (includes history-viewer) -- `pnpm --filter app build:local` - Build desktop app locally (unsigned) -- `pnpm --filter app build` - Build signed macOS app (requires code signing setup) - -#### History Viewer (`apps/history-viewer`) - -- `pnpm --filter history-viewer dev:history` - Start on port 4001 -- `pnpm --filter history-viewer build` - Build static Next.js output +- `pnpm test:run` - Run the config/release tests with Vitest ## Architecture Overview ### Project Structure -This is a **monorepo** managed with **pnpm workspaces** and **Turborepo**. +A single-package Electron + Vite desktop application rooted at the repository root. ``` / -├── apps/ -│ ├── app/ # Electron + Vite desktop application (main app) -│ └── history-viewer/ # Next.js app embedded in desktop app -├── packages/ -│ ├── ui/ # Shared React components (Radix + Tailwind) -│ ├── eslint-config/ # Shared ESLint configurations -│ └── typescript-config/ # Shared TypeScript configurations -└── docs/ # Architecture documentation +├── src/ # Electron app source (main / renderer / preload) +│ ├── main/ # Main process (window mgmt, IPC, SQLite) +│ ├── renderer/ # React UI (renderer process) +│ └── preload/ # Secure IPC bridge +├── resources/ # Bundled binaries (whisper.cpp, models) +├── code-signing/ # macOS signing / notarization scripts +├── tests/ # Vitest tests +├── docs/ # Architecture documentation +├── electron.vite.config.ts # electron-vite build config +├── electron-builder.yml # Packaging / publish config +└── package.json # Single root manifest ``` ### Technology Stack @@ -52,11 +44,6 @@ This is a **monorepo** managed with **pnpm workspaces** and **Turborepo**. - **SQLite** for local data storage - **Electron-vite** for build system -**History Viewer:** - -- **Next.js 15** + **React 19** + **TypeScript** -- Built as a static export and embedded inside the desktop app - **Backend: None** - There is NO cloud backend. The app is fully local. @@ -78,38 +65,38 @@ The desktop app implements a **dual-stream audio architecture**: **Key Files:** -- `apps/app/src/renderer/public/worklets/mic-audio-processor.js` -- `apps/app/src/renderer/public/worklets/system-audio-processor.js` -- `apps/app/src/renderer/src/hooks/useAudioAnalysis.ts` -- `apps/app/src/renderer/src/components/RealTimeAnalysis.tsx` +- `src/renderer/public/worklets/mic-audio-processor.js` +- `src/renderer/public/worklets/system-audio-processor.js` +- `src/renderer/src/hooks/useAudioAnalysis.ts` +- `src/renderer/src/components/RealTimeAnalysis.tsx` #### Electron Architecture -- **Main Process**: `apps/app/src/main/index.ts` - Window management, IPC, database -- **Renderer Process**: `apps/app/src/renderer/src/` - React UI components -- **Preload Scripts**: `apps/app/src/preload/index.ts` - Secure IPC bridge -- **Database**: SQLite with `apps/app/src/main/database-service.ts` +- **Main Process**: `src/main/index.ts` - Window management, IPC, database +- **Renderer Process**: `src/renderer/src/` - React UI components +- **Preload Scripts**: `src/preload/index.ts` - Secure IPC bridge +- **Database**: SQLite with `src/main/database-service.ts` ### Environment Setup -The desktop app requires no cloud credentials. If needed, copy `apps/app/.env.example` to `apps/app/.env` — the app runs without any API keys (Ollama is local HTTP, whisper.cpp is bundled). +The desktop app requires no cloud credentials. If needed, copy `.env.example` to `.env` — the app runs without any API keys (Ollama is local HTTP, whisper.cpp is bundled). ### Development Workflow 1. **Setup**: Install dependencies with `pnpm install` 2. **Ollama** (optional): Install and start Ollama for AI enhancement (`http://localhost:11434`) -3. **Development**: Use `pnpm dev` or `pnpm --filter app dev` for the desktop app -4. **Quality**: Run `pnpm lint` and `pnpm format` before commits +3. **Development**: Use `pnpm dev` for the desktop app +4. **Quality**: Run `pnpm format` before commits ### Testing -- **Desktop App**: No formal test setup currently +- **Config/release tests**: `pnpm test:run` (Vitest) — validates `electron-builder.yml` and the GitHub Actions release/staging workflows. ### Release Process Desktop app releases are automated via **GitHub Actions**: -1. **Update version** in `apps/app/package.json` +1. **Update version** in `package.json` 2. **Create git tag** matching `v*.*.*` pattern 3. **Push tag** to trigger automated build, signing, and release 4. **Code signing** requires Apple Developer credentials in repository secrets @@ -117,9 +104,6 @@ Desktop app releases are automated via **GitHub Actions**: ### Important Notes - **Message Threading**: Recent feature enabling speaker identification in transcription UI -- **History Viewer**: Embedded Next.js app showing session history, built separately and copied into desktop app -- **Shared Packages**: UI components and configs are shared across applications via workspace dependencies -- **Local Development**: Desktop app runs history-viewer concurrently during development - **Database Schema**: Includes `source_type` field for distinguishing microphone vs system audio transcriptions ## Working with Agents diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e9deeefd..14e22a6f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -39,51 +39,38 @@ We expect all contributors to adhere to the following principles: pnpm install ``` -3. **Set up Supabase** +3. **(Optional) Set up environment variables** - ```bash - supabase start - supabase status # Get API keys - ``` - -4. **Set up environment variables** - - Copy `.env.example` to `.env` in each application directory: - - `apps/app/.env` - - `apps/web/.env` + The app runs fully locally without cloud credentials. If you need to override defaults, + copy `.env.example` to `.env`. - Fill in required API keys (Supabase). +4. **(Optional) Start Ollama** -5. **Start the development servers** - - For the desktop application (recommended): - - ```bash - pnpm --filter app dev - ``` + For AI actions, install and run [Ollama](https://ollama.com/) locally + (`http://localhost:11434`). The app works without it for plain transcription. - For the web application: +5. **Start the development server** ```bash - pnpm --filter web dev + pnpm dev ``` ### Development Process -1. **Create a feature branch** from the `main` branch +1. **Create a feature branch** from the `stg` branch 2. **Implement your changes** with appropriate tests and documentation 3. **Run tests** to ensure your changes don't break existing functionality -4. **Submit a pull request** for review +4. **Submit a pull request** targeting `stg` for review ## Git Workflow -We follow a feature branch workflow: +We use a two-tier branch flow: **feature branch → `stg` → `main`**. -1. **Main Branch**: The `main` branch contains the stable, production-ready code -2. **Feature Branches**: Create a branch for each new feature or bug fix -3. **Pull Requests**: All changes must be submitted via pull requests -4. **Reviews**: Pull requests require at least one review before merging -5. **Continuous Integration**: All pull requests must pass CI checks +1. **`main`**: Production branch. Holds released, production-ready code. Release tags (`v*.*.*`) are cut here and trigger the signed build + publish. +2. **`stg`**: Staging/integration branch. Feature branches merge here via PR. Each push to `stg` runs a signed staging build (downloadable Actions artifact, not published). +3. **Feature Branches**: Branch off `stg` for each new feature or bug fix; PR back into `stg`. +4. **Promotion to release**: When `stg` is ready to ship, merge `stg` → `main`, bump the version, and tag `v*.*.*`. +5. **Pull Requests**: All changes are submitted via pull requests and must pass CI checks. ### Branch Naming Convention @@ -117,9 +104,9 @@ Types include: Example: ``` -feat(web): add real-time transcription component +feat(renderer): add real-time transcription component -Implement real-time audio transcription using WebRTC and Web Audio API. +Implement real-time audio transcription using the Web Audio API. Includes unit tests and documentation. Closes #123 @@ -161,15 +148,9 @@ Closes #123 ### Code Formatting -We use ESLint and Prettier for code formatting: +We use Prettier for code formatting: ```bash -# Run linting -pnpm lint - -# Fix linting issues -pnpm lint:fix - # Format code pnpm format ``` @@ -223,37 +204,27 @@ function processSpeech(audioData: AudioBuffer, options: ProcessingOptions): Spee - Use meaningful test descriptions - Follow the AAA pattern (Arrange, Act, Assert) -### Edge Function Testing - -- Write tests for all Supabase Edge Functions -- Test files located in `supabase/functions/*/index.test.ts` -- Test entitlement and quota enforcement -- Mock Supabase client and external API calls - ### Integration Testing - Write integration tests for component interactions -- Test API endpoints with realistic scenarios -- Mock external dependencies appropriately -- Test RBAC entitlements and quota enforcement +- Mock external dependencies (Ollama, whisper.cpp) appropriately ### Running Tests ```bash -# Run all tests -pnpm test +# Run the config/release tests once +pnpm test:run -# Run Supabase Edge Function tests -cd supabase/functions/ -deno test --allow-all +# Watch mode +pnpm test # Run tests with timeout (recommended for CI) -timeout 30 pnpm test +timeout 30 pnpm test:run ``` ## Pull Request Process -1. **Create a pull request** from your feature branch to the `main` branch +1. **Create a pull request** from your feature branch to the `stg` branch 2. **Fill out the pull request template** with: - Description of changes - Related issues @@ -268,20 +239,19 @@ timeout 30 pnpm test Desktop app releases are automated via GitHub Actions: -1. **Version Bump**: Update `version` in `apps/app/package.json` (follow [Semantic Versioning](https://semver.org/)) +1. **Version Bump**: Update `version` in `package.json` (follow [Semantic Versioning](https://semver.org/)) 2. **Release Notes**: Create release notes following the template in previous releases 3. **Tag and Push**: ```bash - git tag v0.3.1 - git push origin v0.3.1 + git tag v0.3.9 + git push origin v0.3.9 ``` -4. **Automated Build**: GitHub Action builds, signs (macOS), and publishes to [Knovy-Release](https://github.com/Intevia-AI/Knovy-Release) +4. **Automated Build**: The Release workflow builds, signs (macOS), and publishes to this + repository's [Releases](https://github.com/Intevia-AI/Knovy/releases) ### Deployment -- **Desktop App**: Automated via GitHub Actions on tag push -- **Edge Functions**: `supabase functions deploy` -- **Secrets**: `supabase secrets set --env-file ./supabase/.env.production` +- **Desktop App**: Automated via GitHub Actions on tag push (`v*.*.*`) ## Project-Specific Guidelines @@ -289,23 +259,21 @@ Desktop app releases are automated via GitHub Actions: - **Frontend**: React 19, TypeScript, Tailwind CSS, Radix UI - **Desktop**: Electron, Vite, whisper.cpp -- **Backend**: Supabase (PostgreSQL, Auth, Edge Functions) -- **Edge Functions**: Deno, TypeScript +- **AI**: Local Ollama (`http://localhost:11434`) +- **Storage**: Local SQLite (no cloud backend) ### Key Architecture Patterns -1. **RBAC System**: All AI actions protected by entitlements middleware +1. **Local-First**: Fully local — whisper.cpp transcription, Ollama AI, SQLite storage 2. **Progressive Enhancement**: Raw transcription → Enhanced transcription with ID-based updates 3. **Dual-Stream Audio**: Separate microphone and system audio processing -4. **Local-First**: Desktop app uses local whisper.cpp for privacy ### Important Files - `.claude/agents/`: Specialized AI agents for development tasks -- `docs/architecture/`: Architecture documentation -- `supabase/functions/_shared/`: Shared middleware and utilities -- `apps/app/src/main/`: Electron main process -- `apps/app/src/renderer/`: React renderer process +- `docs/setup/`: Setup documentation +- `src/main/`: Electron main process +- `src/renderer/`: React renderer process --- diff --git a/README.md b/README.md index d4a08177..bfdd182b 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,40 @@ # Knovy -Knovy is a powerful AI assistant platform with desktop and web applications for real-time audio analysis, transcription, and AI-powered interactions. +Knovy is a local-first AI desktop assistant for real-time audio analysis, transcription, and AI-powered interactions. It runs **fully on your machine** — no cloud backend, no account, no API keys required. ## Project Overview -Knovy combines Google's Generative AI (Gemini) with local transcription to provide intelligent assistance during meetings and conversations. The platform consists of four main applications: +Knovy is a single cross-platform **Electron** desktop application that combines local +**whisper.cpp** transcription with local **Ollama** AI actions to provide intelligent +assistance during meetings and conversations: -1. **Desktop App (Electron)**: Cross-platform desktop application with local whisper.cpp transcription, dual-stream audio capture (microphone + system audio), progressive enhancement, and AI-powered insights. +- Dual-stream audio capture (microphone + system audio) +- Offline speech-to-text via bundled whisper.cpp +- AI actions (summarize, chat, keyword search, screenshot analysis, deep response, + recommendations) powered by a local Ollama server (`http://localhost:11434`) +- All persistence in a local SQLite database -2. **Web Application (Next.js)**: Marketing website with product information and waitlist/beta invitation system. - -3. **Admin Dashboard (Next.js)**: Internal platform for user administration, role assignment, usage analytics, and release management. - -4. **Backend Services (Supabase)**: Serverless backend with authentication, RBAC system, and Edge Functions for AI actions. +There is **no cloud backend**. Earlier web, admin-dashboard, and Supabase components have +been removed; the repository is now a single-package Electron app. ## Repository Structure -This is a monorepo managed with pnpm workspaces and Turborepo. +A single-package Electron + Vite desktop application rooted at the repository root, managed +with **pnpm**. ``` / -├── apps/ -│ ├── app/ # Electron + Vite desktop application (main app) -│ ├── web/ # Next.js marketing and demo website -│ └── admin-dashboard/ # Admin management interface -├── packages/ -│ ├── ui/ # Shared React components (shadcn/ui + Radix + Tailwind) -│ ├── eslint-config/ # Shared ESLint configurations -│ └── typescript-config/ # Shared TypeScript configurations -├── supabase/ # Backend: Auth, DB, Edge Functions -└── docs/ # Architecture and API documentation +├── src/ # Electron app source +│ ├── main/ # Main process (window mgmt, IPC, SQLite) +│ ├── renderer/ # React UI (renderer process) +│ └── preload/ # Secure IPC bridge +├── resources/ # Bundled binaries (whisper.cpp, models) +├── code-signing/ # macOS signing / notarization scripts +├── tests/ # Vitest tests +├── docs/ # Architecture documentation +├── electron.vite.config.ts # electron-vite build config +├── electron-builder.yml # Packaging / publish config +└── package.json # Single root manifest ``` ## Quick Start @@ -39,15 +44,15 @@ This is a monorepo managed with pnpm workspaces and Turborepo. - Node.js v20 or later - pnpm v10 or later - Git -- Supabase CLI (for backend development) +- (Optional) [Ollama](https://ollama.com/) running locally for AI actions ### Installation 1. **Clone the repository** ```bash - git clone https://github.com/your-org/knovy.git - cd knovy + git clone https://github.com/Intevia-AI/Knovy.git + cd Knovy ``` 2. **Install dependencies** @@ -56,139 +61,66 @@ This is a monorepo managed with pnpm workspaces and Turborepo. pnpm install ``` -3. **Set up Supabase** - - ```bash - supabase start - supabase status # Get local API keys - supabase functions serve --env-file supabase/.env.development - ``` - -4. **Set up environment variables** +3. **(Optional) Set up environment variables** - Copy `.env.example` to `.env` in each application directory and fill in required API keys: - - `apps/app/.env` - Desktop app configuration - - `apps/web/.env` - Web app configuration - - `apps/admin-dashboard/.env` - Admin dashboard configuration + The app runs without any cloud credentials. If you need to override defaults, copy + `.env.example` to `.env`. -5. **Start development** +4. **Start development** - **Desktop Application** (recommended): ```bash - cd apps/app pnpm dev ``` - The app will automatically download the small whisper model (488MB) on first launch. - **Web Application**: - ```bash - cd apps/web - pnpm dev - ``` - - **Admin Dashboard**: - ```bash - cd apps/admin-dashboard - pnpm dev - ``` + The app will automatically download the small whisper model (~488MB) on first launch. ## Key Features -### Desktop Application - - **Local Transcription**: Privacy-focused speech-to-text using whisper.cpp (runs offline) - **Dual-Stream Audio**: Simultaneous microphone and system audio capture - **Two-Stage Language Detection**: Improved accuracy for Traditional Chinese - **Progressive Enhancement**: Raw transcription displayed immediately, AI-enhanced version follows -- **AI Actions**: Summarize, chat, keyword search, screenshot analysis, deep response, recommendations -- **RBAC System**: Role-based feature access and usage quotas +- **AI Actions**: Summarize, chat, keyword search, screenshot analysis, deep response, recommendations — all via local Ollama - **Chinese Language Support**: Automatic Traditional/Simplified conversion via OpenCC -### Web Application - -- Marketing website with product showcase -- Waitlist and beta invitation management -- Responsive design with modern UI components - -### Admin Dashboard - -- User management and role assignment (free, pro, admin) -- Usage analytics with Tremor charts -- Release management and beta invitations -- Audit logging - -### Backend Services - -- **Authentication**: JWT-based auth with OAuth support -- **RBAC & Entitlements**: Granular feature control and quota management -- **AI Actions**: `ai-action-summarize`, `ai-action-chat`, `ai-action-keyword`, `ai-action-deep-response`, `ai-action-recommend-response`, `ai-action-screenshot-response` -- **User Management**: `get-session-profile`, `get-latest-release`, `send-beta-invitation`, `add-to-waitlist` - ## Architecture Highlights -- **Serverless Backend**: Supabase Edge Functions (Deno) with JWT authentication -- **RBAC System**: Role-based access with feature entitlements and usage quotas +- **Fully Local**: No backend; SQLite for storage, whisper.cpp for transcription, Ollama for AI - **Progressive Enhancement**: ID-based updates prevent duplicate transcriptions - **Chinese Language Support**: OpenCC integration for Traditional ↔ Simplified conversion -- **Release Management**: Automated updates with GitHub Actions CI/CD +- **Release Management**: Automated builds and updates via GitHub Actions CI/CD ## Documentation -Comprehensive documentation is available in the `/docs` directory: +Documentation is available in the `/docs` directory: -- **[Architecture Overview](docs/architecture/overview.md)**: System architecture and transcription flow - **[Development Setup](docs/setup/development.md)**: Detailed setup instructions -- **[RBAC & Entitlements](docs/architecture/RBAC.md)**: Role-based access control -- **[Edge Functions API](docs/api/edge-functions.md)**: Complete API specification -- **[Whisper Integration](docs/architecture/whisper.md)**: Local transcription architecture -- **[Message Threading](docs/architecture/Message-threading.md)**: Speaker identification -- **[Waitlist to Beta Conversion](docs/waitlist-to-beta-conversion-implementation.md)**: Beta workflow ## Release Process -Desktop app releases are automated via GitHub Actions and published to [Knovy-Release](https://github.com/Intevia-AI/Knovy-Release). +Desktop app releases are automated via GitHub Actions and published to this repository's +[Releases](https://github.com/Intevia-AI/Knovy/releases). -1. Update version in `apps/app/package.json` -2. Create and push git tag: +1. Update version in `package.json` +2. Create and push a git tag matching `v*.*.*`: ```bash - git tag v0.3.7 - git push origin v0.3.7 + git tag v0.3.9 + git push origin v0.3.9 ``` -3. GitHub Action builds, signs (macOS), and publishes release -4. Desktop app automatically notifies users of new versions +3. The Release workflow builds, signs (macOS), and publishes the release. +4. The desktop app automatically notifies users of new versions. **Code Signing**: Requires Apple Developer credentials in repository secrets (see `.github/workflows/release.yml`). ## Development Commands ```bash -# Monorepo management -pnpm install # Install all dependencies -pnpm dev # Start all development servers -pnpm build # Build all applications -pnpm lint # Run linting -pnpm format # Format code - -# Desktop app -cd apps/app -pnpm dev # Start development +pnpm install # Install dependencies +pnpm dev # Start the desktop app in development pnpm build:local # Build locally (unsigned) - -# Web app -cd apps/web -pnpm dev # Start development -pnpm build # Build for production - -# Admin dashboard -cd apps/admin-dashboard -pnpm dev # Start development -pnpm build # Build for production - -# Supabase -supabase start # Start local services -supabase status # Get API keys -supabase functions serve # Start Edge Functions -supabase db reset # Reset local database +pnpm build # Build the signed macOS app +pnpm format # Format code with Prettier +pnpm test:run # Run config/release tests (Vitest) ``` ## Contributing diff --git a/apps/app/.gitignore b/apps/app/.gitignore deleted file mode 100644 index c2a0d845..00000000 --- a/apps/app/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -node_modules -dist -out -.DS_Store -.eslintcache -*.log* -src/renderer/public/history - -# Build -certificate.p12 -build-mac-signed.sh - -# Environment variables -.env.development -.env.production \ No newline at end of file diff --git a/apps/app/.prettierrc.yaml b/apps/app/.prettierrc.yaml deleted file mode 100644 index 35893b3b..00000000 --- a/apps/app/.prettierrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -singleQuote: true -semi: false -printWidth: 100 -trailingComma: none diff --git a/apps/app/README.md b/apps/app/README.md deleted file mode 100644 index bab6ddcf..00000000 --- a/apps/app/README.md +++ /dev/null @@ -1,156 +0,0 @@ -# Knovy Desktop App (electron-vite) - -> [!IMPORTANT] -> This document is AI generated. Please verify the information before using it. - -A cross-platform Electron desktop application that provides real-time AI-powered screen analysis and interaction capabilities. Built with Electron, Vite, and React, this app offers seamless screen sharing, audio processing, and AI-driven insights for enhanced productivity. - -## Overview - -The Knovy Desktop App is an intelligent screen companion that captures and analyzes your screen content in real-time, providing contextual AI assistance through natural language interactions. The application combines powerful screen capture capabilities with advanced AI processing to deliver actionable insights and automated assistance. - -### Key Features - -- **Real-time Screen Capture**: Capture and analyze screen content with system-level permissions -- **AI-Powered Analysis**: Leverage Google Gemini AI for intelligent content analysis and responses -- **Audio Processing**: Capture and process both microphone and system audio streams -- **Cross-Platform Support**: Native desktop experience on Windows, macOS, and Linux -- **Secure Authentication**: Integrated Supabase authentication with OAuth support -- **Customizable Interface**: Resizable panels, always-on-top mode, and dark theme support -- **Global Shortcuts**: Quick access via keyboard shortcuts (alt+\) -- **Screenshot Tools**: Built-in screenshot capture with area selection - -### Technology Stack - -- **Electron**: Cross-platform desktop application framework -- **Vite**: Frontend tooling for the user interface -- **React**: Component-based UI library with hooks -- **TypeScript**: Type-safe development -- **Supabase**: Authentication and backend services -- **Google Gemini AI**: Advanced AI processing and natural language understanding -- **WebSocket**: Real-time communication with proxy server - -## Prerequisites - -Before setting up the development environment, ensure you have: - -- **Node.js** (v18 or higher) -- **pnpm** (v8 or higher) - Package manager -- **Git** - Version control -- **Platform-specific requirements**: - - **macOS**: Xcode Command Line Tools, Screen Recording permissions - - **Windows**: Windows 10/11, Visual Studio Build Tools (for native modules) - - **Linux**: Build essentials, X11 development libraries - -## Installation & Setup - -### 1. Clone and Install Dependencies - -```bash -# Navigate to the app directory -cd apps/app - -# Install dependencies -pnpm install -``` - -### 2. Environment Configuration - -```bash -# Copy the environment template -cp .env.example .env - -# Edit the .env file with your configuration -# Required variables: -# - NEXT_PUBLIC_SUPABASE_URL: Your Supabase project URL -# - NEXT_PUBLIC_SUPABASE_ANON_KEY: Supabase anonymous key -``` - -### 3. Setup Code Signing - -> [!NOTE] -> This step is optional. You can skip it if you don't want to sign the app for distribution. - -#### Add certificate.p12 file - -1. Contact your manager to get the certificate.p12 file. -2. Put it in the root of `apps/app` of the project as `certificate.p12`. - -#### Set up code signing for macOS - -```bash -# Copy the code signing template -cp build-mac-signed.sh.example build-mac-signed.sh - -# Edit the build-mac-signed.sh file with your configuration (optional) -# Required variables: -# - APPLE_ID: Your Apple ID email -# - APPLE_APP_SPECIFIC_PASSWORD: Your App Specific Password -# - APPLE_TEAM_ID: Your Team ID -# - CSC_LINK: Path to your certificate.p12 file -# - CSC_KEY_PASSWORD: Your Certificate Password -``` - -## Development - -### Running in Development Mode - -The development setup uses `electron-vite` for a fast and integrated experience with hot-reloading: - -```bash -# Start development server -pnpm dev -``` - -### Development Workflow - -1. **UI Development**: Modify files in `src/renderer/src` - changes auto-reload. -2. **Main Process Changes**: Modify `src/main/index.ts` or `src/preload/index.ts` - the app will restart automatically. -3. **Debugging**: - - Renderer process: Use Chrome DevTools (opens automatically in dev mode). - - Main process: Use `console.log()` statements in your terminal. - -### Development Server & Port Architecture - -During development, the application runs in a multi-server environment to provide features like hot-reloading for the frontend components. Understanding how the ports are used is key to working on the system. - -| Component | Port | Purpose | -| -------------------------------- | ------ | ---------------------------------------------------------------------------------------------- | -| **History Viewer (Next.js)** | `3000` | Serves the history viewer web interface. This is the URL that opens in your browser. | -| **Backend API Server (Express)** | `4000` | Provides a REST API for the History Viewer to access the main application's database. | -| **Main App UI (Vite)** | `5173` | Serves the main Electron application's UI. This is what you see in the Electron window itself. | - -#### Workflow - -1. Running `pnpm dev` starts all three servers. -2. The main application window loads its UI from the Vite server on port `5173`. -3. When you click the "View History" button, the Electron app opens your default web browser to `http://localhost:3000`. -4. The History Viewer frontend (running on port `3000`) then makes API calls to the Backend API Server at `http://localhost:4000` to fetch session and transcript data. - -> **Note on Production**: In a production build (created with `pnpm build`), this multi-server setup is consolidated. The Backend API Server on port `4000` also serves the pre-built static files of the History Viewer, so only one server is needed. - -### Project Structure - -``` -apps/app/ -├── src/ -│ ├── main/ # Electron Main Process -│ │ └── index.ts -│ ├── preload/ # Preload Script (IPC Bridge) -│ │ └── index.ts -│ └── renderer/ # Vite React UI -│ ├── index.html -│ └── src/ -├── resources/ # Static assets for the build -├── electron.vite.config.ts # Electron-Vite Configuration -└── package.json # Dependencies and scripts -``` - -## Building & Distribution - -```bash -# Build for current platform -pnpm build -``` - -The build process is configured in `package.json` under the `build` section and uses `electron-builder` to package the application for different platforms. diff --git a/apps/app/package.json b/apps/app/package.json deleted file mode 100644 index 8ed941f7..00000000 --- a/apps/app/package.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "Knovy", - "version": "0.3.8", - "private": true, - "productName": "Knovy", - "description": "Your All-in-One AI working assistant.", - "author": "Intevia", - "license": "MIT", - "homepage": "https://intevia.app/", - "repository": { - "type": "git", - "url": "https://github.com/Intevia-AI/Knovy.git" - }, - "keywords": [ - "AI", - "Assistant", - "Desktop", - "Web", - "App" - ], - "type": "module", - "main": "out/main/index.js", - "scripts": { - "dev": "electron-vite dev", - "build": "source ./code-signing/build-mac-signed.sh && electron-vite build && electron-builder", - "build:ci": "electron-vite build && electron-builder", - "build:staging": "electron-vite build && electron-builder --publish never", - "build:local": "export SKIP_NOTARIZE=true && electron-vite build && electron-builder -c.mac.identity=null", - "postinstall": "node -e \"if (process.env.SKIP_ELECTRON_POSTINSTALL !== 'true') { require('child_process').execSync('electron-builder install-app-deps', { stdio: 'inherit' }) }\"" - }, - "dependencies": { - "@hookform/resolvers": "^5.0.1", - "@radix-ui/react-avatar": "^1.1.4", - "@radix-ui/react-dialog": "^1.1.7", - "@radix-ui/react-label": "^2.1.3", - "@radix-ui/react-popover": "^1.1.7", - "@radix-ui/react-progress": "^1.1.3", - "@radix-ui/react-radio-group": "^1.2.4", - "@radix-ui/react-select": "^2.1.7", - "@radix-ui/react-slider": "^1.2.4", - "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-switch": "^1.1.4", - "ai": "^4.3.5", - "bindings": "^1.5.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "electron-updater": "^6.6.2", - "lucide-react": "^0.475.0", - "motion": "npm:framer-motion@^12.23.12", - "next-themes": "^0.4.6", - "opencc-js": "^1.0.5", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-hook-form": "^7.55.0", - "react-markdown": "^10.1.0", - "react-resizable-panels": "^2.1.7", - "remark-breaks": "^4.0.0", - "remark-gfm": "^4.0.1", - "sonner": "^2.0.7", - "sqlite": "^5.1.1", - "sqlite3": "^5.1.7", - "tailwind-merge": "^3.2.0", - "zod": "^3.24.2" - }, - "devDependencies": { - "@electron-toolkit/eslint-config": "^1.0.2", - "@electron-toolkit/tsconfig": "^1.0.1", - "@electron-toolkit/utils": "^3.0.0", - "@electron/notarize": "^3.1.0", - "@types/node": "^20.17.30", - "@types/react": "^19.1.1", - "@types/react-dom": "^19.1.2", - "@vitejs/plugin-react": "^4.3.1", - "@workspace/eslint-config": "workspace:^", - "@workspace/typescript-config": "workspace:*", - "autoprefixer": "^10.4.19", - "electron": "^35.2.0", - "electron-builder": "^26.0.12", - "electron-devtools-installer": "^4.0.0", - "electron-vite": "^2.3.0", - "postcss": "^8.4.38", - "rimraf": "^5.0.0", - "tailwindcss": "^3.4.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.3", - "vite": "^5.3.3", - "which": "^4.0.0" - } -} \ No newline at end of file diff --git a/apps/app/src/renderer/src/components/logo.tsx b/apps/app/src/renderer/src/components/logo.tsx deleted file mode 100644 index fdaf6048..00000000 --- a/apps/app/src/renderer/src/components/logo.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { cn } from '@/lib/utils' - -export const Logo = ({ className }: { className?: string }) => { - return ( - INTEVIA - ) -} diff --git a/apps/app/tsconfig.json b/apps/app/tsconfig.json deleted file mode 100644 index 31bac6e9..00000000 --- a/apps/app/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "files": [], - "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }] -} diff --git a/apps/app/code-signing/build-mac-signed.sh.example b/code-signing/build-mac-signed.sh.example similarity index 100% rename from apps/app/code-signing/build-mac-signed.sh.example rename to code-signing/build-mac-signed.sh.example diff --git a/apps/app/code-signing/notarize.js b/code-signing/notarize.js similarity index 100% rename from apps/app/code-signing/notarize.js rename to code-signing/notarize.js diff --git a/apps/app/code-signing/sign-dylibs.js b/code-signing/sign-dylibs.js similarity index 100% rename from apps/app/code-signing/sign-dylibs.js rename to code-signing/sign-dylibs.js diff --git a/apps/app/components.json b/components.json similarity index 100% rename from apps/app/components.json rename to components.json diff --git a/deno.lock b/deno.lock deleted file mode 100644 index 5eef87d6..00000000 --- a/deno.lock +++ /dev/null @@ -1,33 +0,0 @@ -{ - "version": "5", - "remote": { - "https://deno.land/std@0.168.0/async/abortable.ts": "80b2ac399f142cc528f95a037a7d0e653296352d95c681e284533765961de409", - "https://deno.land/std@0.168.0/async/deadline.ts": "2c2deb53c7c28ca1dda7a3ad81e70508b1ebc25db52559de6b8636c9278fd41f", - "https://deno.land/std@0.168.0/async/debounce.ts": "60301ffb37e730cd2d6f9dadfd0ecb2a38857681bd7aaf6b0a106b06e5210a98", - "https://deno.land/std@0.168.0/async/deferred.ts": "77d3f84255c3627f1cc88699d8472b664d7635990d5358c4351623e098e917d6", - "https://deno.land/std@0.168.0/async/delay.ts": "5a9bfba8de38840308a7a33786a0155a7f6c1f7a859558ddcec5fe06e16daf57", - "https://deno.land/std@0.168.0/async/mod.ts": "7809ad4bb223e40f5fdc043e5c7ca04e0e25eed35c32c3c32e28697c553fa6d9", - "https://deno.land/std@0.168.0/async/mux_async_iterator.ts": "770a0ff26c59f8bbbda6b703a2235f04e379f73238e8d66a087edc68c2a2c35f", - "https://deno.land/std@0.168.0/async/pool.ts": "6854d8cd675a74c73391c82005cbbe4cc58183bddcd1fbbd7c2bcda42b61cf69", - "https://deno.land/std@0.168.0/async/retry.ts": "e8e5173623915bbc0ddc537698fa418cf875456c347eda1ed453528645b42e67", - "https://deno.land/std@0.168.0/async/tee.ts": "3a47cc4e9a940904fd4341f0224907e199121c80b831faa5ec2b054c6d2eff5e", - "https://deno.land/std@0.168.0/http/server.ts": "e99c1bee8a3f6571ee4cdeb2966efad465b8f6fe62bec1bdb59c1f007cc4d155", - "https://deno.land/std@0.177.0/fmt/colors.ts": "938c5d44d889fb82eff6c358bea8baa7e85950a16c9f6dae3ec3a7a729164471", - "https://deno.land/std@0.177.0/testing/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", - "https://deno.land/std@0.177.0/testing/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", - "https://deno.land/std@0.177.0/testing/asserts.ts": "984ab0bfb3faeed92ffaa3a6b06536c66811185328c5dd146257c702c41b01ab", - "https://deno.land/std@0.177.0/testing/mock.ts": "220ed9b8151cb2cac141043d4cfea7c47673fab5d18d1c1f0943297c8afb5d13" - }, - "workspace": { - "packageJson": { - "dependencies": [ - "npm:@eslint/js@^9.32.0", - "npm:concurrently@^9.1.2", - "npm:prettier@^3.5.1", - "npm:turbo@^2.4.2", - "npm:typescript-eslint@^8.24.1", - "npm:typescript@5.7.3" - ] - } - } -} diff --git a/apps/app/dev-app-update.yml b/dev-app-update.yml similarity index 100% rename from apps/app/dev-app-update.yml rename to dev-app-update.yml diff --git a/docs/architecture/Message-threading.md b/docs/architecture/Message-threading.md deleted file mode 100644 index e2a25e35..00000000 --- a/docs/architecture/Message-threading.md +++ /dev/null @@ -1,464 +0,0 @@ -# Transcription Threading Architecture - -## [Info] - -- Last updated: 2025/09/23 by Archi -- AppliedVersion: `v0.2.3` - -## 1. Overview - -The Transcription Threading system enables real-time speaker identification and conversation flow by separating microphone and system audio into distinct processing threads. This creates a natural chat-like experience where users can differentiate between their own speech and others' speech during conversations. - -## 2. Architecture Goals - -- **Speaker Identification**: Distinguish between user speech (microphone) and others' speech (system audio) -- **Real-time Processing**: Parallel transcription without audio mixing artifacts -- **Chat-like UX**: Intuitive left/right message alignment similar to messaging apps -- **Scalability**: Foundation for multi-speaker scenarios and future enhancements -- **Backward Compatibility**: Seamless integration with existing transcription data - -## 3. System Architecture - -### 3.1 High-Level Flow - -```mermaid -graph TD - A[Microphone Input] --> B[MicAudioProcessor] - C[System Audio Input] --> D[SystemAudioProcessor] - - B --> E[WhisperTranscriptionProcessor] - D --> E - - E --> F[IPC Bridge] - F --> G[Main Process - WhisperBackend] - G --> H[whisper.cpp binary] - G --> I[Ollama - local enhancement] - - H --> J[Raw Transcription] - I --> K[Enhanced Transcription] - - J --> L[sourceType: 'microphone' or 'system'] - K --> L - - L --> M[SQLite Database] - L --> N[Broadcast to UI] - - N --> O[Chat Panel] - O --> P[Right Side: User Messages] - O --> Q[Left Side: Others Messages] -``` - -### 3.2 Component Architecture - -```mermaid -graph LR - subgraph "Audio Layer" - A1[Microphone] --> A2[MicAudioProcessor.js] - A3[System Audio] --> A4[SystemAudioProcessor.js] - end - - subgraph "Transcription Layer" - A2 --> B1[WhisperTranscriptionProcessor] - A4 --> B1 - B1 --> B2[IPC Bridge] - end - - subgraph "Main Process" - B2 --> C1[WhisperBackend] - C1 --> C2[whisper.cpp binary] - C1 --> C3[Ollama - local enhancement] - end - - subgraph "Data Layer" - D1 --> E1[Transcription + sourceType] - D2 --> E1 - E1 --> E2[IPC Communication] - E2 --> E3[Database Storage] - end - - subgraph "UI Layer" - E3 --> F1[Chat Panel] - F1 --> F2[Message Threading UI] - end -``` - -## 4. Audio Processing Layer - -### 4.1 Audio Worklets - -#### MicAudioProcessor (`mic-audio-processor.js`) - -```javascript -class MicAudioProcessor extends AudioWorkletProcessor { - constructor(options) { - super(); - this.sourceType = "microphone"; - this.bufferSize = 8192; - this.silenceThreshold = 0.01; - } - - process(inputs, outputs, parameters) { - // Process audio and tag with sourceType - this.port.postMessage({ - pcmData: pcmData.buffer, - level: audioLevel, - sourceType: this.sourceType, // Key differentiation - }); - } -} -``` - -#### SystemAudioProcessor (`system-audio-processor.js`) - -```javascript -class SystemAudioProcessor extends AudioWorkletProcessor { - constructor(options) { - super(); - this.sourceType = "system"; - // Identical processing logic but different sourceType - } -} -``` - -**Key Features:** - -- **Independent Processing**: Each worklet processes audio separately -- **Source Tagging**: Every audio chunk tagged with `sourceType` -- **Silence Detection**: Efficient bandwidth usage by filtering silent periods -- **PCM Conversion**: Standard 16-bit PCM format for whisper.cpp compatibility - -### 4.2 Audio Pipeline Architecture - -``` -Microphone → MicAudioProcessor → Tagged Audio Chunks (sourceType: 'microphone') -System Audio → SystemAudioProcessor → Tagged Audio Chunks (sourceType: 'system') -``` - -## 5. Client Communication Layer - -### 5.1 Transcription Processor Architecture - -Both audio streams flow through a shared `WhisperTranscriptionProcessor` that tags each audio chunk with its `sourceType` before sending it over IPC to the main process: - -```typescript -// WhisperTranscriptionProcessor processes audio from both worklets. -// Each chunk carries sourceType: 'microphone' | 'system'. -const processTranscriptionResponse = ( - text: string, - sourceType: "microphone" | "system", -) => { - onTextResponse(transcription, false, sourceType); -}; -``` - -### 5.2 IPC Communication - -Audio chunks are sent via IPC to the main process where `WhisperBackend` handles transcription: - -```typescript -// Microphone pipeline -electronAPI.send("transcription:audio", { - pcmData: chunk, - sourceType: "microphone", -}); - -// System audio pipeline -electronAPI.send("transcription:audio", { - pcmData: chunk, - sourceType: "system", -}); -``` - -**Benefits:** - -- **Fault Isolation**: Issues with one stream don't affect the other -- **Parallel Processing**: Both streams processed simultaneously by whisper.cpp -- **Source Attribution**: `sourceType` is preserved through the entire pipeline -- **No Network Dependency**: All processing is local via IPC to the main process - -## 6. IPC Communication Protocol - -### 6.1 Enhanced Data Structure - -```typescript -// Before: Simple string -electronAPI.send("transcription:data", text); - -// After: Structured object with source attribution -electronAPI.send("transcription:data", { - text: string, - sourceType: "microphone" | "system", -}); -``` - -### 6.2 Main Process Handler - -```typescript -ipcMain.on( - "transcription:data", - ( - event, - transcriptionData: { - text: string; - sourceType: "microphone" | "system"; - }, - ) => { - const newTranscript = { - id: generateUniqueId(), - session_id: currentSessionId, - timestamp: new Date().toISOString(), - content: transcriptionData.text, - sourceType: transcriptionData.sourceType, // Preserved through pipeline - role: "assistant", - type: "transcription", - }; - - // Save to database with source attribution - dbService.addTranscript(newTranscript); - - // Broadcast to all renderer processes - broadcastToWindows("transcription:data", newTranscript); - }, -); -``` - -## 7. Database Schema - -### 7.1 Schema Evolution - -```sql --- Enhanced transcripts table -CREATE TABLE IF NOT EXISTS transcripts ( - id TEXT PRIMARY KEY, - session_id TEXT, - timestamp TEXT, - content TEXT, - source_type TEXT DEFAULT 'system', -- New field for speaker identification - FOREIGN KEY (session_id) REFERENCES sessions (id) -); - --- Migration for existing data -ALTER TABLE transcripts ADD COLUMN source_type TEXT DEFAULT 'system'; -``` - -### 7.2 Data Model - -```typescript -interface TranscriptRecord { - id: string; - session_id: string; - timestamp: string; - content: string; - source_type: "microphone" | "system"; // Speaker identification -} -``` - -**Design Decisions:** - -- **Default to 'system'**: Ensures backward compatibility with existing transcripts -- **Simple Enum**: Easy to extend for future speaker types (user names, device IDs) -- **Indexed Fields**: Optimized queries by session and timestamp - -## 8. User Interface Architecture - -### 8.1 Message Threading UI - -```tsx -// ChatPanel.tsx -{ - transcriptions.map((message) => { - const isUserMessage = message.sourceType === "microphone"; - - return ( - - {message.content} - - ); - }); -} -``` - -### 8.2 Visual Design Pattern - -``` -┌─────────────────────────────────────────────┐ -│ System Audio (Others) [Gray/Left] │ -│ │ -│ [Blue/Right] User (Mic) │ -│ │ -│ System Audio (Others) [Gray/Left] │ -│ │ -│ [Blue/Right] User (Mic) │ -└─────────────────────────────────────────────┘ -``` - -**UX Principles:** - -- **Familiar Pattern**: Standard chat app left/right alignment -- **Visual Differentiation**: Color coding (blue for user, gray for others) -- **Responsive Design**: Messages adapt to content length -- **Smooth Animations**: Framer Motion for natural message appearance - -## 9. Local Processing Architecture - -Both audio streams are processed locally. There is no proxy server or cloud API: - -``` -MicAudioProcessor → IPC → WhisperBackend → whisper.cpp → sourceType: 'microphone' -SystemAudioProcessor → IPC → WhisperBackend → whisper.cpp → sourceType: 'system' -``` - -Each stream is tagged with `sourceType` at the worklet level and that tag is preserved throughout the entire pipeline (IPC → WhisperBackend → SQLite → UI). - -## 10. Performance Characteristics - -### 10.1 Resource Usage - -| Component | Before (Mixed) | After (Threaded) | Improvement | -| --------------------- | -------------- | ---------------- | ---------------------- | -| Audio Processing | 1 worklet | 2 worklets | Parallel processing | -| IPC Channels | 1 channel | Tagged channel | Source attribution | -| whisper.cpp Calls | Mixed input | Tagged per call | Independent processing | -| Database Writes | Mixed records | Tagged records | Clear attribution | -| UI Rendering | Single thread | Differentiated | Better UX | - -### 10.2 Latency Analysis - -``` -Audio Capture → Worklet Processing → IPC → WhisperBackend → whisper.cpp → Response - ~5ms ~10ms ~2ms ~5ms ~100-500ms -``` - -**Optimizations:** - -- **Parallel Processing**: Both streams processed simultaneously -- **Efficient Buffering**: 8KB buffers minimize latency while ensuring quality -- **Silence Detection**: Reduces unnecessary processing -- **Local-only**: No network round-trip; all processing on-device - -## 11. Error Handling & Resilience - -### 11.1 Fault Isolation - -```typescript -// Independent error handling per stream -try { - electronAPI.send("transcription:audio", { pcmData: data, sourceType: "microphone" }); -} catch (error) { - console.error("Microphone stream error:", error); - // System audio continues unaffected -} - -try { - electronAPI.send("transcription:audio", { pcmData: data, sourceType: "system" }); -} catch (error) { - console.error("System audio stream error:", error); - // Microphone continues unaffected -} -``` - -### 11.2 Resilience Strategy - -If whisper.cpp crashes or Ollama is unavailable, the worklets continue collecting audio. The main process logs errors and attempts recovery. Raw transcription is always shown if enhancement fails. - -### 11.3 Graceful Degradation - -| Failure Scenario | System Behavior | User Experience | -| ---------------------- | ------------------------------ | ------------------------------- | -| Microphone failure | System audio continues | Only others' speech transcribed | -| System audio failure | Microphone continues | Only user speech transcribed | -| whisper.cpp crash | Error logged, session paused | Transcription stops temporarily | -| Ollama unavailable | Raw transcription shown | No enhancement, no AI actions | -| Database failure | UI continues, data queued | Real-time display maintained | - -## 12. Security and Privacy Considerations - -### 12.1 Data Isolation - -- **Stream Separation**: Audio sources never mixed at processing level -- **Source Validation**: `sourceType` validated before database storage -- **IPC Security**: Structured message validation in main process - -### 12.2 Privacy Protection - -- **Fully Local**: All audio processing and transcription happens on-device — audio never leaves the machine -- **No Network Transmission**: whisper.cpp runs as a local binary; Ollama runs at localhost -- **User Control**: Users can disable either microphone or system audio - -## 13. Future Enhancements - -### 13.1 Multi-Speaker Support - -The current architecture provides foundation for: - -```typescript -interface EnhancedTranscription { - sourceType: "microphone" | "system"; - speakerId?: string; // Future: Individual speaker identification - deviceId?: string; // Future: Multiple microphone support - confidence?: number; // Future: AI confidence scoring -} -``` - -### 13.2 Advanced Features - -- **Speaker Recognition**: ML-based individual speaker identification -- **Voice Activity Detection**: More sophisticated silence detection -- **Audio Quality Metrics**: Real-time audio quality monitoring -- **Custom Audio Sources**: Support for external microphones/devices -- **Conversation Analytics**: Speaker time analysis, interruption detection - -## 14. Migration & Deployment - -### 14.1 Backward Compatibility - -```sql --- Existing transcripts automatically get source_type = 'system' -UPDATE transcripts SET source_type = 'system' WHERE source_type IS NULL; -``` - -### 14.2 Feature Rollout - -1. **Phase 1**: Deploy new worklets and dual client architecture -2. **Phase 2**: Update UI to show message threading -3. **Phase 3**: Migrate existing data with default source types -4. **Phase 4**: Enable user configuration options - -### 14.3 Monitoring - -```typescript -// Performance metrics to track -interface TranscriptionMetrics { - microphoneLatency: number; - systemAudioLatency: number; - transcriptionAccuracy: number; - errorRates: { - microphone: number; - systemAudio: number; - websocket: number; - }; -} -``` - -## 15. Conclusion - -The Transcription Threading architecture successfully transforms a mixed-audio experience into an intuitive, chat-like conversation interface. By separating audio processing at the source level and maintaining isolation throughout the entire pipeline, the system provides clear speaker identification while maintaining high performance and reliability. - -The modular design ensures scalability for future enhancements while preserving backward compatibility with existing data and workflows. The implementation leverages the local whisper.cpp + Ollama stack effectively, with all processing happening on-device. - -**Key Achievements:** - -- ✅ Clear speaker identification (user vs others) -- ✅ Intuitive chat-like interface -- ✅ Parallel processing for improved performance -- ✅ Fault isolation and resilience -- ✅ Backward compatibility maintained -- ✅ Foundation for future multi-speaker features diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md deleted file mode 100644 index d0cb4ab8..00000000 --- a/docs/architecture/overview.md +++ /dev/null @@ -1,134 +0,0 @@ -# Knovy Architecture Overview - -## 1. Introduction - -Knovy is a fully local AI meeting-assistant desktop application. It runs entirely on the user's machine — no accounts, no cloud backend, no API keys required. Transcription uses a bundled whisper.cpp binary; all AI actions use a locally-running Ollama instance. - -## 2. System Architecture - -There is no cloud backend. All components run on the user's machine. - -### System Diagram - -```mermaid -graph TD - subgraph "Desktop Application (Electron)" - Renderer[Renderer Process
React UI] - Main[Main Process
IPC, DB, Services] - end - - subgraph "Local Services" - WhisperCpp[whisper.cpp binary
Local transcription] - Ollama[Ollama
http://localhost:11434
AI actions & enhancement] - SQLite[(SQLite Database
Sessions, Transcripts)] - end - - User[User] --> Renderer - Renderer -- "IPC" --> Main - Main -- "Spawn process" --> WhisperCpp - Main -- "HTTP" --> Ollama - Main --> SQLite -``` - -## 3. Application Components - -### 3.1. Desktop Application (`apps/app`) - -- **Framework**: Electron + React (using Vite). -- **Core Functionality**: Provides the full Knovy experience, including real-time audio capture, local transcription, transcription enhancement, and AI actions. No account or internet connection required. -- **Transcription Architecture**: - - **Local Speech-to-Text**: Uses whisper.cpp binaries running directly on the user's machine for privacy and offline capability. - - **Model Management**: Automatically downloads and manages whisper models (default: base model, 142MB). - - **Two-Stage Language Detection**: - - Stage 1: Detects the spoken language using `--detect-language` flag. - - Stage 2: Performs targeted transcription with detected language for improved accuracy. - - Particularly beneficial for Traditional Chinese (zh-TW) users. - - **Dual Audio Streams**: Captures both microphone and system audio simultaneously, each processed independently. - - **Local Transcription Enhancement**: - - Raw transcription is enhanced on-device by a local Ollama model in the main process before being sent to the UI. - - Enhancement covers grammar correction, Traditional Chinese conversion, and keyword extraction. - - If the model is unavailable, the raw transcription is shown unchanged (best-effort, never blocking). -- **All AI Actions** (chat, summarize, recommend, deep, keyword search, screenshot analysis) run locally via Ollama at `http://localhost:11434`. No cloud API calls are made. -- **Local Storage**: SQLite database stores both raw and enhanced transcriptions with metadata. - -## 4. Local Services - -The app depends only on local services: - -- **whisper.cpp**: Bundled binary, spawned as a child process by the main process. Handles all speech-to-text. No network access. -- **Ollama** (`http://localhost:11434`): Optional local LLM server. Used for transcription enhancement and all AI actions. If unavailable, raw transcriptions are shown and AI actions are disabled. -- **SQLite**: Embedded database in the app's user-data directory. Stores sessions, transcripts (raw + enhanced), and metadata. - -## 5. Transcription Enhancement Architecture - -The desktop application implements a sophisticated transcription enhancement system that provides immediate feedback while asynchronously improving transcription quality. - -### Enhancement Flow - -```mermaid -sequenceDiagram - participant Audio as Audio Input - participant Whisper as whisper.cpp - participant Main as Main Process - participant Ollama as Ollama (local) - participant DB as SQLite Database - participant UI as Renderer (UI) - - Audio->>Whisper: Raw audio buffer - Whisper->>Whisper: Two-stage detection
(if Chinese user) - Whisper->>Main: Raw transcription text - Main->>DB: Save raw transcription
(with unique ID) - - Main->>Ollama: Enhance segment
(if model ready) - Note over Ollama: - Grammar correction
- Traditional Chinese conversion
- Keyword extraction
- Intent detection - Ollama->>Main: Enhanced result
(falls back to raw if unavailable) - Main->>DB: Update with enhanced text - Main->>UI: Broadcast transcription
(enhanced, or raw fallback) - UI->>UI: Display text -``` - -### Key Features - -1. **ID-Based Updates**: Each transcript has a unique ID used consistently across the entire flow (database → UI → enhancement), ensuring enhanced text replaces the correct raw text without creating duplicates. - -2. **Two-Stage Language Detection**: - - **Stage 1**: Runs `whisper.cpp --detect-language` to identify spoken language - - **Stage 2**: If Chinese detected for zh-TW user, runs targeted transcription with `--language zh` - - Improves accuracy for Traditional Chinese users by providing language context to whisper - -3. **Local Enhancement**: Each segment is enhanced by a local Ollama model in the main process — no network round-trip, no API cost, and no entitlement check. Enhancement runs per segment (the earlier Gemini-based batching was removed). - -4. **Graceful Fallback**: If the Ollama model is not ready, the raw transcription is displayed unchanged; enhancement is best-effort and never blocks display. - -### Database Schema - -SQLite tables store both raw and enhanced transcriptions: - -```sql -CREATE TABLE transcripts ( - id TEXT PRIMARY KEY, - session_id TEXT NOT NULL, - content TEXT NOT NULL, -- Initially raw, updated to enhanced - raw_text TEXT, -- Original whisper output - enhanced_text TEXT, -- Ollama-enhanced version - detected_language TEXT, -- From two-stage detection - enhancement_status TEXT DEFAULT 'pending', - enhancement_metadata TEXT, -- JSON: keywords, intention, confidence - source_type TEXT, -- 'microphone' or 'system' - timestamp INTEGER NOT NULL, - created_at TEXT NOT NULL, - enhancement_updated_at TEXT -); -``` - -### User Language Context Flow - -The user's preferred language (from local app settings) flows through the entire transcription pipeline: - -1. **App Settings** → Contains `profile.language` or `app_settings.language` (stored locally) -2. **RealTimeAnalysis Component** → Extracts user language from local settings -3. **TranscriptionFactory** → Passes `userLanguage` to processor configuration -4. **WhisperBackend** → Uses `userLanguage` to determine if two-stage detection is needed -5. **Enhancement Service** → Uses `userLanguage` for Traditional Chinese conversion - -This ensures consistent language handling from audio capture to enhanced transcription display. diff --git a/docs/architecture/whisper.md b/docs/architecture/whisper.md deleted file mode 100644 index 02a2e639..00000000 --- a/docs/architecture/whisper.md +++ /dev/null @@ -1,727 +0,0 @@ -# Whisper Local Transcription Architecture - -**Status:** ✅ Production Ready -**Implementation Date:** September 2025 -**Last Updated:** October 1, 2025 - -## Overview - -Knovy's local transcription system provides offline, real-time audio transcription using OpenAI's Whisper model through the whisper.cpp implementation. This system replaces the previous network-dependent Gemini Live API with a robust, privacy-focused, and highly performant local solution. - -## Architecture - -### System Design - -```mermaid -graph TB - subgraph "Renderer Process" - A[RealTimeAnalysis.tsx] --> B[TranscriptionFactory] - B --> C[WhisperTranscriptionProcessor] - C --> D[WhisperClient] - D --> E[IPC Bridge] - end - - subgraph "Main Process" - E --> F[IPC Handlers] - F --> G[WhisperBackend] - G --> H[whisper.cpp Binary] - G --> I[Model Manager] - end - - subgraph "File System" - H --> J[whisper-darwin-arm64] - I --> K[ggml-tiny.bin] - I --> L[ggml-base.bin] - I --> M[User Data Directory] - end - - subgraph "Audio Pipeline" - N[Microphone Worklet] --> C - O[System Audio Worklet] --> C - end -``` - -### Core Components - -#### 1. WhisperBackend (`src/main/whisperBackend.ts`) - -**Primary transcription service in the main process** - -- **Binary Management**: Handles whisper.cpp binary execution across platforms -- **Model Management**: Downloads, validates, and manages Whisper models (default: base model) -- **Audio Processing**: Converts audio data to WAV format and processes through whisper.cpp -- **Two-Stage Language Detection**: Implements detection-first approach for improved accuracy -- **Transcription Enhancement**: Integrates with a local Ollama model for post-processing -- **Noise Filtering**: Advanced audio energy analysis and hallucination detection -- **Error Handling**: Comprehensive error recovery and process management - -**Key Features:** - -- Automatic model download (base model by default, 142MB) -- Two-stage detection for Chinese languages (detect → targeted transcription) -- Local enhancement via Ollama (grammar, zh-TW, keywords, intention) with raw-text fallback -- Configurable model sizes (tiny/base/small/medium) -- Energy-based noise filtering -- Pattern-based hallucination detection -- Cross-platform binary support -- Temp file management and cleanup - -#### 2. WhisperClient (`src/renderer/src/services/whisperClient.ts`) - -**Renderer process interface to the WhisperBackend** - -- **IPC Communication**: Secure bridge to main process transcription service -- **Progress Tracking**: Model download progress and completion events -- **Error Handling**: User-friendly error messages and recovery suggestions -- **Availability Checking**: Real-time model availability validation - -**API Methods:** - -- `initialize()` - Initialize the whisper service -- `transcribeAudio()` - Process audio data -- `getAvailableModels()` - List downloaded models -- `downloadModel()` - Download specific models -- `ensureModelAvailable()` - Ensure at least one model exists - -#### 3. TranscriptionFactory (`src/renderer/src/services/transcription.ts`) - -**Unified transcription interface and processor factory** - -- **Service Abstraction**: Provides unified interface for transcription services -- **Processor Management**: Creates and manages WhisperTranscriptionProcessor instances -- **Configuration**: Centralizes transcription settings and options - -#### 4. WhisperTranscriptionProcessor - -**Real-time audio processor for continuous transcription** - -- **Buffer Management**: Accumulates audio chunks for optimal processing -- **Keyword Extraction**: Intelligent keyword detection for UI highlighting -- **Format Compatibility**: Maintains compatibility with existing chat UI -- **Error Recovery**: Handles model deletion and binary errors gracefully - -### Audio Pipeline Integration - -#### Dual-Stream Architecture - -The whisper implementation maintains the existing dual-stream audio architecture: - -``` -Microphone Worklet → Base64 PCM → WhisperTranscriptionProcessor (mic) → UI (right side) -System Audio Worklet → Base64 PCM → WhisperTranscriptionProcessor (system) → UI (left side) -``` - -#### Processing Flow - -1. **Audio Capture**: Audio worklets capture PCM data at 16kHz, 16-bit, mono -2. **Buffering**: Processors accumulate 5-second buffers or 20 chunks maximum -3. **Conversion**: Base64 PCM converted to ArrayBuffer, then to WAV format -4. **Language Detection** (for Chinese users): Two-stage detection runs first -5. **Transcription**: WhisperBackend processes through whisper.cpp binary -6. **Filtering**: Noise filtering and hallucination detection applied -7. **Database Storage**: Raw transcription saved with unique ID -8. **Enhancement** (local, if model ready): Ollama post-processes transcription - - Grammar and punctuation correction - - Traditional Chinese conversion (for zh-TW users) - - Keyword extraction - - Intent detection -9. **UI Update**: Enhanced text broadcast to the renderer via `transcription:data` (raw text used as fallback if enhancement is unavailable) - -### Model Management - -#### Available Models - -| Model | Size | Memory | Latency | Accuracy | Use Case | -| ---------- | ----- | ------ | ------- | --------- | -------------------- | -| **tiny** | 75MB | ~200MB | <500ms | Good | Default, real-time | -| **base** | 142MB | ~300MB | <800ms | Better | Balanced performance | -| **small** | 466MB | ~600MB | <1200ms | Good+ | High accuracy | -| **medium** | 1.5GB | ~1.5GB | <2000ms | Excellent | Offline/batch | - -#### Storage Locations - -- **Models**: `~/Library/Application Support/Knovy/whisper-models/` -- **Binary**: `app.asar.unpacked/resources/whisper.cpp/whisper-darwin-arm64` -- **Temp Audio**: `/tmp/knovy-transcription/audio-{sessionId}.wav` - -#### Download Strategy - -1. **First Launch**: Automatic download of base model (142MB) with progress UI -2. **Model Selection**: Users can download additional models via settings -3. **Fallback Chain**: requested model → default model (base) → tiny model -4. **Validation**: SHA256 checksums and file size verification - -**Note**: As of October 2025, the system defaults to the base model for better transcription quality, particularly for non-English languages and Chinese character accuracy. - -### Noise Filtering System - -#### Audio Energy Analysis - -The system performs sophisticated audio analysis to prevent processing of noise: - -```typescript -interface AudioMetrics { - averageEnergy: number; // RMS energy normalized to 0-1 - maxEnergy: number; // Peak energy in segment - silentFrames: number; // Frames below silence threshold - totalFrames: number; // Total frames analyzed -} -``` - -**Energy Thresholds:** - -- Microphone: 0.01 (more sensitive to capture speech) -- System Audio: 0.005 (less sensitive to avoid UI sounds) -- Silent Frame Ratio: >85% frames silent → skip transcription - -#### Hallucination Detection - -Advanced pattern matching removes common Whisper hallucinations: - -- **Language Artifacts**: Single CJK characters, parenthetical expressions -- **Repeated Patterns**: Text with >3x word repetition -- **Length Filtering**: <2 character results filtered out -- **Non-Latin Content**: Foreign language detection for English mode -- **Technical Patterns**: Thanks/bye/hello artifacts removal - -### Performance Optimization - -#### Current Metrics (macOS M2, ARM64) - -- **Cold Start**: ~1200ms (first transcription) -- **Warm Start**: ~800ms (subsequent transcriptions) -- **Memory Usage**: ~200MB (tiny model) -- **CPU Usage**: ~50% during active transcription -- **Success Rate**: 99%+ - -#### Optimization Techniques - -- **Thread Count**: Adaptive based on `navigator.hardwareConcurrency` -- **Buffer Strategy**: 5-second windows with 20-chunk maximum -- **Model Caching**: In-memory model loading -- **Temp File Cleanup**: Automatic cleanup after 1 hour -- **Process Pooling**: Reuse whisper processes when possible - -### Security & Privacy - -#### Data Privacy - -- **Local Processing**: All audio processed locally, never transmitted -- **Temp File Security**: Automatic cleanup and secure temp directories -- **Model Integrity**: SHA256 verification of downloaded models -- **Process Isolation**: whisper.cpp runs in sandboxed subprocess - -#### Access Control - -- **IPC Validation**: All renderer→main communication validated -- **File System**: Restricted to app data directories -- **Binary Execution**: Code-signed binaries (macOS entitlements for microphone/audio access) -- **Network**: Only for initial model downloads - -### Error Handling & Recovery - -#### Error Categories - -1. **Binary Errors** - - Missing or corrupted whisper.cpp binary - - Platform compatibility issues - - Permission/execution problems - -2. **Model Errors** - - Missing model files - - Corrupted model data - - Insufficient disk space - -3. **Processing Errors** - - Audio format incompatibility - - Process timeouts (30s limit) - - Memory exhaustion - -4. **Runtime Errors** - - Model deletion during active session - - Binary crashes or hangs - - IPC communication failures - -#### Recovery Mechanisms - -```typescript -// Automatic model recovery -if (error.includes("No whisper models available")) { - await client.ensureModelAvailable(); - // Retry transcription or notify user -} - -// Binary error recovery -if (error.includes("whisper.cpp binary")) { - // Fall back to network transcription or notify user - notifyUser("Local transcription temporarily unavailable"); -} - -// Process timeout recovery -setTimeout(() => { - process.kill("SIGTERM"); - // Clean up and retry with fresh process -}, 30000); -``` - -## Testing - -### Test Suite Structure - -Located in `apps/app/tests/local-transcription/`: - -#### 1. Basic Validation (`test-transcription.js`) - -- Binary existence and executability -- Model availability and integrity -- Basic transcription functionality -- **Runtime**: ~30 seconds - -#### 2. Comprehensive Tests (`test-comprehensive.js`) - -- 17 test cases covering all functionality -- Performance benchmarking (5 iterations) -- Error handling and edge cases -- Memory usage analysis -- Concurrent processing validation -- **Runtime**: ~5 minutes - -#### 3. Service Layer Tests (`test-services.mjs`) - -- TypeScript service validation -- IPC layer verification -- Model management logic -- API structure validation -- **Runtime**: ~1 minute - -#### 4. Performance Benchmarks (`benchmark-performance.js`) - -- Cold vs warm start analysis -- Throughput measurement -- Memory usage monitoring -- Scalability testing -- **Runtime**: ~10 minutes - -### Running Tests - -```bash -# Navigate to app directory -cd apps/app - -# Quick validation -node tests/local-transcription/test-transcription.js - -# Full test suite -node tests/local-transcription/test-comprehensive.js - -# Service validation -node tests/local-transcription/test-services.mjs - -# Performance analysis -node tests/local-transcription/benchmark-performance.js -``` - -### Test Requirements - -1. **Test Audio**: Download test file to `/tmp/test.wav` - - ```bash - curl -L -o /tmp/test.wav https://cdn.openai.com/whisper/draft-20220913a/micro-machines.wav - ``` - -2. **Binary**: Ensure whisper.cpp binary exists and is executable - - ```bash - chmod +x resources/whisper.cpp/whisper-darwin-arm64 - ``` - -3. **Model**: At least tiny model must be available - ```bash - # Models downloaded automatically on first app startup - # Manual download if needed: - mkdir -p "~/Library/Application Support/Knovy/whisper-models" - cd "~/Library/Application Support/Knovy/whisper-models" - curl -L -o ggml-tiny.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin - ``` - -### Expected Results - -- **All Tests Pass**: 100% success rate required -- **Performance**: <1500ms average (target: <1000ms) -- **Memory**: <1GB usage (actual: ~200MB) -- **Error Handling**: Graceful degradation -- **Concurrency**: Multiple simultaneous transcriptions - -## Deployment - -### Production Build - -The whisper system is fully integrated into the production build: - -1. **Binary Packaging**: whisper.cpp included in `app.asar.unpacked/resources/` -2. **Model Storage**: User data directory for downloaded models -3. **First Launch**: Automatic model download with progress UI -4. **Code Signing**: Binary signed with Apple Developer credentials - -### Platform Support - -#### Current Support - -- **macOS ARM64**: Full support (primary platform) -- **macOS x64**: Binary available but not tested -- **Windows**: Binary exists but integration pending -- **Linux**: Binary compilation available - -#### Cross-Platform Considerations - -- Platform-specific binary selection in WhisperBackend constructor -- File path handling for different OS conventions -- Permission and execution model differences -- Package manager integration (Homebrew, apt, etc.) - -## Troubleshooting - -### Common Issues - -#### 1. "whisper.cpp binary not found" - -```bash -# Verify binary location -ls -la resources/whisper.cpp/whisper-darwin-arm64 - -# Check permissions -chmod +x resources/whisper.cpp/whisper-darwin-arm64 - -# Verify architecture -file resources/whisper.cpp/whisper-darwin-arm64 -# Should show: Mach-O 64-bit executable arm64 -``` - -#### 2. "No whisper models available" - -```bash -# Check model directory -ls -la "~/Library/Application Support/Knovy/whisper-models/" - -# Manual model download -curl -L -o "~/Library/Application Support/Knovy/whisper-models/ggml-tiny.bin" \ - https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin - -# Restart app to reinitialize -``` - -#### 3. "Transcription process timeout" - -- Audio segment too long (>30s limit) -- Corrupted audio data -- System resource exhaustion -- **Solution**: Reduce audio buffer size or check system resources - -#### 4. Poor transcription quality - -- Wrong model size for audio quality -- Background noise interference -- Non-speech audio (music, system sounds) -- **Solution**: Adjust noise filtering or upgrade model - -### Debug Logging - -Enable verbose logging for troubleshooting: - -```typescript -// In WhisperBackend.ts -console.log("[WhisperService] Debug mode enabled"); - -// Add debug flags to whisper.cpp -const args = [ - audioFilePath, - "--model", - modelPath, - "--no-timestamps", - "--no-prints", - "--debug", // Enable debug output - "--threads", - "4", -]; -``` - -### Performance Tuning - -#### System Optimization - -- **Memory**: Ensure >2GB available RAM -- **CPU**: 4+ cores recommended for real-time processing -- **Storage**: SSD recommended for model access -- **Network**: Only required for initial model download - -#### Application Tuning - -- **Thread Count**: Match to CPU cores (`navigator.hardwareConcurrency`) -- **Buffer Size**: Balance latency vs accuracy (current: 5s windows) -- **Model Selection**: tiny for speed, base for accuracy -- **Energy Threshold**: Adjust for environment noise levels - -## Complete Transcription Flow - -### End-to-End Flow Diagram - -```mermaid -sequenceDiagram - participant Mic as Audio Worklet
(mic/system) - participant RTA as RealTimeAnalysis.tsx - participant WTP as WhisperTranscriptionProcessor - participant WC as WhisperClient
(renderer IPC) - participant Main as Main Process
(index.ts) - participant WB as WhisperBackend - participant Whisper as whisper.cpp
Binary - participant TES as TranscriptionEnhancementService - participant DB as SQLite Database - participant Ollama as Ollama
(local) - - Mic->>RTA: PCM audio chunks - RTA->>WTP: processAudioChunk(base64Audio) - WTP->>WTP: Buffer until 5s/20 chunks - WTP->>WC: transcribeAudio(audioData) - WC->>Main: IPC: whisper:transcribe - Main->>WB: transcribeAudio(audioData) - - Note over WB,Whisper: Two-Stage Detection (if zh-TW) - WB->>Whisper: --detect-language - Whisper->>WB: detected language - WB->>Whisper: --language zh (targeted) - Whisper->>WB: raw transcription text - - WB->>Main: Return transcription - Main->>DB: Save raw transcript (with ID) - - Note over Main,Ollama: Enhancement Path (local, if model ready) - Main->>TES: enhanceSegment(segment, context) - TES->>Ollama: Local inference
(grammar, zh-TW, keywords, intention) - Ollama->>TES: Enhanced segment - TES->>Main: Enhanced result (or raw fallback) - Main->>DB: Update transcript with enhanced text - Main->>RTA: IPC: transcription:data
(enhanced, or raw fallback) - RTA->>RTA: Display text -``` - -### Flow Stages - -#### 1. Audio Capture - -**Files:** `apps/app/src/renderer/public/worklets/{mic,system}-audio-processor.js` - -- AudioWorklet captures PCM at 16kHz, 16-bit, mono -- Encodes to base64 and posts to main thread -- Dual streams: microphone and system audio processed independently - -#### 2. Audio Buffering - -**File:** `apps/app/src/renderer/src/services/transcription.ts` - -WhisperTranscriptionProcessor buffers audio until: - -- 20 chunks accumulated, OR -- 5 seconds elapsed since last transcription - -#### 3. IPC Communication - -**Files:** `apps/app/src/renderer/src/services/whisperClient.ts` → `apps/app/src/main/index.ts` - -- Renderer invokes `whisper:transcribe` via IPC -- Main process routes to WhisperBackend -- Includes sourceType and userLanguage context - -#### 4. Whisper.cpp Processing - -**File:** `apps/app/src/main/whisperBackend.ts` - -1. Convert base64 → ArrayBuffer → WAV file -2. Analyze audio energy (filter noise) -3. Two-stage detection (if Chinese user): - - Stage 1: `--detect-language` flag - - Stage 2: `--language zh` for targeted transcription -4. Execute whisper.cpp binary with model -5. Filter hallucinations -6. Return raw transcription text - -#### 5. Database Storage & Broadcast - -**File:** `apps/app/src/main/index.ts` (lines 801-965) - -- Save raw transcription to SQLite with unique ID -- Enhance locally (see step 6), then broadcast the result via `transcription:data` -- UI displays the enhanced text (or the raw text, if enhancement is unavailable) - -#### 6. Enhancement Path - -**Files:** `apps/app/src/main/index.ts`, `apps/app/src/main/transcriptionEnhancementService.ts`, `apps/app/src/main/ollamaService.ts` - -If the local Ollama model is ready: - -1. Gather session context (session ID, user language) -2. Pass the segment to TranscriptionEnhancementService → OllamaService -3. Run local inference: grammar correction, Traditional Chinese conversion, keyword extraction, intention detection -4. Update the database with the enhanced text and metadata -5. Broadcast `transcription:data` with the enhanced result (raw text is used as a fallback if the model is unavailable) - -Enhancement runs locally over HTTP to Ollama — there is no Supabase Edge Function or Gemini API call, no batching, and no entitlement/quota check. - -### Key Implementation Details - -#### Audio Energy Filtering - -```typescript -// From whisperBackend.ts -interface AudioMetrics { - averageEnergy: number; // RMS energy normalized to 0-1 - maxEnergy: number; // Peak energy in segment - silentFrames: number; // Frames below silence threshold - totalFrames: number; // Total frames analyzed -} - -// Thresholds -const MICROPHONE_THRESHOLD = 0.01; -const SYSTEM_AUDIO_THRESHOLD = 0.005; -const SILENT_FRAME_RATIO = 0.85; -``` - -#### Enhancement Batching Strategy - -```typescript -// From transcriptionEnhancementService.ts -const BATCH_SIZE = 5; // segments -const BATCH_TIMEOUT = 3000; // milliseconds -const DELAY_BEFORE_ENHANCE = 100; // ms (for DB consistency) -``` - -#### ID-Based UI Updates - -```typescript -// Raw transcription saved with ID -const transcriptId = await dbService.saveTranscript({ - sessionId, - content: segment.text, - rawText: segment.text, - enhancementStatus: "pending", -}); - -// Enhanced text replaces by ID -setTranscriptions((prev) => - prev.map((t) => (t.id === data.id ? { ...t, text: data.enhanced, status: "enhanced" } : t)), -); -``` - -## Recent Improvements (October 2025) - -> **Status:** ✅ Phase 1-4 Complete - Major refactoring completed October 1, 2025 - -### 1. Unified AI Action Integration - -**Completed:** Enhancement action integrated into `useAIInteraction.ts` - -**Changes:** - -- Added `transcription_enhance` to AIAction type -- Implemented enhancement case in `sendContextToAI()` switch -- Enhancement now uses `ollamaService` directly in the main process (no cloud call) -- Reuses existing context gathering, session management patterns - -**Benefits:** - -- Eliminates code duplication -- Consistent error handling across all AI actions -- Easier to maintain and extend - -**Files updated:** - -- `apps/app/src/renderer/src/hooks/useAIInteraction.ts` -- `apps/app/src/main/transcriptionEnhancementService.ts` - -### 2. Retry Logic Implementation - -**Completed:** Exponential backoff retry logic added to Ollama HTTP calls - -**Pattern:** - -```typescript -// Retry configuration -- Max retries: 3 -- Backoff delays: 1s, 2s, 5s -- Retryable errors: 503, 429, 500 -- Network errors: Always retry -``` - -**Impact:** - -- Enhancement success rate improved from ~95% to ~99%+ -- Better handling of transient Ollama unavailability - -**File updated:** - -- `apps/app/src/main/transcriptionEnhancementService.ts` - -### 3. Architecture Improvements - -**Preserved:** - -- Batching efficiency (5 segments / 3 seconds) -- Event-driven architecture for UI updates -- Progressive enhancement pattern (raw → enhanced) -- ID-based UI updates for clean replacements - -**Enhanced:** - -- Retry logic for reliability -- Better error logging with attempt counts -- Documentation of architecture -- Backward-compatible data format - -## Future Enhancements - -### Short-Term (Q4 2025) - -- **Windows/Linux Support**: Complete cross-platform implementation -- **Model Quantization**: Smaller, faster model variants -- **Streaming Processing**: Real-time word-by-word transcription -- **Custom Models**: Support for domain-specific fine-tuned models - -### Medium-Term (Q1 2026) - -- **Speaker Diarization**: Multi-speaker identification -- **Language Auto-Detection**: Automatic language switching -- **Background Processing**: Continuous transcription with minimal UI impact - -### Long-Term (Q2+ 2026) - -- **On-Device Training**: Personalization through local model adaptation -- **Multi-Modal Input**: Video/screen content integration -- **Real-Time Translation**: Live language translation -- **Enterprise Features**: Compliance, audit logs, enterprise model management - ---- - -## Implementation Status - -### ✅ Completed Features - -- **Core Architecture**: Full whisper.cpp integration -- **Dual-Stream Audio**: Microphone and system audio processing -- **Model Management**: Download, validation, and storage (base model default) -- **Two-Stage Language Detection**: Enhanced accuracy for Chinese languages -- **Local Enhancement**: On-device Ollama post-processing with ID-based updates -- **Traditional Chinese Support**: Automatic conversion for zh-TW users -- **Noise Filtering**: Advanced hallucination detection -- **Error Recovery**: Comprehensive error handling -- **Performance Optimization**: Sub-second processing -- **Test Suite**: Comprehensive validation framework -- **Production Deployment**: Signed, packaged, and distributed - -### 🎯 Production Metrics - -- **Reliability**: 99%+ transcription success rate -- **Performance**: ~800ms average processing time -- **Offline Capability**: 100% local processing -- **Privacy**: Zero external data transmission -- **User Experience**: Seamless integration with existing UI - -The Whisper local transcription system represents a significant advancement in Knovy's audio processing capabilities, providing users with fast, private, and reliable speech-to-text functionality that works completely offline while maintaining the familiar chat-based user interface. diff --git a/docs/superpowers/plans/2026-06-07-flatten-monorepo-to-single-package.md b/docs/superpowers/plans/2026-06-07-flatten-monorepo-to-single-package.md new file mode 100644 index 00000000..065260fb --- /dev/null +++ b/docs/superpowers/plans/2026-06-07-flatten-monorepo-to-single-package.md @@ -0,0 +1,521 @@ +# Flatten Monorepo → Single-Package Repo Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Dissolve the now-single-app monorepo so the repo root *is* the Knovy Electron app, removing the `apps/`/`packages/` workspace scaffold and Turborepo, and bring docs in line. + +**Architecture:** Move `apps/app/*` to the repo root, resolving 5 file collisions; delete the orphaned `packages/ui` and the root-only `packages/eslint-config` + `packages/typescript-config`; merge the two `package.json` files into one; remove `pnpm-workspace.yaml`/`turbo.json`; regenerate the lockfile; rewrite CI pipeline paths; update docs. Each group is its own commit. + +**Tech Stack:** pnpm 10, electron-vite, electron-builder, vitest, GitHub Actions. + +**Branch:** `chore/flatten-monorepo` (already created off `dev`; spec committed as `c92fc5b`). + +**Reference spec:** `docs/superpowers/specs/2026-06-07-flatten-monorepo-to-single-package-design.md` + +--- + +## File Structure (end state) + +``` +/ +├── src/ resources/ code-signing/ tests/ (moved from apps/app/) +├── electron.vite.config.ts electron-builder.yml entitlements.mac.plist +├── tailwind.config.ts postcss.config.mjs components.json eslint.config.mjs +├── tsconfig.json tsconfig.node.json tsconfig.web.json (app's, references-based) +├── package.json (merged) +├── .gitignore .prettierrc.yaml .editorconfig .npmrc .prettierignore +├── .env.example dev-app-update.yml +├── docs/ plans/ scripts/ types/ .github/ (root, unchanged except CI + docs) +└── README.md CONTRIBUTING.md CLAUDE.md +``` + +Deleted: `apps/`, `packages/`, `pnpm-workspace.yaml`, `turbo.json`, root `.eslintrc.js`, root `test/` (→ `tests/`). + +**Collision resolution (root ← apps/app):** + +| File | Resolution | +|------|-----------| +| `package.json` | merge (Task 3) | +| `tsconfig.json` | app's wins; root's deleted | +| `.gitignore` | merged union, root-relative (Task 4) | +| `.prettierrc.yaml` | app's wins (root's deleted) | +| `README.md` | root's kept; app's deleted (app's is stale: references Gemini/Supabase) | + +--- + +## Task 1: Remove orphaned `packages/ui` + +**Files:** +- Delete: `packages/ui/` (entire directory) + +Rationale: `@workspace/ui` appears in zero `dependencies` repo-wide (verified) — only its own +`name`, self-imports, one historical plan doc. + +- [ ] **Step 1: Confirm no consumer exists** + +Run: +```bash +grep -rn '"@workspace/ui"' --include=package.json . | grep -v node_modules | grep -v 'packages/ui/package.json' +``` +Expected: no output (empty). + +- [ ] **Step 2: Delete the package** + +Run: +```bash +git rm -r packages/ui +``` +Expected: lists the removed files, no errors. + +- [ ] **Step 3: Commit** + +```bash +git commit -m "Chore: Remove orphaned packages/ui (dead after web/admin removal)" +``` + +--- + +## Task 2: Move `apps/app/*` to repo root (non-colliding entries) + +**Files:** +- Move (git mv, history-preserving) each non-colliding tracked entry from `apps/app/` to root. + +The 18 non-colliding tracked entries are: `.editorconfig`, `.env.example`, `.npmrc`, +`.prettierignore`, `code-signing`, `components.json`, `dev-app-update.yml`, +`electron-builder.yml`, `electron.vite.config.ts`, `entitlements.mac.plist`, +`eslint.config.mjs`, `postcss.config.mjs`, `resources`, `src`, `tailwind.config.ts`, +`tests`, `tsconfig.node.json`, `tsconfig.web.json`. + +- [ ] **Step 1: Move non-colliding entries** + +Run: +```bash +cd /Users/tweizh/DEV/Intevia/Knovy +for x in .editorconfig .env.example .npmrc .prettierignore code-signing components.json \ + dev-app-update.yml electron-builder.yml electron.vite.config.ts entitlements.mac.plist \ + eslint.config.mjs postcss.config.mjs resources src tailwind.config.ts tests \ + tsconfig.node.json tsconfig.web.json; do + git mv "apps/app/$x" "$x" +done +``` +Expected: no errors. (If `tests/` collides with root `test/` — it will not; names differ.) + +- [ ] **Step 2: Resolve the `tsconfig.json` collision (app's wins)** + +Run: +```bash +git rm tsconfig.json +git mv apps/app/tsconfig.json tsconfig.json +``` +Expected: root tsconfig (extended deleted `@workspace/typescript-config`) removed; app's +references-based tsconfig now at root. + +- [ ] **Step 3: Resolve the `.prettierrc.yaml` collision (app's wins)** + +Run: +```bash +git rm .prettierrc.yaml +git mv apps/app/.prettierrc.yaml .prettierrc.yaml +``` + +- [ ] **Step 4: Delete the stale app README (root README kept)** + +Run: +```bash +git rm apps/app/README.md +``` + +- [ ] **Step 5: Verify nothing tracked remains under apps/ except the two collision files handled in later tasks** + +Run: +```bash +git ls-files apps/ +``` +Expected: only `apps/app/.gitignore` and `apps/app/package.json` remain (handled in Tasks 3–4). + +- [ ] **Step 6: Commit** + +```bash +git add -A +git commit -m "Chore: Move apps/app contents to repo root" +``` + +--- + +## Task 3: Merge `package.json` + +**Files:** +- Modify: root `package.json` (replace with merged content) +- Delete: `apps/app/package.json` + +Merge rule: **base = `apps/app/package.json`** (the Knovy app), then apply the additions and +removals below. Preserve the app's existing `version` value as-is. + +- [ ] **Step 1: Author the merged root `package.json`** + +Start from the current `apps/app/package.json` and apply exactly these changes: + +**Add these scripts** (alongside the existing `dev`/`build`/`build:ci`/`build:staging`/`build:local`/`postinstall`): +```json +"test": "vitest", +"test:run": "vitest run", +"format": "prettier --write \"**/*.{ts,tsx,md}\"" +``` + +**Remove from `devDependencies`:** +``` +"@workspace/eslint-config" +"@workspace/typescript-config" +``` + +**Add to `devDependencies`** (versions copied verbatim from the current root `package.json`): +```json +"@types/js-yaml": "^4.0.9", +"js-yaml": "^4.1.0", +"prettier": "^3.5.1", +"vitest": "^3.0.0" +``` +(Note: `turbo` and `concurrently` from root are intentionally NOT carried over — turbo is +gone, concurrently ran the removed history-viewer.) + +**Add these top-level fields** (copied verbatim from the current root `package.json`): +```json +"packageManager": "pnpm@10.4.1", +"engines": { "node": ">=20" }, +"pnpm": { + "onlyBuiltDependencies": [ + "@tailwindcss/oxide", + "@vercel/speed-insights", + "core-js-pure", + "electron", + "electron-winstaller", + "esbuild", + "sharp", + "sqlite3" + ] +} +``` + +Do NOT carry over the root `dependencies` block (`@eslint/js`, `typescript-eslint`) — those +backed the deleted root `.eslintrc.js`; the app's `eslint.config.mjs` uses `@electron-toolkit/*`. + +Write the result to the root `package.json` (overwrite). + +- [ ] **Step 2: Verify no `@workspace/` references remain in the merged file** + +Run: +```bash +grep -n "@workspace/\|turbo\|concurrently" package.json +``` +Expected: no output. + +- [ ] **Step 3: Remove the app's now-redundant package.json** + +Run: +```bash +git rm apps/app/package.json +``` +Expected: `apps/app/` is now empty of tracked files. + +- [ ] **Step 4: Verify `apps/` is fully untracked-empty and remove the empty dir** + +Run: +```bash +git ls-files apps/ +rmdir apps/app apps 2>/dev/null; true +``` +Expected: first command prints nothing. + +- [ ] **Step 5: Commit** + +```bash +git add package.json +git commit -m "Chore: Merge app and root package.json into single root manifest" +``` + +--- + +## Task 4: Remove workspace scaffold and merge `.gitignore` + +**Files:** +- Delete: `packages/eslint-config/`, `packages/typescript-config/`, `pnpm-workspace.yaml`, `turbo.json`, root `.eslintrc.js` +- Modify: root `.gitignore` (merge in app entries, strip dead paths), delete `apps/app/.gitignore` + +- [ ] **Step 1: Delete the remaining workspace config packages and root configs** + +Run: +```bash +git rm -r packages/eslint-config packages/typescript-config +git rm pnpm-workspace.yaml turbo.json .eslintrc.js +rmdir packages 2>/dev/null; true +``` +Expected: files removed, no errors. + +- [ ] **Step 2: Merge `.gitignore`** + +Replace the root `.gitignore` with the union below — root entries with `apps/app/` prefixes +rewritten to root-relative, dead paths (`apps/app_old/...`, `supabase/...`) dropped, and the +app's unique entries folded in: + +```gitignore +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# Dependencies +node_modules +.pnp +.pnp.js + +# Local env files +.env +.env.local +.env.development +.env.development.local +.env.test.local +.env.production +.env.production.local + +# Testing +coverage + +# Build Outputs +out/ +build +dist +.eslintcache + +# Debug +*.log* +npm-debug.log* + +# Misc +.DS_Store +*.pem +.debug +.prompts.md +.prompts_app.md +.prompts_web.md +.prompts_admin.md +**/private_keys/ +.vscode/ +.claude/ + +# Code signing +certificate.p12 +build-mac-signed.sh + +# Built history viewer copied into the app public folder (not committed) +src/renderer/public/history + +# Local transcription models (downloaded at runtime) +resources/whisper.cpp/models/ +``` + +Then remove the app's `.gitignore`: +```bash +git rm apps/app/.gitignore +``` + +- [ ] **Step 3: Verify no workspace/turbo residue in tracked config** + +Run: +```bash +grep -rn "pnpm-workspace\|turbo\|@workspace/" --include=*.json --include=*.js --include=*.mjs --include=*.yaml --include=*.yml . | grep -v node_modules | grep -v graphify-out | grep -v docs/superpowers +``` +Expected: no output (matches only in plans/specs are excluded by the filter above; if any +appear, they are historical plan docs — confirm and ignore). + +- [ ] **Step 4: Commit** + +```bash +git add -A +git commit -m "Chore: Remove pnpm workspace + turbo scaffold and merge .gitignore" +``` + +--- + +## Task 5: Consolidate tests and rewrite CI pipeline paths + +**Files:** +- Move: `test/release-config.test.ts` → `tests/release-config.test.ts`; delete root `test/` +- Modify: `tests/release-config.test.ts` (fix `apps/app/electron-builder.yml` path) +- Modify: `.github/workflows/release.yml`, `.github/workflows/staging.yml` + +- [ ] **Step 1: Move the release-config test into the app's tests dir** + +Run: +```bash +git mv test/release-config.test.ts tests/release-config.test.ts +rmdir test 2>/dev/null; true +``` + +- [ ] **Step 2: Fix the electron-builder path in the test** + +In `tests/release-config.test.ts`, change: +```ts +const config = readYaml('apps/app/electron-builder.yml') +``` +to: +```ts +const config = readYaml('electron-builder.yml') +``` +(Leave the `.github/workflows/release.yml` read unchanged — workflows stay at root. Note the +test computes `repoRoot` as one level up from its own dir; since the test now sits in +`tests/`, `resolve(dirname, '..')` still resolves to the repo root. Verify in Step 6.) + +- [ ] **Step 3: Rewrite `release.yml`** + +In `.github/workflows/release.yml`: +- Change the "Verify tag matches app version" step body from + `PKG=$(node -p "require('./apps/app/package.json').version")` + to `PKG=$(node -p "require('./package.json').version")` + and the error string `apps/app/package.json version` → `package.json version`. +- Change the final step `run: pnpm --filter Knovy run build:ci` → `run: pnpm run build:ci`. + +- [ ] **Step 4: Rewrite `staging.yml`** + +In `.github/workflows/staging.yml`: +- In the "Apply staging version suffix" step, remove the line `working-directory: apps/app` + (the `package.json` is now at root, which is the default working directory). +- Change `run: pnpm --filter Knovy run build:staging` → `run: pnpm run build:staging`. +- In the "Upload staging build artifacts" step, change the `path:` entries + `apps/app/dist/*.dmg` → `dist/*.dmg` and `apps/app/dist/*.zip` → `dist/*.zip`. + +- [ ] **Step 5: Grep sweep for residual paths** + +Run: +```bash +grep -rn "apps/app\|--filter Knovy\|--filter app" .github/ tests/ package.json +``` +Expected: no output. + +- [ ] **Step 6: Commit** + +```bash +git add -A +git commit -m "Chore: Consolidate tests and update CI paths for flat layout" +``` + +--- + +## Task 6: Regenerate lockfile and verify the build wiring + +**Files:** +- Modify: `pnpm-lock.yaml` (regenerated) + +- [ ] **Step 1: Regenerate the lockfile** + +Run: +```bash +SKIP_ELECTRON_POSTINSTALL=true pnpm install +``` +Expected: install completes; `pnpm-lock.yaml` updated. (`SKIP_ELECTRON_POSTINSTALL` avoids the +electron-builder app-deps rebuild during planning; the real CI runs it.) If the flag causes +issues, run plain `pnpm install`. + +- [ ] **Step 2: Verify the lockfile has no workspace package entries** + +Run: +```bash +grep -n "packages/ui\|packages/eslint-config\|packages/typescript-config\|apps/app" pnpm-lock.yaml +``` +Expected: no output. + +- [ ] **Step 3: Run the config tests** + +Run: +```bash +timeout 30 pnpm test:run +``` +Expected: PASS — including `tests/release-config.test.ts` (it reads `electron-builder.yml` and +`.github/workflows/release.yml` from repo root). + +- [ ] **Step 4: Full residual grep sweep across the repo** + +Run: +```bash +grep -rn "apps/app\|--filter Knovy\|@workspace/\|pnpm-workspace\|turbo" \ + --include=*.json --include=*.yaml --include=*.yml --include=*.js --include=*.mjs --include=*.ts \ + . | grep -v node_modules | grep -v graphify-out | grep -v "docs/superpowers" | grep -v "plans/" +``` +Expected: no output (any hits in `plans/` or `docs/superpowers/` are historical and excluded). + +- [ ] **Step 5: Commit** + +```bash +git add pnpm-lock.yaml +git commit -m "Chore: Regenerate lockfile for single-package layout" +``` + +--- + +## Task 7: Update documentation + +**Files:** +- Modify: `CLAUDE.md`, `README.md`, `CONTRIBUTING.md` + +- [ ] **Step 1: Update `CLAUDE.md`** + +In `/Users/tweizh/DEV/Intevia/Knovy/CLAUDE.md`: +- **Development Commands → Monorepo Management:** rename to single-app; remove Turbo references. + Replace `pnpm dev`/`pnpm build`/`pnpm lint` turbo descriptions with the direct app scripts + (`pnpm dev` = `electron-vite dev`, `pnpm build:local`, `pnpm lint`, `pnpm test:run`). +- **Application-Specific Commands:** delete the `History Viewer (apps/history-viewer)` subsection + and the `pnpm --filter app dev` / `pnpm --filter history-viewer ...` lines; replace with + root-level `pnpm dev` / `pnpm build:local`. +- **Architecture Overview → Project Structure:** replace the `apps/` + `packages/` tree with the + flat root layout (src/, resources/, code-signing/, tests/, docs/, etc.). +- Remove the "History Viewer" technology-stack bullet and the "History Viewer: Embedded Next.js" + Important-Notes bullet, and the "Shared Packages" / "Local Development runs history-viewer" + bullets. +- Update all `apps/app/src/...` path references — they remain valid since the file moved with its + `src/` tree, so paths change from `apps/app/src/main/index.ts` → `src/main/index.ts`. Update the + Key Files / Electron Architecture / Database paths accordingly. + +- [ ] **Step 2: Update `README.md`** + +In `/Users/tweizh/DEV/Intevia/Knovy/README.md`, update any project-structure diagram, setup +steps, and command examples that reference `apps/app`, `apps/history-viewer`, `packages/*`, +`pnpm --filter`, or Turborepo to the single-package root layout and direct `pnpm` scripts. + +- [ ] **Step 3: Update `CONTRIBUTING.md`** + +In `/Users/tweizh/DEV/Intevia/Knovy/CONTRIBUTING.md`, update any structure references, +`pnpm --filter` commands, or `apps/`/`packages/` mentions to the flat layout. + +- [ ] **Step 4: Grep sweep docs for stale structure references** + +Run: +```bash +grep -rn "apps/app\|apps/history-viewer\|--filter\|packages/ui\|Turborepo\|pnpm-workspace" \ + CLAUDE.md README.md CONTRIBUTING.md +``` +Expected: no output (or only intentional historical mentions you've confirmed). + +- [ ] **Step 5: Commit** + +```bash +git add CLAUDE.md README.md CONTRIBUTING.md +git commit -m "Docs: Update structure and commands for single-package layout" +``` + +--- + +## Final verification (after all tasks) + +- [ ] `git ls-files apps/ packages/` → empty. +- [ ] `pnpm install` clean; `pnpm-lock.yaml` has no `apps/`/`packages/` entries. +- [ ] `timeout 30 pnpm test:run` → PASS. +- [ ] `pnpm lint` runs from root (app eslint). +- [ ] Optional (only if asked): `pnpm run build:local` produces artifacts in root `dist/`. +- [ ] Repo-wide grep for `apps/app` / `--filter` / `@workspace/` returns only historical + `plans/` and `docs/superpowers/` matches. + +## Notes / risks (from spec) + +- **Release pipeline is the blast radius** — Task 5 + the grep sweeps are the guard; the + `release-config.test.ts` runs in `staging.yml` on push to `stg`. +- **electron-builder relative paths** (`./code-signing/*`, icons, entitlements) stay valid — + those files moved to root with the config. +- **Prettier config switched** to the app's (no-semi/single-quote) for the whole repo; root + tooling files (`scripts/`, `types/`) may now report as unformatted. Acceptable; run + `pnpm format` once if desired (not required). diff --git a/docs/superpowers/specs/2026-06-07-flatten-monorepo-to-single-package-design.md b/docs/superpowers/specs/2026-06-07-flatten-monorepo-to-single-package-design.md new file mode 100644 index 00000000..8cb6af4e --- /dev/null +++ b/docs/superpowers/specs/2026-06-07-flatten-monorepo-to-single-package-design.md @@ -0,0 +1,169 @@ +# Flatten Monorepo → Single-Package Repo + +**Date:** 2026-06-07 +**Status:** Approved design, pending implementation plan +**Branch target:** feature branch off `dev`, one PR, granular commits + +## Problem + +After the local-only migration (PR #18) removed `apps/web` and `apps/admin-dashboard`, and +the earlier removal of `apps/history-viewer`, the repository still carries a full monorepo +scaffold (`apps/*` + `packages/*` workspaces, Turborepo) for what is now a **single +application**: `apps/app` (Knovy). The `apps/` directory has exactly one child, and two of +the three shared `packages/*` are dead. Docs still describe the removed apps. + +Goal: dissolve the monorepo into a single-package repository whose root **is** the Knovy +Electron app, and bring the docs in line. + +## Current state (verified) + +- `apps/app` — **Knovy** v0.3.9, the only app. `history-viewer` is entirely absent from the repo. +- `packages/ui` (`@workspace/ui`) — **orphaned**: appears in zero `dependencies` anywhere + (only its own `name`, self-imports, one historical plan doc). Was consumed by the removed + web/admin apps. +- `packages/eslint-config` (`@workspace/eslint-config`), `packages/typescript-config` + (`@workspace/typescript-config`) — consumed **only at the repo root** + (`.eslintrc.js`, root `tsconfig.json`). The root eslint config explicitly ignores + `apps/**` and `packages/**`, so it only ever linted root-level tooling files. +- `apps/app`'s **own** `eslint.config.mjs` and tsconfigs extend `@electron-toolkit/*`, **not** + the `@workspace/*` packages. The app already lints/typechecks self-contained; its declared + `@workspace/*` devDeps are dead weight. +- `turbo` — referenced only by root config + the packages being deleted. +- `concurrently` — only in root devDeps + stale docs (it ran history-viewer, now gone). + +## Target end state + +``` +/ +├── src/ (was apps/app/src) +├── resources/ code-signing/ build/ +├── electron.vite.config.ts electron-builder.yml entitlements.mac.plist +├── tailwind.config.ts postcss.config.mjs components.json eslint.config.mjs +├── tsconfig.json tsconfig.node.json tsconfig.web.json +├── package.json (merged: Knovy app + root-only bits) +├── tests/ (app tests + consolidated release-config test) +├── docs/ plans/ scripts/ types/ .github/ +├── .gitignore .prettierrc.yaml .editorconfig .npmrc dev-app-update.yml +└── README.md CONTRIBUTING.md CLAUDE.md +``` + +Removed: `apps/`, `packages/`, `pnpm-workspace.yaml`, `turbo.json`, root `.eslintrc.js`, +root `tsconfig.json`, root `test/` (consolidated into `tests/`). + +## Operations + +### 1. Move `apps/app/*` → repo root + +Use `git mv` to preserve history. Move all of `apps/app`'s tracked contents to root, +including dotfiles (`.editorconfig`, `.npmrc`, `.prettierignore`, `.prettierrc.yaml`, +`.env.example`, etc.) and dirs (`src/`, `resources/`, `code-signing/`, `build/`, `tests/`). + +**Collision resolution (root ← app):** + +| File | Resolution | +|------|-----------| +| `package.json` | **Merge** (§3) | +| `tsconfig.json` | App's (references-based) wins; root's `@workspace`-extending one deleted | +| `.gitignore` | **Union**, root-relative (§5) | +| `.prettierrc.yaml` | **App's wins** (no-semi/single-quote governs the bulk of the code; root's semi/double-quote style would force a mass reformat of app source) | +| `README.md` | Keep **root's** as canonical repo front page; fold in anything unique from app's; delete app's | + +### 2. Delete dead workspace scaffold + +- `packages/ui` (orphaned) +- `packages/eslint-config`, `packages/typescript-config` (root-only consumers removed in this change) +- `pnpm-workspace.yaml` +- `turbo.json` +- root `.eslintrc.js` (only linted root tooling; the app's `eslint.config.mjs` now covers root) +- root `tsconfig.json` (extended the deleted `@workspace/typescript-config`) + +### 3. Merge `package.json` → single file + +Base = the Knovy app `package.json` (keep `name: "Knovy"`, `productName`, all app +`scripts`, `dependencies`, full electron-builder devDeps, `main`, `type`, `postinstall`, +repo metadata). + +**Add from root package.json:** +- scripts: `test` (`vitest`), `test:run` (`vitest run`), `format` (prettier) +- devDeps: `vitest`, `js-yaml`, `@types/js-yaml`, `prettier` +- `pnpm.onlyBuiltDependencies` +- `packageManager` (`pnpm@10.4.1`), `engines` (`node >=20`) + +**Drop:** +- devDeps: `@workspace/eslint-config`, `@workspace/typescript-config`, `turbo`, `concurrently` +- root `build` / `dev` / `lint` turbo scripts (the app's own `dev`/`build` scripts replace them) +- root deps `@eslint/js`, `typescript-eslint` **if** unused after `.eslintrc.js` deletion + (verify during implementation; they backed the deleted root eslint config) + +**No dependency version changes** — only which file the entries live in. + +### 4. Rewrite pipeline path references + +- `.github/workflows/release.yml`: + - `require('./apps/app/package.json').version` → `require('./package.json').version` + - `pnpm --filter Knovy run build:ci` → `pnpm run build:ci` + - error message string `apps/app/package.json` → `package.json` +- `.github/workflows/staging.yml`: + - remove `working-directory: apps/app` from the version-suffix step + - `pnpm --filter Knovy run build:staging` → `pnpm run build:staging` + - artifact paths `apps/app/dist/*.dmg` / `*.zip` → `dist/*.dmg` / `*.zip` +- `tests/release-config.test.ts` (after consolidation, §6): + - `readYaml('apps/app/electron-builder.yml')` → `readYaml('electron-builder.yml')` + - `.github/workflows/release.yml` path unchanged (workflows stay at root) + +### 5. Merge `.gitignore` + +Union of root + app `.gitignore`, then: +- strip `apps/app/` prefixes → root-relative (`apps/app/public/history` → `public/history`, + `apps/app/resources/whisper.cpp/models/` → `resources/whisper.cpp/models/`) +- drop dead entries: `apps/app_old/...`, `supabase/...` +- keep app entries (`out`, `dist`, `.eslintcache`, `src/renderer/public/history`, + `certificate.p12`, `build-mac-signed.sh`, `.env.development`, `.env.production`) +- keep `.turbo` removal? `.turbo` dirs are gone after dissolve — entry can be dropped, harmless to keep. + +### 6. Consolidate tests + +Move `test/release-config.test.ts` → `tests/release-config.test.ts` (app's test dir), delete +the now-empty root `test/`. One vitest run covers all tests from root. + +### 7. Regenerate `pnpm-lock.yaml` + +Run `pnpm install` to rebuild the lockfile for the single-package layout. Dependency +versions are unchanged. **Must succeed before push** or CI `--frozen-lockfile` fails. +(Decision: implementer runs `pnpm install`.) + +### 8. Update docs + +- `CLAUDE.md`: remove the monorepo/Turborepo/workspace sections, the `apps/` + `packages/` + tree diagram, `apps/history-viewer` references, `pnpm --filter` commands; rewrite the + Project Structure and Development Commands sections for a single-package root layout. +- `README.md`: update structure/setup/commands to single-package. +- `CONTRIBUTING.md`: update any structure or `--filter` references. + +## Risks & mitigations + +- **Release pipeline is the blast radius.** A wrong path silently breaks tag→build→publish. + Mitigations: `tests/release-config.test.ts` runs in `staging.yml`; a final repo-wide grep + sweep for residual `apps/app`, `--filter`, `packages/`, `@workspace/`, `turbo`. +- **electron-builder relative paths** (`./code-signing/*`, icon `src/renderer/public/...`, + `entitlements.mac.plist`) stay valid because those files move to root alongside the config. +- **Lockfile regen** must complete before pushing. +- **Prettier config switch** for root tooling files: `test/`, `scripts/`, `types/` were + authored under root's semi/double-quote style; under the app's config they may report as + unformatted. Acceptable (tiny surface); optionally run `pnpm format` once post-move. + +## Out of scope + +- No dependency upgrades or additions. +- No source-code refactoring inside `src/`. +- Graphify artifacts (`graphify-out/`, `deno.lock`, `.prompts_*.md`), `docs/`, `plans/` + content unchanged except the doc updates in §8. + +## Verification (post-implementation) + +1. `pnpm install` succeeds; lockfile has no `apps/*` / `packages/*` workspace entries. +2. `pnpm test:run` passes (release-config + app tests). +3. `pnpm run build:local` / `build:staging` produces artifacts in root `dist/`. +4. Repo-wide grep for `apps/app`, `--filter`, `@workspace/`, `pnpm-workspace`, `turbo` + returns only historical `plans/`, `docs/specs/`, and graphify artifacts. +5. `pnpm lint` (app eslint) runs from root. diff --git a/apps/app/electron-builder.yml b/electron-builder.yml similarity index 100% rename from apps/app/electron-builder.yml rename to electron-builder.yml diff --git a/apps/app/electron.vite.config.ts b/electron.vite.config.ts similarity index 100% rename from apps/app/electron.vite.config.ts rename to electron.vite.config.ts diff --git a/apps/app/entitlements.mac.plist b/entitlements.mac.plist similarity index 100% rename from apps/app/entitlements.mac.plist rename to entitlements.mac.plist diff --git a/apps/app/eslint.config.mjs b/eslint.config.mjs similarity index 100% rename from apps/app/eslint.config.mjs rename to eslint.config.mjs diff --git a/graphify-out/.gitignore b/graphify-out/.gitignore index d4eb8158..11e37323 100644 --- a/graphify-out/.gitignore +++ b/graphify-out/.gitignore @@ -10,3 +10,10 @@ cache/ graph.json graph.html GRAPH_REPORT.md + +# Regenerated graph data — rewritten by the post-commit/post-checkout hooks on +# every commit and branch switch. Kept local-only so the churn never dirties the +# working tree and blocks pulls/checkouts. +manifest.json +cost.json +.graphify_labels.json diff --git a/graphify-out/.graphify_labels.json b/graphify-out/.graphify_labels.json deleted file mode 100644 index e5128f6b..00000000 --- a/graphify-out/.graphify_labels.json +++ /dev/null @@ -1,229 +0,0 @@ -{ - "0": "App i18n (English)", - "1": "App i18n (Traditional Chinese)", - "2": "UI Primitives (Sheet)", - "3": "Electron Main Process", - "4": "UI Package Dependencies", - "5": "Admin Cost Widgets & Dialogs", - "6": "Analytics Charts", - "7": "Web App Dependencies", - "8": "Admin Token Usage Cards", - "9": "Auth Context & AI Action Types", - "10": "Monorepo Root Config", - "11": "SQLite Database Service", - "12": "Architecture Overview & Edge Functions", - "13": "Desktop Panels & Routing", - "14": "Web AI SDK Dependencies", - "15": "Desktop App Dependencies", - "16": "Edge Function Handlers", - "17": "Backend Security & Auth Plans", - "18": "Agent System & Contributing", - "19": "Whisper Backend", - "20": "Web Landing Page Sections", - "21": "Intention Processor", - "22": "Admin Activity Queries", - "23": "Web UI Buttons & Login", - "24": "Electron Build Tooling", - "25": "Login Form Components", - "26": "ESLint Config", - "27": "Audio Visualizer & Demo", - "28": "Ollama Service", - "29": "App Shell & Loading", - "30": "Web Root Layout & i18n", - "31": "Admin Role/Invitation Dialogs", - "32": "Performance Benchmark", - "33": "Admin & Release Edge Functions", - "34": "Dropdown Menu Primitive", - "35": "Comprehensive Test Suite", - "36": "Ollama Enhancement Prompts", - "37": "Summarization & RBAC Plans", - "38": "Gemini Proxy (startProxy)", - "39": "TypeScript Config Base", - "40": "shadcn components.json", - "41": "Gemini Proxy (proxy.ts)", - "42": "Analytics Engagement Queries", - "43": "shadcn components.json", - "44": "Menubar Primitive", - "45": "Beta Invitation Email", - "46": "Whisper Client", - "47": "shadcn components.json", - "48": "shadcn components.json", - "49": "Command Palette Primitive", - "50": "Context Menu Primitive", - "51": "Whisper Transcription Processor", - "52": "Admin Layout & Auth Guard", - "53": "App package.json Metadata", - "54": "Transcription Threading Architecture", - "55": "Settings Page Views", - "56": "Copy & Date Utils", - "57": "Whisper Hallucination & Prompt Plans", - "58": "Proxy package.json", - "59": "Real-Time Analysis & GeminiClient", - "60": "Carousel Primitive", - "61": "Waitlist Welcome Email & CORS", - "62": "Text Effect Animation", - "63": "Settings Window Manager", - "64": "Dual-Panel UI Plans", - "65": "Web AI Route & GeminiClient", - "66": "Alert Dialog Primitive", - "67": "Analytics Service & Plans", - "68": "Waitlist-to-Beta Conversion", - "69": "Tailwind & Type Dev Deps", - "70": "Module Cluster 70", - "71": "Module Cluster 71", - "72": "Module Cluster 72", - "73": "Module Cluster 73", - "74": "Module Cluster 74", - "75": "Module Cluster 75", - "76": "Module Cluster 76", - "77": "Module Cluster 77", - "78": "Module Cluster 78", - "79": "Module Cluster 79", - "80": "Module Cluster 80", - "81": "Module Cluster 81", - "82": "Module Cluster 82", - "83": "Module Cluster 83", - "84": "Module Cluster 84", - "85": "Module Cluster 85", - "86": "Module Cluster 86", - "87": "Module Cluster 87", - "88": "Module Cluster 88", - "89": "Module Cluster 89", - "90": "Module Cluster 90", - "91": "Module Cluster 91", - "92": "Module Cluster 92", - "93": "Module Cluster 93", - "94": "Module Cluster 94", - "95": "Module Cluster 95", - "96": "Module Cluster 96", - "97": "Module Cluster 97", - "98": "Module Cluster 98", - "99": "Module Cluster 99", - "100": "Module Cluster 100", - "101": "Module Cluster 101", - "102": "Module Cluster 102", - "103": "Module Cluster 103", - "104": "Module Cluster 104", - "105": "Community 105", - "106": "Community 106", - "107": "Module Cluster 107", - "108": "Module Cluster 108", - "109": "Module Cluster 109", - "110": "Module Cluster 110", - "111": "Module Cluster 111", - "112": "Module Cluster 112", - "113": "Module Cluster 113", - "114": "Module Cluster 114", - "115": "Module Cluster 115", - "116": "Community 116", - "117": "Module Cluster 117", - "118": "Module Cluster 118", - "119": "Module Cluster 119", - "120": "Module Cluster 120", - "121": "Module Cluster 121", - "122": "Module Cluster 122", - "123": "Module Cluster 123", - "124": "Community 124", - "125": "Module Cluster 125", - "126": "Module Cluster 126", - "127": "Module Cluster 127", - "128": "Module Cluster 128", - "129": "Module Cluster 129", - "130": "Module Cluster 130", - "131": "Module Cluster 131", - "132": "Module Cluster 132", - "133": "Module Cluster 133", - "134": "Module Cluster 134", - "135": "Module Cluster 135", - "136": "Module Cluster 136", - "137": "Module Cluster 137", - "138": "Module Cluster 138", - "139": "Module Cluster 139", - "140": "Module Cluster 140", - "141": "Module Cluster 141", - "142": "Module Cluster 142", - "143": "Module Cluster 143", - "144": "Module Cluster 144", - "145": "Module Cluster 145", - "146": "Module Cluster 146", - "147": "Community 147", - "148": "Module Cluster 148", - "149": "Module Cluster 149", - "150": "Module Cluster 150", - "151": "Module Cluster 151", - "152": "Module Cluster 152", - "153": "Module Cluster 153", - "154": "Module Cluster 154", - "155": "Module Cluster 155", - "156": "Module Cluster 156", - "157": "Module Cluster 157", - "158": "Module Cluster 158", - "159": "Module Cluster 159", - "160": "Module Cluster 160", - "161": "Module Cluster 161", - "162": "Module Cluster 162", - "163": "Module Cluster 163", - "164": "Module Cluster 164", - "165": "Module Cluster 165", - "166": "Module Cluster 166", - "167": "Module Cluster 167", - "168": "Module Cluster 168", - "169": "Module Cluster 169", - "170": "Community 170", - "171": "Module Cluster 171", - "172": "Module Cluster 172", - "173": "Module Cluster 173", - "174": "Module Cluster 174", - "175": "Module Cluster 175", - "176": "Module Cluster 176", - "177": "Module Cluster 177", - "179": "Module Cluster 179", - "181": "Module Cluster 181", - "182": "Module Cluster 182", - "183": "Module Cluster 183", - "184": "Module Cluster 184", - "185": "Module Cluster 185", - "186": "Module Cluster 186", - "187": "Module Cluster 187", - "188": "Module Cluster 188", - "189": "Module Cluster 189", - "190": "Module Cluster 190", - "191": "Module Cluster 191", - "192": "Module Cluster 192", - "193": "Module Cluster 193", - "194": "Module Cluster 194", - "195": "Module Cluster 195", - "196": "Module Cluster 196", - "197": "Module Cluster 197", - "198": "Module Cluster 198", - "199": "Module Cluster 199", - "200": "Module Cluster 200", - "201": "Module Cluster 201", - "202": "Module Cluster 202", - "203": "Module Cluster 203", - "204": "Module Cluster 204", - "205": "Module Cluster 205", - "206": "Module Cluster 206", - "207": "Module Cluster 207", - "208": "Module Cluster 208", - "209": "Module Cluster 209", - "210": "Module Cluster 210", - "211": "Module Cluster 211", - "212": "Module Cluster 212", - "213": "Module Cluster 213", - "214": "Module Cluster 214", - "215": "Module Cluster 215", - "217": "Module Cluster 217", - "218": "Module Cluster 218", - "219": "Module Cluster 219", - "220": "Module Cluster 220", - "221": "Module Cluster 221", - "222": "Module Cluster 222", - "223": "Module Cluster 223", - "224": "Module Cluster 224", - "225": "Module Cluster 225", - "226": "Module Cluster 226", - "227": "Module Cluster 227", - "228": "Module Cluster 228", - "229": "Module Cluster 229" -} diff --git a/graphify-out/2026-06-06/.graphify_labels.json b/graphify-out/2026-06-06/.graphify_labels.json deleted file mode 100644 index 31ec0d89..00000000 --- a/graphify-out/2026-06-06/.graphify_labels.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "0": "App i18n (English)", - "1": "App i18n (Traditional Chinese)", - "2": "UI Primitives (Sheet)", - "3": "Electron Main Process", - "4": "UI Package Dependencies", - "5": "Admin Cost Widgets & Dialogs", - "6": "Analytics Charts", - "7": "Web App Dependencies", - "8": "Admin Token Usage Cards", - "9": "Auth Context & AI Action Types", - "10": "Monorepo Root Config", - "11": "SQLite Database Service", - "12": "Architecture Overview & Edge Functions", - "13": "Desktop Panels & Routing", - "14": "Web AI SDK Dependencies", - "15": "Desktop App Dependencies", - "16": "Edge Function Handlers", - "17": "Backend Security & Auth Plans", - "18": "Agent System & Contributing", - "19": "Whisper Backend", - "20": "Web Landing Page Sections", - "21": "Intention Processor", - "22": "Admin Activity Queries", - "23": "Web UI Buttons & Login", - "24": "Electron Build Tooling", - "25": "Login Form Components", - "26": "ESLint Config", - "27": "Audio Visualizer & Demo", - "28": "Ollama Service", - "29": "App Shell & Loading", - "30": "Web Root Layout & i18n", - "31": "Admin Role/Invitation Dialogs", - "32": "Performance Benchmark", - "33": "Admin & Release Edge Functions", - "34": "Dropdown Menu Primitive", - "35": "Comprehensive Test Suite", - "36": "Ollama Enhancement Prompts", - "37": "Summarization & RBAC Plans", - "38": "Gemini Proxy (startProxy)", - "39": "TypeScript Config Base", - "40": "shadcn components.json", - "41": "Gemini Proxy (proxy.ts)", - "42": "Analytics Engagement Queries", - "43": "shadcn components.json", - "44": "Menubar Primitive", - "45": "Beta Invitation Email", - "46": "Whisper Client", - "47": "shadcn components.json", - "48": "shadcn components.json", - "49": "Command Palette Primitive", - "50": "Context Menu Primitive", - "51": "Whisper Transcription Processor", - "52": "Admin Layout & Auth Guard", - "53": "App package.json Metadata", - "54": "Transcription Threading Architecture", - "55": "Settings Page Views", - "56": "Copy & Date Utils", - "57": "Whisper Hallucination & Prompt Plans", - "58": "Proxy package.json", - "59": "Real-Time Analysis & GeminiClient", - "60": "Carousel Primitive", - "61": "Waitlist Welcome Email & CORS", - "62": "Text Effect Animation", - "63": "Settings Window Manager", - "64": "Dual-Panel UI Plans", - "65": "Web AI Route & GeminiClient", - "66": "Alert Dialog Primitive", - "67": "Analytics Service & Plans", - "68": "Waitlist-to-Beta Conversion", - "69": "Tailwind & Type Dev Deps", - "70": "Module Cluster 70", - "71": "Module Cluster 71", - "72": "Module Cluster 72", - "73": "Module Cluster 73", - "74": "Module Cluster 74", - "75": "Module Cluster 75", - "76": "Module Cluster 76", - "77": "Module Cluster 77", - "78": "Module Cluster 78", - "79": "Module Cluster 79", - "80": "Module Cluster 80", - "81": "Module Cluster 81", - "82": "Module Cluster 82", - "83": "Module Cluster 83", - "84": "Module Cluster 84", - "85": "Module Cluster 85", - "86": "Module Cluster 86", - "87": "Module Cluster 87", - "88": "Module Cluster 88", - "89": "Module Cluster 89", - "90": "Module Cluster 90", - "91": "Module Cluster 91", - "92": "Module Cluster 92", - "93": "Module Cluster 93", - "94": "Module Cluster 94", - "95": "Module Cluster 95", - "96": "Module Cluster 96", - "97": "Module Cluster 97", - "98": "Module Cluster 98", - "99": "Module Cluster 99", - "100": "Module Cluster 100", - "101": "Module Cluster 101", - "102": "Module Cluster 102", - "103": "Module Cluster 103", - "104": "Module Cluster 104", - "105": "Community 105", - "107": "Module Cluster 107", - "108": "Module Cluster 108", - "109": "Module Cluster 109", - "110": "Module Cluster 110", - "111": "Module Cluster 111", - "112": "Module Cluster 112", - "113": "Module Cluster 113", - "114": "Module Cluster 114", - "115": "Module Cluster 115", - "117": "Module Cluster 117", - "118": "Module Cluster 118", - "119": "Module Cluster 119", - "120": "Module Cluster 120", - "121": "Module Cluster 121", - "122": "Module Cluster 122", - "123": "Module Cluster 123", - "125": "Module Cluster 125", - "126": "Module Cluster 126", - "127": "Module Cluster 127", - "128": "Module Cluster 128", - "129": "Module Cluster 129", - "130": "Module Cluster 130", - "131": "Module Cluster 131", - "132": "Module Cluster 132", - "133": "Module Cluster 133", - "134": "Module Cluster 134", - "135": "Module Cluster 135", - "136": "Module Cluster 136", - "137": "Module Cluster 137", - "138": "Module Cluster 138", - "139": "Module Cluster 139", - "140": "Module Cluster 140", - "141": "Module Cluster 141", - "142": "Module Cluster 142", - "143": "Module Cluster 143", - "144": "Module Cluster 144", - "145": "Module Cluster 145", - "146": "Module Cluster 146", - "148": "Module Cluster 148", - "149": "Module Cluster 149", - "150": "Module Cluster 150", - "151": "Module Cluster 151", - "152": "Module Cluster 152", - "153": "Module Cluster 153", - "154": "Module Cluster 154", - "155": "Module Cluster 155", - "156": "Module Cluster 156", - "157": "Module Cluster 157", - "158": "Module Cluster 158", - "159": "Module Cluster 159", - "160": "Module Cluster 160", - "161": "Module Cluster 161", - "162": "Module Cluster 162", - "163": "Module Cluster 163", - "164": "Module Cluster 164", - "165": "Module Cluster 165", - "166": "Module Cluster 166", - "167": "Module Cluster 167", - "168": "Module Cluster 168", - "169": "Module Cluster 169", - "171": "Module Cluster 171", - "172": "Module Cluster 172", - "173": "Module Cluster 173", - "174": "Module Cluster 174", - "175": "Module Cluster 175", - "176": "Module Cluster 176", - "177": "Module Cluster 177", - "179": "Module Cluster 179", - "181": "Module Cluster 181", - "182": "Module Cluster 182", - "183": "Module Cluster 183", - "184": "Module Cluster 184", - "185": "Module Cluster 185", - "186": "Module Cluster 186", - "187": "Module Cluster 187", - "188": "Module Cluster 188", - "189": "Module Cluster 189", - "190": "Module Cluster 190", - "191": "Module Cluster 191", - "192": "Module Cluster 192", - "193": "Module Cluster 193", - "194": "Module Cluster 194", - "195": "Module Cluster 195", - "196": "Module Cluster 196", - "197": "Module Cluster 197", - "198": "Module Cluster 198", - "199": "Module Cluster 199", - "200": "Module Cluster 200", - "201": "Module Cluster 201", - "202": "Module Cluster 202", - "203": "Module Cluster 203", - "204": "Module Cluster 204", - "205": "Module Cluster 205", - "206": "Module Cluster 206", - "207": "Module Cluster 207", - "208": "Module Cluster 208", - "209": "Module Cluster 209", - "210": "Module Cluster 210", - "211": "Module Cluster 211", - "212": "Module Cluster 212", - "213": "Module Cluster 213", - "214": "Module Cluster 214", - "215": "Module Cluster 215", - "217": "Module Cluster 217", - "218": "Module Cluster 218", - "219": "Module Cluster 219", - "220": "Module Cluster 220", - "221": "Module Cluster 221", - "222": "Module Cluster 222", - "223": "Module Cluster 223", - "224": "Module Cluster 224", - "225": "Module Cluster 225", - "226": "Module Cluster 226", - "227": "Module Cluster 227", - "228": "Module Cluster 228", - "229": "Module Cluster 229" -} diff --git a/graphify-out/2026-06-06/cost.json b/graphify-out/2026-06-06/cost.json deleted file mode 100644 index 74263f42..00000000 --- a/graphify-out/2026-06-06/cost.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "runs": [ - { - "date": "2026-06-06T06:16:40.717322+00:00", - "input_tokens": 593217, - "output_tokens": 0, - "files": 445 - } - ], - "total_input_tokens": 593217, - "total_output_tokens": 0 -} \ No newline at end of file diff --git a/graphify-out/2026-06-06/manifest.json b/graphify-out/2026-06-06/manifest.json deleted file mode 100644 index 7afb5f35..00000000 --- a/graphify-out/2026-06-06/manifest.json +++ /dev/null @@ -1,2067 +0,0 @@ -{ - ".eslintrc.js": { - "mtime": 1754482602.9354572, - "ast_hash": "499a4acb997fd7673a6cba0fb8deefcb", - "semantic_hash": "499a4acb997fd7673a6cba0fb8deefcb" - }, - "apps/admin-dashboard/app/analytics/engagement/client-view.tsx": { - "mtime": 1760696521.6879454, - "ast_hash": "7d0a70f6b458a3baebdae6b50f9c51d4", - "semantic_hash": "7d0a70f6b458a3baebdae6b50f9c51d4" - }, - "apps/admin-dashboard/app/analytics/engagement/page.tsx": { - "mtime": 1760696521.6881006, - "ast_hash": "a6069ac3931a685c0475a03ab6d984ae", - "semantic_hash": "a6069ac3931a685c0475a03ab6d984ae" - }, - "apps/admin-dashboard/app/analytics/errors/client-view.tsx": { - "mtime": 1760696521.6883297, - "ast_hash": "dba01250f78a006726ad542764a91429", - "semantic_hash": "dba01250f78a006726ad542764a91429" - }, - "apps/admin-dashboard/app/analytics/errors/page.tsx": { - "mtime": 1760696521.68879, - "ast_hash": "e00820a469dd098642ab4bcf372e2bd8", - "semantic_hash": "e00820a469dd098642ab4bcf372e2bd8" - }, - "apps/admin-dashboard/app/analytics/features/client-view.tsx": { - "mtime": 1760696521.6892715, - "ast_hash": "10384bace0da0ea5e2663abb7d0926a7", - "semantic_hash": "10384bace0da0ea5e2663abb7d0926a7" - }, - "apps/admin-dashboard/app/analytics/features/page.tsx": { - "mtime": 1760696521.6894443, - "ast_hash": "d11589151862f6e64e0e28f95117b370", - "semantic_hash": "d11589151862f6e64e0e28f95117b370" - }, - "apps/admin-dashboard/app/analytics/layout.tsx": { - "mtime": 1760696521.6897106, - "ast_hash": "c80d4dadfaa34c4ea0bd081a78bb1c34", - "semantic_hash": "c80d4dadfaa34c4ea0bd081a78bb1c34" - }, - "apps/admin-dashboard/app/analytics/overview/client-view.tsx": { - "mtime": 1760696521.6901417, - "ast_hash": "57133eb7e7850bce2f7c9608df7ba10a", - "semantic_hash": "57133eb7e7850bce2f7c9608df7ba10a" - }, - "apps/admin-dashboard/app/analytics/overview/page.tsx": { - "mtime": 1760696521.6905503, - "ast_hash": "c92f24b39c1dac044ad0307ddf5fbb59", - "semantic_hash": "c92f24b39c1dac044ad0307ddf5fbb59" - }, - "apps/admin-dashboard/app/analytics/users/client-view.tsx": { - "mtime": 1760696521.6909075, - "ast_hash": "03dd59ca74d7ca797c2d9946e3256879", - "semantic_hash": "03dd59ca74d7ca797c2d9946e3256879" - }, - "apps/admin-dashboard/app/analytics/users/page.tsx": { - "mtime": 1760696521.691161, - "ast_hash": "491070d15bae4c6f03b1c1c42080af04", - "semantic_hash": "491070d15bae4c6f03b1c1c42080af04" - }, - "apps/admin-dashboard/app/auth/callback/layout.tsx": { - "mtime": 1760621325.8891156, - "ast_hash": "7e34734da47244c804a1c46ca4db7dbc", - "semantic_hash": "7e34734da47244c804a1c46ca4db7dbc" - }, - "apps/admin-dashboard/app/auth/callback/page.tsx": { - "mtime": 1760698759.688935, - "ast_hash": "a920c9be1b0757dbd64d0f08552e332a", - "semantic_hash": "a920c9be1b0757dbd64d0f08552e332a" - }, - "apps/admin-dashboard/app/layout.tsx": { - "mtime": 1760696521.6919887, - "ast_hash": "cbf0ce0d5ab69f75400254d70c4a26e4", - "semantic_hash": "cbf0ce0d5ab69f75400254d70c4a26e4" - }, - "apps/admin-dashboard/app/login/page.tsx": { - "mtime": 1760696521.69227, - "ast_hash": "b0426cf1b68e8a7062de84c0e6fcc31e", - "semantic_hash": "b0426cf1b68e8a7062de84c0e6fcc31e" - }, - "apps/admin-dashboard/app/logout/page.tsx": { - "mtime": 1760696521.6925542, - "ast_hash": "94f6f901a73dfb6cc9e1e279ba1a3c62", - "semantic_hash": "94f6f901a73dfb6cc9e1e279ba1a3c62" - }, - "apps/admin-dashboard/app/page.tsx": { - "mtime": 1760696521.69276, - "ast_hash": "c73db1d23fe14f5ea543caf349e37c23", - "semantic_hash": "c73db1d23fe14f5ea543caf349e37c23" - }, - "apps/admin-dashboard/app/test-auth/page.tsx": { - "mtime": 1760696521.692974, - "ast_hash": "3abd892d1f2859283ea557b657000583", - "semantic_hash": "3abd892d1f2859283ea557b657000583" - }, - "apps/admin-dashboard/app/unauthorized/page.tsx": { - "mtime": 1760696521.693183, - "ast_hash": "06c581fb0c4c3c921250da762c40023c", - "semantic_hash": "06c581fb0c4c3c921250da762c40023c" - }, - "apps/admin-dashboard/app/waitlist/page.tsx": { - "mtime": 1761748353.1678293, - "ast_hash": "9886d3600d8c8245f58db0dc387b5719", - "semantic_hash": "9886d3600d8c8245f58db0dc387b5719" - }, - "apps/admin-dashboard/components.json": { - "mtime": 1757825615.3388984, - "ast_hash": "7495a623b1693e1588cd718f03961093", - "semantic_hash": "7495a623b1693e1588cd718f03961093" - }, - "apps/admin-dashboard/components/AuthGuard.tsx": { - "mtime": 1760696521.693401, - "ast_hash": "4ca33d4c43697a3b9bc0548a8c475964", - "semantic_hash": "4ca33d4c43697a3b9bc0548a8c475964" - }, - "apps/admin-dashboard/components/DashboardLayout.tsx": { - "mtime": 1761748353.1684778, - "ast_hash": "3da501d19fd358f42bb7f67a9c491b2b", - "semantic_hash": "3da501d19fd358f42bb7f67a9c491b2b" - }, - "apps/admin-dashboard/components/EditRoleDialog.tsx": { - "mtime": 1760696521.694039, - "ast_hash": "9e9b26d9a3c9031ee9d0743a7154e75a", - "semantic_hash": "9e9b26d9a3c9031ee9d0743a7154e75a" - }, - "apps/admin-dashboard/components/EmailPreviewDialog.tsx": { - "mtime": 1762180707.9097602, - "ast_hash": "462ad9a737d147d32409e8e1439aa089", - "semantic_hash": "462ad9a737d147d32409e8e1439aa089" - }, - "apps/admin-dashboard/components/ResetStatusDialog.tsx": { - "mtime": 1761843669.401986, - "ast_hash": "7564c79defc58ed784b0dd194686d2d8", - "semantic_hash": "7564c79defc58ed784b0dd194686d2d8" - }, - "apps/admin-dashboard/components/SendInvitationDialog.tsx": { - "mtime": 1761925251.4148283, - "ast_hash": "0276de6ba6a020b83e7649f38c47901c", - "semantic_hash": "0276de6ba6a020b83e7649f38c47901c" - }, - "apps/admin-dashboard/components/UserTable.tsx": { - "mtime": 1760696521.694213, - "ast_hash": "b235bc1d38fc5ca3f4782d983d03b656", - "semantic_hash": "b235bc1d38fc5ca3f4782d983d03b656" - }, - "apps/admin-dashboard/components/ViewLogsDialog.tsx": { - "mtime": 1760696521.6944132, - "ast_hash": "4575f5cd455500d968852b5ef36f681b", - "semantic_hash": "4575f5cd455500d968852b5ef36f681b" - }, - "apps/admin-dashboard/components/WaitlistTable.tsx": { - "mtime": 1761843717.1838388, - "ast_hash": "0e525cfb05ebc55583abc5138c6321e5", - "semantic_hash": "0e525cfb05ebc55583abc5138c6321e5" - }, - "apps/admin-dashboard/components/analytics/CostEstimationWidget.tsx": { - "mtime": 1760696521.6948297, - "ast_hash": "4a4d63eca54c2afc4314c56d13e92bf4", - "semantic_hash": "4a4d63eca54c2afc4314c56d13e92bf4" - }, - "apps/admin-dashboard/components/analytics/TokenUsageCard.tsx": { - "mtime": 1760696521.695063, - "ast_hash": "9e371e09f764c673ae13b85a9449abd8", - "semantic_hash": "9e371e09f764c673ae13b85a9449abd8" - }, - "apps/admin-dashboard/components/analytics/date-range-picker.tsx": { - "mtime": 1760696521.6952055, - "ast_hash": "35a1e7da20b2d7252a08b117af4a4326", - "semantic_hash": "35a1e7da20b2d7252a08b117af4a4326" - }, - "apps/admin-dashboard/components/analytics/dau-chart.tsx": { - "mtime": 1760696521.6953504, - "ast_hash": "1e454c2a882e694d2bc352d76a346d67", - "semantic_hash": "1e454c2a882e694d2bc352d76a346d67" - }, - "apps/admin-dashboard/components/analytics/engagement-histogram.tsx": { - "mtime": 1760696521.695506, - "ast_hash": "67d4137542c00fb8e131eaeb58b8ba30", - "semantic_hash": "67d4137542c00fb8e131eaeb58b8ba30" - }, - "apps/admin-dashboard/components/analytics/error-rate-chart.tsx": { - "mtime": 1760696521.6956398, - "ast_hash": "c09e3674bf23e7c68827e3b9929eb120", - "semantic_hash": "c09e3674bf23e7c68827e3b9929eb120" - }, - "apps/admin-dashboard/components/analytics/export-button.tsx": { - "mtime": 1760696521.6957827, - "ast_hash": "b9c220a0cae3d33b5256c761141e4549", - "semantic_hash": "b9c220a0cae3d33b5256c761141e4549" - }, - "apps/admin-dashboard/components/analytics/feature-adoption-chart.tsx": { - "mtime": 1760696521.6959262, - "ast_hash": "7314394512f108148a33f8116c126cf7", - "semantic_hash": "7314394512f108148a33f8116c126cf7" - }, - "apps/admin-dashboard/components/analytics/index.ts": { - "mtime": 1760696521.69609, - "ast_hash": "2b2fadbeb25f695a16bff855eb961557", - "semantic_hash": "2b2fadbeb25f695a16bff855eb961557" - }, - "apps/admin-dashboard/components/analytics/overview-metrics-grid.tsx": { - "mtime": 1760696521.696313, - "ast_hash": "2af6a2f2f658bc4d37346f1587e0fc26", - "semantic_hash": "2af6a2f2f658bc4d37346f1587e0fc26" - }, - "apps/admin-dashboard/components/analytics/session-metrics-card.tsx": { - "mtime": 1760696521.6964629, - "ast_hash": "e83e3cf3ccd56b835b586036b8fb0d14", - "semantic_hash": "e83e3cf3ccd56b835b586036b8fb0d14" - }, - "apps/admin-dashboard/components/analytics/wau-mau-chart.tsx": { - "mtime": 1760696521.696629, - "ast_hash": "53949b190b40eeb539d360709312567d", - "semantic_hash": "53949b190b40eeb539d360709312567d" - }, - "apps/admin-dashboard/components/design-system/colors.ts": { - "mtime": 1760696521.6968606, - "ast_hash": "4b1355cd05e05bcd0ab8566cfc837ed7", - "semantic_hash": "4b1355cd05e05bcd0ab8566cfc837ed7" - }, - "apps/admin-dashboard/components/design-system/index.ts": { - "mtime": 1760696521.6969981, - "ast_hash": "646475ac04fb259a1d9277f435ac0076", - "semantic_hash": "646475ac04fb259a1d9277f435ac0076" - }, - "apps/admin-dashboard/components/design-system/modern-bar-chart.tsx": { - "mtime": 1760696521.6972322, - "ast_hash": "2ece4d268630cffb2249f1e8cdebabbc", - "semantic_hash": "2ece4d268630cffb2249f1e8cdebabbc" - }, - "apps/admin-dashboard/components/design-system/modern-data-table.tsx": { - "mtime": 1760696521.6974955, - "ast_hash": "ecaa2bf4c27cf07f493bd49f59c24bd9", - "semantic_hash": "ecaa2bf4c27cf07f493bd49f59c24bd9" - }, - "apps/admin-dashboard/components/design-system/modern-line-chart.tsx": { - "mtime": 1760696521.6978884, - "ast_hash": "254fa7cdc269a978f94a4e6e548950ba", - "semantic_hash": "254fa7cdc269a978f94a4e6e548950ba" - }, - "apps/admin-dashboard/components/design-system/modern-metric-card.tsx": { - "mtime": 1760696521.6981893, - "ast_hash": "a082d5399b79b22b3f617f496bb9686b", - "semantic_hash": "a082d5399b79b22b3f617f496bb9686b" - }, - "apps/admin-dashboard/components/logo.tsx": { - "mtime": 1760621363.684277, - "ast_hash": "a80b0f089fce3a90f0533bd33716e42b", - "semantic_hash": "a80b0f089fce3a90f0533bd33716e42b" - }, - "apps/admin-dashboard/components/providers.tsx": { - "mtime": 1760621363.8447714, - "ast_hash": "fd29d949ab99a26acb856dec339c6c47", - "semantic_hash": "fd29d949ab99a26acb856dec339c6c47" - }, - "apps/admin-dashboard/context/AuthContext.tsx": { - "mtime": 1760696521.698478, - "ast_hash": "745c4a11361af099347e36459c96fad3", - "semantic_hash": "745c4a11361af099347e36459c96fad3" - }, - "apps/admin-dashboard/eslint.config.js": { - "mtime": 1757825615.3425806, - "ast_hash": "b1b307ace41d163147d2e6b23fd3d2d6", - "semantic_hash": "b1b307ace41d163147d2e6b23fd3d2d6" - }, - "apps/admin-dashboard/lib/analytics/queries.ts": { - "mtime": 1760696521.698801, - "ast_hash": "a7197145f8f96e5680e46fecfce624be", - "semantic_hash": "a7197145f8f96e5680e46fecfce624be" - }, - "apps/admin-dashboard/lib/analytics/types.ts": { - "mtime": 1760696521.6992633, - "ast_hash": "d72cc53ce8d295f1e8e390abd0486f5a", - "semantic_hash": "d72cc53ce8d295f1e8e390abd0486f5a" - }, - "apps/admin-dashboard/lib/analytics/user-activity-queries.ts": { - "mtime": 1760696521.699527, - "ast_hash": "5be8554c0d5bc0ff2caba5320f108b1b", - "semantic_hash": "5be8554c0d5bc0ff2caba5320f108b1b" - }, - "apps/admin-dashboard/lib/supabase-client.ts": { - "mtime": 1760704894.99084, - "ast_hash": "a16a04d1423c117ebcd897da3b01dd37", - "semantic_hash": "a16a04d1423c117ebcd897da3b01dd37" - }, - "apps/admin-dashboard/lib/supabase-server.ts": { - "mtime": 1760696521.6999989, - "ast_hash": "9b930ddd31bd966eca90cf92150f529d", - "semantic_hash": "9b930ddd31bd966eca90cf92150f529d" - }, - "apps/admin-dashboard/middleware.ts": { - "mtime": 1760696521.7006679, - "ast_hash": "b6c9c775af11287cbc4ee21eb4579c0e", - "semantic_hash": "b6c9c775af11287cbc4ee21eb4579c0e" - }, - "apps/admin-dashboard/next-env.d.ts": { - "mtime": 1760696521.7010121, - "ast_hash": "ba64ff7d54714a8f64db89b1003207d8", - "semantic_hash": "ba64ff7d54714a8f64db89b1003207d8" - }, - "apps/admin-dashboard/next.config.mjs": { - "mtime": 1757825615.3437886, - "ast_hash": "96b5421c5a84d7826cc2a757595ac568", - "semantic_hash": "96b5421c5a84d7826cc2a757595ac568" - }, - "apps/admin-dashboard/package.json": { - "mtime": 1761823377.015263, - "ast_hash": "05aca1504ec9c1511442b71d4014131c", - "semantic_hash": "05aca1504ec9c1511442b71d4014131c" - }, - "apps/admin-dashboard/postcss.config.mjs": { - "mtime": 1757825615.3442376, - "ast_hash": "c2fa9f5bf5678c555f31e75bed0a4fc2", - "semantic_hash": "c2fa9f5bf5678c555f31e75bed0a4fc2" - }, - "apps/admin-dashboard/tsconfig.json": { - "mtime": 1757825615.3460407, - "ast_hash": "ae42a760d61107cbc206566c7b6cce0a", - "semantic_hash": "ae42a760d61107cbc206566c7b6cce0a" - }, - "apps/app/code-signing/build-mac-signed.sh": { - "mtime": 1757048552.3840318, - "ast_hash": "c84217b819ef7b637a88f5d885a2e5f9", - "semantic_hash": "c84217b819ef7b637a88f5d885a2e5f9" - }, - "apps/app/code-signing/notarize.js": { - "mtime": 1757084252.0632145, - "ast_hash": "86a67ac84faeebb9a5c5a6a8505b5ab2", - "semantic_hash": "86a67ac84faeebb9a5c5a6a8505b5ab2" - }, - "apps/app/code-signing/sign-dylibs.js": { - "mtime": 1759399863.3871868, - "ast_hash": "5f15dd763260f2722f03ca5d4cc8e478", - "semantic_hash": "5f15dd763260f2722f03ca5d4cc8e478" - }, - "apps/app/components.json": { - "mtime": 1760161026.6662169, - "ast_hash": "5aebc81813ce3db3138069cf77e45841", - "semantic_hash": "5aebc81813ce3db3138069cf77e45841" - }, - "apps/app/electron.vite.config.ts": { - "mtime": 1759765539.2945335, - "ast_hash": "24555b85168619a468e363ad0f3c7036", - "semantic_hash": "24555b85168619a468e363ad0f3c7036" - }, - "apps/app/eslint.config.mjs": { - "mtime": 1755360516.1621282, - "ast_hash": "3183f21704b2809b64fe177479fb942c", - "semantic_hash": "3183f21704b2809b64fe177479fb942c" - }, - "apps/app/package.json": { - "mtime": 1761748353.159904, - "ast_hash": "665b3b4b564a1bd85ee8bcd87a3efe12", - "semantic_hash": "665b3b4b564a1bd85ee8bcd87a3efe12" - }, - "apps/app/postcss.config.mjs": { - "mtime": 1755360516.1624694, - "ast_hash": "c56b5f3c12f777a86e2513f45daab56a", - "semantic_hash": "c56b5f3c12f777a86e2513f45daab56a" - }, - "apps/app/src/main/database.ts": { - "mtime": 1770456619.0279992, - "ast_hash": "98bbfa6b6454604731653ab9ba7187fb", - "semantic_hash": "98bbfa6b6454604731653ab9ba7187fb" - }, - "apps/app/src/main/databaseService.ts": { - "mtime": 1760208358.5607288, - "ast_hash": "4dbece5fe086d858f72172d7bfa1a918", - "semantic_hash": "4dbece5fe086d858f72172d7bfa1a918" - }, - "apps/app/src/main/index.ts": { - "mtime": 1770460216.1868203, - "ast_hash": "306bb8a569db3bb948772c44d24249f5", - "semantic_hash": "306bb8a569db3bb948772c44d24249f5" - }, - "apps/app/src/main/intentionProcessor.ts": { - "mtime": 1761663810.2448616, - "ast_hash": "d6c2164a040f5552f922b19d51d3f6d0", - "semantic_hash": "d6c2164a040f5552f922b19d51d3f6d0" - }, - "apps/app/src/main/localLLMPrompts.ts": { - "mtime": 1770460234.3831854, - "ast_hash": "ad0fca760e7a8740757c13f92dc60c5e", - "semantic_hash": "ad0fca760e7a8740757c13f92dc60c5e" - }, - "apps/app/src/main/ollamaService.ts": { - "mtime": 1770460184.4369814, - "ast_hash": "590a1d5e81dec4f44cab72ae85d39b2d", - "semantic_hash": "590a1d5e81dec4f44cab72ae85d39b2d" - }, - "apps/app/src/main/popoverManager.ts": { - "mtime": 1770455778.896914, - "ast_hash": "6b892349e4128d9636e9e4aabd1f7fb7", - "semantic_hash": "6b892349e4128d9636e9e4aabd1f7fb7" - }, - "apps/app/src/main/settingsWindowManager.ts": { - "mtime": 1770455778.897771, - "ast_hash": "39e9fedb8109d1f86b11711c8528bbbc", - "semantic_hash": "39e9fedb8109d1f86b11711c8528bbbc" - }, - "apps/app/src/main/transcriptionEnhancementService.ts": { - "mtime": 1770458117.3471425, - "ast_hash": "5e74d7a078954a18b5caebe0cc8904b8", - "semantic_hash": "5e74d7a078954a18b5caebe0cc8904b8" - }, - "apps/app/src/main/types/export.ts": { - "mtime": 1760208358.5627742, - "ast_hash": "2bae0eb0ca6a55393d8e09cf93730090", - "semantic_hash": "2bae0eb0ca6a55393d8e09cf93730090" - }, - "apps/app/src/main/utils/export-formatter.ts": { - "mtime": 1760208358.5633662, - "ast_hash": "4f22bc5157f2ceb77640a2ae7693c0c4", - "semantic_hash": "4f22bc5157f2ceb77640a2ae7693c0c4" - }, - "apps/app/src/main/whisperBackend.ts": { - "mtime": 1770445584.8538663, - "ast_hash": "bb2c9913d68602467e9df0f91de4b489", - "semantic_hash": "bb2c9913d68602467e9df0f91de4b489" - }, - "apps/app/src/main/windowManager.ts": { - "mtime": 1759765539.2964847, - "ast_hash": "7a88a4c0f94513c26bc3102438958c2a", - "semantic_hash": "7a88a4c0f94513c26bc3102438958c2a" - }, - "apps/app/src/preload/index.d.ts": { - "mtime": 1755784180.5834703, - "ast_hash": "49212028271d72b7ff84b2893299c17f", - "semantic_hash": "49212028271d72b7ff84b2893299c17f" - }, - "apps/app/src/preload/index.ts": { - "mtime": 1770457950.3389578, - "ast_hash": "549acaf36bb9051660d119d8f5aba874", - "semantic_hash": "549acaf36bb9051660d119d8f5aba874" - }, - "apps/app/src/renderer/public/worklets/mic-audio-processor.js": { - "mtime": 1759386727.0246794, - "ast_hash": "4c22205b4698a6005b06d81e0f0570f6", - "semantic_hash": "4c22205b4698a6005b06d81e0f0570f6" - }, - "apps/app/src/renderer/public/worklets/system-audio-processor.js": { - "mtime": 1759386727.0250492, - "ast_hash": "5ef2b0a351e8e05cc2a902e880561448", - "semantic_hash": "5ef2b0a351e8e05cc2a902e880561448" - }, - "apps/app/src/renderer/src/app/App.tsx": { - "mtime": 1760595356.5242853, - "ast_hash": "bf20b4e417451b8308e9e369850c5039", - "semantic_hash": "bf20b4e417451b8308e9e369850c5039" - }, - "apps/app/src/renderer/src/app/AppRouter.tsx": { - "mtime": 1759765539.2986789, - "ast_hash": "373822f84866af2c0615fd91bd4e8205", - "semantic_hash": "373822f84866af2c0615fd91bd4e8205" - }, - "apps/app/src/renderer/src/app/providers.tsx": { - "mtime": 1759143095.427457, - "ast_hash": "b4c65ea37a16ea0ccb76cdafc71e3376", - "semantic_hash": "b4c65ea37a16ea0ccb76cdafc71e3376" - }, - "apps/app/src/renderer/src/components/ActionQueue.tsx": { - "mtime": 1760208358.5656755, - "ast_hash": "00851618f122801aad19d5429562902e", - "semantic_hash": "00851618f122801aad19d5429562902e" - }, - "apps/app/src/renderer/src/components/ActionsPanel.tsx": { - "mtime": 1761665817.6537151, - "ast_hash": "5a8555eecd4c5fc237ca50d1e8b14f71", - "semantic_hash": "5a8555eecd4c5fc237ca50d1e8b14f71" - }, - "apps/app/src/renderer/src/components/ChatPanel.tsx": { - "mtime": 1760208358.5664532, - "ast_hash": "010ad48ab20fc5c99a8320479a2529bc", - "semantic_hash": "010ad48ab20fc5c99a8320479a2529bc" - }, - "apps/app/src/renderer/src/components/KeywordHighlighter.tsx": { - "mtime": 1760208358.5667632, - "ast_hash": "d34e665b320dc617feabd548452dcdfb", - "semantic_hash": "d34e665b320dc617feabd548452dcdfb" - }, - "apps/app/src/renderer/src/components/LoadingPage.tsx": { - "mtime": 1760208358.567208, - "ast_hash": "cc14f742ad8fb6c55da9615099344da8", - "semantic_hash": "cc14f742ad8fb6c55da9615099344da8" - }, - "apps/app/src/renderer/src/components/LoginPage.tsx": { - "mtime": 1759765002.9105046, - "ast_hash": "2829bbef59f069ac043a63040e8709c3", - "semantic_hash": "2829bbef59f069ac043a63040e8709c3" - }, - "apps/app/src/renderer/src/components/MainControlBar.tsx": { - "mtime": 1760198233.8703444, - "ast_hash": "a2f19850955a17277323df590c68bcfa", - "semantic_hash": "a2f19850955a17277323df590c68bcfa" - }, - "apps/app/src/renderer/src/components/MainController.tsx": { - "mtime": 1761328748.2140505, - "ast_hash": "1bd13ac0ab5fb6533f5b806b22b4ab9e", - "semantic_hash": "1bd13ac0ab5fb6533f5b806b22b4ab9e" - }, - "apps/app/src/renderer/src/components/MarkdownRenderer.tsx": { - "mtime": 1759764997.0774946, - "ast_hash": "dc90c2958de4ef309179995bafa66558", - "semantic_hash": "dc90c2958de4ef309179995bafa66558" - }, - "apps/app/src/renderer/src/components/PreviewPanel.tsx": { - "mtime": 1759764995.6619473, - "ast_hash": "d8a9380244242736e7ef969d9d99ac82", - "semantic_hash": "d8a9380244242736e7ef969d9d99ac82" - }, - "apps/app/src/renderer/src/components/RealTimeAnalysis.tsx": { - "mtime": 1770458170.3431592, - "ast_hash": "9443a3fe5acf42363d9e15a80ad08ada", - "semantic_hash": "9443a3fe5acf42363d9e15a80ad08ada" - }, - "apps/app/src/renderer/src/components/SelectionPage.tsx": { - "mtime": 1760208358.5683749, - "ast_hash": "cd3d4c219401513f0bad8fc54fae09dc", - "semantic_hash": "cd3d4c219401513f0bad8fc54fae09dc" - }, - "apps/app/src/renderer/src/components/SettingsPage.tsx": { - "mtime": 1770445680.4378579, - "ast_hash": "33820258a9b03b360d5b8f8054350c7c", - "semantic_hash": "33820258a9b03b360d5b8f8054350c7c" - }, - "apps/app/src/renderer/src/components/UpdaterPanel.tsx": { - "mtime": 1759765018.511983, - "ast_hash": "463374221757f7f44aab11b4b44b2172", - "semantic_hash": "463374221757f7f44aab11b4b44b2172" - }, - "apps/app/src/renderer/src/components/logo.tsx": { - "mtime": 1760693624.199204, - "ast_hash": "1441941b00becb8afbe4f772343de1c9", - "semantic_hash": "1441941b00becb8afbe4f772343de1c9" - }, - "apps/app/src/renderer/src/components/settings/AboutView.tsx": { - "mtime": 1761667147.4988008, - "ast_hash": "af736c56153453b411ef871342d136db", - "semantic_hash": "af736c56153453b411ef871342d136db" - }, - "apps/app/src/renderer/src/components/settings/AccountSettings.tsx": { - "mtime": 1760693717.51984, - "ast_hash": "315a9283555f2222702dd8a7337282cd", - "semantic_hash": "315a9283555f2222702dd8a7337282cd" - }, - "apps/app/src/renderer/src/components/settings/AutoTriggerSettings.tsx": { - "mtime": 1760208358.569326, - "ast_hash": "c06e8701cb819b4f28cce9929fef07e9", - "semantic_hash": "c06e8701cb819b4f28cce9929fef07e9" - }, - "apps/app/src/renderer/src/components/settings/CalendarPicker.tsx": { - "mtime": 1759765539.3040874, - "ast_hash": "d7949838fbb21ea620b7a51ba9e7d158", - "semantic_hash": "d7949838fbb21ea620b7a51ba9e7d158" - }, - "apps/app/src/renderer/src/components/settings/GeneralSettings.tsx": { - "mtime": 1760208358.5698292, - "ast_hash": "0e4b42608725c0c1c03909446a18141e", - "semantic_hash": "0e4b42608725c0c1c03909446a18141e" - }, - "apps/app/src/renderer/src/components/settings/HistoryView.tsx": { - "mtime": 1760208358.5703773, - "ast_hash": "0b7205ed828a0344f54cc0aa4e92ad70", - "semantic_hash": "0b7205ed828a0344f54cc0aa4e92ad70" - }, - "apps/app/src/renderer/src/components/settings/OllamaSettings.tsx": { - "mtime": 1770460189.5065556, - "ast_hash": "3561979eb991ef3b10c2079d72e40b0f", - "semantic_hash": "3561979eb991ef3b10c2079d72e40b0f" - }, - "apps/app/src/renderer/src/components/settings/SessionCard.tsx": { - "mtime": 1760208358.5708318, - "ast_hash": "8f521caec3d36b761ef1c74fe5a7831b", - "semantic_hash": "8f521caec3d36b761ef1c74fe5a7831b" - }, - "apps/app/src/renderer/src/components/settings/SettingsSidebar.tsx": { - "mtime": 1770445723.3739543, - "ast_hash": "1eb76245ca766b505925c2bc887b715d", - "semantic_hash": "1eb76245ca766b505925c2bc887b715d" - }, - "apps/app/src/renderer/src/components/settings/ShortcutsView.tsx": { - "mtime": 1759765539.305702, - "ast_hash": "10ea051edf55c3e9a537d2914c15e443", - "semantic_hash": "10ea051edf55c3e9a537d2914c15e443" - }, - "apps/app/src/renderer/src/components/ui/AnimatedText.tsx": { - "mtime": 1757698602.8060265, - "ast_hash": "d1afb91b6dc5922ca948bd3b6b2ad776", - "semantic_hash": "d1afb91b6dc5922ca948bd3b6b2ad776" - }, - "apps/app/src/renderer/src/components/ui/alert.tsx": { - "mtime": 1759765539.306074, - "ast_hash": "6f9cbda26bf358040c66daa18353bd0f", - "semantic_hash": "6f9cbda26bf358040c66daa18353bd0f" - }, - "apps/app/src/renderer/src/components/ui/avatar.tsx": { - "mtime": 1759765539.306661, - "ast_hash": "ce4fe60f4c48c01a5a601d9835648b40", - "semantic_hash": "ce4fe60f4c48c01a5a601d9835648b40" - }, - "apps/app/src/renderer/src/components/ui/badge.tsx": { - "mtime": 1759765539.3073633, - "ast_hash": "d418e7d17e73d698299284a0e46e3e9f", - "semantic_hash": "d418e7d17e73d698299284a0e46e3e9f" - }, - "apps/app/src/renderer/src/components/ui/button.tsx": { - "mtime": 1757084252.0673637, - "ast_hash": "2284d3d313fb837007c45e62f12c1c08", - "semantic_hash": "2284d3d313fb837007c45e62f12c1c08" - }, - "apps/app/src/renderer/src/components/ui/card.tsx": { - "mtime": 1756796812.147516, - "ast_hash": "671ed9a92bcfad592a31ddaba6dc007a", - "semantic_hash": "671ed9a92bcfad592a31ddaba6dc007a" - }, - "apps/app/src/renderer/src/components/ui/dialog.tsx": { - "mtime": 1756796812.1477425, - "ast_hash": "078f5a8817eb1ab6f4c81a3e2a9b366e", - "semantic_hash": "078f5a8817eb1ab6f4c81a3e2a9b366e" - }, - "apps/app/src/renderer/src/components/ui/input.tsx": { - "mtime": 1756796812.1479352, - "ast_hash": "6af718ada2c33bc2c8fca1b02f1ea8ca", - "semantic_hash": "6af718ada2c33bc2c8fca1b02f1ea8ca" - }, - "apps/app/src/renderer/src/components/ui/label.tsx": { - "mtime": 1756796812.148472, - "ast_hash": "4d555ac1839d2400109c3e10a91af39d", - "semantic_hash": "4d555ac1839d2400109c3e10a91af39d" - }, - "apps/app/src/renderer/src/components/ui/popover.tsx": { - "mtime": 1756796812.1486135, - "ast_hash": "0d3652c78d8b43951911a0bc3aff31d5", - "semantic_hash": "0d3652c78d8b43951911a0bc3aff31d5" - }, - "apps/app/src/renderer/src/components/ui/progress.tsx": { - "mtime": 1759765539.3081353, - "ast_hash": "97b0fc2e77eba6412131f9d54dc68a8a", - "semantic_hash": "97b0fc2e77eba6412131f9d54dc68a8a" - }, - "apps/app/src/renderer/src/components/ui/radio-group.tsx": { - "mtime": 1760208358.5715358, - "ast_hash": "e9b130a08e4d0126ecb254e46b86661b", - "semantic_hash": "e9b130a08e4d0126ecb254e46b86661b" - }, - "apps/app/src/renderer/src/components/ui/resizable.tsx": { - "mtime": 1756796812.1488342, - "ast_hash": "3eb6f0e11517a74c48134bdb49323f29", - "semantic_hash": "3eb6f0e11517a74c48134bdb49323f29" - }, - "apps/app/src/renderer/src/components/ui/select.tsx": { - "mtime": 1756796812.1490593, - "ast_hash": "04eb81ab81572e0e79cbfdb8da65a317", - "semantic_hash": "04eb81ab81572e0e79cbfdb8da65a317" - }, - "apps/app/src/renderer/src/components/ui/skeleton.tsx": { - "mtime": 1759765539.310273, - "ast_hash": "0501cf882399b1db3a8e2addfe0cfecf", - "semantic_hash": "0501cf882399b1db3a8e2addfe0cfecf" - }, - "apps/app/src/renderer/src/components/ui/slider.tsx": { - "mtime": 1760208358.5718381, - "ast_hash": "5fbab7963bd442067af44a2b02d894d1", - "semantic_hash": "5fbab7963bd442067af44a2b02d894d1" - }, - "apps/app/src/renderer/src/components/ui/sonner.tsx": { - "mtime": 1756796812.149366, - "ast_hash": "92b245aabc0b2d63281bbc2ece7470eb", - "semantic_hash": "92b245aabc0b2d63281bbc2ece7470eb" - }, - "apps/app/src/renderer/src/components/ui/switch.tsx": { - "mtime": 1756796812.1499202, - "ast_hash": "819ac386400bff5a197344b0355099ae", - "semantic_hash": "819ac386400bff5a197344b0355099ae" - }, - "apps/app/src/renderer/src/components/ui/table.tsx": { - "mtime": 1759765539.3124502, - "ast_hash": "6c42a48097fd46f40fe776fc1c307d96", - "semantic_hash": "6c42a48097fd46f40fe776fc1c307d96" - }, - "apps/app/src/renderer/src/components/ui/textarea.tsx": { - "mtime": 1756796812.1503456, - "ast_hash": "67fa8ed4455be2ce9ea36f854b832205", - "semantic_hash": "67fa8ed4455be2ce9ea36f854b832205" - }, - "apps/app/src/renderer/src/context/AuthContext.tsx": { - "mtime": 1761824751.2206006, - "ast_hash": "a428cbc4b6b0dc95daee68269a124d5e", - "semantic_hash": "a428cbc4b6b0dc95daee68269a124d5e" - }, - "apps/app/src/renderer/src/context/TranslationContext.tsx": { - "mtime": 1759765539.3140118, - "ast_hash": "dd79a31efcde5222d87abf0c96835213", - "semantic_hash": "dd79a31efcde5222d87abf0c96835213" - }, - "apps/app/src/renderer/src/env.d.ts": { - "mtime": 1758530377.3841248, - "ast_hash": "0352474ba2918efe13895edbc3780d94", - "semantic_hash": "0352474ba2918efe13895edbc3780d94" - }, - "apps/app/src/renderer/src/hooks/useAIInteraction.ts": { - "mtime": 1770458201.5691519, - "ast_hash": "de477b17a3ea0a51dc904ada8418807b", - "semantic_hash": "de477b17a3ea0a51dc904ada8418807b" - }, - "apps/app/src/renderer/src/hooks/useActionQueue.ts": { - "mtime": 1761328748.2212899, - "ast_hash": "dc63f52b500019add1df5e7dc9a17863", - "semantic_hash": "dc63f52b500019add1df5e7dc9a17863" - }, - "apps/app/src/renderer/src/hooks/useAudioAnalysis.ts": { - "mtime": 1758793069.9220114, - "ast_hash": "3946a931d956611130b49e582cfc66cd", - "semantic_hash": "3946a931d956611130b49e582cfc66cd" - }, - "apps/app/src/renderer/src/hooks/useAuth.ts": { - "mtime": 1759143095.4306815, - "ast_hash": "51df58a93a9f223c11d49d101d408cf7", - "semantic_hash": "51df58a93a9f223c11d49d101d408cf7" - }, - "apps/app/src/renderer/src/hooks/useElectron.ts": { - "mtime": 1757654451.2213733, - "ast_hash": "b46b61e28bbdee104a5f98ef2e580f21", - "semantic_hash": "b46b61e28bbdee104a5f98ef2e580f21" - }, - "apps/app/src/renderer/src/hooks/useI18n.ts": { - "mtime": 1759143095.4308586, - "ast_hash": "0be70fd5f92f711255161350f3a1dc09", - "semantic_hash": "0be70fd5f92f711255161350f3a1dc09" - }, - "apps/app/src/renderer/src/hooks/useLanguage.ts": { - "mtime": 1759143095.4310026, - "ast_hash": "a6993ba04f40872f27dfb1ec74c1e6aa", - "semantic_hash": "a6993ba04f40872f27dfb1ec74c1e6aa" - }, - "apps/app/src/renderer/src/hooks/useScreenShare.ts": { - "mtime": 1760693717.5208366, - "ast_hash": "2f5b37537a3ae501f609db1465a9c9ec", - "semantic_hash": "2f5b37537a3ae501f609db1465a9c9ec" - }, - "apps/app/src/renderer/src/hooks/useSegmentRecorder.ts": { - "mtime": 1759386727.0268767, - "ast_hash": "6325b70338c0a32d1b3ee97f5fb4073a", - "semantic_hash": "6325b70338c0a32d1b3ee97f5fb4073a" - }, - "apps/app/src/renderer/src/hooks/useTranscriptionEnhancement.ts": { - "mtime": 1770458178.3949068, - "ast_hash": "64cdbe1bea33b6b86a344e7bb67f71d3", - "semantic_hash": "64cdbe1bea33b6b86a344e7bb67f71d3" - }, - "apps/app/src/renderer/src/lib/copy-utils.ts": { - "mtime": 1760208358.5733006, - "ast_hash": "af663e3bb713fe62ffb107af62ddf25c", - "semantic_hash": "af663e3bb713fe62ffb107af62ddf25c" - }, - "apps/app/src/renderer/src/lib/date-utils.ts": { - "mtime": 1759765539.315686, - "ast_hash": "9215a344165c12f9a4e84da3df6e8aec", - "semantic_hash": "9215a344165c12f9a4e84da3df6e8aec" - }, - "apps/app/src/renderer/src/lib/history-utils.ts": { - "mtime": 1759765539.3164809, - "ast_hash": "d2d6d7ad597e9167545595cbf16b0c66", - "semantic_hash": "d2d6d7ad597e9167545595cbf16b0c66" - }, - "apps/app/src/renderer/src/lib/translations.ts": { - "mtime": 1770445713.7907605, - "ast_hash": "fd48db8860d7f17bc1e6a0ae981a01c6", - "semantic_hash": "fd48db8860d7f17bc1e6a0ae981a01c6" - }, - "apps/app/src/renderer/src/lib/utils.ts": { - "mtime": 1755360516.1730635, - "ast_hash": "fb6ca08a007849efb7dd97f5acba344a", - "semantic_hash": "fb6ca08a007849efb7dd97f5acba344a" - }, - "apps/app/src/renderer/src/main.tsx": { - "mtime": 1759143095.4322598, - "ast_hash": "476e5c792cba44fa2358adb9957f5e94", - "semantic_hash": "476e5c792cba44fa2358adb9957f5e94" - }, - "apps/app/src/renderer/src/selection.tsx": { - "mtime": 1759765539.3181527, - "ast_hash": "fafdbbd0882934280b645d277b6d0076", - "semantic_hash": "fafdbbd0882934280b645d277b6d0076" - }, - "apps/app/src/renderer/src/services/ai-actions.ts": { - "mtime": 1761663865.848906, - "ast_hash": "85c3ca2878af85e28cd535cae09a8dc9", - "semantic_hash": "85c3ca2878af85e28cd535cae09a8dc9" - }, - "apps/app/src/renderer/src/services/analytics-service.ts": { - "mtime": 1760693717.5216722, - "ast_hash": "8bf531eee8538c584b7a6395f472ce48", - "semantic_hash": "8bf531eee8538c584b7a6395f472ce48" - }, - "apps/app/src/renderer/src/services/supabaseClient.ts": { - "mtime": 1759143095.4330351, - "ast_hash": "0cbb60c01993e972c327bdf736d9e64a", - "semantic_hash": "0cbb60c01993e972c327bdf736d9e64a" - }, - "apps/app/src/renderer/src/services/transcription.ts": { - "mtime": 1770455778.8996785, - "ast_hash": "05a3465270caad36dda7f9b364751f46", - "semantic_hash": "05a3465270caad36dda7f9b364751f46" - }, - "apps/app/src/renderer/src/services/whisperClient.ts": { - "mtime": 1760208358.574906, - "ast_hash": "035cda158de877e55a681c5e512a6942", - "semantic_hash": "035cda158de877e55a681c5e512a6942" - }, - "apps/app/src/renderer/src/settings.tsx": { - "mtime": 1759765539.3185148, - "ast_hash": "aebadab83cc3d33adfb37f29f7ffc01d", - "semantic_hash": "aebadab83cc3d33adfb37f29f7ffc01d" - }, - "apps/app/src/renderer/src/types/history.ts": { - "mtime": 1760208358.5752823, - "ast_hash": "0a6af63d87abcc9cb88118410f9d9001", - "semantic_hash": "0a6af63d87abcc9cb88118410f9d9001" - }, - "apps/app/src/renderer/src/types/index.ts": { - "mtime": 1770446006.5693939, - "ast_hash": "8f659fa89314138e56df12361b76eb26", - "semantic_hash": "8f659fa89314138e56df12361b76eb26" - }, - "apps/app/src/renderer/src/types/settings.ts": { - "mtime": 1760208358.5756102, - "ast_hash": "0ba8d6dfe036dff1fc72083a23a509cd", - "semantic_hash": "0ba8d6dfe036dff1fc72083a23a509cd" - }, - "apps/app/tailwind.config.ts": { - "mtime": 1755360516.1736, - "ast_hash": "f2772f24798a4a5211bc4fbd150d435a", - "semantic_hash": "f2772f24798a4a5211bc4fbd150d435a" - }, - "apps/app/tests/local-transcription/benchmark-performance.js": { - "mtime": 1761925251.4153054, - "ast_hash": "b1eda9c0f0bebf8e22c5772c049f16d1", - "semantic_hash": "b1eda9c0f0bebf8e22c5772c049f16d1" - }, - "apps/app/tests/local-transcription/quick-benchmark.js": { - "mtime": 1759200200.9277232, - "ast_hash": "dda37be86af5dcf3fa87d3c244faede5", - "semantic_hash": "dda37be86af5dcf3fa87d3c244faede5" - }, - "apps/app/tests/local-transcription/test-comprehensive.js": { - "mtime": 1761925251.4157693, - "ast_hash": "9fc63f5bd961fdd482cdb0cb6dfd2c7f", - "semantic_hash": "9fc63f5bd961fdd482cdb0cb6dfd2c7f" - }, - "apps/app/tests/local-transcription/test-services.mjs": { - "mtime": 1761925251.416296, - "ast_hash": "9fb879c7a3b49ee0e6144e2225180d30", - "semantic_hash": "9fb879c7a3b49ee0e6144e2225180d30" - }, - "apps/app/tests/local-transcription/test-transcription.js": { - "mtime": 1761925251.4166093, - "ast_hash": "1350b73c440efda5d8dbbe59f4a2fa48", - "semantic_hash": "1350b73c440efda5d8dbbe59f4a2fa48" - }, - "apps/app/tsconfig.json": { - "mtime": 1755360516.1737788, - "ast_hash": "f78ff8c2e2efb59fcf218eac57774d94", - "semantic_hash": "f78ff8c2e2efb59fcf218eac57774d94" - }, - "apps/app/tsconfig.node.json": { - "mtime": 1755360516.1738877, - "ast_hash": "9a09247aa797699e4223e0a9f78914dc", - "semantic_hash": "9a09247aa797699e4223e0a9f78914dc" - }, - "apps/app/tsconfig.web.json": { - "mtime": 1757598837.9316492, - "ast_hash": "190e07fadcd53c0606fde7cb23ef2855", - "semantic_hash": "190e07fadcd53c0606fde7cb23ef2855" - }, - "apps/web/app/(landing)/layout.tsx": { - "mtime": 1757338195.20135, - "ast_hash": "b2696cac2a696998e95af3eccd2800fb", - "semantic_hash": "b2696cac2a696998e95af3eccd2800fb" - }, - "apps/web/app/(landing)/page.tsx": { - "mtime": 1780729886.2083325, - "ast_hash": "f76645de74ceead7e38fd29f0f516118", - "semantic_hash": "" - }, - "apps/web/app/(landing)/privacy/page.tsx": { - "mtime": 1757338267.5203032, - "ast_hash": "84bde892d2536024d7abac46d2b19d81", - "semantic_hash": "84bde892d2536024d7abac46d2b19d81" - }, - "apps/web/app/(landing)/terms/page.tsx": { - "mtime": 1758383563.1580882, - "ast_hash": "a16fd35ff0e1714a031880dbe27e9731", - "semantic_hash": "a16fd35ff0e1714a031880dbe27e9731" - }, - "apps/web/app/api/feedback/route.ts": { - "mtime": 1756796812.1737113, - "ast_hash": "7b56e75e7eaa350d8cdaf8f70bbcce93", - "semantic_hash": "7b56e75e7eaa350d8cdaf8f70bbcce93" - }, - "apps/web/app/api/process-audio/route.ts": { - "mtime": 1756796812.1740062, - "ast_hash": "2072c7467de869b05c0483527ddcd468", - "semantic_hash": "2072c7467de869b05c0483527ddcd468" - }, - "apps/web/app/api/waitlist/route.ts": { - "mtime": 1756796812.1742282, - "ast_hash": "11a8edb647b1c782ff770ca71868cc99", - "semantic_hash": "11a8edb647b1c782ff770ca71868cc99" - }, - "apps/web/app/auth/callback/layout.tsx": { - "mtime": 1756796812.1744335, - "ast_hash": "7e34734da47244c804a1c46ca4db7dbc", - "semantic_hash": "7e34734da47244c804a1c46ca4db7dbc" - }, - "apps/web/app/auth/callback/page.tsx": { - "mtime": 1756796812.1746285, - "ast_hash": "e217ecae5ab75413eac530639dbba606", - "semantic_hash": "e217ecae5ab75413eac530639dbba606" - }, - "apps/web/app/auth/login/page.tsx": { - "mtime": 1756796812.1748686, - "ast_hash": "1bfe046f2067705276f79ca593490744", - "semantic_hash": "1bfe046f2067705276f79ca593490744" - }, - "apps/web/app/auth/register/page.tsx": { - "mtime": 1756796812.175139, - "ast_hash": "45c9651602bebcd442acd0c773cf85fb", - "semantic_hash": "45c9651602bebcd442acd0c773cf85fb" - }, - "apps/web/app/layout.tsx": { - "mtime": 1758383563.1584144, - "ast_hash": "70980de3e214e71a5fb6f4eefc52061b", - "semantic_hash": "70980de3e214e71a5fb6f4eefc52061b" - }, - "apps/web/components.json": { - "mtime": 1753113293.2774103, - "ast_hash": "7495a623b1693e1588cd718f03961093", - "semantic_hash": "7495a623b1693e1588cd718f03961093" - }, - "apps/web/components/call-to-action.tsx": { - "mtime": 1756796812.1802897, - "ast_hash": "ca72a90086e2117cb8c9a42ee87a5288", - "semantic_hash": "ca72a90086e2117cb8c9a42ee87a5288" - }, - "apps/web/components/evidence.tsx": { - "mtime": 1762517029.0194418, - "ast_hash": "74a2a88fb26fadfc3fd2390770e6ed0b", - "semantic_hash": "74a2a88fb26fadfc3fd2390770e6ed0b" - }, - "apps/web/components/features.tsx": { - "mtime": 1762516271.1541996, - "ast_hash": "b46d58331af1ad79731ddda97a3922b5", - "semantic_hash": "b46d58331af1ad79731ddda97a3922b5" - }, - "apps/web/components/footer.tsx": { - "mtime": 1761665798.6586232, - "ast_hash": "5afa6bf295d7fd14a9510010798c6192", - "semantic_hash": "5afa6bf295d7fd14a9510010798c6192" - }, - "apps/web/components/hero-header.tsx": { - "mtime": 1757338195.2023535, - "ast_hash": "890e3dfb9a83eb14992408dcff5b780e", - "semantic_hash": "890e3dfb9a83eb14992408dcff5b780e" - }, - "apps/web/components/hero-section.tsx": { - "mtime": 1757338195.0899572, - "ast_hash": "73609081e6235035c5818c35a69f8292", - "semantic_hash": "73609081e6235035c5818c35a69f8292" - }, - "apps/web/components/integrations.tsx": { - "mtime": 1756796812.1840067, - "ast_hash": "5e56cddff792da33df5ad291459639a7", - "semantic_hash": "5e56cddff792da33df5ad291459639a7" - }, - "apps/web/components/language-switcher.tsx": { - "mtime": 1756796812.1844647, - "ast_hash": "a64270a95f84848c7b62366c4a46946b", - "semantic_hash": "a64270a95f84848c7b62366c4a46946b" - }, - "apps/web/components/logo.tsx": { - "mtime": 1756796812.185946, - "ast_hash": "61dca0ea09e1f217b5b99f50feb7e20f", - "semantic_hash": "61dca0ea09e1f217b5b99f50feb7e20f" - }, - "apps/web/components/page-transition.tsx": { - "mtime": 1757338195.2133982, - "ast_hash": "671e4d9c773036b95d9322ef38b48710", - "semantic_hash": "671e4d9c773036b95d9322ef38b48710" - }, - "apps/web/components/pain-point.tsx": { - "mtime": 1762517082.8417146, - "ast_hash": "22bd150b415657f32479af077909519e", - "semantic_hash": "22bd150b415657f32479af077909519e" - }, - "apps/web/components/providers.tsx": { - "mtime": 1756375755.6541507, - "ast_hash": "fd29d949ab99a26acb856dec339c6c47", - "semantic_hash": "fd29d949ab99a26acb856dec339c6c47" - }, - "apps/web/components/solution.tsx": { - "mtime": 1756796812.187204, - "ast_hash": "590dc03c22069a453a6f4da0da817465", - "semantic_hash": "590dc03c22069a453a6f4da0da817465" - }, - "apps/web/components/team.tsx": { - "mtime": 1762179093.0916417, - "ast_hash": "d9eb244ac635d93bfc2606593350913b", - "semantic_hash": "d9eb244ac635d93bfc2606593350913b" - }, - "apps/web/components/video-demo.tsx": { - "mtime": 1762694749.296534, - "ast_hash": "88a888fd94035102cc5dd3cf178d2bc8", - "semantic_hash": "88a888fd94035102cc5dd3cf178d2bc8" - }, - "apps/web/components/waitlist-form.tsx": { - "mtime": 1756796812.187992, - "ast_hash": "5bfd47f804bf36b752b709d29b5d82e6", - "semantic_hash": "5bfd47f804bf36b752b709d29b5d82e6" - }, - "apps/web/components/waitlist-section.tsx": { - "mtime": 1756796812.188872, - "ast_hash": "97e561fe413b761a938fa6939f906e29", - "semantic_hash": "97e561fe413b761a938fa6939f906e29" - }, - "apps/web/context/language-context.tsx": { - "mtime": 1757338195.1703641, - "ast_hash": "e90c39eaa57e498b459aa35df7b9414a", - "semantic_hash": "e90c39eaa57e498b459aa35df7b9414a" - }, - "apps/web/eslint.config.js": { - "mtime": 1753113293.2802422, - "ast_hash": "b1b307ace41d163147d2e6b23fd3d2d6", - "semantic_hash": "b1b307ace41d163147d2e6b23fd3d2d6" - }, - "apps/web/hooks/useIntersectionObserver.ts": { - "mtime": 1762696061.6570556, - "ast_hash": "50133f6f2d8ad56bccfae36e91b6b9d8", - "semantic_hash": "50133f6f2d8ad56bccfae36e91b6b9d8" - }, - "apps/web/lib/i18n.ts": { - "mtime": 1756796812.1896904, - "ast_hash": "58db46dfde404b12a71c2cb944f36259", - "semantic_hash": "58db46dfde404b12a71c2cb944f36259" - }, - "apps/web/lib/supabaseClient.ts": { - "mtime": 1756796812.1899698, - "ast_hash": "508b85fbc7b14dc46b69c0ef680fcab3", - "semantic_hash": "508b85fbc7b14dc46b69c0ef680fcab3" - }, - "apps/web/lib/validateEnv.ts": { - "mtime": 1780729884.7432935, - "ast_hash": "6c3c31f8d21085d5578120ad09336c8e", - "semantic_hash": "" - }, - "apps/web/next-env.d.ts": { - "mtime": 1759765539.3192022, - "ast_hash": "ba64ff7d54714a8f64db89b1003207d8", - "semantic_hash": "ba64ff7d54714a8f64db89b1003207d8" - }, - "apps/web/next.config.mjs": { - "mtime": 1753113293.2808988, - "ast_hash": "96b5421c5a84d7826cc2a757595ac568", - "semantic_hash": "96b5421c5a84d7826cc2a757595ac568" - }, - "apps/web/package.json": { - "mtime": 1780729825.1941497, - "ast_hash": "7162d2aac122f093a4217731c750a602", - "semantic_hash": "" - }, - "apps/web/postcss.config.mjs": { - "mtime": 1753113293.281078, - "ast_hash": "c2fa9f5bf5678c555f31e75bed0a4fc2", - "semantic_hash": "c2fa9f5bf5678c555f31e75bed0a4fc2" - }, - "apps/web/public/locales/en.json": { - "mtime": 1780729889.4922416, - "ast_hash": "3f5ca4f3e28755eadf57e8c7a0911667", - "semantic_hash": "" - }, - "apps/web/public/locales/zh-TW.json": { - "mtime": 1780729892.3561306, - "ast_hash": "df0eee88f1d913142618574c0f1baef8", - "semantic_hash": "" - }, - "apps/web/public/worklets/audio-processor.js": { - "mtime": 1753113293.2850184, - "ast_hash": "a8192c07a29046fe648771a5657fcf5b", - "semantic_hash": "a8192c07a29046fe648771a5657fcf5b" - }, - "apps/web/tsconfig.json": { - "mtime": 1753113293.2851994, - "ast_hash": "ae42a760d61107cbc206566c7b6cce0a", - "semantic_hash": "ae42a760d61107cbc206566c7b6cce0a" - }, - "apps/web/utils/audioUtils.ts": { - "mtime": 1756796812.1906981, - "ast_hash": "3137b4594fb76742ebbbe71e3d7ab3af", - "semantic_hash": "3137b4594fb76742ebbbe71e3d7ab3af" - }, - "apps/web/vercel.json": { - "mtime": 1761665798.6588185, - "ast_hash": "688431b89ce81afc9922ff736e5224f9", - "semantic_hash": "688431b89ce81afc9922ff736e5224f9" - }, - "package.json": { - "mtime": 1761372095.380427, - "ast_hash": "8085064aa304f3289eeca5cd748d8e4b", - "semantic_hash": "8085064aa304f3289eeca5cd748d8e4b" - }, - "packages/eslint-config/base.js": { - "mtime": 1753113293.2856667, - "ast_hash": "45b355ae247772103aa02662e5648aea", - "semantic_hash": "45b355ae247772103aa02662e5648aea" - }, - "packages/eslint-config/next.js": { - "mtime": 1753113293.2857325, - "ast_hash": "114583a5838869d01a4edb0d00fb1bb0", - "semantic_hash": "114583a5838869d01a4edb0d00fb1bb0" - }, - "packages/eslint-config/package.json": { - "mtime": 1753113293.285806, - "ast_hash": "edbc74ce7ebb0ab8af7665ec705c2373", - "semantic_hash": "edbc74ce7ebb0ab8af7665ec705c2373" - }, - "packages/eslint-config/react-internal.js": { - "mtime": 1753113293.2858813, - "ast_hash": "8304db1ab4204bfa8586682a1c96a139", - "semantic_hash": "8304db1ab4204bfa8586682a1c96a139" - }, - "packages/typescript-config/base.json": { - "mtime": 1753113293.2860532, - "ast_hash": "91496257ade11c7e49703b57f8dbe504", - "semantic_hash": "91496257ade11c7e49703b57f8dbe504" - }, - "packages/typescript-config/nextjs.json": { - "mtime": 1753113293.2861164, - "ast_hash": "8cbd1ce342dc2fa14771e38d4ae2d228", - "semantic_hash": "8cbd1ce342dc2fa14771e38d4ae2d228" - }, - "packages/typescript-config/package.json": { - "mtime": 1753113293.2861855, - "ast_hash": "b0509474339825bc63016ad5692d1f33", - "semantic_hash": "b0509474339825bc63016ad5692d1f33" - }, - "packages/typescript-config/react-library.json": { - "mtime": 1753113293.2862523, - "ast_hash": "177e163c90fad6598867a3a4a6b18d87", - "semantic_hash": "177e163c90fad6598867a3a4a6b18d87" - }, - "packages/ui/components.json": { - "mtime": 1754578277.4957373, - "ast_hash": "e4d2acbc892182625e010022820cee45", - "semantic_hash": "e4d2acbc892182625e010022820cee45" - }, - "packages/ui/eslint.config.js": { - "mtime": 1753113293.2870367, - "ast_hash": "c51fb75d7965548fed2964c1d5b91a73", - "semantic_hash": "c51fb75d7965548fed2964c1d5b91a73" - }, - "packages/ui/package.json": { - "mtime": 1755360516.1946917, - "ast_hash": "4b5bc4fbd11bc4a78e84247ae97f31e0", - "semantic_hash": "4b5bc4fbd11bc4a78e84247ae97f31e0" - }, - "packages/ui/postcss.config.mjs": { - "mtime": 1755360516.1948516, - "ast_hash": "784097f99502acdfcd097af2be35c661", - "semantic_hash": "784097f99502acdfcd097af2be35c661" - }, - "packages/ui/src/components/accordion.tsx": { - "mtime": 1756796812.1920834, - "ast_hash": "a537bb58ca63dcdbefc87d1293f17456", - "semantic_hash": "a537bb58ca63dcdbefc87d1293f17456" - }, - "packages/ui/src/components/alert-dialog.tsx": { - "mtime": 1756796812.1925488, - "ast_hash": "524d68ddfdf46366d299382b5e25336a", - "semantic_hash": "524d68ddfdf46366d299382b5e25336a" - }, - "packages/ui/src/components/alert.tsx": { - "mtime": 1756796812.1927657, - "ast_hash": "9e5e072768d711a05b50ca8e6a511b76", - "semantic_hash": "9e5e072768d711a05b50ca8e6a511b76" - }, - "packages/ui/src/components/animated-group.tsx": { - "mtime": 1756375756.0791943, - "ast_hash": "09a37f0bd0636e47147398569e33f3e1", - "semantic_hash": "09a37f0bd0636e47147398569e33f3e1" - }, - "packages/ui/src/components/aspect-ratio.tsx": { - "mtime": 1756796812.1932034, - "ast_hash": "09aa81bcf9b2130d0ee47abcb77ffe1e", - "semantic_hash": "09aa81bcf9b2130d0ee47abcb77ffe1e" - }, - "packages/ui/src/components/avatar.tsx": { - "mtime": 1756796812.193471, - "ast_hash": "09ca0e330f4c3f5659c378edb825c0cf", - "semantic_hash": "09ca0e330f4c3f5659c378edb825c0cf" - }, - "packages/ui/src/components/badge.tsx": { - "mtime": 1756796812.1937494, - "ast_hash": "f2edc10e0144b70070fab428fa1fec1b", - "semantic_hash": "f2edc10e0144b70070fab428fa1fec1b" - }, - "packages/ui/src/components/border-beam.tsx": { - "mtime": 1756375756.0872424, - "ast_hash": "aa87e342b7068180b564c18426fdf467", - "semantic_hash": "aa87e342b7068180b564c18426fdf467" - }, - "packages/ui/src/components/breadcrumb.tsx": { - "mtime": 1756796812.1940434, - "ast_hash": "c92e8083ea134efbd8e00ffe93918175", - "semantic_hash": "c92e8083ea134efbd8e00ffe93918175" - }, - "packages/ui/src/components/button.tsx": { - "mtime": 1756796812.1943848, - "ast_hash": "695fbfbfa132f4b1ca293025b7a2e626", - "semantic_hash": "695fbfbfa132f4b1ca293025b7a2e626" - }, - "packages/ui/src/components/calendar.tsx": { - "mtime": 1756796812.194636, - "ast_hash": "16e5e02e875d53625604ff654d047fa5", - "semantic_hash": "16e5e02e875d53625604ff654d047fa5" - }, - "packages/ui/src/components/card.tsx": { - "mtime": 1756796812.1950126, - "ast_hash": "87a38154e62a31725a4568e1cec55592", - "semantic_hash": "87a38154e62a31725a4568e1cec55592" - }, - "packages/ui/src/components/carousel.tsx": { - "mtime": 1756796812.1954567, - "ast_hash": "3ba70c2a6739a957dc8cb56f1a96e2f0", - "semantic_hash": "3ba70c2a6739a957dc8cb56f1a96e2f0" - }, - "packages/ui/src/components/chart.tsx": { - "mtime": 1756796812.195785, - "ast_hash": "468043b2dff2e8247642c54c599828cb", - "semantic_hash": "468043b2dff2e8247642c54c599828cb" - }, - "packages/ui/src/components/checkbox.tsx": { - "mtime": 1756796812.1962452, - "ast_hash": "0f298ce6bb7c88034fb55ab286fe78af", - "semantic_hash": "0f298ce6bb7c88034fb55ab286fe78af" - }, - "packages/ui/src/components/collapsible.tsx": { - "mtime": 1756796812.1966143, - "ast_hash": "062d650afb7bd535dff418df0410b68d", - "semantic_hash": "062d650afb7bd535dff418df0410b68d" - }, - "packages/ui/src/components/command.tsx": { - "mtime": 1756796812.1968942, - "ast_hash": "2a71424450872e26290a9a3ddc6768da", - "semantic_hash": "2a71424450872e26290a9a3ddc6768da" - }, - "packages/ui/src/components/context-menu.tsx": { - "mtime": 1756796812.1971576, - "ast_hash": "a1d3da5b2f4987f8157702c06d73fa42", - "semantic_hash": "a1d3da5b2f4987f8157702c06d73fa42" - }, - "packages/ui/src/components/dialog.tsx": { - "mtime": 1756796812.1975255, - "ast_hash": "34f40dd328ac553fccbd87fcc126898d", - "semantic_hash": "34f40dd328ac553fccbd87fcc126898d" - }, - "packages/ui/src/components/drawer.tsx": { - "mtime": 1756796812.197732, - "ast_hash": "3513c5400f0f0bf499ebac430c728a33", - "semantic_hash": "3513c5400f0f0bf499ebac430c728a33" - }, - "packages/ui/src/components/dropdown-menu.tsx": { - "mtime": 1756796812.1980915, - "ast_hash": "76fe1f7d44eb7e1b198909d9111fed3e", - "semantic_hash": "76fe1f7d44eb7e1b198909d9111fed3e" - }, - "packages/ui/src/components/form.tsx": { - "mtime": 1756796812.1984906, - "ast_hash": "24dc9910c160c392d7087dbe0eab2acc", - "semantic_hash": "24dc9910c160c392d7087dbe0eab2acc" - }, - "packages/ui/src/components/hover-card.tsx": { - "mtime": 1756796812.198862, - "ast_hash": "467faf0d8dcc0fd6e9a17564cc305b13", - "semantic_hash": "467faf0d8dcc0fd6e9a17564cc305b13" - }, - "packages/ui/src/components/input-otp.tsx": { - "mtime": 1756796812.1992953, - "ast_hash": "f1bec9a7e992aa43f614b897fed802c8", - "semantic_hash": "f1bec9a7e992aa43f614b897fed802c8" - }, - "packages/ui/src/components/input.tsx": { - "mtime": 1756628901.9464993, - "ast_hash": "346b6066a33df53430343e62d928e66d", - "semantic_hash": "346b6066a33df53430343e62d928e66d" - }, - "packages/ui/src/components/label.tsx": { - "mtime": 1756796812.1995742, - "ast_hash": "ad11ebc3d88bbf197649cb3a4c76f681", - "semantic_hash": "ad11ebc3d88bbf197649cb3a4c76f681" - }, - "packages/ui/src/components/menubar.tsx": { - "mtime": 1756796812.1999192, - "ast_hash": "b0a897c9661ea5e7424ebae6e52f9591", - "semantic_hash": "b0a897c9661ea5e7424ebae6e52f9591" - }, - "packages/ui/src/components/navigation-menu.tsx": { - "mtime": 1756796812.2001877, - "ast_hash": "b9d2ed8f69c391318eeeee1a6212a817", - "semantic_hash": "b9d2ed8f69c391318eeeee1a6212a817" - }, - "packages/ui/src/components/pagination.tsx": { - "mtime": 1756796812.200422, - "ast_hash": "2157df6b4a55a2db244f7923aca4c427", - "semantic_hash": "2157df6b4a55a2db244f7923aca4c427" - }, - "packages/ui/src/components/popover.tsx": { - "mtime": 1756796812.2006984, - "ast_hash": "25ad5b561e260efb71536e3ac0af1d15", - "semantic_hash": "25ad5b561e260efb71536e3ac0af1d15" - }, - "packages/ui/src/components/progress.tsx": { - "mtime": 1756796812.2009153, - "ast_hash": "0a49844e22b1807e52e90b6533a2f812", - "semantic_hash": "0a49844e22b1807e52e90b6533a2f812" - }, - "packages/ui/src/components/radio-group.tsx": { - "mtime": 1756375756.1731637, - "ast_hash": "2e30d5258660e97a2a9deb4db723c43f", - "semantic_hash": "2e30d5258660e97a2a9deb4db723c43f" - }, - "packages/ui/src/components/resizable.tsx": { - "mtime": 1756796812.2011187, - "ast_hash": "dd24a5270719a9771c87dda4ed858272", - "semantic_hash": "dd24a5270719a9771c87dda4ed858272" - }, - "packages/ui/src/components/scroll-area.tsx": { - "mtime": 1756796812.2013478, - "ast_hash": "acc38d43222ce8c8ed7062a8818f0aa4", - "semantic_hash": "acc38d43222ce8c8ed7062a8818f0aa4" - }, - "packages/ui/src/components/select.tsx": { - "mtime": 1756796812.2016082, - "ast_hash": "a5efeaa0304f8f83f2081628499367d2", - "semantic_hash": "a5efeaa0304f8f83f2081628499367d2" - }, - "packages/ui/src/components/separator.tsx": { - "mtime": 1756375756.1853745, - "ast_hash": "93837cf06f10f5302c5301efc9e3663b", - "semantic_hash": "93837cf06f10f5302c5301efc9e3663b" - }, - "packages/ui/src/components/sheet.tsx": { - "mtime": 1756796812.202171, - "ast_hash": "eecce4b5528b1c3d02d33932edce9abc", - "semantic_hash": "eecce4b5528b1c3d02d33932edce9abc" - }, - "packages/ui/src/components/sidebar.tsx": { - "mtime": 1756796812.2025702, - "ast_hash": "1363b23a82b2d372c71a45cde5a387d1", - "semantic_hash": "1363b23a82b2d372c71a45cde5a387d1" - }, - "packages/ui/src/components/skeleton.tsx": { - "mtime": 1756375756.204101, - "ast_hash": "361a581bea90af8fc032bb52f401abe3", - "semantic_hash": "361a581bea90af8fc032bb52f401abe3" - }, - "packages/ui/src/components/slider.tsx": { - "mtime": 1756796812.2029035, - "ast_hash": "156225cab4cacc7092f58f2c8bd3402d", - "semantic_hash": "156225cab4cacc7092f58f2c8bd3402d" - }, - "packages/ui/src/components/sonner.tsx": { - "mtime": 1756375756.2079463, - "ast_hash": "ace3a6465858e1f9a441724008f2d921", - "semantic_hash": "ace3a6465858e1f9a441724008f2d921" - }, - "packages/ui/src/components/switch.tsx": { - "mtime": 1756796812.2031567, - "ast_hash": "156001859c6a65a7fa8bc36bdd7b534d", - "semantic_hash": "156001859c6a65a7fa8bc36bdd7b534d" - }, - "packages/ui/src/components/table.tsx": { - "mtime": 1756796812.203441, - "ast_hash": "c398dd9017babb00c42cb8dfecfff3c9", - "semantic_hash": "c398dd9017babb00c42cb8dfecfff3c9" - }, - "packages/ui/src/components/tabs.tsx": { - "mtime": 1756796812.2037952, - "ast_hash": "f5ffc55ef2c3be7753fb884cceedca6a", - "semantic_hash": "f5ffc55ef2c3be7753fb884cceedca6a" - }, - "packages/ui/src/components/text-effect.tsx": { - "mtime": 1756796812.20427, - "ast_hash": "bb9ac4c581c443322949e60e3b53b5ca", - "semantic_hash": "bb9ac4c581c443322949e60e3b53b5ca" - }, - "packages/ui/src/components/textarea.tsx": { - "mtime": 1756375756.227261, - "ast_hash": "c7fc3e4200d561f7e6a6e700b005e865", - "semantic_hash": "c7fc3e4200d561f7e6a6e700b005e865" - }, - "packages/ui/src/components/toggle-group.tsx": { - "mtime": 1756796812.2051353, - "ast_hash": "b65424839269ffaeaaf44ef95319a769", - "semantic_hash": "b65424839269ffaeaaf44ef95319a769" - }, - "packages/ui/src/components/toggle.tsx": { - "mtime": 1756796812.205347, - "ast_hash": "a7019f85ca880689daa02ee18f8e568c", - "semantic_hash": "a7019f85ca880689daa02ee18f8e568c" - }, - "packages/ui/src/components/tooltip.tsx": { - "mtime": 1756796812.2055485, - "ast_hash": "294535a32714d0b728133f07b7987cec", - "semantic_hash": "294535a32714d0b728133f07b7987cec" - }, - "packages/ui/src/hooks/use-mobile.ts": { - "mtime": 1756796812.205872, - "ast_hash": "c0a0bdd4638c391a1dd06ac82074e60b", - "semantic_hash": "c0a0bdd4638c391a1dd06ac82074e60b" - }, - "packages/ui/src/lib/utils.ts": { - "mtime": 1756375756.240204, - "ast_hash": "618d00bf4537ce84f9ba62c5b215fb30", - "semantic_hash": "618d00bf4537ce84f9ba62c5b215fb30" - }, - "packages/ui/tsconfig.json": { - "mtime": 1753113293.2930648, - "ast_hash": "750dcc9a42219306cae210934c27fc1e", - "semantic_hash": "750dcc9a42219306cae210934c27fc1e" - }, - "packages/ui/tsconfig.lint.json": { - "mtime": 1753113293.2931433, - "ast_hash": "587fb50f2f4632cf1134fb279a900305", - "semantic_hash": "587fb50f2f4632cf1134fb279a900305" - }, - "scripts/deploy-proxy.sh": { - "mtime": 1756630430.9615598, - "ast_hash": "36cbdbad4aa1c63ff7ac5218f8752a33", - "semantic_hash": "36cbdbad4aa1c63ff7ac5218f8752a33" - }, - "supabase/functions/_shared/cors.ts": { - "mtime": 1761824751.220853, - "ast_hash": "7ddbae13df270acdfbf701dd1deb7f2a", - "semantic_hash": "7ddbae13df270acdfbf701dd1deb7f2a" - }, - "supabase/functions/_shared/gemini-client.ts": { - "mtime": 1760161026.6871226, - "ast_hash": "d643485d2efd2b3370d212555441ae7b", - "semantic_hash": "d643485d2efd2b3370d212555441ae7b" - }, - "supabase/functions/_shared/prompts.ts": { - "mtime": 1761665817.6546266, - "ast_hash": "701ab143a7a7397ce7bf401923daade4", - "semantic_hash": "701ab143a7a7397ce7bf401923daade4" - }, - "supabase/functions/_shared/rbac.ts": { - "mtime": 1760696521.7035341, - "ast_hash": "91e93fc3d4025c12a7ffbf2397c40889", - "semantic_hash": "91e93fc3d4025c12a7ffbf2397c40889" - }, - "supabase/functions/add-to-waitlist/deno.json": { - "mtime": 1756134156.8737535, - "ast_hash": "af84e44d5c8e2c89ab58060848ce672d", - "semantic_hash": "af84e44d5c8e2c89ab58060848ce672d" - }, - "supabase/functions/add-to-waitlist/emails/waitlist-welcome.tsx": { - "mtime": 1756796812.2087843, - "ast_hash": "3c654594dc97ce15bbc819bccf21653c", - "semantic_hash": "3c654594dc97ce15bbc819bccf21653c" - }, - "supabase/functions/add-to-waitlist/index.ts": { - "mtime": 1761748353.17078, - "ast_hash": "1405521fd6452a57499e61ff2633d93a", - "semantic_hash": "1405521fd6452a57499e61ff2633d93a" - }, - "supabase/functions/add-to-waitlist/package.json": { - "mtime": 1756134156.8741074, - "ast_hash": "5151ba554b240b2c1058f2c1d7f93ba5", - "semantic_hash": "5151ba554b240b2c1058f2c1d7f93ba5" - }, - "supabase/functions/admin-api/index.ts": { - "mtime": 1760704894.9915097, - "ast_hash": "da20709c2ccbee992cdbbb20dde5855e", - "semantic_hash": "da20709c2ccbee992cdbbb20dde5855e" - }, - "supabase/functions/ai-action-chat/index.ts": { - "mtime": 1761372095.3839433, - "ast_hash": "a5deeec883e2cb465467fe9ae799f801", - "semantic_hash": "a5deeec883e2cb465467fe9ae799f801" - }, - "supabase/functions/ai-action-deep-response/index.test.ts": { - "mtime": 1761663865.8222618, - "ast_hash": "78ce70ef3474ad665dcc6cf1958c17e3", - "semantic_hash": "78ce70ef3474ad665dcc6cf1958c17e3" - }, - "supabase/functions/ai-action-deep-response/index.ts": { - "mtime": 1761663865.8226912, - "ast_hash": "e1959cb1b4298222e3ba9e99864cb7ea", - "semantic_hash": "e1959cb1b4298222e3ba9e99864cb7ea" - }, - "supabase/functions/ai-action-keyword-search/index.test.ts": { - "mtime": 1757084252.07272, - "ast_hash": "995e2123a14f6cd5f71eaf05e792c12d", - "semantic_hash": "995e2123a14f6cd5f71eaf05e792c12d" - }, - "supabase/functions/ai-action-keyword-search/index.ts": { - "mtime": 1761372095.3842793, - "ast_hash": "0c35e4a0e886cc2375b60954d752d086", - "semantic_hash": "0c35e4a0e886cc2375b60954d752d086" - }, - "supabase/functions/ai-action-recommend-response/index.test.ts": { - "mtime": 1758383563.1618178, - "ast_hash": "8feb152c7b71780c118a220163150c85", - "semantic_hash": "8feb152c7b71780c118a220163150c85" - }, - "supabase/functions/ai-action-recommend-response/index.ts": { - "mtime": 1761372095.3846138, - "ast_hash": "0e384c99ed3930b0aca667a9100110af", - "semantic_hash": "0e384c99ed3930b0aca667a9100110af" - }, - "supabase/functions/ai-action-screenshot-analysis/index.ts": { - "mtime": 1761372095.3849072, - "ast_hash": "a2df5f17f91d8f83c704cbaf8040e45d", - "semantic_hash": "a2df5f17f91d8f83c704cbaf8040e45d" - }, - "supabase/functions/ai-action-summarize/index.test.ts": { - "mtime": 1758383563.1619868, - "ast_hash": "7e0da024ded75544e643a2a282803916", - "semantic_hash": "7e0da024ded75544e643a2a282803916" - }, - "supabase/functions/ai-action-summarize/index.ts": { - "mtime": 1760693717.5264027, - "ast_hash": "37731af841bdf41aa3584f725ff4b1ba", - "semantic_hash": "37731af841bdf41aa3584f725ff4b1ba" - }, - "supabase/functions/get-latest-release/index.ts": { - "mtime": 1761925251.4179158, - "ast_hash": "4357a18e485bd28b17c464f84c179920", - "semantic_hash": "4357a18e485bd28b17c464f84c179920" - }, - "supabase/functions/get-session-profile/index.ts": { - "mtime": 1760704894.9917977, - "ast_hash": "9daa3a9d355f5c0366a056f7a716ccbb", - "semantic_hash": "9daa3a9d355f5c0366a056f7a716ccbb" - }, - "supabase/functions/send-beta-invitation/emails/beta-invitation.tsx": { - "mtime": 1762180707.9112477, - "ast_hash": "d7cb667af129a86dede99c3d73c81125", - "semantic_hash": "d7cb667af129a86dede99c3d73c81125" - }, - "supabase/functions/send-beta-invitation/index.ts": { - "mtime": 1761843636.5754278, - "ast_hash": "1c77902aa35595650846891b9c63392f", - "semantic_hash": "1c77902aa35595650846891b9c63392f" - }, - "supabase/migrations/20250825112617_consolidated_waitlist.sql": { - "mtime": 1758117442.1476517, - "ast_hash": "6d045ae63be7c2bc3c82083bbb096632", - "semantic_hash": "6d045ae63be7c2bc3c82083bbb096632" - }, - "supabase/migrations/20250918150000_consolidated_initial_schema.sql": { - "mtime": 1758117442.1480882, - "ast_hash": "faf4ffb1df3a13ac2492ac4abb72ceea", - "semantic_hash": "faf4ffb1df3a13ac2492ac4abb72ceea" - }, - "supabase/migrations/20250918160000_add_rls_to_roles_table.sql": { - "mtime": 1758117442.1487057, - "ast_hash": "7d11dd5d44a801e8cb9be839fd4cc195", - "semantic_hash": "7d11dd5d44a801e8cb9be839fd4cc195" - }, - "supabase/migrations/20250918170000_setup_automatic_profile_creation.sql": { - "mtime": 1758636998.4158542, - "ast_hash": "d84c364cd7f124b785ce1b9afb1696f0", - "semantic_hash": "d84c364cd7f124b785ce1b9afb1696f0" - }, - "supabase/migrations/20250930200000_add_transcription_enhance_entitlement.sql": { - "mtime": 1759386727.0327382, - "ast_hash": "9ac3129fb30875a531a9dfffa378db3a", - "semantic_hash": "9ac3129fb30875a531a9dfffa378db3a" - }, - "supabase/migrations/20251015181639_analytics_lean_implementation.sql": { - "mtime": 1760693717.5272293, - "ast_hash": "ab357f3a96e46c8b49b3495fb402bbdd", - "semantic_hash": "ab357f3a96e46c8b49b3495fb402bbdd" - }, - "supabase/migrations/20251015183745_fix_analytics_rls_policies.sql": { - "mtime": 1760693717.527381, - "ast_hash": "0a876ad1ace1787ebfd1ac15ab6b9038", - "semantic_hash": "0a876ad1ace1787ebfd1ac15ab6b9038" - }, - "supabase/migrations/20251015190000_fix_rbac_function_for_analytics.sql": { - "mtime": 1760693717.527519, - "ast_hash": "d1a0a408a3198bb06a5e6f507d644b6f", - "semantic_hash": "d1a0a408a3198bb06a5e6f507d644b6f" - }, - "supabase/migrations/20251015200000_remove_api_cost_usd.sql": { - "mtime": 1760693717.52765, - "ast_hash": "3d6ea445c679687b4ec56f8c0d0a79d8", - "semantic_hash": "3d6ea445c679687b4ec56f8c0d0a79d8" - }, - "supabase/migrations/20251017000000_add_admin_rls_policies.sql": { - "mtime": 1760696521.7039666, - "ast_hash": "29877d8003c2b4333600324fc93f1541", - "semantic_hash": "29877d8003c2b4333600324fc93f1541" - }, - "supabase/migrations/20251028000000_add_deep_response_rbac.sql": { - "mtime": 1761663865.8319397, - "ast_hash": "6e1c2f3242b17b1ee0883f6e9513ed5f", - "semantic_hash": "6e1c2f3242b17b1ee0883f6e9513ed5f" - }, - "supabase/migrations/20251028120000_add_beta_invitation_tracking.sql": { - "mtime": 1761748353.17156, - "ast_hash": "9e158c995021a536e87336b52db73eee", - "semantic_hash": "9e158c995021a536e87336b52db73eee" - }, - "supabase/migrations/20251028130000_enhance_auto_beta_conversion.sql": { - "mtime": 1761748353.171807, - "ast_hash": "bd5dad1d069ae8a2604d31926fe4042c", - "semantic_hash": "bd5dad1d069ae8a2604d31926fe4042c" - }, - "supabase/migrations/20251030050000_update_beta_transcription_quota.sql": { - "mtime": 1761824751.2219238, - "ast_hash": "4eed0264ff9fc5193fa26bb359b8eeb9", - "semantic_hash": "4eed0264ff9fc5193fa26bb359b8eeb9" - }, - "tsconfig.json": { - "mtime": 1753113293.2943778, - "ast_hash": "0e3be1e56cca99765fbcee2a43cc9573", - "semantic_hash": "0e3be1e56cca99765fbcee2a43cc9573" - }, - "turbo.json": { - "mtime": 1755247025.7136104, - "ast_hash": "34a33f53eaa9fe63b3c770a00c82f89f", - "semantic_hash": "34a33f53eaa9fe63b3c770a00c82f89f" - }, - "types/renderer.d.ts": { - "mtime": 1758636998.4162247, - "ast_hash": "005ab3720a6e3f430c579651cf089a36", - "semantic_hash": "005ab3720a6e3f430c579651cf089a36" - }, - ".github/workflows/release.yml": { - "mtime": 1770456627.0254822, - "ast_hash": "f02eb64e6c46be38c0442dd84ee6919f", - "semantic_hash": "f02eb64e6c46be38c0442dd84ee6919f" - }, - ".prettierrc.yaml": { - "mtime": 1756796812.1335547, - "ast_hash": "9933f2a775239515483fe7974aefa8e0", - "semantic_hash": "9933f2a775239515483fe7974aefa8e0" - }, - "CLAUDE.md": { - "mtime": 1780730051.547558, - "ast_hash": "97ef81614e6ad1e005874aba16700f0a", - "semantic_hash": "" - }, - "CONTRIBUTING.md": { - "mtime": 1780729941.8756502, - "ast_hash": "ac72a40a2464c361d62afafea92e43e0", - "semantic_hash": "" - }, - "README.md": { - "mtime": 1780729923.0282445, - "ast_hash": "51f56e70d3cba72d77eebe40fd72f803", - "semantic_hash": "" - }, - "apps/admin-dashboard/README.md": { - "mtime": 1758383563.151353, - "ast_hash": "c1bd77ce9448328061653a4b3743293f", - "semantic_hash": "c1bd77ce9448328061653a4b3743293f" - }, - "apps/app/.prettierrc.yaml": { - "mtime": 1755360516.1610472, - "ast_hash": "0494080f0af72e414e6fb29f89c49d89", - "semantic_hash": "0494080f0af72e414e6fb29f89c49d89" - }, - "apps/app/README.md": { - "mtime": 1770456645.9531398, - "ast_hash": "a61ac52d5fb2dec99979eb630c1b52d4", - "semantic_hash": "a61ac52d5fb2dec99979eb630c1b52d4" - }, - "apps/app/dev-app-update.yml": { - "mtime": 1755360516.1616619, - "ast_hash": "6022599c251e3a78dbb8f6e31b7c79da", - "semantic_hash": "6022599c251e3a78dbb8f6e31b7c79da" - }, - "apps/app/electron-builder.yml": { - "mtime": 1759399485.6008196, - "ast_hash": "18809faab4c334699ffe799706fe9169", - "semantic_hash": "18809faab4c334699ffe799706fe9169" - }, - "apps/app/resources/whisper.cpp/README.md": { - "mtime": 1759399108.687297, - "ast_hash": "f696c19d21b6498fb750e8621387a136", - "semantic_hash": "f696c19d21b6498fb750e8621387a136" - }, - "apps/app/src/renderer/index.html": { - "mtime": 1770456624.0700357, - "ast_hash": "08aa1dfeac9f7290ef496131360f3e26", - "semantic_hash": "08aa1dfeac9f7290ef496131360f3e26" - }, - "apps/app/src/renderer/selection.html": { - "mtime": 1759765539.2972813, - "ast_hash": "80f9081aa75d7cd4ec7572b081f4acd2", - "semantic_hash": "80f9081aa75d7cd4ec7572b081f4acd2" - }, - "apps/app/src/renderer/settings.html": { - "mtime": 1759765539.2975514, - "ast_hash": "4561bfa130494618c475338fb76b992d", - "semantic_hash": "4561bfa130494618c475338fb76b992d" - }, - "apps/app/tests/local-transcription/README.md": { - "mtime": 1759200200.9269557, - "ast_hash": "66d1b165d18d548d3dc8526e70adff8d", - "semantic_hash": "66d1b165d18d548d3dc8526e70adff8d" - }, - "apps/web/README.md": { - "mtime": 1758183040.7677991, - "ast_hash": "00827f674894a151aef6257f573df82f", - "semantic_hash": "00827f674894a151aef6257f573df82f" - }, - "docs/api/edge-functions.md": { - "mtime": 1780727349.156307, - "ast_hash": "faa3e7bd18d1f3e0c0bbf024649b4fc8", - "semantic_hash": "" - }, - "docs/architecture/Message-threading.md": { - "mtime": 1760375689.5798874, - "ast_hash": "977d596c4be549160de3c51416587e89", - "semantic_hash": "977d596c4be549160de3c51416587e89" - }, - "docs/architecture/RBAC.md": { - "mtime": 1760516091.8541884, - "ast_hash": "8f4a13485fb2deda401785addc6b7e5d", - "semantic_hash": "8f4a13485fb2deda401785addc6b7e5d" - }, - "docs/architecture/overview.md": { - "mtime": 1780730015.9240158, - "ast_hash": "5e167371bd11b32cb322b30f1f6377db", - "semantic_hash": "" - }, - "docs/architecture/whisper.md": { - "mtime": 1780727416.4430146, - "ast_hash": "f22f97a1abf2dc69bebf88c3149ef27d", - "semantic_hash": "" - }, - "docs/setup/development.md": { - "mtime": 1780729982.5320678, - "ast_hash": "0e12bce781db7a429c494d1fc70ef7a3", - "semantic_hash": "" - }, - "docs/waitlist-to-beta-conversion-implementation.md": { - "mtime": 1761748353.1699724, - "ast_hash": "8b889703f5c7fee418efa89ecce0a82a", - "semantic_hash": "8b889703f5c7fee418efa89ecce0a82a" - }, - "packages/eslint-config/README.md": { - "mtime": 1753113293.285602, - "ast_hash": "59963ee08d1627771348c8de3359daf7", - "semantic_hash": "59963ee08d1627771348c8de3359daf7" - }, - "packages/typescript-config/README.md": { - "mtime": 1753113293.2859876, - "ast_hash": "7f23ef73f596183f048ced7c752cfedb", - "semantic_hash": "7f23ef73f596183f048ced7c752cfedb" - }, - "plans/20250831-backend-security-refactor.md": { - "mtime": 1757084252.0705702, - "ast_hash": "ac48708d7fb3a2d73da65bb673aac373", - "semantic_hash": "ac48708d7fb3a2d73da65bb673aac373" - }, - "plans/20250905-secure-ai-actions-flow.md": { - "mtime": 1757084252.0706863, - "ast_hash": "f8a05da3f2fff21f20fd1854b32acb80", - "semantic_hash": "f8a05da3f2fff21f20fd1854b32acb80" - }, - "plans/20250911-dynamic-summarize.md": { - "mtime": 1758383563.1593366, - "ast_hash": "9313fc4a156832fa8cae5a5f7f60bf4e", - "semantic_hash": "9313fc4a156832fa8cae5a5f7f60bf4e" - }, - "plans/20250911-update-ui.md": { - "mtime": 1757654451.2232656, - "ast_hash": "127f08adfef52c5c22b7127aea370162", - "semantic_hash": "127f08adfef52c5c22b7127aea370162" - }, - "plans/20250912-improve-login-experience.md": { - "mtime": 1758383563.1597872, - "ast_hash": "be42a704f9880575fbb6dc9746ebb47f", - "semantic_hash": "be42a704f9880575fbb6dc9746ebb47f" - }, - "plans/20250913-auto-update-experience.md": { - "mtime": 1757825615.3577483, - "ast_hash": "019d61537b6057f6f10ae5d2c4afc024", - "semantic_hash": "019d61537b6057f6f10ae5d2c4afc024" - }, - "plans/20250913-rbac-for-the-app.md": { - "mtime": 1758383563.1600742, - "ast_hash": "de3c10ca6e9e29abdbb0d911eb6279ea", - "semantic_hash": "de3c10ca6e9e29abdbb0d911eb6279ea" - }, - "plans/20250913-update-ui-ux.md": { - "mtime": 1758383563.1604064, - "ast_hash": "fc634fe524f45189bf8337560ba7be59", - "semantic_hash": "fc634fe524f45189bf8337560ba7be59" - }, - "plans/20250914-coexistence-of-panels.md": { - "mtime": 1758117442.142634, - "ast_hash": "61c03c7b957e4d952992cba0dee4a106", - "semantic_hash": "61c03c7b957e4d952992cba0dee4a106" - }, - "plans/20250914-highlight-the-keywords-in-the-transcriptions.md": { - "mtime": 1758383563.160649, - "ast_hash": "a5f5e99631fa18f73116b6eaf2022fc2", - "semantic_hash": "a5f5e99631fa18f73116b6eaf2022fc2" - }, - "plans/20250914-refactor-electron-apis.md": { - "mtime": 1758383563.1608336, - "ast_hash": "d3e95e2a46eb65f32226d6e13c009ea9", - "semantic_hash": "d3e95e2a46eb65f32226d6e13c009ea9" - }, - "plans/20250917-universal-entitlements-engine.md": { - "mtime": 1758383563.1610982, - "ast_hash": "d05b25ca2b0022f9c9268e905e08997c", - "semantic_hash": "d05b25ca2b0022f9c9268e905e08997c" - }, - "plans/20250928-local-transcription.md": { - "mtime": 1759200200.929625, - "ast_hash": "581be5e4db2cc43d21225db563af1099", - "semantic_hash": "581be5e4db2cc43d21225db563af1099" - }, - "plans/20250930-audio-processing.md": { - "mtime": 1759386727.0290282, - "ast_hash": "858c7cc9726264720e5a786c8df13fcc", - "semantic_hash": "858c7cc9726264720e5a786c8df13fcc" - }, - "plans/20250930-multilingual-whisper.md": { - "mtime": 1759386727.0292711, - "ast_hash": "4094a239d4d5886cebc01df6b996e81a", - "semantic_hash": "4094a239d4d5886cebc01df6b996e81a" - }, - "plans/20251001-whisper-transcription-review.md": { - "mtime": 1759386727.0294683, - "ast_hash": "95aba0b84ee1202af2b46a905bb10a47", - "semantic_hash": "95aba0b84ee1202af2b46a905bb10a47" - }, - "plans/20251004-redesign-settings.md": { - "mtime": 1759765539.3197007, - "ast_hash": "5016a267849ef796251a127f9c9b93c4", - "semantic_hash": "5016a267849ef796251a127f9c9b93c4" - }, - "plans/20251009-download-session-json-file-issue.md": { - "mtime": 1760208358.5764382, - "ast_hash": "16760d41a0288e6f98f51a7c5695d3ee", - "semantic_hash": "16760d41a0288e6f98f51a7c5695d3ee" - }, - "plans/20251009-first-keyword-search-issue.md": { - "mtime": 1760208358.5767758, - "ast_hash": "e264f73bec04a4ee80fa80250dd90541", - "semantic_hash": "e264f73bec04a4ee80fa80250dd90541" - }, - "plans/20251009-keywords-display-issue.md": { - "mtime": 1760208358.577202, - "ast_hash": "6d3d8e77ac0a8cb99ece90478a188ac4", - "semantic_hash": "6d3d8e77ac0a8cb99ece90478a188ac4" - }, - "plans/20251010-actions-for-intention-detection.md": { - "mtime": 1760208358.577804, - "ast_hash": "01e159b2ec73b2bbf1b0c347439d16e5", - "semantic_hash": "01e159b2ec73b2bbf1b0c347439d16e5" - }, - "plans/20251011-whisper-hallucination-issue.md": { - "mtime": 1760208358.5782325, - "ast_hash": "cd1a254972536d9500f6a1c0b65ffc57", - "semantic_hash": "cd1a254972536d9500f6a1c0b65ffc57" - }, - "plans/20251012-auto-summarize.md": { - "mtime": 1760208358.5786753, - "ast_hash": "614a8a0ce4c7fff6bfa34e75035a3770", - "semantic_hash": "614a8a0ce4c7fff6bfa34e75035a3770" - }, - "plans/20251012-structure-of-gemini-response-of-summary.md": { - "mtime": 1760208358.578993, - "ast_hash": "b283983d16f38285d306ef3f05c01b5d", - "semantic_hash": "b283983d16f38285d306ef3f05c01b5d" - }, - "plans/20251015-users-behavior-and-preferences-analytics.md": { - "mtime": 1760696521.7015724, - "ast_hash": "2e5bafdcef1a2df263f773caa5e89283", - "semantic_hash": "2e5bafdcef1a2df263f773caa5e89283" - }, - "plans/20251016-admin-monitor.md": { - "mtime": 1760696521.7018433, - "ast_hash": "39fee55722d49da1d6a9b192a9a9b037", - "semantic_hash": "39fee55722d49da1d6a9b192a9a9b037" - }, - "plans/20251024_prompt_improvement_for_all_ai_actions.md": { - "mtime": 1761372095.3809114, - "ast_hash": "0e325a29302046b9a6468ef65b74ad7c", - "semantic_hash": "0e325a29302046b9a6468ef65b74ad7c" - }, - "plans/20251025-prepare-for-beta-release.md": { - "mtime": 1761372095.3813128, - "ast_hash": "7a08b7c2cb507cd718985ac6168c7e58", - "semantic_hash": "7a08b7c2cb507cd718985ac6168c7e58" - }, - "plans/20251030-waitlist-management-page.md": { - "mtime": 1761843884.4409823, - "ast_hash": "706ef89b7810fcdaceb06bfd2645448f", - "semantic_hash": "706ef89b7810fcdaceb06bfd2645448f" - }, - "plans/20251030-waitlist-to-beta-conversion.md": { - "mtime": 1761838796.7332568, - "ast_hash": "23041aa501cfe4acda2c2f27ed653799", - "semantic_hash": "23041aa501cfe4acda2c2f27ed653799" - }, - "plans/20251031-update-invitation-email-content.md": { - "mtime": 1762180707.9102917, - "ast_hash": "e29b86bd383b60c7bb711efb9793dba5", - "semantic_hash": "e29b86bd383b60c7bb711efb9793dba5" - }, - "plans/20260207-local-ollama-transcription-enhancement.md": { - "mtime": 1770449326.6753204, - "ast_hash": "951d55f8e28959ba2a47894b34b5a66f", - "semantic_hash": "951d55f8e28959ba2a47894b34b5a66f" - }, - "pnpm-workspace.yaml": { - "mtime": 1756134156.8733323, - "ast_hash": "5ea7919401809311057872d5a0a1504a", - "semantic_hash": "5ea7919401809311057872d5a0a1504a" - }, - "apps/admin-dashboard/public/logo/intevia(+logo).svg": { - "mtime": 1757825615.344873, - "ast_hash": "a8da20188033cbf6dd8cbe5cd0f88af4", - "semantic_hash": "a8da20188033cbf6dd8cbe5cd0f88af4" - }, - "apps/admin-dashboard/public/logo/intevia.svg": { - "mtime": 1757825615.3451345, - "ast_hash": "02bdbaa81b8cc03adcb530e19542e3bb", - "semantic_hash": "02bdbaa81b8cc03adcb530e19542e3bb" - }, - "apps/admin-dashboard/public/logo/intevia_logo.png": { - "mtime": 1757825615.3455944, - "ast_hash": "7033f3e5ce98174ba6927679ac59af64", - "semantic_hash": "7033f3e5ce98174ba6927679ac59af64" - }, - "apps/admin-dashboard/public/logo/intevia_logo.svg": { - "mtime": 1757825615.3459468, - "ast_hash": "fda17cb2ce4448ad731bad1e1f77f58a", - "semantic_hash": "fda17cb2ce4448ad731bad1e1f77f58a" - }, - "apps/app/src/renderer/public/logo/intevia(+logo).svg": { - "mtime": 1757084252.0642462, - "ast_hash": "a8da20188033cbf6dd8cbe5cd0f88af4", - "semantic_hash": "a8da20188033cbf6dd8cbe5cd0f88af4" - }, - "apps/app/src/renderer/public/logo/intevia.svg": { - "mtime": 1757084252.0643234, - "ast_hash": "02bdbaa81b8cc03adcb530e19542e3bb", - "semantic_hash": "02bdbaa81b8cc03adcb530e19542e3bb" - }, - "apps/app/src/renderer/public/logo/intevia_logo.png": { - "mtime": 1759200200.9235022, - "ast_hash": "6a36a8c735c8a61bfd564523ad92cfcd", - "semantic_hash": "6a36a8c735c8a61bfd564523ad92cfcd" - }, - "apps/app/src/renderer/public/logo/intevia_logo.svg": { - "mtime": 1757084252.0646572, - "ast_hash": "fda17cb2ce4448ad731bad1e1f77f58a", - "semantic_hash": "fda17cb2ce4448ad731bad1e1f77f58a" - }, - "apps/app/src/renderer/public/logo/intevia_logo_bg.svg": { - "mtime": 1759200200.923822, - "ast_hash": "70cf11122cb7f76b436fed00adaffea0", - "semantic_hash": "70cf11122cb7f76b436fed00adaffea0" - }, - "apps/app/src/renderer/src/assets/electron.svg": { - "mtime": 1756297804.5598474, - "ast_hash": "7e350671f4993b01b6110e283cb7ab02", - "semantic_hash": "7e350671f4993b01b6110e283cb7ab02" - }, - "apps/app/src/renderer/src/assets/wavy-lines.svg": { - "mtime": 1756297800.9859123, - "ast_hash": "990cf549e920e993d4c1998c217661c6", - "semantic_hash": "990cf549e920e993d4c1998c217661c6" - }, - "apps/web/public/meeting/google.png": { - "mtime": 1753113293.2812545, - "ast_hash": "2e776d99c875a69cad1e2e14552551a4", - "semantic_hash": "2e776d99c875a69cad1e2e14552551a4" - }, - "apps/web/public/meeting/intevia(+logo).svg": { - "mtime": 1757776142.2775347, - "ast_hash": "a8da20188033cbf6dd8cbe5cd0f88af4", - "semantic_hash": "a8da20188033cbf6dd8cbe5cd0f88af4" - }, - "apps/web/public/meeting/intevia.svg": { - "mtime": 1757776142.9608235, - "ast_hash": "02bdbaa81b8cc03adcb530e19542e3bb", - "semantic_hash": "02bdbaa81b8cc03adcb530e19542e3bb" - }, - "apps/web/public/meeting/intevia_logo.png": { - "mtime": 1757776143.7603736, - "ast_hash": "7033f3e5ce98174ba6927679ac59af64", - "semantic_hash": "7033f3e5ce98174ba6927679ac59af64" - }, - "apps/web/public/meeting/intevia_logo.svg": { - "mtime": 1757776144.5602608, - "ast_hash": "fda17cb2ce4448ad731bad1e1f77f58a", - "semantic_hash": "fda17cb2ce4448ad731bad1e1f77f58a" - }, - "apps/web/public/meeting/ms_meeting.png": { - "mtime": 1755360516.1930923, - "ast_hash": "58209df0050c34149dfb1a11e2424942", - "semantic_hash": "58209df0050c34149dfb1a11e2424942" - }, - "apps/web/public/meeting/webex.png": { - "mtime": 1755360516.1942236, - "ast_hash": "969b27a3c2d1424a4e84615ccb00c1f4", - "semantic_hash": "969b27a3c2d1424a4e84615ccb00c1f4" - }, - "apps/web/public/meeting/zoom.png": { - "mtime": 1753113293.2826123, - "ast_hash": "d0da0f30b87514d3a4db058dc422ae3a", - "semantic_hash": "d0da0f30b87514d3a4db058dc422ae3a" - }, - "apps/web/public/placeholder.png": { - "mtime": 1753113293.2828119, - "ast_hash": "f04ec8cef80f319a70f846b07fefe4f6", - "semantic_hash": "f04ec8cef80f319a70f846b07fefe4f6" - }, - "apps/web/public/team/wei.jpg": { - "mtime": 1762178339.53229, - "ast_hash": "ffb52722149e204ee103736b4625c2c1", - "semantic_hash": "ffb52722149e204ee103736b4625c2c1" - }, - "apps/web/public/team/yao.jpg": { - "mtime": 1762178339.5327034, - "ast_hash": "828ec3430471561fe3e47151c5ae3314", - "semantic_hash": "828ec3430471561fe3e47151c5ae3314" - }, - "apps/web/public/team/ye.jpg": { - "mtime": 1762178339.5329013, - "ast_hash": "db3af16e4ddce04080d22e83274a8c6c", - "semantic_hash": "db3af16e4ddce04080d22e83274a8c6c" - }, - ".remember/tmp/last-ndc.ts": { - "mtime": 1780727137.0932486, - "ast_hash": "4cea4f5102240c13a0cae871e5aa77b9", - "semantic_hash": "" - }, - ".remember/tmp/last-save.json": { - "mtime": 1780729376.5321147, - "ast_hash": "864b530974b58315c0dd9a1f1e6f175c", - "semantic_hash": "" - }, - ".remember/now.md": { - "mtime": 1780729376.4959729, - "ast_hash": "d76b4aafbfdfe81f94e1efd90964592d", - "semantic_hash": "" - }, - ".remember/today-2026-06-06.md": { - "mtime": 1780727150.2999213, - "ast_hash": "c612115fc099fb67adcd1cad74608b80", - "semantic_hash": "" - } -} \ No newline at end of file diff --git a/graphify-out/cost.json b/graphify-out/cost.json deleted file mode 100644 index 74263f42..00000000 --- a/graphify-out/cost.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "runs": [ - { - "date": "2026-06-06T06:16:40.717322+00:00", - "input_tokens": 593217, - "output_tokens": 0, - "files": 445 - } - ], - "total_input_tokens": 593217, - "total_output_tokens": 0 -} \ No newline at end of file diff --git a/graphify-out/manifest.json b/graphify-out/manifest.json deleted file mode 100644 index 7afb5f35..00000000 --- a/graphify-out/manifest.json +++ /dev/null @@ -1,2067 +0,0 @@ -{ - ".eslintrc.js": { - "mtime": 1754482602.9354572, - "ast_hash": "499a4acb997fd7673a6cba0fb8deefcb", - "semantic_hash": "499a4acb997fd7673a6cba0fb8deefcb" - }, - "apps/admin-dashboard/app/analytics/engagement/client-view.tsx": { - "mtime": 1760696521.6879454, - "ast_hash": "7d0a70f6b458a3baebdae6b50f9c51d4", - "semantic_hash": "7d0a70f6b458a3baebdae6b50f9c51d4" - }, - "apps/admin-dashboard/app/analytics/engagement/page.tsx": { - "mtime": 1760696521.6881006, - "ast_hash": "a6069ac3931a685c0475a03ab6d984ae", - "semantic_hash": "a6069ac3931a685c0475a03ab6d984ae" - }, - "apps/admin-dashboard/app/analytics/errors/client-view.tsx": { - "mtime": 1760696521.6883297, - "ast_hash": "dba01250f78a006726ad542764a91429", - "semantic_hash": "dba01250f78a006726ad542764a91429" - }, - "apps/admin-dashboard/app/analytics/errors/page.tsx": { - "mtime": 1760696521.68879, - "ast_hash": "e00820a469dd098642ab4bcf372e2bd8", - "semantic_hash": "e00820a469dd098642ab4bcf372e2bd8" - }, - "apps/admin-dashboard/app/analytics/features/client-view.tsx": { - "mtime": 1760696521.6892715, - "ast_hash": "10384bace0da0ea5e2663abb7d0926a7", - "semantic_hash": "10384bace0da0ea5e2663abb7d0926a7" - }, - "apps/admin-dashboard/app/analytics/features/page.tsx": { - "mtime": 1760696521.6894443, - "ast_hash": "d11589151862f6e64e0e28f95117b370", - "semantic_hash": "d11589151862f6e64e0e28f95117b370" - }, - "apps/admin-dashboard/app/analytics/layout.tsx": { - "mtime": 1760696521.6897106, - "ast_hash": "c80d4dadfaa34c4ea0bd081a78bb1c34", - "semantic_hash": "c80d4dadfaa34c4ea0bd081a78bb1c34" - }, - "apps/admin-dashboard/app/analytics/overview/client-view.tsx": { - "mtime": 1760696521.6901417, - "ast_hash": "57133eb7e7850bce2f7c9608df7ba10a", - "semantic_hash": "57133eb7e7850bce2f7c9608df7ba10a" - }, - "apps/admin-dashboard/app/analytics/overview/page.tsx": { - "mtime": 1760696521.6905503, - "ast_hash": "c92f24b39c1dac044ad0307ddf5fbb59", - "semantic_hash": "c92f24b39c1dac044ad0307ddf5fbb59" - }, - "apps/admin-dashboard/app/analytics/users/client-view.tsx": { - "mtime": 1760696521.6909075, - "ast_hash": "03dd59ca74d7ca797c2d9946e3256879", - "semantic_hash": "03dd59ca74d7ca797c2d9946e3256879" - }, - "apps/admin-dashboard/app/analytics/users/page.tsx": { - "mtime": 1760696521.691161, - "ast_hash": "491070d15bae4c6f03b1c1c42080af04", - "semantic_hash": "491070d15bae4c6f03b1c1c42080af04" - }, - "apps/admin-dashboard/app/auth/callback/layout.tsx": { - "mtime": 1760621325.8891156, - "ast_hash": "7e34734da47244c804a1c46ca4db7dbc", - "semantic_hash": "7e34734da47244c804a1c46ca4db7dbc" - }, - "apps/admin-dashboard/app/auth/callback/page.tsx": { - "mtime": 1760698759.688935, - "ast_hash": "a920c9be1b0757dbd64d0f08552e332a", - "semantic_hash": "a920c9be1b0757dbd64d0f08552e332a" - }, - "apps/admin-dashboard/app/layout.tsx": { - "mtime": 1760696521.6919887, - "ast_hash": "cbf0ce0d5ab69f75400254d70c4a26e4", - "semantic_hash": "cbf0ce0d5ab69f75400254d70c4a26e4" - }, - "apps/admin-dashboard/app/login/page.tsx": { - "mtime": 1760696521.69227, - "ast_hash": "b0426cf1b68e8a7062de84c0e6fcc31e", - "semantic_hash": "b0426cf1b68e8a7062de84c0e6fcc31e" - }, - "apps/admin-dashboard/app/logout/page.tsx": { - "mtime": 1760696521.6925542, - "ast_hash": "94f6f901a73dfb6cc9e1e279ba1a3c62", - "semantic_hash": "94f6f901a73dfb6cc9e1e279ba1a3c62" - }, - "apps/admin-dashboard/app/page.tsx": { - "mtime": 1760696521.69276, - "ast_hash": "c73db1d23fe14f5ea543caf349e37c23", - "semantic_hash": "c73db1d23fe14f5ea543caf349e37c23" - }, - "apps/admin-dashboard/app/test-auth/page.tsx": { - "mtime": 1760696521.692974, - "ast_hash": "3abd892d1f2859283ea557b657000583", - "semantic_hash": "3abd892d1f2859283ea557b657000583" - }, - "apps/admin-dashboard/app/unauthorized/page.tsx": { - "mtime": 1760696521.693183, - "ast_hash": "06c581fb0c4c3c921250da762c40023c", - "semantic_hash": "06c581fb0c4c3c921250da762c40023c" - }, - "apps/admin-dashboard/app/waitlist/page.tsx": { - "mtime": 1761748353.1678293, - "ast_hash": "9886d3600d8c8245f58db0dc387b5719", - "semantic_hash": "9886d3600d8c8245f58db0dc387b5719" - }, - "apps/admin-dashboard/components.json": { - "mtime": 1757825615.3388984, - "ast_hash": "7495a623b1693e1588cd718f03961093", - "semantic_hash": "7495a623b1693e1588cd718f03961093" - }, - "apps/admin-dashboard/components/AuthGuard.tsx": { - "mtime": 1760696521.693401, - "ast_hash": "4ca33d4c43697a3b9bc0548a8c475964", - "semantic_hash": "4ca33d4c43697a3b9bc0548a8c475964" - }, - "apps/admin-dashboard/components/DashboardLayout.tsx": { - "mtime": 1761748353.1684778, - "ast_hash": "3da501d19fd358f42bb7f67a9c491b2b", - "semantic_hash": "3da501d19fd358f42bb7f67a9c491b2b" - }, - "apps/admin-dashboard/components/EditRoleDialog.tsx": { - "mtime": 1760696521.694039, - "ast_hash": "9e9b26d9a3c9031ee9d0743a7154e75a", - "semantic_hash": "9e9b26d9a3c9031ee9d0743a7154e75a" - }, - "apps/admin-dashboard/components/EmailPreviewDialog.tsx": { - "mtime": 1762180707.9097602, - "ast_hash": "462ad9a737d147d32409e8e1439aa089", - "semantic_hash": "462ad9a737d147d32409e8e1439aa089" - }, - "apps/admin-dashboard/components/ResetStatusDialog.tsx": { - "mtime": 1761843669.401986, - "ast_hash": "7564c79defc58ed784b0dd194686d2d8", - "semantic_hash": "7564c79defc58ed784b0dd194686d2d8" - }, - "apps/admin-dashboard/components/SendInvitationDialog.tsx": { - "mtime": 1761925251.4148283, - "ast_hash": "0276de6ba6a020b83e7649f38c47901c", - "semantic_hash": "0276de6ba6a020b83e7649f38c47901c" - }, - "apps/admin-dashboard/components/UserTable.tsx": { - "mtime": 1760696521.694213, - "ast_hash": "b235bc1d38fc5ca3f4782d983d03b656", - "semantic_hash": "b235bc1d38fc5ca3f4782d983d03b656" - }, - "apps/admin-dashboard/components/ViewLogsDialog.tsx": { - "mtime": 1760696521.6944132, - "ast_hash": "4575f5cd455500d968852b5ef36f681b", - "semantic_hash": "4575f5cd455500d968852b5ef36f681b" - }, - "apps/admin-dashboard/components/WaitlistTable.tsx": { - "mtime": 1761843717.1838388, - "ast_hash": "0e525cfb05ebc55583abc5138c6321e5", - "semantic_hash": "0e525cfb05ebc55583abc5138c6321e5" - }, - "apps/admin-dashboard/components/analytics/CostEstimationWidget.tsx": { - "mtime": 1760696521.6948297, - "ast_hash": "4a4d63eca54c2afc4314c56d13e92bf4", - "semantic_hash": "4a4d63eca54c2afc4314c56d13e92bf4" - }, - "apps/admin-dashboard/components/analytics/TokenUsageCard.tsx": { - "mtime": 1760696521.695063, - "ast_hash": "9e371e09f764c673ae13b85a9449abd8", - "semantic_hash": "9e371e09f764c673ae13b85a9449abd8" - }, - "apps/admin-dashboard/components/analytics/date-range-picker.tsx": { - "mtime": 1760696521.6952055, - "ast_hash": "35a1e7da20b2d7252a08b117af4a4326", - "semantic_hash": "35a1e7da20b2d7252a08b117af4a4326" - }, - "apps/admin-dashboard/components/analytics/dau-chart.tsx": { - "mtime": 1760696521.6953504, - "ast_hash": "1e454c2a882e694d2bc352d76a346d67", - "semantic_hash": "1e454c2a882e694d2bc352d76a346d67" - }, - "apps/admin-dashboard/components/analytics/engagement-histogram.tsx": { - "mtime": 1760696521.695506, - "ast_hash": "67d4137542c00fb8e131eaeb58b8ba30", - "semantic_hash": "67d4137542c00fb8e131eaeb58b8ba30" - }, - "apps/admin-dashboard/components/analytics/error-rate-chart.tsx": { - "mtime": 1760696521.6956398, - "ast_hash": "c09e3674bf23e7c68827e3b9929eb120", - "semantic_hash": "c09e3674bf23e7c68827e3b9929eb120" - }, - "apps/admin-dashboard/components/analytics/export-button.tsx": { - "mtime": 1760696521.6957827, - "ast_hash": "b9c220a0cae3d33b5256c761141e4549", - "semantic_hash": "b9c220a0cae3d33b5256c761141e4549" - }, - "apps/admin-dashboard/components/analytics/feature-adoption-chart.tsx": { - "mtime": 1760696521.6959262, - "ast_hash": "7314394512f108148a33f8116c126cf7", - "semantic_hash": "7314394512f108148a33f8116c126cf7" - }, - "apps/admin-dashboard/components/analytics/index.ts": { - "mtime": 1760696521.69609, - "ast_hash": "2b2fadbeb25f695a16bff855eb961557", - "semantic_hash": "2b2fadbeb25f695a16bff855eb961557" - }, - "apps/admin-dashboard/components/analytics/overview-metrics-grid.tsx": { - "mtime": 1760696521.696313, - "ast_hash": "2af6a2f2f658bc4d37346f1587e0fc26", - "semantic_hash": "2af6a2f2f658bc4d37346f1587e0fc26" - }, - "apps/admin-dashboard/components/analytics/session-metrics-card.tsx": { - "mtime": 1760696521.6964629, - "ast_hash": "e83e3cf3ccd56b835b586036b8fb0d14", - "semantic_hash": "e83e3cf3ccd56b835b586036b8fb0d14" - }, - "apps/admin-dashboard/components/analytics/wau-mau-chart.tsx": { - "mtime": 1760696521.696629, - "ast_hash": "53949b190b40eeb539d360709312567d", - "semantic_hash": "53949b190b40eeb539d360709312567d" - }, - "apps/admin-dashboard/components/design-system/colors.ts": { - "mtime": 1760696521.6968606, - "ast_hash": "4b1355cd05e05bcd0ab8566cfc837ed7", - "semantic_hash": "4b1355cd05e05bcd0ab8566cfc837ed7" - }, - "apps/admin-dashboard/components/design-system/index.ts": { - "mtime": 1760696521.6969981, - "ast_hash": "646475ac04fb259a1d9277f435ac0076", - "semantic_hash": "646475ac04fb259a1d9277f435ac0076" - }, - "apps/admin-dashboard/components/design-system/modern-bar-chart.tsx": { - "mtime": 1760696521.6972322, - "ast_hash": "2ece4d268630cffb2249f1e8cdebabbc", - "semantic_hash": "2ece4d268630cffb2249f1e8cdebabbc" - }, - "apps/admin-dashboard/components/design-system/modern-data-table.tsx": { - "mtime": 1760696521.6974955, - "ast_hash": "ecaa2bf4c27cf07f493bd49f59c24bd9", - "semantic_hash": "ecaa2bf4c27cf07f493bd49f59c24bd9" - }, - "apps/admin-dashboard/components/design-system/modern-line-chart.tsx": { - "mtime": 1760696521.6978884, - "ast_hash": "254fa7cdc269a978f94a4e6e548950ba", - "semantic_hash": "254fa7cdc269a978f94a4e6e548950ba" - }, - "apps/admin-dashboard/components/design-system/modern-metric-card.tsx": { - "mtime": 1760696521.6981893, - "ast_hash": "a082d5399b79b22b3f617f496bb9686b", - "semantic_hash": "a082d5399b79b22b3f617f496bb9686b" - }, - "apps/admin-dashboard/components/logo.tsx": { - "mtime": 1760621363.684277, - "ast_hash": "a80b0f089fce3a90f0533bd33716e42b", - "semantic_hash": "a80b0f089fce3a90f0533bd33716e42b" - }, - "apps/admin-dashboard/components/providers.tsx": { - "mtime": 1760621363.8447714, - "ast_hash": "fd29d949ab99a26acb856dec339c6c47", - "semantic_hash": "fd29d949ab99a26acb856dec339c6c47" - }, - "apps/admin-dashboard/context/AuthContext.tsx": { - "mtime": 1760696521.698478, - "ast_hash": "745c4a11361af099347e36459c96fad3", - "semantic_hash": "745c4a11361af099347e36459c96fad3" - }, - "apps/admin-dashboard/eslint.config.js": { - "mtime": 1757825615.3425806, - "ast_hash": "b1b307ace41d163147d2e6b23fd3d2d6", - "semantic_hash": "b1b307ace41d163147d2e6b23fd3d2d6" - }, - "apps/admin-dashboard/lib/analytics/queries.ts": { - "mtime": 1760696521.698801, - "ast_hash": "a7197145f8f96e5680e46fecfce624be", - "semantic_hash": "a7197145f8f96e5680e46fecfce624be" - }, - "apps/admin-dashboard/lib/analytics/types.ts": { - "mtime": 1760696521.6992633, - "ast_hash": "d72cc53ce8d295f1e8e390abd0486f5a", - "semantic_hash": "d72cc53ce8d295f1e8e390abd0486f5a" - }, - "apps/admin-dashboard/lib/analytics/user-activity-queries.ts": { - "mtime": 1760696521.699527, - "ast_hash": "5be8554c0d5bc0ff2caba5320f108b1b", - "semantic_hash": "5be8554c0d5bc0ff2caba5320f108b1b" - }, - "apps/admin-dashboard/lib/supabase-client.ts": { - "mtime": 1760704894.99084, - "ast_hash": "a16a04d1423c117ebcd897da3b01dd37", - "semantic_hash": "a16a04d1423c117ebcd897da3b01dd37" - }, - "apps/admin-dashboard/lib/supabase-server.ts": { - "mtime": 1760696521.6999989, - "ast_hash": "9b930ddd31bd966eca90cf92150f529d", - "semantic_hash": "9b930ddd31bd966eca90cf92150f529d" - }, - "apps/admin-dashboard/middleware.ts": { - "mtime": 1760696521.7006679, - "ast_hash": "b6c9c775af11287cbc4ee21eb4579c0e", - "semantic_hash": "b6c9c775af11287cbc4ee21eb4579c0e" - }, - "apps/admin-dashboard/next-env.d.ts": { - "mtime": 1760696521.7010121, - "ast_hash": "ba64ff7d54714a8f64db89b1003207d8", - "semantic_hash": "ba64ff7d54714a8f64db89b1003207d8" - }, - "apps/admin-dashboard/next.config.mjs": { - "mtime": 1757825615.3437886, - "ast_hash": "96b5421c5a84d7826cc2a757595ac568", - "semantic_hash": "96b5421c5a84d7826cc2a757595ac568" - }, - "apps/admin-dashboard/package.json": { - "mtime": 1761823377.015263, - "ast_hash": "05aca1504ec9c1511442b71d4014131c", - "semantic_hash": "05aca1504ec9c1511442b71d4014131c" - }, - "apps/admin-dashboard/postcss.config.mjs": { - "mtime": 1757825615.3442376, - "ast_hash": "c2fa9f5bf5678c555f31e75bed0a4fc2", - "semantic_hash": "c2fa9f5bf5678c555f31e75bed0a4fc2" - }, - "apps/admin-dashboard/tsconfig.json": { - "mtime": 1757825615.3460407, - "ast_hash": "ae42a760d61107cbc206566c7b6cce0a", - "semantic_hash": "ae42a760d61107cbc206566c7b6cce0a" - }, - "apps/app/code-signing/build-mac-signed.sh": { - "mtime": 1757048552.3840318, - "ast_hash": "c84217b819ef7b637a88f5d885a2e5f9", - "semantic_hash": "c84217b819ef7b637a88f5d885a2e5f9" - }, - "apps/app/code-signing/notarize.js": { - "mtime": 1757084252.0632145, - "ast_hash": "86a67ac84faeebb9a5c5a6a8505b5ab2", - "semantic_hash": "86a67ac84faeebb9a5c5a6a8505b5ab2" - }, - "apps/app/code-signing/sign-dylibs.js": { - "mtime": 1759399863.3871868, - "ast_hash": "5f15dd763260f2722f03ca5d4cc8e478", - "semantic_hash": "5f15dd763260f2722f03ca5d4cc8e478" - }, - "apps/app/components.json": { - "mtime": 1760161026.6662169, - "ast_hash": "5aebc81813ce3db3138069cf77e45841", - "semantic_hash": "5aebc81813ce3db3138069cf77e45841" - }, - "apps/app/electron.vite.config.ts": { - "mtime": 1759765539.2945335, - "ast_hash": "24555b85168619a468e363ad0f3c7036", - "semantic_hash": "24555b85168619a468e363ad0f3c7036" - }, - "apps/app/eslint.config.mjs": { - "mtime": 1755360516.1621282, - "ast_hash": "3183f21704b2809b64fe177479fb942c", - "semantic_hash": "3183f21704b2809b64fe177479fb942c" - }, - "apps/app/package.json": { - "mtime": 1761748353.159904, - "ast_hash": "665b3b4b564a1bd85ee8bcd87a3efe12", - "semantic_hash": "665b3b4b564a1bd85ee8bcd87a3efe12" - }, - "apps/app/postcss.config.mjs": { - "mtime": 1755360516.1624694, - "ast_hash": "c56b5f3c12f777a86e2513f45daab56a", - "semantic_hash": "c56b5f3c12f777a86e2513f45daab56a" - }, - "apps/app/src/main/database.ts": { - "mtime": 1770456619.0279992, - "ast_hash": "98bbfa6b6454604731653ab9ba7187fb", - "semantic_hash": "98bbfa6b6454604731653ab9ba7187fb" - }, - "apps/app/src/main/databaseService.ts": { - "mtime": 1760208358.5607288, - "ast_hash": "4dbece5fe086d858f72172d7bfa1a918", - "semantic_hash": "4dbece5fe086d858f72172d7bfa1a918" - }, - "apps/app/src/main/index.ts": { - "mtime": 1770460216.1868203, - "ast_hash": "306bb8a569db3bb948772c44d24249f5", - "semantic_hash": "306bb8a569db3bb948772c44d24249f5" - }, - "apps/app/src/main/intentionProcessor.ts": { - "mtime": 1761663810.2448616, - "ast_hash": "d6c2164a040f5552f922b19d51d3f6d0", - "semantic_hash": "d6c2164a040f5552f922b19d51d3f6d0" - }, - "apps/app/src/main/localLLMPrompts.ts": { - "mtime": 1770460234.3831854, - "ast_hash": "ad0fca760e7a8740757c13f92dc60c5e", - "semantic_hash": "ad0fca760e7a8740757c13f92dc60c5e" - }, - "apps/app/src/main/ollamaService.ts": { - "mtime": 1770460184.4369814, - "ast_hash": "590a1d5e81dec4f44cab72ae85d39b2d", - "semantic_hash": "590a1d5e81dec4f44cab72ae85d39b2d" - }, - "apps/app/src/main/popoverManager.ts": { - "mtime": 1770455778.896914, - "ast_hash": "6b892349e4128d9636e9e4aabd1f7fb7", - "semantic_hash": "6b892349e4128d9636e9e4aabd1f7fb7" - }, - "apps/app/src/main/settingsWindowManager.ts": { - "mtime": 1770455778.897771, - "ast_hash": "39e9fedb8109d1f86b11711c8528bbbc", - "semantic_hash": "39e9fedb8109d1f86b11711c8528bbbc" - }, - "apps/app/src/main/transcriptionEnhancementService.ts": { - "mtime": 1770458117.3471425, - "ast_hash": "5e74d7a078954a18b5caebe0cc8904b8", - "semantic_hash": "5e74d7a078954a18b5caebe0cc8904b8" - }, - "apps/app/src/main/types/export.ts": { - "mtime": 1760208358.5627742, - "ast_hash": "2bae0eb0ca6a55393d8e09cf93730090", - "semantic_hash": "2bae0eb0ca6a55393d8e09cf93730090" - }, - "apps/app/src/main/utils/export-formatter.ts": { - "mtime": 1760208358.5633662, - "ast_hash": "4f22bc5157f2ceb77640a2ae7693c0c4", - "semantic_hash": "4f22bc5157f2ceb77640a2ae7693c0c4" - }, - "apps/app/src/main/whisperBackend.ts": { - "mtime": 1770445584.8538663, - "ast_hash": "bb2c9913d68602467e9df0f91de4b489", - "semantic_hash": "bb2c9913d68602467e9df0f91de4b489" - }, - "apps/app/src/main/windowManager.ts": { - "mtime": 1759765539.2964847, - "ast_hash": "7a88a4c0f94513c26bc3102438958c2a", - "semantic_hash": "7a88a4c0f94513c26bc3102438958c2a" - }, - "apps/app/src/preload/index.d.ts": { - "mtime": 1755784180.5834703, - "ast_hash": "49212028271d72b7ff84b2893299c17f", - "semantic_hash": "49212028271d72b7ff84b2893299c17f" - }, - "apps/app/src/preload/index.ts": { - "mtime": 1770457950.3389578, - "ast_hash": "549acaf36bb9051660d119d8f5aba874", - "semantic_hash": "549acaf36bb9051660d119d8f5aba874" - }, - "apps/app/src/renderer/public/worklets/mic-audio-processor.js": { - "mtime": 1759386727.0246794, - "ast_hash": "4c22205b4698a6005b06d81e0f0570f6", - "semantic_hash": "4c22205b4698a6005b06d81e0f0570f6" - }, - "apps/app/src/renderer/public/worklets/system-audio-processor.js": { - "mtime": 1759386727.0250492, - "ast_hash": "5ef2b0a351e8e05cc2a902e880561448", - "semantic_hash": "5ef2b0a351e8e05cc2a902e880561448" - }, - "apps/app/src/renderer/src/app/App.tsx": { - "mtime": 1760595356.5242853, - "ast_hash": "bf20b4e417451b8308e9e369850c5039", - "semantic_hash": "bf20b4e417451b8308e9e369850c5039" - }, - "apps/app/src/renderer/src/app/AppRouter.tsx": { - "mtime": 1759765539.2986789, - "ast_hash": "373822f84866af2c0615fd91bd4e8205", - "semantic_hash": "373822f84866af2c0615fd91bd4e8205" - }, - "apps/app/src/renderer/src/app/providers.tsx": { - "mtime": 1759143095.427457, - "ast_hash": "b4c65ea37a16ea0ccb76cdafc71e3376", - "semantic_hash": "b4c65ea37a16ea0ccb76cdafc71e3376" - }, - "apps/app/src/renderer/src/components/ActionQueue.tsx": { - "mtime": 1760208358.5656755, - "ast_hash": "00851618f122801aad19d5429562902e", - "semantic_hash": "00851618f122801aad19d5429562902e" - }, - "apps/app/src/renderer/src/components/ActionsPanel.tsx": { - "mtime": 1761665817.6537151, - "ast_hash": "5a8555eecd4c5fc237ca50d1e8b14f71", - "semantic_hash": "5a8555eecd4c5fc237ca50d1e8b14f71" - }, - "apps/app/src/renderer/src/components/ChatPanel.tsx": { - "mtime": 1760208358.5664532, - "ast_hash": "010ad48ab20fc5c99a8320479a2529bc", - "semantic_hash": "010ad48ab20fc5c99a8320479a2529bc" - }, - "apps/app/src/renderer/src/components/KeywordHighlighter.tsx": { - "mtime": 1760208358.5667632, - "ast_hash": "d34e665b320dc617feabd548452dcdfb", - "semantic_hash": "d34e665b320dc617feabd548452dcdfb" - }, - "apps/app/src/renderer/src/components/LoadingPage.tsx": { - "mtime": 1760208358.567208, - "ast_hash": "cc14f742ad8fb6c55da9615099344da8", - "semantic_hash": "cc14f742ad8fb6c55da9615099344da8" - }, - "apps/app/src/renderer/src/components/LoginPage.tsx": { - "mtime": 1759765002.9105046, - "ast_hash": "2829bbef59f069ac043a63040e8709c3", - "semantic_hash": "2829bbef59f069ac043a63040e8709c3" - }, - "apps/app/src/renderer/src/components/MainControlBar.tsx": { - "mtime": 1760198233.8703444, - "ast_hash": "a2f19850955a17277323df590c68bcfa", - "semantic_hash": "a2f19850955a17277323df590c68bcfa" - }, - "apps/app/src/renderer/src/components/MainController.tsx": { - "mtime": 1761328748.2140505, - "ast_hash": "1bd13ac0ab5fb6533f5b806b22b4ab9e", - "semantic_hash": "1bd13ac0ab5fb6533f5b806b22b4ab9e" - }, - "apps/app/src/renderer/src/components/MarkdownRenderer.tsx": { - "mtime": 1759764997.0774946, - "ast_hash": "dc90c2958de4ef309179995bafa66558", - "semantic_hash": "dc90c2958de4ef309179995bafa66558" - }, - "apps/app/src/renderer/src/components/PreviewPanel.tsx": { - "mtime": 1759764995.6619473, - "ast_hash": "d8a9380244242736e7ef969d9d99ac82", - "semantic_hash": "d8a9380244242736e7ef969d9d99ac82" - }, - "apps/app/src/renderer/src/components/RealTimeAnalysis.tsx": { - "mtime": 1770458170.3431592, - "ast_hash": "9443a3fe5acf42363d9e15a80ad08ada", - "semantic_hash": "9443a3fe5acf42363d9e15a80ad08ada" - }, - "apps/app/src/renderer/src/components/SelectionPage.tsx": { - "mtime": 1760208358.5683749, - "ast_hash": "cd3d4c219401513f0bad8fc54fae09dc", - "semantic_hash": "cd3d4c219401513f0bad8fc54fae09dc" - }, - "apps/app/src/renderer/src/components/SettingsPage.tsx": { - "mtime": 1770445680.4378579, - "ast_hash": "33820258a9b03b360d5b8f8054350c7c", - "semantic_hash": "33820258a9b03b360d5b8f8054350c7c" - }, - "apps/app/src/renderer/src/components/UpdaterPanel.tsx": { - "mtime": 1759765018.511983, - "ast_hash": "463374221757f7f44aab11b4b44b2172", - "semantic_hash": "463374221757f7f44aab11b4b44b2172" - }, - "apps/app/src/renderer/src/components/logo.tsx": { - "mtime": 1760693624.199204, - "ast_hash": "1441941b00becb8afbe4f772343de1c9", - "semantic_hash": "1441941b00becb8afbe4f772343de1c9" - }, - "apps/app/src/renderer/src/components/settings/AboutView.tsx": { - "mtime": 1761667147.4988008, - "ast_hash": "af736c56153453b411ef871342d136db", - "semantic_hash": "af736c56153453b411ef871342d136db" - }, - "apps/app/src/renderer/src/components/settings/AccountSettings.tsx": { - "mtime": 1760693717.51984, - "ast_hash": "315a9283555f2222702dd8a7337282cd", - "semantic_hash": "315a9283555f2222702dd8a7337282cd" - }, - "apps/app/src/renderer/src/components/settings/AutoTriggerSettings.tsx": { - "mtime": 1760208358.569326, - "ast_hash": "c06e8701cb819b4f28cce9929fef07e9", - "semantic_hash": "c06e8701cb819b4f28cce9929fef07e9" - }, - "apps/app/src/renderer/src/components/settings/CalendarPicker.tsx": { - "mtime": 1759765539.3040874, - "ast_hash": "d7949838fbb21ea620b7a51ba9e7d158", - "semantic_hash": "d7949838fbb21ea620b7a51ba9e7d158" - }, - "apps/app/src/renderer/src/components/settings/GeneralSettings.tsx": { - "mtime": 1760208358.5698292, - "ast_hash": "0e4b42608725c0c1c03909446a18141e", - "semantic_hash": "0e4b42608725c0c1c03909446a18141e" - }, - "apps/app/src/renderer/src/components/settings/HistoryView.tsx": { - "mtime": 1760208358.5703773, - "ast_hash": "0b7205ed828a0344f54cc0aa4e92ad70", - "semantic_hash": "0b7205ed828a0344f54cc0aa4e92ad70" - }, - "apps/app/src/renderer/src/components/settings/OllamaSettings.tsx": { - "mtime": 1770460189.5065556, - "ast_hash": "3561979eb991ef3b10c2079d72e40b0f", - "semantic_hash": "3561979eb991ef3b10c2079d72e40b0f" - }, - "apps/app/src/renderer/src/components/settings/SessionCard.tsx": { - "mtime": 1760208358.5708318, - "ast_hash": "8f521caec3d36b761ef1c74fe5a7831b", - "semantic_hash": "8f521caec3d36b761ef1c74fe5a7831b" - }, - "apps/app/src/renderer/src/components/settings/SettingsSidebar.tsx": { - "mtime": 1770445723.3739543, - "ast_hash": "1eb76245ca766b505925c2bc887b715d", - "semantic_hash": "1eb76245ca766b505925c2bc887b715d" - }, - "apps/app/src/renderer/src/components/settings/ShortcutsView.tsx": { - "mtime": 1759765539.305702, - "ast_hash": "10ea051edf55c3e9a537d2914c15e443", - "semantic_hash": "10ea051edf55c3e9a537d2914c15e443" - }, - "apps/app/src/renderer/src/components/ui/AnimatedText.tsx": { - "mtime": 1757698602.8060265, - "ast_hash": "d1afb91b6dc5922ca948bd3b6b2ad776", - "semantic_hash": "d1afb91b6dc5922ca948bd3b6b2ad776" - }, - "apps/app/src/renderer/src/components/ui/alert.tsx": { - "mtime": 1759765539.306074, - "ast_hash": "6f9cbda26bf358040c66daa18353bd0f", - "semantic_hash": "6f9cbda26bf358040c66daa18353bd0f" - }, - "apps/app/src/renderer/src/components/ui/avatar.tsx": { - "mtime": 1759765539.306661, - "ast_hash": "ce4fe60f4c48c01a5a601d9835648b40", - "semantic_hash": "ce4fe60f4c48c01a5a601d9835648b40" - }, - "apps/app/src/renderer/src/components/ui/badge.tsx": { - "mtime": 1759765539.3073633, - "ast_hash": "d418e7d17e73d698299284a0e46e3e9f", - "semantic_hash": "d418e7d17e73d698299284a0e46e3e9f" - }, - "apps/app/src/renderer/src/components/ui/button.tsx": { - "mtime": 1757084252.0673637, - "ast_hash": "2284d3d313fb837007c45e62f12c1c08", - "semantic_hash": "2284d3d313fb837007c45e62f12c1c08" - }, - "apps/app/src/renderer/src/components/ui/card.tsx": { - "mtime": 1756796812.147516, - "ast_hash": "671ed9a92bcfad592a31ddaba6dc007a", - "semantic_hash": "671ed9a92bcfad592a31ddaba6dc007a" - }, - "apps/app/src/renderer/src/components/ui/dialog.tsx": { - "mtime": 1756796812.1477425, - "ast_hash": "078f5a8817eb1ab6f4c81a3e2a9b366e", - "semantic_hash": "078f5a8817eb1ab6f4c81a3e2a9b366e" - }, - "apps/app/src/renderer/src/components/ui/input.tsx": { - "mtime": 1756796812.1479352, - "ast_hash": "6af718ada2c33bc2c8fca1b02f1ea8ca", - "semantic_hash": "6af718ada2c33bc2c8fca1b02f1ea8ca" - }, - "apps/app/src/renderer/src/components/ui/label.tsx": { - "mtime": 1756796812.148472, - "ast_hash": "4d555ac1839d2400109c3e10a91af39d", - "semantic_hash": "4d555ac1839d2400109c3e10a91af39d" - }, - "apps/app/src/renderer/src/components/ui/popover.tsx": { - "mtime": 1756796812.1486135, - "ast_hash": "0d3652c78d8b43951911a0bc3aff31d5", - "semantic_hash": "0d3652c78d8b43951911a0bc3aff31d5" - }, - "apps/app/src/renderer/src/components/ui/progress.tsx": { - "mtime": 1759765539.3081353, - "ast_hash": "97b0fc2e77eba6412131f9d54dc68a8a", - "semantic_hash": "97b0fc2e77eba6412131f9d54dc68a8a" - }, - "apps/app/src/renderer/src/components/ui/radio-group.tsx": { - "mtime": 1760208358.5715358, - "ast_hash": "e9b130a08e4d0126ecb254e46b86661b", - "semantic_hash": "e9b130a08e4d0126ecb254e46b86661b" - }, - "apps/app/src/renderer/src/components/ui/resizable.tsx": { - "mtime": 1756796812.1488342, - "ast_hash": "3eb6f0e11517a74c48134bdb49323f29", - "semantic_hash": "3eb6f0e11517a74c48134bdb49323f29" - }, - "apps/app/src/renderer/src/components/ui/select.tsx": { - "mtime": 1756796812.1490593, - "ast_hash": "04eb81ab81572e0e79cbfdb8da65a317", - "semantic_hash": "04eb81ab81572e0e79cbfdb8da65a317" - }, - "apps/app/src/renderer/src/components/ui/skeleton.tsx": { - "mtime": 1759765539.310273, - "ast_hash": "0501cf882399b1db3a8e2addfe0cfecf", - "semantic_hash": "0501cf882399b1db3a8e2addfe0cfecf" - }, - "apps/app/src/renderer/src/components/ui/slider.tsx": { - "mtime": 1760208358.5718381, - "ast_hash": "5fbab7963bd442067af44a2b02d894d1", - "semantic_hash": "5fbab7963bd442067af44a2b02d894d1" - }, - "apps/app/src/renderer/src/components/ui/sonner.tsx": { - "mtime": 1756796812.149366, - "ast_hash": "92b245aabc0b2d63281bbc2ece7470eb", - "semantic_hash": "92b245aabc0b2d63281bbc2ece7470eb" - }, - "apps/app/src/renderer/src/components/ui/switch.tsx": { - "mtime": 1756796812.1499202, - "ast_hash": "819ac386400bff5a197344b0355099ae", - "semantic_hash": "819ac386400bff5a197344b0355099ae" - }, - "apps/app/src/renderer/src/components/ui/table.tsx": { - "mtime": 1759765539.3124502, - "ast_hash": "6c42a48097fd46f40fe776fc1c307d96", - "semantic_hash": "6c42a48097fd46f40fe776fc1c307d96" - }, - "apps/app/src/renderer/src/components/ui/textarea.tsx": { - "mtime": 1756796812.1503456, - "ast_hash": "67fa8ed4455be2ce9ea36f854b832205", - "semantic_hash": "67fa8ed4455be2ce9ea36f854b832205" - }, - "apps/app/src/renderer/src/context/AuthContext.tsx": { - "mtime": 1761824751.2206006, - "ast_hash": "a428cbc4b6b0dc95daee68269a124d5e", - "semantic_hash": "a428cbc4b6b0dc95daee68269a124d5e" - }, - "apps/app/src/renderer/src/context/TranslationContext.tsx": { - "mtime": 1759765539.3140118, - "ast_hash": "dd79a31efcde5222d87abf0c96835213", - "semantic_hash": "dd79a31efcde5222d87abf0c96835213" - }, - "apps/app/src/renderer/src/env.d.ts": { - "mtime": 1758530377.3841248, - "ast_hash": "0352474ba2918efe13895edbc3780d94", - "semantic_hash": "0352474ba2918efe13895edbc3780d94" - }, - "apps/app/src/renderer/src/hooks/useAIInteraction.ts": { - "mtime": 1770458201.5691519, - "ast_hash": "de477b17a3ea0a51dc904ada8418807b", - "semantic_hash": "de477b17a3ea0a51dc904ada8418807b" - }, - "apps/app/src/renderer/src/hooks/useActionQueue.ts": { - "mtime": 1761328748.2212899, - "ast_hash": "dc63f52b500019add1df5e7dc9a17863", - "semantic_hash": "dc63f52b500019add1df5e7dc9a17863" - }, - "apps/app/src/renderer/src/hooks/useAudioAnalysis.ts": { - "mtime": 1758793069.9220114, - "ast_hash": "3946a931d956611130b49e582cfc66cd", - "semantic_hash": "3946a931d956611130b49e582cfc66cd" - }, - "apps/app/src/renderer/src/hooks/useAuth.ts": { - "mtime": 1759143095.4306815, - "ast_hash": "51df58a93a9f223c11d49d101d408cf7", - "semantic_hash": "51df58a93a9f223c11d49d101d408cf7" - }, - "apps/app/src/renderer/src/hooks/useElectron.ts": { - "mtime": 1757654451.2213733, - "ast_hash": "b46b61e28bbdee104a5f98ef2e580f21", - "semantic_hash": "b46b61e28bbdee104a5f98ef2e580f21" - }, - "apps/app/src/renderer/src/hooks/useI18n.ts": { - "mtime": 1759143095.4308586, - "ast_hash": "0be70fd5f92f711255161350f3a1dc09", - "semantic_hash": "0be70fd5f92f711255161350f3a1dc09" - }, - "apps/app/src/renderer/src/hooks/useLanguage.ts": { - "mtime": 1759143095.4310026, - "ast_hash": "a6993ba04f40872f27dfb1ec74c1e6aa", - "semantic_hash": "a6993ba04f40872f27dfb1ec74c1e6aa" - }, - "apps/app/src/renderer/src/hooks/useScreenShare.ts": { - "mtime": 1760693717.5208366, - "ast_hash": "2f5b37537a3ae501f609db1465a9c9ec", - "semantic_hash": "2f5b37537a3ae501f609db1465a9c9ec" - }, - "apps/app/src/renderer/src/hooks/useSegmentRecorder.ts": { - "mtime": 1759386727.0268767, - "ast_hash": "6325b70338c0a32d1b3ee97f5fb4073a", - "semantic_hash": "6325b70338c0a32d1b3ee97f5fb4073a" - }, - "apps/app/src/renderer/src/hooks/useTranscriptionEnhancement.ts": { - "mtime": 1770458178.3949068, - "ast_hash": "64cdbe1bea33b6b86a344e7bb67f71d3", - "semantic_hash": "64cdbe1bea33b6b86a344e7bb67f71d3" - }, - "apps/app/src/renderer/src/lib/copy-utils.ts": { - "mtime": 1760208358.5733006, - "ast_hash": "af663e3bb713fe62ffb107af62ddf25c", - "semantic_hash": "af663e3bb713fe62ffb107af62ddf25c" - }, - "apps/app/src/renderer/src/lib/date-utils.ts": { - "mtime": 1759765539.315686, - "ast_hash": "9215a344165c12f9a4e84da3df6e8aec", - "semantic_hash": "9215a344165c12f9a4e84da3df6e8aec" - }, - "apps/app/src/renderer/src/lib/history-utils.ts": { - "mtime": 1759765539.3164809, - "ast_hash": "d2d6d7ad597e9167545595cbf16b0c66", - "semantic_hash": "d2d6d7ad597e9167545595cbf16b0c66" - }, - "apps/app/src/renderer/src/lib/translations.ts": { - "mtime": 1770445713.7907605, - "ast_hash": "fd48db8860d7f17bc1e6a0ae981a01c6", - "semantic_hash": "fd48db8860d7f17bc1e6a0ae981a01c6" - }, - "apps/app/src/renderer/src/lib/utils.ts": { - "mtime": 1755360516.1730635, - "ast_hash": "fb6ca08a007849efb7dd97f5acba344a", - "semantic_hash": "fb6ca08a007849efb7dd97f5acba344a" - }, - "apps/app/src/renderer/src/main.tsx": { - "mtime": 1759143095.4322598, - "ast_hash": "476e5c792cba44fa2358adb9957f5e94", - "semantic_hash": "476e5c792cba44fa2358adb9957f5e94" - }, - "apps/app/src/renderer/src/selection.tsx": { - "mtime": 1759765539.3181527, - "ast_hash": "fafdbbd0882934280b645d277b6d0076", - "semantic_hash": "fafdbbd0882934280b645d277b6d0076" - }, - "apps/app/src/renderer/src/services/ai-actions.ts": { - "mtime": 1761663865.848906, - "ast_hash": "85c3ca2878af85e28cd535cae09a8dc9", - "semantic_hash": "85c3ca2878af85e28cd535cae09a8dc9" - }, - "apps/app/src/renderer/src/services/analytics-service.ts": { - "mtime": 1760693717.5216722, - "ast_hash": "8bf531eee8538c584b7a6395f472ce48", - "semantic_hash": "8bf531eee8538c584b7a6395f472ce48" - }, - "apps/app/src/renderer/src/services/supabaseClient.ts": { - "mtime": 1759143095.4330351, - "ast_hash": "0cbb60c01993e972c327bdf736d9e64a", - "semantic_hash": "0cbb60c01993e972c327bdf736d9e64a" - }, - "apps/app/src/renderer/src/services/transcription.ts": { - "mtime": 1770455778.8996785, - "ast_hash": "05a3465270caad36dda7f9b364751f46", - "semantic_hash": "05a3465270caad36dda7f9b364751f46" - }, - "apps/app/src/renderer/src/services/whisperClient.ts": { - "mtime": 1760208358.574906, - "ast_hash": "035cda158de877e55a681c5e512a6942", - "semantic_hash": "035cda158de877e55a681c5e512a6942" - }, - "apps/app/src/renderer/src/settings.tsx": { - "mtime": 1759765539.3185148, - "ast_hash": "aebadab83cc3d33adfb37f29f7ffc01d", - "semantic_hash": "aebadab83cc3d33adfb37f29f7ffc01d" - }, - "apps/app/src/renderer/src/types/history.ts": { - "mtime": 1760208358.5752823, - "ast_hash": "0a6af63d87abcc9cb88118410f9d9001", - "semantic_hash": "0a6af63d87abcc9cb88118410f9d9001" - }, - "apps/app/src/renderer/src/types/index.ts": { - "mtime": 1770446006.5693939, - "ast_hash": "8f659fa89314138e56df12361b76eb26", - "semantic_hash": "8f659fa89314138e56df12361b76eb26" - }, - "apps/app/src/renderer/src/types/settings.ts": { - "mtime": 1760208358.5756102, - "ast_hash": "0ba8d6dfe036dff1fc72083a23a509cd", - "semantic_hash": "0ba8d6dfe036dff1fc72083a23a509cd" - }, - "apps/app/tailwind.config.ts": { - "mtime": 1755360516.1736, - "ast_hash": "f2772f24798a4a5211bc4fbd150d435a", - "semantic_hash": "f2772f24798a4a5211bc4fbd150d435a" - }, - "apps/app/tests/local-transcription/benchmark-performance.js": { - "mtime": 1761925251.4153054, - "ast_hash": "b1eda9c0f0bebf8e22c5772c049f16d1", - "semantic_hash": "b1eda9c0f0bebf8e22c5772c049f16d1" - }, - "apps/app/tests/local-transcription/quick-benchmark.js": { - "mtime": 1759200200.9277232, - "ast_hash": "dda37be86af5dcf3fa87d3c244faede5", - "semantic_hash": "dda37be86af5dcf3fa87d3c244faede5" - }, - "apps/app/tests/local-transcription/test-comprehensive.js": { - "mtime": 1761925251.4157693, - "ast_hash": "9fc63f5bd961fdd482cdb0cb6dfd2c7f", - "semantic_hash": "9fc63f5bd961fdd482cdb0cb6dfd2c7f" - }, - "apps/app/tests/local-transcription/test-services.mjs": { - "mtime": 1761925251.416296, - "ast_hash": "9fb879c7a3b49ee0e6144e2225180d30", - "semantic_hash": "9fb879c7a3b49ee0e6144e2225180d30" - }, - "apps/app/tests/local-transcription/test-transcription.js": { - "mtime": 1761925251.4166093, - "ast_hash": "1350b73c440efda5d8dbbe59f4a2fa48", - "semantic_hash": "1350b73c440efda5d8dbbe59f4a2fa48" - }, - "apps/app/tsconfig.json": { - "mtime": 1755360516.1737788, - "ast_hash": "f78ff8c2e2efb59fcf218eac57774d94", - "semantic_hash": "f78ff8c2e2efb59fcf218eac57774d94" - }, - "apps/app/tsconfig.node.json": { - "mtime": 1755360516.1738877, - "ast_hash": "9a09247aa797699e4223e0a9f78914dc", - "semantic_hash": "9a09247aa797699e4223e0a9f78914dc" - }, - "apps/app/tsconfig.web.json": { - "mtime": 1757598837.9316492, - "ast_hash": "190e07fadcd53c0606fde7cb23ef2855", - "semantic_hash": "190e07fadcd53c0606fde7cb23ef2855" - }, - "apps/web/app/(landing)/layout.tsx": { - "mtime": 1757338195.20135, - "ast_hash": "b2696cac2a696998e95af3eccd2800fb", - "semantic_hash": "b2696cac2a696998e95af3eccd2800fb" - }, - "apps/web/app/(landing)/page.tsx": { - "mtime": 1780729886.2083325, - "ast_hash": "f76645de74ceead7e38fd29f0f516118", - "semantic_hash": "" - }, - "apps/web/app/(landing)/privacy/page.tsx": { - "mtime": 1757338267.5203032, - "ast_hash": "84bde892d2536024d7abac46d2b19d81", - "semantic_hash": "84bde892d2536024d7abac46d2b19d81" - }, - "apps/web/app/(landing)/terms/page.tsx": { - "mtime": 1758383563.1580882, - "ast_hash": "a16fd35ff0e1714a031880dbe27e9731", - "semantic_hash": "a16fd35ff0e1714a031880dbe27e9731" - }, - "apps/web/app/api/feedback/route.ts": { - "mtime": 1756796812.1737113, - "ast_hash": "7b56e75e7eaa350d8cdaf8f70bbcce93", - "semantic_hash": "7b56e75e7eaa350d8cdaf8f70bbcce93" - }, - "apps/web/app/api/process-audio/route.ts": { - "mtime": 1756796812.1740062, - "ast_hash": "2072c7467de869b05c0483527ddcd468", - "semantic_hash": "2072c7467de869b05c0483527ddcd468" - }, - "apps/web/app/api/waitlist/route.ts": { - "mtime": 1756796812.1742282, - "ast_hash": "11a8edb647b1c782ff770ca71868cc99", - "semantic_hash": "11a8edb647b1c782ff770ca71868cc99" - }, - "apps/web/app/auth/callback/layout.tsx": { - "mtime": 1756796812.1744335, - "ast_hash": "7e34734da47244c804a1c46ca4db7dbc", - "semantic_hash": "7e34734da47244c804a1c46ca4db7dbc" - }, - "apps/web/app/auth/callback/page.tsx": { - "mtime": 1756796812.1746285, - "ast_hash": "e217ecae5ab75413eac530639dbba606", - "semantic_hash": "e217ecae5ab75413eac530639dbba606" - }, - "apps/web/app/auth/login/page.tsx": { - "mtime": 1756796812.1748686, - "ast_hash": "1bfe046f2067705276f79ca593490744", - "semantic_hash": "1bfe046f2067705276f79ca593490744" - }, - "apps/web/app/auth/register/page.tsx": { - "mtime": 1756796812.175139, - "ast_hash": "45c9651602bebcd442acd0c773cf85fb", - "semantic_hash": "45c9651602bebcd442acd0c773cf85fb" - }, - "apps/web/app/layout.tsx": { - "mtime": 1758383563.1584144, - "ast_hash": "70980de3e214e71a5fb6f4eefc52061b", - "semantic_hash": "70980de3e214e71a5fb6f4eefc52061b" - }, - "apps/web/components.json": { - "mtime": 1753113293.2774103, - "ast_hash": "7495a623b1693e1588cd718f03961093", - "semantic_hash": "7495a623b1693e1588cd718f03961093" - }, - "apps/web/components/call-to-action.tsx": { - "mtime": 1756796812.1802897, - "ast_hash": "ca72a90086e2117cb8c9a42ee87a5288", - "semantic_hash": "ca72a90086e2117cb8c9a42ee87a5288" - }, - "apps/web/components/evidence.tsx": { - "mtime": 1762517029.0194418, - "ast_hash": "74a2a88fb26fadfc3fd2390770e6ed0b", - "semantic_hash": "74a2a88fb26fadfc3fd2390770e6ed0b" - }, - "apps/web/components/features.tsx": { - "mtime": 1762516271.1541996, - "ast_hash": "b46d58331af1ad79731ddda97a3922b5", - "semantic_hash": "b46d58331af1ad79731ddda97a3922b5" - }, - "apps/web/components/footer.tsx": { - "mtime": 1761665798.6586232, - "ast_hash": "5afa6bf295d7fd14a9510010798c6192", - "semantic_hash": "5afa6bf295d7fd14a9510010798c6192" - }, - "apps/web/components/hero-header.tsx": { - "mtime": 1757338195.2023535, - "ast_hash": "890e3dfb9a83eb14992408dcff5b780e", - "semantic_hash": "890e3dfb9a83eb14992408dcff5b780e" - }, - "apps/web/components/hero-section.tsx": { - "mtime": 1757338195.0899572, - "ast_hash": "73609081e6235035c5818c35a69f8292", - "semantic_hash": "73609081e6235035c5818c35a69f8292" - }, - "apps/web/components/integrations.tsx": { - "mtime": 1756796812.1840067, - "ast_hash": "5e56cddff792da33df5ad291459639a7", - "semantic_hash": "5e56cddff792da33df5ad291459639a7" - }, - "apps/web/components/language-switcher.tsx": { - "mtime": 1756796812.1844647, - "ast_hash": "a64270a95f84848c7b62366c4a46946b", - "semantic_hash": "a64270a95f84848c7b62366c4a46946b" - }, - "apps/web/components/logo.tsx": { - "mtime": 1756796812.185946, - "ast_hash": "61dca0ea09e1f217b5b99f50feb7e20f", - "semantic_hash": "61dca0ea09e1f217b5b99f50feb7e20f" - }, - "apps/web/components/page-transition.tsx": { - "mtime": 1757338195.2133982, - "ast_hash": "671e4d9c773036b95d9322ef38b48710", - "semantic_hash": "671e4d9c773036b95d9322ef38b48710" - }, - "apps/web/components/pain-point.tsx": { - "mtime": 1762517082.8417146, - "ast_hash": "22bd150b415657f32479af077909519e", - "semantic_hash": "22bd150b415657f32479af077909519e" - }, - "apps/web/components/providers.tsx": { - "mtime": 1756375755.6541507, - "ast_hash": "fd29d949ab99a26acb856dec339c6c47", - "semantic_hash": "fd29d949ab99a26acb856dec339c6c47" - }, - "apps/web/components/solution.tsx": { - "mtime": 1756796812.187204, - "ast_hash": "590dc03c22069a453a6f4da0da817465", - "semantic_hash": "590dc03c22069a453a6f4da0da817465" - }, - "apps/web/components/team.tsx": { - "mtime": 1762179093.0916417, - "ast_hash": "d9eb244ac635d93bfc2606593350913b", - "semantic_hash": "d9eb244ac635d93bfc2606593350913b" - }, - "apps/web/components/video-demo.tsx": { - "mtime": 1762694749.296534, - "ast_hash": "88a888fd94035102cc5dd3cf178d2bc8", - "semantic_hash": "88a888fd94035102cc5dd3cf178d2bc8" - }, - "apps/web/components/waitlist-form.tsx": { - "mtime": 1756796812.187992, - "ast_hash": "5bfd47f804bf36b752b709d29b5d82e6", - "semantic_hash": "5bfd47f804bf36b752b709d29b5d82e6" - }, - "apps/web/components/waitlist-section.tsx": { - "mtime": 1756796812.188872, - "ast_hash": "97e561fe413b761a938fa6939f906e29", - "semantic_hash": "97e561fe413b761a938fa6939f906e29" - }, - "apps/web/context/language-context.tsx": { - "mtime": 1757338195.1703641, - "ast_hash": "e90c39eaa57e498b459aa35df7b9414a", - "semantic_hash": "e90c39eaa57e498b459aa35df7b9414a" - }, - "apps/web/eslint.config.js": { - "mtime": 1753113293.2802422, - "ast_hash": "b1b307ace41d163147d2e6b23fd3d2d6", - "semantic_hash": "b1b307ace41d163147d2e6b23fd3d2d6" - }, - "apps/web/hooks/useIntersectionObserver.ts": { - "mtime": 1762696061.6570556, - "ast_hash": "50133f6f2d8ad56bccfae36e91b6b9d8", - "semantic_hash": "50133f6f2d8ad56bccfae36e91b6b9d8" - }, - "apps/web/lib/i18n.ts": { - "mtime": 1756796812.1896904, - "ast_hash": "58db46dfde404b12a71c2cb944f36259", - "semantic_hash": "58db46dfde404b12a71c2cb944f36259" - }, - "apps/web/lib/supabaseClient.ts": { - "mtime": 1756796812.1899698, - "ast_hash": "508b85fbc7b14dc46b69c0ef680fcab3", - "semantic_hash": "508b85fbc7b14dc46b69c0ef680fcab3" - }, - "apps/web/lib/validateEnv.ts": { - "mtime": 1780729884.7432935, - "ast_hash": "6c3c31f8d21085d5578120ad09336c8e", - "semantic_hash": "" - }, - "apps/web/next-env.d.ts": { - "mtime": 1759765539.3192022, - "ast_hash": "ba64ff7d54714a8f64db89b1003207d8", - "semantic_hash": "ba64ff7d54714a8f64db89b1003207d8" - }, - "apps/web/next.config.mjs": { - "mtime": 1753113293.2808988, - "ast_hash": "96b5421c5a84d7826cc2a757595ac568", - "semantic_hash": "96b5421c5a84d7826cc2a757595ac568" - }, - "apps/web/package.json": { - "mtime": 1780729825.1941497, - "ast_hash": "7162d2aac122f093a4217731c750a602", - "semantic_hash": "" - }, - "apps/web/postcss.config.mjs": { - "mtime": 1753113293.281078, - "ast_hash": "c2fa9f5bf5678c555f31e75bed0a4fc2", - "semantic_hash": "c2fa9f5bf5678c555f31e75bed0a4fc2" - }, - "apps/web/public/locales/en.json": { - "mtime": 1780729889.4922416, - "ast_hash": "3f5ca4f3e28755eadf57e8c7a0911667", - "semantic_hash": "" - }, - "apps/web/public/locales/zh-TW.json": { - "mtime": 1780729892.3561306, - "ast_hash": "df0eee88f1d913142618574c0f1baef8", - "semantic_hash": "" - }, - "apps/web/public/worklets/audio-processor.js": { - "mtime": 1753113293.2850184, - "ast_hash": "a8192c07a29046fe648771a5657fcf5b", - "semantic_hash": "a8192c07a29046fe648771a5657fcf5b" - }, - "apps/web/tsconfig.json": { - "mtime": 1753113293.2851994, - "ast_hash": "ae42a760d61107cbc206566c7b6cce0a", - "semantic_hash": "ae42a760d61107cbc206566c7b6cce0a" - }, - "apps/web/utils/audioUtils.ts": { - "mtime": 1756796812.1906981, - "ast_hash": "3137b4594fb76742ebbbe71e3d7ab3af", - "semantic_hash": "3137b4594fb76742ebbbe71e3d7ab3af" - }, - "apps/web/vercel.json": { - "mtime": 1761665798.6588185, - "ast_hash": "688431b89ce81afc9922ff736e5224f9", - "semantic_hash": "688431b89ce81afc9922ff736e5224f9" - }, - "package.json": { - "mtime": 1761372095.380427, - "ast_hash": "8085064aa304f3289eeca5cd748d8e4b", - "semantic_hash": "8085064aa304f3289eeca5cd748d8e4b" - }, - "packages/eslint-config/base.js": { - "mtime": 1753113293.2856667, - "ast_hash": "45b355ae247772103aa02662e5648aea", - "semantic_hash": "45b355ae247772103aa02662e5648aea" - }, - "packages/eslint-config/next.js": { - "mtime": 1753113293.2857325, - "ast_hash": "114583a5838869d01a4edb0d00fb1bb0", - "semantic_hash": "114583a5838869d01a4edb0d00fb1bb0" - }, - "packages/eslint-config/package.json": { - "mtime": 1753113293.285806, - "ast_hash": "edbc74ce7ebb0ab8af7665ec705c2373", - "semantic_hash": "edbc74ce7ebb0ab8af7665ec705c2373" - }, - "packages/eslint-config/react-internal.js": { - "mtime": 1753113293.2858813, - "ast_hash": "8304db1ab4204bfa8586682a1c96a139", - "semantic_hash": "8304db1ab4204bfa8586682a1c96a139" - }, - "packages/typescript-config/base.json": { - "mtime": 1753113293.2860532, - "ast_hash": "91496257ade11c7e49703b57f8dbe504", - "semantic_hash": "91496257ade11c7e49703b57f8dbe504" - }, - "packages/typescript-config/nextjs.json": { - "mtime": 1753113293.2861164, - "ast_hash": "8cbd1ce342dc2fa14771e38d4ae2d228", - "semantic_hash": "8cbd1ce342dc2fa14771e38d4ae2d228" - }, - "packages/typescript-config/package.json": { - "mtime": 1753113293.2861855, - "ast_hash": "b0509474339825bc63016ad5692d1f33", - "semantic_hash": "b0509474339825bc63016ad5692d1f33" - }, - "packages/typescript-config/react-library.json": { - "mtime": 1753113293.2862523, - "ast_hash": "177e163c90fad6598867a3a4a6b18d87", - "semantic_hash": "177e163c90fad6598867a3a4a6b18d87" - }, - "packages/ui/components.json": { - "mtime": 1754578277.4957373, - "ast_hash": "e4d2acbc892182625e010022820cee45", - "semantic_hash": "e4d2acbc892182625e010022820cee45" - }, - "packages/ui/eslint.config.js": { - "mtime": 1753113293.2870367, - "ast_hash": "c51fb75d7965548fed2964c1d5b91a73", - "semantic_hash": "c51fb75d7965548fed2964c1d5b91a73" - }, - "packages/ui/package.json": { - "mtime": 1755360516.1946917, - "ast_hash": "4b5bc4fbd11bc4a78e84247ae97f31e0", - "semantic_hash": "4b5bc4fbd11bc4a78e84247ae97f31e0" - }, - "packages/ui/postcss.config.mjs": { - "mtime": 1755360516.1948516, - "ast_hash": "784097f99502acdfcd097af2be35c661", - "semantic_hash": "784097f99502acdfcd097af2be35c661" - }, - "packages/ui/src/components/accordion.tsx": { - "mtime": 1756796812.1920834, - "ast_hash": "a537bb58ca63dcdbefc87d1293f17456", - "semantic_hash": "a537bb58ca63dcdbefc87d1293f17456" - }, - "packages/ui/src/components/alert-dialog.tsx": { - "mtime": 1756796812.1925488, - "ast_hash": "524d68ddfdf46366d299382b5e25336a", - "semantic_hash": "524d68ddfdf46366d299382b5e25336a" - }, - "packages/ui/src/components/alert.tsx": { - "mtime": 1756796812.1927657, - "ast_hash": "9e5e072768d711a05b50ca8e6a511b76", - "semantic_hash": "9e5e072768d711a05b50ca8e6a511b76" - }, - "packages/ui/src/components/animated-group.tsx": { - "mtime": 1756375756.0791943, - "ast_hash": "09a37f0bd0636e47147398569e33f3e1", - "semantic_hash": "09a37f0bd0636e47147398569e33f3e1" - }, - "packages/ui/src/components/aspect-ratio.tsx": { - "mtime": 1756796812.1932034, - "ast_hash": "09aa81bcf9b2130d0ee47abcb77ffe1e", - "semantic_hash": "09aa81bcf9b2130d0ee47abcb77ffe1e" - }, - "packages/ui/src/components/avatar.tsx": { - "mtime": 1756796812.193471, - "ast_hash": "09ca0e330f4c3f5659c378edb825c0cf", - "semantic_hash": "09ca0e330f4c3f5659c378edb825c0cf" - }, - "packages/ui/src/components/badge.tsx": { - "mtime": 1756796812.1937494, - "ast_hash": "f2edc10e0144b70070fab428fa1fec1b", - "semantic_hash": "f2edc10e0144b70070fab428fa1fec1b" - }, - "packages/ui/src/components/border-beam.tsx": { - "mtime": 1756375756.0872424, - "ast_hash": "aa87e342b7068180b564c18426fdf467", - "semantic_hash": "aa87e342b7068180b564c18426fdf467" - }, - "packages/ui/src/components/breadcrumb.tsx": { - "mtime": 1756796812.1940434, - "ast_hash": "c92e8083ea134efbd8e00ffe93918175", - "semantic_hash": "c92e8083ea134efbd8e00ffe93918175" - }, - "packages/ui/src/components/button.tsx": { - "mtime": 1756796812.1943848, - "ast_hash": "695fbfbfa132f4b1ca293025b7a2e626", - "semantic_hash": "695fbfbfa132f4b1ca293025b7a2e626" - }, - "packages/ui/src/components/calendar.tsx": { - "mtime": 1756796812.194636, - "ast_hash": "16e5e02e875d53625604ff654d047fa5", - "semantic_hash": "16e5e02e875d53625604ff654d047fa5" - }, - "packages/ui/src/components/card.tsx": { - "mtime": 1756796812.1950126, - "ast_hash": "87a38154e62a31725a4568e1cec55592", - "semantic_hash": "87a38154e62a31725a4568e1cec55592" - }, - "packages/ui/src/components/carousel.tsx": { - "mtime": 1756796812.1954567, - "ast_hash": "3ba70c2a6739a957dc8cb56f1a96e2f0", - "semantic_hash": "3ba70c2a6739a957dc8cb56f1a96e2f0" - }, - "packages/ui/src/components/chart.tsx": { - "mtime": 1756796812.195785, - "ast_hash": "468043b2dff2e8247642c54c599828cb", - "semantic_hash": "468043b2dff2e8247642c54c599828cb" - }, - "packages/ui/src/components/checkbox.tsx": { - "mtime": 1756796812.1962452, - "ast_hash": "0f298ce6bb7c88034fb55ab286fe78af", - "semantic_hash": "0f298ce6bb7c88034fb55ab286fe78af" - }, - "packages/ui/src/components/collapsible.tsx": { - "mtime": 1756796812.1966143, - "ast_hash": "062d650afb7bd535dff418df0410b68d", - "semantic_hash": "062d650afb7bd535dff418df0410b68d" - }, - "packages/ui/src/components/command.tsx": { - "mtime": 1756796812.1968942, - "ast_hash": "2a71424450872e26290a9a3ddc6768da", - "semantic_hash": "2a71424450872e26290a9a3ddc6768da" - }, - "packages/ui/src/components/context-menu.tsx": { - "mtime": 1756796812.1971576, - "ast_hash": "a1d3da5b2f4987f8157702c06d73fa42", - "semantic_hash": "a1d3da5b2f4987f8157702c06d73fa42" - }, - "packages/ui/src/components/dialog.tsx": { - "mtime": 1756796812.1975255, - "ast_hash": "34f40dd328ac553fccbd87fcc126898d", - "semantic_hash": "34f40dd328ac553fccbd87fcc126898d" - }, - "packages/ui/src/components/drawer.tsx": { - "mtime": 1756796812.197732, - "ast_hash": "3513c5400f0f0bf499ebac430c728a33", - "semantic_hash": "3513c5400f0f0bf499ebac430c728a33" - }, - "packages/ui/src/components/dropdown-menu.tsx": { - "mtime": 1756796812.1980915, - "ast_hash": "76fe1f7d44eb7e1b198909d9111fed3e", - "semantic_hash": "76fe1f7d44eb7e1b198909d9111fed3e" - }, - "packages/ui/src/components/form.tsx": { - "mtime": 1756796812.1984906, - "ast_hash": "24dc9910c160c392d7087dbe0eab2acc", - "semantic_hash": "24dc9910c160c392d7087dbe0eab2acc" - }, - "packages/ui/src/components/hover-card.tsx": { - "mtime": 1756796812.198862, - "ast_hash": "467faf0d8dcc0fd6e9a17564cc305b13", - "semantic_hash": "467faf0d8dcc0fd6e9a17564cc305b13" - }, - "packages/ui/src/components/input-otp.tsx": { - "mtime": 1756796812.1992953, - "ast_hash": "f1bec9a7e992aa43f614b897fed802c8", - "semantic_hash": "f1bec9a7e992aa43f614b897fed802c8" - }, - "packages/ui/src/components/input.tsx": { - "mtime": 1756628901.9464993, - "ast_hash": "346b6066a33df53430343e62d928e66d", - "semantic_hash": "346b6066a33df53430343e62d928e66d" - }, - "packages/ui/src/components/label.tsx": { - "mtime": 1756796812.1995742, - "ast_hash": "ad11ebc3d88bbf197649cb3a4c76f681", - "semantic_hash": "ad11ebc3d88bbf197649cb3a4c76f681" - }, - "packages/ui/src/components/menubar.tsx": { - "mtime": 1756796812.1999192, - "ast_hash": "b0a897c9661ea5e7424ebae6e52f9591", - "semantic_hash": "b0a897c9661ea5e7424ebae6e52f9591" - }, - "packages/ui/src/components/navigation-menu.tsx": { - "mtime": 1756796812.2001877, - "ast_hash": "b9d2ed8f69c391318eeeee1a6212a817", - "semantic_hash": "b9d2ed8f69c391318eeeee1a6212a817" - }, - "packages/ui/src/components/pagination.tsx": { - "mtime": 1756796812.200422, - "ast_hash": "2157df6b4a55a2db244f7923aca4c427", - "semantic_hash": "2157df6b4a55a2db244f7923aca4c427" - }, - "packages/ui/src/components/popover.tsx": { - "mtime": 1756796812.2006984, - "ast_hash": "25ad5b561e260efb71536e3ac0af1d15", - "semantic_hash": "25ad5b561e260efb71536e3ac0af1d15" - }, - "packages/ui/src/components/progress.tsx": { - "mtime": 1756796812.2009153, - "ast_hash": "0a49844e22b1807e52e90b6533a2f812", - "semantic_hash": "0a49844e22b1807e52e90b6533a2f812" - }, - "packages/ui/src/components/radio-group.tsx": { - "mtime": 1756375756.1731637, - "ast_hash": "2e30d5258660e97a2a9deb4db723c43f", - "semantic_hash": "2e30d5258660e97a2a9deb4db723c43f" - }, - "packages/ui/src/components/resizable.tsx": { - "mtime": 1756796812.2011187, - "ast_hash": "dd24a5270719a9771c87dda4ed858272", - "semantic_hash": "dd24a5270719a9771c87dda4ed858272" - }, - "packages/ui/src/components/scroll-area.tsx": { - "mtime": 1756796812.2013478, - "ast_hash": "acc38d43222ce8c8ed7062a8818f0aa4", - "semantic_hash": "acc38d43222ce8c8ed7062a8818f0aa4" - }, - "packages/ui/src/components/select.tsx": { - "mtime": 1756796812.2016082, - "ast_hash": "a5efeaa0304f8f83f2081628499367d2", - "semantic_hash": "a5efeaa0304f8f83f2081628499367d2" - }, - "packages/ui/src/components/separator.tsx": { - "mtime": 1756375756.1853745, - "ast_hash": "93837cf06f10f5302c5301efc9e3663b", - "semantic_hash": "93837cf06f10f5302c5301efc9e3663b" - }, - "packages/ui/src/components/sheet.tsx": { - "mtime": 1756796812.202171, - "ast_hash": "eecce4b5528b1c3d02d33932edce9abc", - "semantic_hash": "eecce4b5528b1c3d02d33932edce9abc" - }, - "packages/ui/src/components/sidebar.tsx": { - "mtime": 1756796812.2025702, - "ast_hash": "1363b23a82b2d372c71a45cde5a387d1", - "semantic_hash": "1363b23a82b2d372c71a45cde5a387d1" - }, - "packages/ui/src/components/skeleton.tsx": { - "mtime": 1756375756.204101, - "ast_hash": "361a581bea90af8fc032bb52f401abe3", - "semantic_hash": "361a581bea90af8fc032bb52f401abe3" - }, - "packages/ui/src/components/slider.tsx": { - "mtime": 1756796812.2029035, - "ast_hash": "156225cab4cacc7092f58f2c8bd3402d", - "semantic_hash": "156225cab4cacc7092f58f2c8bd3402d" - }, - "packages/ui/src/components/sonner.tsx": { - "mtime": 1756375756.2079463, - "ast_hash": "ace3a6465858e1f9a441724008f2d921", - "semantic_hash": "ace3a6465858e1f9a441724008f2d921" - }, - "packages/ui/src/components/switch.tsx": { - "mtime": 1756796812.2031567, - "ast_hash": "156001859c6a65a7fa8bc36bdd7b534d", - "semantic_hash": "156001859c6a65a7fa8bc36bdd7b534d" - }, - "packages/ui/src/components/table.tsx": { - "mtime": 1756796812.203441, - "ast_hash": "c398dd9017babb00c42cb8dfecfff3c9", - "semantic_hash": "c398dd9017babb00c42cb8dfecfff3c9" - }, - "packages/ui/src/components/tabs.tsx": { - "mtime": 1756796812.2037952, - "ast_hash": "f5ffc55ef2c3be7753fb884cceedca6a", - "semantic_hash": "f5ffc55ef2c3be7753fb884cceedca6a" - }, - "packages/ui/src/components/text-effect.tsx": { - "mtime": 1756796812.20427, - "ast_hash": "bb9ac4c581c443322949e60e3b53b5ca", - "semantic_hash": "bb9ac4c581c443322949e60e3b53b5ca" - }, - "packages/ui/src/components/textarea.tsx": { - "mtime": 1756375756.227261, - "ast_hash": "c7fc3e4200d561f7e6a6e700b005e865", - "semantic_hash": "c7fc3e4200d561f7e6a6e700b005e865" - }, - "packages/ui/src/components/toggle-group.tsx": { - "mtime": 1756796812.2051353, - "ast_hash": "b65424839269ffaeaaf44ef95319a769", - "semantic_hash": "b65424839269ffaeaaf44ef95319a769" - }, - "packages/ui/src/components/toggle.tsx": { - "mtime": 1756796812.205347, - "ast_hash": "a7019f85ca880689daa02ee18f8e568c", - "semantic_hash": "a7019f85ca880689daa02ee18f8e568c" - }, - "packages/ui/src/components/tooltip.tsx": { - "mtime": 1756796812.2055485, - "ast_hash": "294535a32714d0b728133f07b7987cec", - "semantic_hash": "294535a32714d0b728133f07b7987cec" - }, - "packages/ui/src/hooks/use-mobile.ts": { - "mtime": 1756796812.205872, - "ast_hash": "c0a0bdd4638c391a1dd06ac82074e60b", - "semantic_hash": "c0a0bdd4638c391a1dd06ac82074e60b" - }, - "packages/ui/src/lib/utils.ts": { - "mtime": 1756375756.240204, - "ast_hash": "618d00bf4537ce84f9ba62c5b215fb30", - "semantic_hash": "618d00bf4537ce84f9ba62c5b215fb30" - }, - "packages/ui/tsconfig.json": { - "mtime": 1753113293.2930648, - "ast_hash": "750dcc9a42219306cae210934c27fc1e", - "semantic_hash": "750dcc9a42219306cae210934c27fc1e" - }, - "packages/ui/tsconfig.lint.json": { - "mtime": 1753113293.2931433, - "ast_hash": "587fb50f2f4632cf1134fb279a900305", - "semantic_hash": "587fb50f2f4632cf1134fb279a900305" - }, - "scripts/deploy-proxy.sh": { - "mtime": 1756630430.9615598, - "ast_hash": "36cbdbad4aa1c63ff7ac5218f8752a33", - "semantic_hash": "36cbdbad4aa1c63ff7ac5218f8752a33" - }, - "supabase/functions/_shared/cors.ts": { - "mtime": 1761824751.220853, - "ast_hash": "7ddbae13df270acdfbf701dd1deb7f2a", - "semantic_hash": "7ddbae13df270acdfbf701dd1deb7f2a" - }, - "supabase/functions/_shared/gemini-client.ts": { - "mtime": 1760161026.6871226, - "ast_hash": "d643485d2efd2b3370d212555441ae7b", - "semantic_hash": "d643485d2efd2b3370d212555441ae7b" - }, - "supabase/functions/_shared/prompts.ts": { - "mtime": 1761665817.6546266, - "ast_hash": "701ab143a7a7397ce7bf401923daade4", - "semantic_hash": "701ab143a7a7397ce7bf401923daade4" - }, - "supabase/functions/_shared/rbac.ts": { - "mtime": 1760696521.7035341, - "ast_hash": "91e93fc3d4025c12a7ffbf2397c40889", - "semantic_hash": "91e93fc3d4025c12a7ffbf2397c40889" - }, - "supabase/functions/add-to-waitlist/deno.json": { - "mtime": 1756134156.8737535, - "ast_hash": "af84e44d5c8e2c89ab58060848ce672d", - "semantic_hash": "af84e44d5c8e2c89ab58060848ce672d" - }, - "supabase/functions/add-to-waitlist/emails/waitlist-welcome.tsx": { - "mtime": 1756796812.2087843, - "ast_hash": "3c654594dc97ce15bbc819bccf21653c", - "semantic_hash": "3c654594dc97ce15bbc819bccf21653c" - }, - "supabase/functions/add-to-waitlist/index.ts": { - "mtime": 1761748353.17078, - "ast_hash": "1405521fd6452a57499e61ff2633d93a", - "semantic_hash": "1405521fd6452a57499e61ff2633d93a" - }, - "supabase/functions/add-to-waitlist/package.json": { - "mtime": 1756134156.8741074, - "ast_hash": "5151ba554b240b2c1058f2c1d7f93ba5", - "semantic_hash": "5151ba554b240b2c1058f2c1d7f93ba5" - }, - "supabase/functions/admin-api/index.ts": { - "mtime": 1760704894.9915097, - "ast_hash": "da20709c2ccbee992cdbbb20dde5855e", - "semantic_hash": "da20709c2ccbee992cdbbb20dde5855e" - }, - "supabase/functions/ai-action-chat/index.ts": { - "mtime": 1761372095.3839433, - "ast_hash": "a5deeec883e2cb465467fe9ae799f801", - "semantic_hash": "a5deeec883e2cb465467fe9ae799f801" - }, - "supabase/functions/ai-action-deep-response/index.test.ts": { - "mtime": 1761663865.8222618, - "ast_hash": "78ce70ef3474ad665dcc6cf1958c17e3", - "semantic_hash": "78ce70ef3474ad665dcc6cf1958c17e3" - }, - "supabase/functions/ai-action-deep-response/index.ts": { - "mtime": 1761663865.8226912, - "ast_hash": "e1959cb1b4298222e3ba9e99864cb7ea", - "semantic_hash": "e1959cb1b4298222e3ba9e99864cb7ea" - }, - "supabase/functions/ai-action-keyword-search/index.test.ts": { - "mtime": 1757084252.07272, - "ast_hash": "995e2123a14f6cd5f71eaf05e792c12d", - "semantic_hash": "995e2123a14f6cd5f71eaf05e792c12d" - }, - "supabase/functions/ai-action-keyword-search/index.ts": { - "mtime": 1761372095.3842793, - "ast_hash": "0c35e4a0e886cc2375b60954d752d086", - "semantic_hash": "0c35e4a0e886cc2375b60954d752d086" - }, - "supabase/functions/ai-action-recommend-response/index.test.ts": { - "mtime": 1758383563.1618178, - "ast_hash": "8feb152c7b71780c118a220163150c85", - "semantic_hash": "8feb152c7b71780c118a220163150c85" - }, - "supabase/functions/ai-action-recommend-response/index.ts": { - "mtime": 1761372095.3846138, - "ast_hash": "0e384c99ed3930b0aca667a9100110af", - "semantic_hash": "0e384c99ed3930b0aca667a9100110af" - }, - "supabase/functions/ai-action-screenshot-analysis/index.ts": { - "mtime": 1761372095.3849072, - "ast_hash": "a2df5f17f91d8f83c704cbaf8040e45d", - "semantic_hash": "a2df5f17f91d8f83c704cbaf8040e45d" - }, - "supabase/functions/ai-action-summarize/index.test.ts": { - "mtime": 1758383563.1619868, - "ast_hash": "7e0da024ded75544e643a2a282803916", - "semantic_hash": "7e0da024ded75544e643a2a282803916" - }, - "supabase/functions/ai-action-summarize/index.ts": { - "mtime": 1760693717.5264027, - "ast_hash": "37731af841bdf41aa3584f725ff4b1ba", - "semantic_hash": "37731af841bdf41aa3584f725ff4b1ba" - }, - "supabase/functions/get-latest-release/index.ts": { - "mtime": 1761925251.4179158, - "ast_hash": "4357a18e485bd28b17c464f84c179920", - "semantic_hash": "4357a18e485bd28b17c464f84c179920" - }, - "supabase/functions/get-session-profile/index.ts": { - "mtime": 1760704894.9917977, - "ast_hash": "9daa3a9d355f5c0366a056f7a716ccbb", - "semantic_hash": "9daa3a9d355f5c0366a056f7a716ccbb" - }, - "supabase/functions/send-beta-invitation/emails/beta-invitation.tsx": { - "mtime": 1762180707.9112477, - "ast_hash": "d7cb667af129a86dede99c3d73c81125", - "semantic_hash": "d7cb667af129a86dede99c3d73c81125" - }, - "supabase/functions/send-beta-invitation/index.ts": { - "mtime": 1761843636.5754278, - "ast_hash": "1c77902aa35595650846891b9c63392f", - "semantic_hash": "1c77902aa35595650846891b9c63392f" - }, - "supabase/migrations/20250825112617_consolidated_waitlist.sql": { - "mtime": 1758117442.1476517, - "ast_hash": "6d045ae63be7c2bc3c82083bbb096632", - "semantic_hash": "6d045ae63be7c2bc3c82083bbb096632" - }, - "supabase/migrations/20250918150000_consolidated_initial_schema.sql": { - "mtime": 1758117442.1480882, - "ast_hash": "faf4ffb1df3a13ac2492ac4abb72ceea", - "semantic_hash": "faf4ffb1df3a13ac2492ac4abb72ceea" - }, - "supabase/migrations/20250918160000_add_rls_to_roles_table.sql": { - "mtime": 1758117442.1487057, - "ast_hash": "7d11dd5d44a801e8cb9be839fd4cc195", - "semantic_hash": "7d11dd5d44a801e8cb9be839fd4cc195" - }, - "supabase/migrations/20250918170000_setup_automatic_profile_creation.sql": { - "mtime": 1758636998.4158542, - "ast_hash": "d84c364cd7f124b785ce1b9afb1696f0", - "semantic_hash": "d84c364cd7f124b785ce1b9afb1696f0" - }, - "supabase/migrations/20250930200000_add_transcription_enhance_entitlement.sql": { - "mtime": 1759386727.0327382, - "ast_hash": "9ac3129fb30875a531a9dfffa378db3a", - "semantic_hash": "9ac3129fb30875a531a9dfffa378db3a" - }, - "supabase/migrations/20251015181639_analytics_lean_implementation.sql": { - "mtime": 1760693717.5272293, - "ast_hash": "ab357f3a96e46c8b49b3495fb402bbdd", - "semantic_hash": "ab357f3a96e46c8b49b3495fb402bbdd" - }, - "supabase/migrations/20251015183745_fix_analytics_rls_policies.sql": { - "mtime": 1760693717.527381, - "ast_hash": "0a876ad1ace1787ebfd1ac15ab6b9038", - "semantic_hash": "0a876ad1ace1787ebfd1ac15ab6b9038" - }, - "supabase/migrations/20251015190000_fix_rbac_function_for_analytics.sql": { - "mtime": 1760693717.527519, - "ast_hash": "d1a0a408a3198bb06a5e6f507d644b6f", - "semantic_hash": "d1a0a408a3198bb06a5e6f507d644b6f" - }, - "supabase/migrations/20251015200000_remove_api_cost_usd.sql": { - "mtime": 1760693717.52765, - "ast_hash": "3d6ea445c679687b4ec56f8c0d0a79d8", - "semantic_hash": "3d6ea445c679687b4ec56f8c0d0a79d8" - }, - "supabase/migrations/20251017000000_add_admin_rls_policies.sql": { - "mtime": 1760696521.7039666, - "ast_hash": "29877d8003c2b4333600324fc93f1541", - "semantic_hash": "29877d8003c2b4333600324fc93f1541" - }, - "supabase/migrations/20251028000000_add_deep_response_rbac.sql": { - "mtime": 1761663865.8319397, - "ast_hash": "6e1c2f3242b17b1ee0883f6e9513ed5f", - "semantic_hash": "6e1c2f3242b17b1ee0883f6e9513ed5f" - }, - "supabase/migrations/20251028120000_add_beta_invitation_tracking.sql": { - "mtime": 1761748353.17156, - "ast_hash": "9e158c995021a536e87336b52db73eee", - "semantic_hash": "9e158c995021a536e87336b52db73eee" - }, - "supabase/migrations/20251028130000_enhance_auto_beta_conversion.sql": { - "mtime": 1761748353.171807, - "ast_hash": "bd5dad1d069ae8a2604d31926fe4042c", - "semantic_hash": "bd5dad1d069ae8a2604d31926fe4042c" - }, - "supabase/migrations/20251030050000_update_beta_transcription_quota.sql": { - "mtime": 1761824751.2219238, - "ast_hash": "4eed0264ff9fc5193fa26bb359b8eeb9", - "semantic_hash": "4eed0264ff9fc5193fa26bb359b8eeb9" - }, - "tsconfig.json": { - "mtime": 1753113293.2943778, - "ast_hash": "0e3be1e56cca99765fbcee2a43cc9573", - "semantic_hash": "0e3be1e56cca99765fbcee2a43cc9573" - }, - "turbo.json": { - "mtime": 1755247025.7136104, - "ast_hash": "34a33f53eaa9fe63b3c770a00c82f89f", - "semantic_hash": "34a33f53eaa9fe63b3c770a00c82f89f" - }, - "types/renderer.d.ts": { - "mtime": 1758636998.4162247, - "ast_hash": "005ab3720a6e3f430c579651cf089a36", - "semantic_hash": "005ab3720a6e3f430c579651cf089a36" - }, - ".github/workflows/release.yml": { - "mtime": 1770456627.0254822, - "ast_hash": "f02eb64e6c46be38c0442dd84ee6919f", - "semantic_hash": "f02eb64e6c46be38c0442dd84ee6919f" - }, - ".prettierrc.yaml": { - "mtime": 1756796812.1335547, - "ast_hash": "9933f2a775239515483fe7974aefa8e0", - "semantic_hash": "9933f2a775239515483fe7974aefa8e0" - }, - "CLAUDE.md": { - "mtime": 1780730051.547558, - "ast_hash": "97ef81614e6ad1e005874aba16700f0a", - "semantic_hash": "" - }, - "CONTRIBUTING.md": { - "mtime": 1780729941.8756502, - "ast_hash": "ac72a40a2464c361d62afafea92e43e0", - "semantic_hash": "" - }, - "README.md": { - "mtime": 1780729923.0282445, - "ast_hash": "51f56e70d3cba72d77eebe40fd72f803", - "semantic_hash": "" - }, - "apps/admin-dashboard/README.md": { - "mtime": 1758383563.151353, - "ast_hash": "c1bd77ce9448328061653a4b3743293f", - "semantic_hash": "c1bd77ce9448328061653a4b3743293f" - }, - "apps/app/.prettierrc.yaml": { - "mtime": 1755360516.1610472, - "ast_hash": "0494080f0af72e414e6fb29f89c49d89", - "semantic_hash": "0494080f0af72e414e6fb29f89c49d89" - }, - "apps/app/README.md": { - "mtime": 1770456645.9531398, - "ast_hash": "a61ac52d5fb2dec99979eb630c1b52d4", - "semantic_hash": "a61ac52d5fb2dec99979eb630c1b52d4" - }, - "apps/app/dev-app-update.yml": { - "mtime": 1755360516.1616619, - "ast_hash": "6022599c251e3a78dbb8f6e31b7c79da", - "semantic_hash": "6022599c251e3a78dbb8f6e31b7c79da" - }, - "apps/app/electron-builder.yml": { - "mtime": 1759399485.6008196, - "ast_hash": "18809faab4c334699ffe799706fe9169", - "semantic_hash": "18809faab4c334699ffe799706fe9169" - }, - "apps/app/resources/whisper.cpp/README.md": { - "mtime": 1759399108.687297, - "ast_hash": "f696c19d21b6498fb750e8621387a136", - "semantic_hash": "f696c19d21b6498fb750e8621387a136" - }, - "apps/app/src/renderer/index.html": { - "mtime": 1770456624.0700357, - "ast_hash": "08aa1dfeac9f7290ef496131360f3e26", - "semantic_hash": "08aa1dfeac9f7290ef496131360f3e26" - }, - "apps/app/src/renderer/selection.html": { - "mtime": 1759765539.2972813, - "ast_hash": "80f9081aa75d7cd4ec7572b081f4acd2", - "semantic_hash": "80f9081aa75d7cd4ec7572b081f4acd2" - }, - "apps/app/src/renderer/settings.html": { - "mtime": 1759765539.2975514, - "ast_hash": "4561bfa130494618c475338fb76b992d", - "semantic_hash": "4561bfa130494618c475338fb76b992d" - }, - "apps/app/tests/local-transcription/README.md": { - "mtime": 1759200200.9269557, - "ast_hash": "66d1b165d18d548d3dc8526e70adff8d", - "semantic_hash": "66d1b165d18d548d3dc8526e70adff8d" - }, - "apps/web/README.md": { - "mtime": 1758183040.7677991, - "ast_hash": "00827f674894a151aef6257f573df82f", - "semantic_hash": "00827f674894a151aef6257f573df82f" - }, - "docs/api/edge-functions.md": { - "mtime": 1780727349.156307, - "ast_hash": "faa3e7bd18d1f3e0c0bbf024649b4fc8", - "semantic_hash": "" - }, - "docs/architecture/Message-threading.md": { - "mtime": 1760375689.5798874, - "ast_hash": "977d596c4be549160de3c51416587e89", - "semantic_hash": "977d596c4be549160de3c51416587e89" - }, - "docs/architecture/RBAC.md": { - "mtime": 1760516091.8541884, - "ast_hash": "8f4a13485fb2deda401785addc6b7e5d", - "semantic_hash": "8f4a13485fb2deda401785addc6b7e5d" - }, - "docs/architecture/overview.md": { - "mtime": 1780730015.9240158, - "ast_hash": "5e167371bd11b32cb322b30f1f6377db", - "semantic_hash": "" - }, - "docs/architecture/whisper.md": { - "mtime": 1780727416.4430146, - "ast_hash": "f22f97a1abf2dc69bebf88c3149ef27d", - "semantic_hash": "" - }, - "docs/setup/development.md": { - "mtime": 1780729982.5320678, - "ast_hash": "0e12bce781db7a429c494d1fc70ef7a3", - "semantic_hash": "" - }, - "docs/waitlist-to-beta-conversion-implementation.md": { - "mtime": 1761748353.1699724, - "ast_hash": "8b889703f5c7fee418efa89ecce0a82a", - "semantic_hash": "8b889703f5c7fee418efa89ecce0a82a" - }, - "packages/eslint-config/README.md": { - "mtime": 1753113293.285602, - "ast_hash": "59963ee08d1627771348c8de3359daf7", - "semantic_hash": "59963ee08d1627771348c8de3359daf7" - }, - "packages/typescript-config/README.md": { - "mtime": 1753113293.2859876, - "ast_hash": "7f23ef73f596183f048ced7c752cfedb", - "semantic_hash": "7f23ef73f596183f048ced7c752cfedb" - }, - "plans/20250831-backend-security-refactor.md": { - "mtime": 1757084252.0705702, - "ast_hash": "ac48708d7fb3a2d73da65bb673aac373", - "semantic_hash": "ac48708d7fb3a2d73da65bb673aac373" - }, - "plans/20250905-secure-ai-actions-flow.md": { - "mtime": 1757084252.0706863, - "ast_hash": "f8a05da3f2fff21f20fd1854b32acb80", - "semantic_hash": "f8a05da3f2fff21f20fd1854b32acb80" - }, - "plans/20250911-dynamic-summarize.md": { - "mtime": 1758383563.1593366, - "ast_hash": "9313fc4a156832fa8cae5a5f7f60bf4e", - "semantic_hash": "9313fc4a156832fa8cae5a5f7f60bf4e" - }, - "plans/20250911-update-ui.md": { - "mtime": 1757654451.2232656, - "ast_hash": "127f08adfef52c5c22b7127aea370162", - "semantic_hash": "127f08adfef52c5c22b7127aea370162" - }, - "plans/20250912-improve-login-experience.md": { - "mtime": 1758383563.1597872, - "ast_hash": "be42a704f9880575fbb6dc9746ebb47f", - "semantic_hash": "be42a704f9880575fbb6dc9746ebb47f" - }, - "plans/20250913-auto-update-experience.md": { - "mtime": 1757825615.3577483, - "ast_hash": "019d61537b6057f6f10ae5d2c4afc024", - "semantic_hash": "019d61537b6057f6f10ae5d2c4afc024" - }, - "plans/20250913-rbac-for-the-app.md": { - "mtime": 1758383563.1600742, - "ast_hash": "de3c10ca6e9e29abdbb0d911eb6279ea", - "semantic_hash": "de3c10ca6e9e29abdbb0d911eb6279ea" - }, - "plans/20250913-update-ui-ux.md": { - "mtime": 1758383563.1604064, - "ast_hash": "fc634fe524f45189bf8337560ba7be59", - "semantic_hash": "fc634fe524f45189bf8337560ba7be59" - }, - "plans/20250914-coexistence-of-panels.md": { - "mtime": 1758117442.142634, - "ast_hash": "61c03c7b957e4d952992cba0dee4a106", - "semantic_hash": "61c03c7b957e4d952992cba0dee4a106" - }, - "plans/20250914-highlight-the-keywords-in-the-transcriptions.md": { - "mtime": 1758383563.160649, - "ast_hash": "a5f5e99631fa18f73116b6eaf2022fc2", - "semantic_hash": "a5f5e99631fa18f73116b6eaf2022fc2" - }, - "plans/20250914-refactor-electron-apis.md": { - "mtime": 1758383563.1608336, - "ast_hash": "d3e95e2a46eb65f32226d6e13c009ea9", - "semantic_hash": "d3e95e2a46eb65f32226d6e13c009ea9" - }, - "plans/20250917-universal-entitlements-engine.md": { - "mtime": 1758383563.1610982, - "ast_hash": "d05b25ca2b0022f9c9268e905e08997c", - "semantic_hash": "d05b25ca2b0022f9c9268e905e08997c" - }, - "plans/20250928-local-transcription.md": { - "mtime": 1759200200.929625, - "ast_hash": "581be5e4db2cc43d21225db563af1099", - "semantic_hash": "581be5e4db2cc43d21225db563af1099" - }, - "plans/20250930-audio-processing.md": { - "mtime": 1759386727.0290282, - "ast_hash": "858c7cc9726264720e5a786c8df13fcc", - "semantic_hash": "858c7cc9726264720e5a786c8df13fcc" - }, - "plans/20250930-multilingual-whisper.md": { - "mtime": 1759386727.0292711, - "ast_hash": "4094a239d4d5886cebc01df6b996e81a", - "semantic_hash": "4094a239d4d5886cebc01df6b996e81a" - }, - "plans/20251001-whisper-transcription-review.md": { - "mtime": 1759386727.0294683, - "ast_hash": "95aba0b84ee1202af2b46a905bb10a47", - "semantic_hash": "95aba0b84ee1202af2b46a905bb10a47" - }, - "plans/20251004-redesign-settings.md": { - "mtime": 1759765539.3197007, - "ast_hash": "5016a267849ef796251a127f9c9b93c4", - "semantic_hash": "5016a267849ef796251a127f9c9b93c4" - }, - "plans/20251009-download-session-json-file-issue.md": { - "mtime": 1760208358.5764382, - "ast_hash": "16760d41a0288e6f98f51a7c5695d3ee", - "semantic_hash": "16760d41a0288e6f98f51a7c5695d3ee" - }, - "plans/20251009-first-keyword-search-issue.md": { - "mtime": 1760208358.5767758, - "ast_hash": "e264f73bec04a4ee80fa80250dd90541", - "semantic_hash": "e264f73bec04a4ee80fa80250dd90541" - }, - "plans/20251009-keywords-display-issue.md": { - "mtime": 1760208358.577202, - "ast_hash": "6d3d8e77ac0a8cb99ece90478a188ac4", - "semantic_hash": "6d3d8e77ac0a8cb99ece90478a188ac4" - }, - "plans/20251010-actions-for-intention-detection.md": { - "mtime": 1760208358.577804, - "ast_hash": "01e159b2ec73b2bbf1b0c347439d16e5", - "semantic_hash": "01e159b2ec73b2bbf1b0c347439d16e5" - }, - "plans/20251011-whisper-hallucination-issue.md": { - "mtime": 1760208358.5782325, - "ast_hash": "cd1a254972536d9500f6a1c0b65ffc57", - "semantic_hash": "cd1a254972536d9500f6a1c0b65ffc57" - }, - "plans/20251012-auto-summarize.md": { - "mtime": 1760208358.5786753, - "ast_hash": "614a8a0ce4c7fff6bfa34e75035a3770", - "semantic_hash": "614a8a0ce4c7fff6bfa34e75035a3770" - }, - "plans/20251012-structure-of-gemini-response-of-summary.md": { - "mtime": 1760208358.578993, - "ast_hash": "b283983d16f38285d306ef3f05c01b5d", - "semantic_hash": "b283983d16f38285d306ef3f05c01b5d" - }, - "plans/20251015-users-behavior-and-preferences-analytics.md": { - "mtime": 1760696521.7015724, - "ast_hash": "2e5bafdcef1a2df263f773caa5e89283", - "semantic_hash": "2e5bafdcef1a2df263f773caa5e89283" - }, - "plans/20251016-admin-monitor.md": { - "mtime": 1760696521.7018433, - "ast_hash": "39fee55722d49da1d6a9b192a9a9b037", - "semantic_hash": "39fee55722d49da1d6a9b192a9a9b037" - }, - "plans/20251024_prompt_improvement_for_all_ai_actions.md": { - "mtime": 1761372095.3809114, - "ast_hash": "0e325a29302046b9a6468ef65b74ad7c", - "semantic_hash": "0e325a29302046b9a6468ef65b74ad7c" - }, - "plans/20251025-prepare-for-beta-release.md": { - "mtime": 1761372095.3813128, - "ast_hash": "7a08b7c2cb507cd718985ac6168c7e58", - "semantic_hash": "7a08b7c2cb507cd718985ac6168c7e58" - }, - "plans/20251030-waitlist-management-page.md": { - "mtime": 1761843884.4409823, - "ast_hash": "706ef89b7810fcdaceb06bfd2645448f", - "semantic_hash": "706ef89b7810fcdaceb06bfd2645448f" - }, - "plans/20251030-waitlist-to-beta-conversion.md": { - "mtime": 1761838796.7332568, - "ast_hash": "23041aa501cfe4acda2c2f27ed653799", - "semantic_hash": "23041aa501cfe4acda2c2f27ed653799" - }, - "plans/20251031-update-invitation-email-content.md": { - "mtime": 1762180707.9102917, - "ast_hash": "e29b86bd383b60c7bb711efb9793dba5", - "semantic_hash": "e29b86bd383b60c7bb711efb9793dba5" - }, - "plans/20260207-local-ollama-transcription-enhancement.md": { - "mtime": 1770449326.6753204, - "ast_hash": "951d55f8e28959ba2a47894b34b5a66f", - "semantic_hash": "951d55f8e28959ba2a47894b34b5a66f" - }, - "pnpm-workspace.yaml": { - "mtime": 1756134156.8733323, - "ast_hash": "5ea7919401809311057872d5a0a1504a", - "semantic_hash": "5ea7919401809311057872d5a0a1504a" - }, - "apps/admin-dashboard/public/logo/intevia(+logo).svg": { - "mtime": 1757825615.344873, - "ast_hash": "a8da20188033cbf6dd8cbe5cd0f88af4", - "semantic_hash": "a8da20188033cbf6dd8cbe5cd0f88af4" - }, - "apps/admin-dashboard/public/logo/intevia.svg": { - "mtime": 1757825615.3451345, - "ast_hash": "02bdbaa81b8cc03adcb530e19542e3bb", - "semantic_hash": "02bdbaa81b8cc03adcb530e19542e3bb" - }, - "apps/admin-dashboard/public/logo/intevia_logo.png": { - "mtime": 1757825615.3455944, - "ast_hash": "7033f3e5ce98174ba6927679ac59af64", - "semantic_hash": "7033f3e5ce98174ba6927679ac59af64" - }, - "apps/admin-dashboard/public/logo/intevia_logo.svg": { - "mtime": 1757825615.3459468, - "ast_hash": "fda17cb2ce4448ad731bad1e1f77f58a", - "semantic_hash": "fda17cb2ce4448ad731bad1e1f77f58a" - }, - "apps/app/src/renderer/public/logo/intevia(+logo).svg": { - "mtime": 1757084252.0642462, - "ast_hash": "a8da20188033cbf6dd8cbe5cd0f88af4", - "semantic_hash": "a8da20188033cbf6dd8cbe5cd0f88af4" - }, - "apps/app/src/renderer/public/logo/intevia.svg": { - "mtime": 1757084252.0643234, - "ast_hash": "02bdbaa81b8cc03adcb530e19542e3bb", - "semantic_hash": "02bdbaa81b8cc03adcb530e19542e3bb" - }, - "apps/app/src/renderer/public/logo/intevia_logo.png": { - "mtime": 1759200200.9235022, - "ast_hash": "6a36a8c735c8a61bfd564523ad92cfcd", - "semantic_hash": "6a36a8c735c8a61bfd564523ad92cfcd" - }, - "apps/app/src/renderer/public/logo/intevia_logo.svg": { - "mtime": 1757084252.0646572, - "ast_hash": "fda17cb2ce4448ad731bad1e1f77f58a", - "semantic_hash": "fda17cb2ce4448ad731bad1e1f77f58a" - }, - "apps/app/src/renderer/public/logo/intevia_logo_bg.svg": { - "mtime": 1759200200.923822, - "ast_hash": "70cf11122cb7f76b436fed00adaffea0", - "semantic_hash": "70cf11122cb7f76b436fed00adaffea0" - }, - "apps/app/src/renderer/src/assets/electron.svg": { - "mtime": 1756297804.5598474, - "ast_hash": "7e350671f4993b01b6110e283cb7ab02", - "semantic_hash": "7e350671f4993b01b6110e283cb7ab02" - }, - "apps/app/src/renderer/src/assets/wavy-lines.svg": { - "mtime": 1756297800.9859123, - "ast_hash": "990cf549e920e993d4c1998c217661c6", - "semantic_hash": "990cf549e920e993d4c1998c217661c6" - }, - "apps/web/public/meeting/google.png": { - "mtime": 1753113293.2812545, - "ast_hash": "2e776d99c875a69cad1e2e14552551a4", - "semantic_hash": "2e776d99c875a69cad1e2e14552551a4" - }, - "apps/web/public/meeting/intevia(+logo).svg": { - "mtime": 1757776142.2775347, - "ast_hash": "a8da20188033cbf6dd8cbe5cd0f88af4", - "semantic_hash": "a8da20188033cbf6dd8cbe5cd0f88af4" - }, - "apps/web/public/meeting/intevia.svg": { - "mtime": 1757776142.9608235, - "ast_hash": "02bdbaa81b8cc03adcb530e19542e3bb", - "semantic_hash": "02bdbaa81b8cc03adcb530e19542e3bb" - }, - "apps/web/public/meeting/intevia_logo.png": { - "mtime": 1757776143.7603736, - "ast_hash": "7033f3e5ce98174ba6927679ac59af64", - "semantic_hash": "7033f3e5ce98174ba6927679ac59af64" - }, - "apps/web/public/meeting/intevia_logo.svg": { - "mtime": 1757776144.5602608, - "ast_hash": "fda17cb2ce4448ad731bad1e1f77f58a", - "semantic_hash": "fda17cb2ce4448ad731bad1e1f77f58a" - }, - "apps/web/public/meeting/ms_meeting.png": { - "mtime": 1755360516.1930923, - "ast_hash": "58209df0050c34149dfb1a11e2424942", - "semantic_hash": "58209df0050c34149dfb1a11e2424942" - }, - "apps/web/public/meeting/webex.png": { - "mtime": 1755360516.1942236, - "ast_hash": "969b27a3c2d1424a4e84615ccb00c1f4", - "semantic_hash": "969b27a3c2d1424a4e84615ccb00c1f4" - }, - "apps/web/public/meeting/zoom.png": { - "mtime": 1753113293.2826123, - "ast_hash": "d0da0f30b87514d3a4db058dc422ae3a", - "semantic_hash": "d0da0f30b87514d3a4db058dc422ae3a" - }, - "apps/web/public/placeholder.png": { - "mtime": 1753113293.2828119, - "ast_hash": "f04ec8cef80f319a70f846b07fefe4f6", - "semantic_hash": "f04ec8cef80f319a70f846b07fefe4f6" - }, - "apps/web/public/team/wei.jpg": { - "mtime": 1762178339.53229, - "ast_hash": "ffb52722149e204ee103736b4625c2c1", - "semantic_hash": "ffb52722149e204ee103736b4625c2c1" - }, - "apps/web/public/team/yao.jpg": { - "mtime": 1762178339.5327034, - "ast_hash": "828ec3430471561fe3e47151c5ae3314", - "semantic_hash": "828ec3430471561fe3e47151c5ae3314" - }, - "apps/web/public/team/ye.jpg": { - "mtime": 1762178339.5329013, - "ast_hash": "db3af16e4ddce04080d22e83274a8c6c", - "semantic_hash": "db3af16e4ddce04080d22e83274a8c6c" - }, - ".remember/tmp/last-ndc.ts": { - "mtime": 1780727137.0932486, - "ast_hash": "4cea4f5102240c13a0cae871e5aa77b9", - "semantic_hash": "" - }, - ".remember/tmp/last-save.json": { - "mtime": 1780729376.5321147, - "ast_hash": "864b530974b58315c0dd9a1f1e6f175c", - "semantic_hash": "" - }, - ".remember/now.md": { - "mtime": 1780729376.4959729, - "ast_hash": "d76b4aafbfdfe81f94e1efd90964592d", - "semantic_hash": "" - }, - ".remember/today-2026-06-06.md": { - "mtime": 1780727150.2999213, - "ast_hash": "c612115fc099fb67adcd1cad74608b80", - "semantic_hash": "" - } -} \ No newline at end of file diff --git a/package.json b/package.json index 726b5cfc..f3696a02 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,99 @@ { - "name": "intevia-ai", - "version": "0.0.1", + "name": "Knovy", + "version": "0.3.9", "private": true, + "productName": "Knovy", + "description": "Your All-in-One AI working assistant.", + "author": "Intevia", + "license": "MIT", + "homepage": "https://intevia.app/", + "repository": { + "type": "git", + "url": "https://github.com/Intevia-AI/Knovy.git" + }, + "keywords": [ + "AI", + "Assistant", + "Desktop", + "Web", + "App" + ], + "type": "module", + "main": "out/main/index.js", + "packageManager": "pnpm@10.4.1", + "engines": { + "node": ">=20" + }, "scripts": { - "build": "turbo build", - "dev": "turbo dev", - "lint": "turbo lint", - "format": "prettier --write \"**/*.{ts,tsx,md}\"", + "dev": "electron-vite dev", + "build": "source ./code-signing/build-mac-signed.sh && electron-vite build && electron-builder", + "build:ci": "electron-vite build && electron-builder", + "build:staging": "electron-vite build && electron-builder --publish never", + "build:local": "export SKIP_NOTARIZE=true && electron-vite build && electron-builder -c.mac.identity=null", "test": "vitest", - "test:run": "vitest run" + "test:run": "vitest run", + "format": "prettier --write \"**/*.{ts,tsx,md}\"", + "postinstall": "node -e \"if (process.env.SKIP_ELECTRON_POSTINSTALL !== 'true') { require('child_process').execSync('electron-builder install-app-deps', { stdio: 'inherit' }) }\"" + }, + "dependencies": { + "@hookform/resolvers": "^5.0.1", + "@radix-ui/react-avatar": "^1.1.4", + "@radix-ui/react-dialog": "^1.1.7", + "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-popover": "^1.1.7", + "@radix-ui/react-progress": "^1.1.3", + "@radix-ui/react-radio-group": "^1.2.4", + "@radix-ui/react-select": "^2.1.7", + "@radix-ui/react-slider": "^1.2.4", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-switch": "^1.1.4", + "ai": "^4.3.5", + "bindings": "^1.5.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "electron-updater": "^6.6.2", + "lucide-react": "^0.475.0", + "motion": "npm:framer-motion@^12.23.12", + "next-themes": "^0.4.6", + "opencc-js": "^1.0.5", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-hook-form": "^7.55.0", + "react-markdown": "^10.1.0", + "react-resizable-panels": "^2.1.7", + "remark-breaks": "^4.0.0", + "remark-gfm": "^4.0.1", + "sonner": "^2.0.7", + "sqlite": "^5.1.1", + "sqlite3": "^5.1.7", + "tailwind-merge": "^3.2.0", + "zod": "^3.24.2" }, "devDependencies": { + "@electron-toolkit/eslint-config": "^1.0.2", + "@electron-toolkit/tsconfig": "^1.0.1", + "@electron-toolkit/utils": "^3.0.0", + "@electron/notarize": "^3.1.0", "@types/js-yaml": "^4.0.9", - "@workspace/eslint-config": "workspace:*", - "@workspace/typescript-config": "workspace:*", - "concurrently": "^9.1.2", + "@types/node": "^20.17.30", + "@types/react": "^19.1.1", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.19", + "electron": "^35.2.0", + "electron-builder": "^26.0.12", + "electron-devtools-installer": "^4.0.0", + "electron-vite": "^2.3.0", "js-yaml": "^4.1.0", + "postcss": "^8.4.38", "prettier": "^3.5.1", - "turbo": "^2.4.2", - "typescript": "5.7.3", - "vitest": "^3.0.0" - }, - "packageManager": "pnpm@10.4.1", - "engines": { - "node": ">=20" - }, - "dependencies": { - "@eslint/js": "^9.32.0", - "typescript-eslint": "^8.24.1" + "rimraf": "^5.0.0", + "tailwindcss": "^3.4.4", + "ts-node": "^10.9.2", + "typescript": "^5.5.3", + "vite": "^5.3.3", + "vitest": "^3.0.0", + "which": "^4.0.0" }, "pnpm": { "onlyBuiltDependencies": [ @@ -41,4 +107,4 @@ "sqlite3" ] } -} \ No newline at end of file +} diff --git a/packages/eslint-config/README.md b/packages/eslint-config/README.md deleted file mode 100644 index 4a414ab1..00000000 --- a/packages/eslint-config/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `@workspace/eslint-config` - -Shared eslint configuration for the workspace. diff --git a/packages/eslint-config/base.js b/packages/eslint-config/base.js deleted file mode 100644 index b0f1eaea..00000000 --- a/packages/eslint-config/base.js +++ /dev/null @@ -1,32 +0,0 @@ -import js from "@eslint/js" -import eslintConfigPrettier from "eslint-config-prettier" -import onlyWarn from "eslint-plugin-only-warn" -import turboPlugin from "eslint-plugin-turbo" -import tseslint from "typescript-eslint" - -/** - * A shared ESLint configuration for the repository. - * - * @type {import("eslint").Linter.Config} - * */ -export const config = [ - js.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.recommended, - { - plugins: { - turbo: turboPlugin, - }, - rules: { - "turbo/no-undeclared-env-vars": "warn", - }, - }, - { - plugins: { - onlyWarn, - }, - }, - { - ignores: ["dist/**"], - }, -] diff --git a/packages/eslint-config/next.js b/packages/eslint-config/next.js deleted file mode 100644 index e40fffcd..00000000 --- a/packages/eslint-config/next.js +++ /dev/null @@ -1,51 +0,0 @@ -import js from "@eslint/js" -import pluginNext from "@next/eslint-plugin-next" -import eslintConfigPrettier from "eslint-config-prettier" -import pluginReact from "eslint-plugin-react" -import pluginReactHooks from "eslint-plugin-react-hooks" -import globals from "globals" -import tseslint from "typescript-eslint" - -import { config as baseConfig } from "./base.js" - -/** - * A custom ESLint configuration for libraries that use Next.js. - * - * @type {import("eslint").Linter.Config} - * */ -export const nextJsConfig = [ - ...baseConfig, - js.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.recommended, - { - ...pluginReact.configs.flat.recommended, - languageOptions: { - ...pluginReact.configs.flat.recommended.languageOptions, - globals: { - ...globals.serviceworker, - }, - }, - }, - { - plugins: { - "@next/next": pluginNext, - }, - rules: { - ...pluginNext.configs.recommended.rules, - ...pluginNext.configs["core-web-vitals"].rules, - }, - }, - { - plugins: { - "react-hooks": pluginReactHooks, - }, - settings: { react: { version: "detect" } }, - rules: { - ...pluginReactHooks.configs.recommended.rules, - // React scope no longer necessary with new JSX transform. - "react/react-in-jsx-scope": "off", - "react/prop-types": "off", - }, - }, -] diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json deleted file mode 100644 index 6bbc76a8..00000000 --- a/packages/eslint-config/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "@workspace/eslint-config", - "version": "0.0.0", - "type": "module", - "private": true, - "exports": { - "./base": "./base.js", - "./next-js": "./next.js", - "./react-internal": "./react-internal.js" - }, - "devDependencies": { - "@next/eslint-plugin-next": "^15.1.7", - "@typescript-eslint/eslint-plugin": "^8.24.1", - "@typescript-eslint/parser": "^8.24.1", - "eslint": "^9.20.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-only-warn": "^1.1.0", - "eslint-plugin-react": "^7.37.4", - "eslint-plugin-react-hooks": "^5.1.0", - "eslint-plugin-turbo": "^2.4.2", - "globals": "^15.15.0", - "typescript": "^5.7.3", - "typescript-eslint": "^8.24.1" - } -} diff --git a/packages/eslint-config/react-internal.js b/packages/eslint-config/react-internal.js deleted file mode 100644 index dda3143e..00000000 --- a/packages/eslint-config/react-internal.js +++ /dev/null @@ -1,41 +0,0 @@ -import js from "@eslint/js" -import eslintConfigPrettier from "eslint-config-prettier" -import pluginReact from "eslint-plugin-react" -import pluginReactHooks from "eslint-plugin-react-hooks" -import globals from "globals" -import tseslint from "typescript-eslint" - -import { config as baseConfig } from "./base.js" - -/** - * A custom ESLint configuration for libraries that use React. - * - * @type {import("eslint").Linter.Config} */ -export const config = [ - ...baseConfig, - js.configs.recommended, - eslintConfigPrettier, - ...tseslint.configs.recommended, - pluginReact.configs.flat.recommended, - { - languageOptions: { - ...pluginReact.configs.flat.recommended.languageOptions, - globals: { - ...globals.serviceworker, - ...globals.browser, - }, - }, - }, - { - plugins: { - "react-hooks": pluginReactHooks, - }, - settings: { react: { version: "detect" } }, - rules: { - ...pluginReactHooks.configs.recommended.rules, - // React scope no longer necessary with new JSX transform. - "react/react-in-jsx-scope": "off", - "react/prop-types": "off", - }, - }, -] diff --git a/packages/typescript-config/README.md b/packages/typescript-config/README.md deleted file mode 100644 index e5f0c936..00000000 --- a/packages/typescript-config/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `@workspace/typescript-config` - -Shared typescript configuration for the workspace. diff --git a/packages/typescript-config/base.json b/packages/typescript-config/base.json deleted file mode 100644 index 0f80cfd6..00000000 --- a/packages/typescript-config/base.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Default", - "compilerOptions": { - "declaration": true, - "declarationMap": true, - "esModuleInterop": true, - "incremental": false, - "isolatedModules": true, - "lib": ["es2022", "DOM", "DOM.Iterable"], - "module": "NodeNext", - "moduleDetection": "force", - "moduleResolution": "NodeNext", - "noUncheckedIndexedAccess": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "ES2022" - } -} diff --git a/packages/typescript-config/nextjs.json b/packages/typescript-config/nextjs.json deleted file mode 100644 index 44f42899..00000000 --- a/packages/typescript-config/nextjs.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Next.js", - "extends": "./base.json", - "compilerOptions": { - "plugins": [{ "name": "next" }], - "module": "ESNext", - "moduleResolution": "Bundler", - "allowJs": true, - "jsx": "preserve", - "noEmit": true - } -} diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json deleted file mode 100644 index 94501168..00000000 --- a/packages/typescript-config/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@workspace/typescript-config", - "version": "0.0.0", - "private": true, - "license": "PROPRIETARY", - "publishConfig": { - "access": "public" - } -} diff --git a/packages/typescript-config/react-library.json b/packages/typescript-config/react-library.json deleted file mode 100644 index a755ffea..00000000 --- a/packages/typescript-config/react-library.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "React Library", - "extends": "./base.json", - "compilerOptions": { - "jsx": "react-jsx", - } -} diff --git a/packages/ui/components.json b/packages/ui/components.json deleted file mode 100644 index 4821fa96..00000000 --- a/packages/ui/components.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": true, - "tsx": true, - "tailwind": { - "config": "tailwind.config.ts", - "css": "src/styles/globals.css", - "baseColor": "neutral", - "cssVariables": true - }, - "iconLibrary": "lucide", - "aliases": { - "components": "@workspace/ui/components", - "utils": "@workspace/ui/lib/utils", - "hooks": "@workspace/ui/hooks", - "lib": "@workspace/ui/lib", - "ui": "@workspace/ui/components" - } -} \ No newline at end of file diff --git a/packages/ui/eslint.config.js b/packages/ui/eslint.config.js deleted file mode 100644 index 69da3ed0..00000000 --- a/packages/ui/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { config } from "@workspace/eslint-config/react-internal" - -/** @type {import("eslint").Linter.Config} */ -export default config diff --git a/packages/ui/package.json b/packages/ui/package.json deleted file mode 100644 index 97da3cd2..00000000 --- a/packages/ui/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "@workspace/ui", - "version": "0.0.0", - "type": "module", - "private": true, - "scripts": { - "lint": "eslint . --max-warnings 0" - }, - "dependencies": { - "@hookform/resolvers": "^5.0.1", - "@radix-ui/react-accordion": "^1.2.4", - "@radix-ui/react-alert-dialog": "^1.1.7", - "@radix-ui/react-aspect-ratio": "^1.1.3", - "@radix-ui/react-avatar": "^1.1.4", - "@radix-ui/react-checkbox": "^1.1.5", - "@radix-ui/react-collapsible": "^1.1.4", - "@radix-ui/react-context-menu": "^2.2.7", - "@radix-ui/react-dialog": "^1.1.7", - "@radix-ui/react-dropdown-menu": "^2.1.7", - "@radix-ui/react-hover-card": "^1.1.7", - "@radix-ui/react-label": "^2.1.3", - "@radix-ui/react-menubar": "^1.1.7", - "@radix-ui/react-navigation-menu": "^1.2.6", - "@radix-ui/react-popover": "^1.1.7", - "@radix-ui/react-progress": "^1.1.3", - "@radix-ui/react-radio-group": "^1.2.4", - "@radix-ui/react-scroll-area": "^1.2.4", - "@radix-ui/react-select": "^2.1.7", - "@radix-ui/react-separator": "^1.1.3", - "@radix-ui/react-slider": "^1.2.4", - "@radix-ui/react-slot": "^1.2.0", - "@radix-ui/react-switch": "^1.1.4", - "@radix-ui/react-tabs": "^1.1.4", - "@radix-ui/react-toggle": "^1.1.3", - "@radix-ui/react-toggle-group": "^1.1.3", - "@radix-ui/react-tooltip": "^1.2.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "date-fns": "^4.1.0", - "embla-carousel-react": "^8.6.0", - "input-otp": "^1.4.2", - "lucide-react": "^0.475.0", - "motion": "^12.6.5", - "next-themes": "^0.4.6", - "react": "^19.1.0", - "react-day-picker": "8.10.1", - "react-dom": "^19.1.0", - "react-hook-form": "^7.55.0", - "react-resizable-panels": "^2.1.7", - "recharts": "^2.15.2", - "sonner": "^2.0.3", - "tailwind-merge": "^3.2.0", - "tw-animate-css": "^1.2.5", - "vaul": "^1.1.2", - "zod": "^3.24.2" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4.1.3", - "@turbo/gen": "^2.5.0", - "@types/node": "^20.17.30", - "@types/react": "^19.1.1", - "@types/react-dom": "^19.1.2", - "@workspace/eslint-config": "workspace:*", - "@workspace/typescript-config": "workspace:*", - "tailwindcss": "^4.1.3", - "tailwindcss-animate": "^1.0.7", - "typescript": "^5.8.3" - }, - "exports": { - "./globals.css": "./src/styles/globals.css", - "./postcss.config": "./postcss.config.mjs", - "./lib/*": "./src/lib/*.ts", - "./components/*": "./src/components/*.tsx", - "./hooks/*": "./src/hooks/*.ts" - } -} \ No newline at end of file diff --git a/packages/ui/postcss.config.mjs b/packages/ui/postcss.config.mjs deleted file mode 100644 index 4ae682d8..00000000 --- a/packages/ui/postcss.config.mjs +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('postcss-load-config').Config} */ -const config = { - plugins: { "@tailwindcss/postcss": {} }, -}; - -export default config; diff --git a/packages/ui/src/components/.gitkeep b/packages/ui/src/components/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/ui/src/components/accordion.tsx b/packages/ui/src/components/accordion.tsx deleted file mode 100644 index 0928bf08..00000000 --- a/packages/ui/src/components/accordion.tsx +++ /dev/null @@ -1,64 +0,0 @@ -"use client"; - -import * as React from "react"; -import * as AccordionPrimitive from "@radix-ui/react-accordion"; -import { ChevronDownIcon } from "lucide-react"; - -import { cn } from "@workspace/ui/lib/utils"; - -function Accordion({ ...props }: React.ComponentProps) { - return ; -} - -function AccordionItem({ - className, - ...props -}: React.ComponentProps) { - return ( - - ); -} - -function AccordionTrigger({ - className, - children, - ...props -}: React.ComponentProps) { - return ( - - svg]:rotate-180", - className, - )} - {...props} - > - {children} - - - - ); -} - -function AccordionContent({ - className, - children, - ...props -}: React.ComponentProps) { - return ( - -
{children}
-
- ); -} - -export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/packages/ui/src/components/alert-dialog.tsx b/packages/ui/src/components/alert-dialog.tsx deleted file mode 100644 index 8e86c94d..00000000 --- a/packages/ui/src/components/alert-dialog.tsx +++ /dev/null @@ -1,135 +0,0 @@ -"use client"; - -import * as React from "react"; -import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"; - -import { cn } from "@workspace/ui/lib/utils"; -import { buttonVariants } from "@workspace/ui/components/button"; - -function AlertDialog({ ...props }: React.ComponentProps) { - return ; -} - -function AlertDialogTrigger({ - ...props -}: React.ComponentProps) { - return ; -} - -function AlertDialogPortal({ ...props }: React.ComponentProps) { - return ; -} - -function AlertDialogOverlay({ - className, - ...props -}: React.ComponentProps) { - return ( - - ); -} - -function AlertDialogContent({ - className, - ...props -}: React.ComponentProps) { - return ( - - - - - ); -} - -function AlertDialogHeader({ className, ...props }: React.ComponentProps<"div">) { - return ( -
- ); -} - -function AlertDialogFooter({ className, ...props }: React.ComponentProps<"div">) { - return ( -
- ); -} - -function AlertDialogTitle({ - className, - ...props -}: React.ComponentProps) { - return ( - - ); -} - -function AlertDialogDescription({ - className, - ...props -}: React.ComponentProps) { - return ( - - ); -} - -function AlertDialogAction({ - className, - ...props -}: React.ComponentProps) { - return ; -} - -function AlertDialogCancel({ - className, - ...props -}: React.ComponentProps) { - return ( - - ); -} - -export { - AlertDialog, - AlertDialogPortal, - AlertDialogOverlay, - AlertDialogTrigger, - AlertDialogContent, - AlertDialogHeader, - AlertDialogFooter, - AlertDialogTitle, - AlertDialogDescription, - AlertDialogAction, - AlertDialogCancel, -}; diff --git a/packages/ui/src/components/alert.tsx b/packages/ui/src/components/alert.tsx deleted file mode 100644 index 807ad396..00000000 --- a/packages/ui/src/components/alert.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import * as React from "react"; -import { cva, type VariantProps } from "class-variance-authority"; - -import { cn } from "@workspace/ui/lib/utils"; - -const alertVariants = cva( - "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", - { - variants: { - variant: { - default: "bg-card text-card-foreground", - destructive: - "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", - }, - }, - defaultVariants: { - variant: "default", - }, - }, -); - -function Alert({ - className, - variant, - ...props -}: React.ComponentProps<"div"> & VariantProps) { - return ( -
- ); -} - -function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { - return ( -
- ); -} - -function AlertDescription({ className, ...props }: React.ComponentProps<"div">) { - return ( -
- ); -} - -export { Alert, AlertTitle, AlertDescription }; diff --git a/packages/ui/src/components/animated-group.tsx b/packages/ui/src/components/animated-group.tsx deleted file mode 100644 index 05dfe94f..00000000 --- a/packages/ui/src/components/animated-group.tsx +++ /dev/null @@ -1,137 +0,0 @@ -"use client"; -import { ReactNode } from "react"; -import { motion, Variants } from "motion/react"; -import React from "react"; - -export type PresetType = - | "fade" - | "slide" - | "scale" - | "blur" - | "blur-slide" - | "zoom" - | "flip" - | "bounce" - | "rotate" - | "swing"; - -export type AnimatedGroupProps = { - children: ReactNode; - className?: string; - variants?: { - container?: Variants; - item?: Variants; - }; - preset?: PresetType; - as?: React.ElementType; - asChild?: React.ElementType; -}; - -const defaultContainerVariants: Variants = { - visible: { - transition: { - staggerChildren: 0.1, - }, - }, -}; - -const defaultItemVariants: Variants = { - hidden: { opacity: 0 }, - visible: { opacity: 1 }, -}; - -const presetVariants: Record = { - fade: {}, - slide: { - hidden: { y: 20 }, - visible: { y: 0 }, - }, - scale: { - hidden: { scale: 0.8 }, - visible: { scale: 1 }, - }, - blur: { - hidden: { filter: "blur(4px)" }, - visible: { filter: "blur(0px)" }, - }, - "blur-slide": { - hidden: { filter: "blur(4px)", y: 20 }, - visible: { filter: "blur(0px)", y: 0 }, - }, - zoom: { - hidden: { scale: 0.5 }, - visible: { - scale: 1, - transition: { type: "spring", stiffness: 300, damping: 20 }, - }, - }, - flip: { - hidden: { rotateX: -90 }, - visible: { - rotateX: 0, - transition: { type: "spring", stiffness: 300, damping: 20 }, - }, - }, - bounce: { - hidden: { y: -50 }, - visible: { - y: 0, - transition: { type: "spring", stiffness: 400, damping: 10 }, - }, - }, - rotate: { - hidden: { rotate: -180 }, - visible: { - rotate: 0, - transition: { type: "spring", stiffness: 200, damping: 15 }, - }, - }, - swing: { - hidden: { rotate: -10 }, - visible: { - rotate: 0, - transition: { type: "spring", stiffness: 300, damping: 8 }, - }, - }, -}; - -const addDefaultVariants = (variants: Variants) => ({ - hidden: { ...defaultItemVariants.hidden, ...variants.hidden }, - visible: { ...defaultItemVariants.visible, ...variants.visible }, -}); - -function AnimatedGroup({ - children, - className, - variants, - preset, - as = "div", - asChild = "div", -}: AnimatedGroupProps) { - const selectedVariants = { - item: addDefaultVariants(preset ? presetVariants[preset] : {}), - container: addDefaultVariants(defaultContainerVariants), - }; - const containerVariants = variants?.container || selectedVariants.container; - const itemVariants = variants?.item || selectedVariants.item; - - const MotionComponent = React.useMemo(() => motion.create(as), [as]); - const MotionChild = React.useMemo(() => motion.create(asChild), [asChild]); - - return ( - - {React.Children.map(children, (child, index) => ( - - {child} - - ))} - - ); -} - -export { AnimatedGroup }; diff --git a/packages/ui/src/components/aspect-ratio.tsx b/packages/ui/src/components/aspect-ratio.tsx deleted file mode 100644 index 59d6b357..00000000 --- a/packages/ui/src/components/aspect-ratio.tsx +++ /dev/null @@ -1,9 +0,0 @@ -"use client"; - -import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"; - -function AspectRatio({ ...props }: React.ComponentProps) { - return ; -} - -export { AspectRatio }; diff --git a/packages/ui/src/components/avatar.tsx b/packages/ui/src/components/avatar.tsx deleted file mode 100644 index e7f4932d..00000000 --- a/packages/ui/src/components/avatar.tsx +++ /dev/null @@ -1,41 +0,0 @@ -"use client"; - -import * as React from "react"; -import * as AvatarPrimitive from "@radix-ui/react-avatar"; - -import { cn } from "@workspace/ui/lib/utils"; - -function Avatar({ className, ...props }: React.ComponentProps) { - return ( - - ); -} - -function AvatarImage({ className, ...props }: React.ComponentProps) { - return ( - - ); -} - -function AvatarFallback({ - className, - ...props -}: React.ComponentProps) { - return ( - - ); -} - -export { Avatar, AvatarImage, AvatarFallback }; diff --git a/packages/ui/src/components/badge.tsx b/packages/ui/src/components/badge.tsx deleted file mode 100644 index afa86c56..00000000 --- a/packages/ui/src/components/badge.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; -import { cva, type VariantProps } from "class-variance-authority"; - -import { cn } from "@workspace/ui/lib/utils"; - -const badgeVariants = cva( - "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", - { - variants: { - variant: { - default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", - secondary: - "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", - destructive: - "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", - outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", - }, - }, - defaultVariants: { - variant: "default", - }, - }, -); - -function Badge({ - className, - variant, - asChild = false, - ...props -}: React.ComponentProps<"span"> & VariantProps & { asChild?: boolean }) { - const Comp = asChild ? Slot : "span"; - - return ( - - ); -} - -export { Badge, badgeVariants }; diff --git a/packages/ui/src/components/border-beam.tsx b/packages/ui/src/components/border-beam.tsx deleted file mode 100644 index f2d93491..00000000 --- a/packages/ui/src/components/border-beam.tsx +++ /dev/null @@ -1,94 +0,0 @@ -"use client"; - -import { cn } from "@workspace/ui/lib/utils"; -import { motion, MotionStyle, Transition } from "motion/react"; - -interface BorderBeamProps { - /** - * The size of the border beam. - */ - size?: number; - /** - * The duration of the border beam. - */ - duration?: number; - /** - * The delay of the border beam. - */ - delay?: number; - /** - * The color of the border beam from. - */ - colorFrom?: string; - /** - * The color of the border beam to. - */ - colorTo?: string; - /** - * The motion transition of the border beam. - */ - transition?: Transition; - /** - * The class name of the border beam. - */ - className?: string; - /** - * The style of the border beam. - */ - style?: React.CSSProperties; - /** - * Whether to reverse the animation direction. - */ - reverse?: boolean; - /** - * The initial offset position (0-100). - */ - initialOffset?: number; -} - -export const BorderBeam = ({ - className, - size = 50, - delay = 0, - duration = 6, - colorFrom = "#ffaa40", - colorTo = "#9c40ff", - transition, - style, - reverse = false, - initialOffset = 0, -}: BorderBeamProps) => { - return ( -
- -
- ); -}; diff --git a/packages/ui/src/components/breadcrumb.tsx b/packages/ui/src/components/breadcrumb.tsx deleted file mode 100644 index 6fc57fbf..00000000 --- a/packages/ui/src/components/breadcrumb.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; -import { ChevronRight, MoreHorizontal } from "lucide-react"; - -import { cn } from "@workspace/ui/lib/utils"; - -function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { - return