New version v2.3.6

This commit is contained in:
2026-03-04 10:19:16 +01:00
parent 65a35cd508
commit 49f842f119
52 changed files with 14034 additions and 358 deletions

141
DEVELOPMENT.md Normal file
View File

@@ -0,0 +1,141 @@
# oAI — Development Guide
## Project Structure
```
oAI/
├── Models/ # Data models
│ ├── Message.swift # Chat message model
│ ├── Conversation.swift # Saved conversation model
│ ├── ModelInfo.swift # AI model metadata
│ └── Settings.swift # App settings enums
├── Views/ # SwiftUI views
│ ├── Main/ # Primary UI components
│ │ ├── ChatView.swift # Main chat interface
│ │ ├── MessageRow.swift # Individual message display
│ │ ├── InputBar.swift # Message input with commands
│ │ ├── HeaderView.swift # Top bar (provider/model/status)
│ │ └── FooterView.swift # Bottom stats bar
│ │
│ └── Screens/ # Modal/sheet views
│ ├── SettingsView.swift # Settings with tabs
│ ├── ModelSelectorView.swift
│ ├── ConversationListView.swift
│ └── HelpView.swift
├── ViewModels/ # Observable view models
│ └── ChatViewModel.swift # Main chat logic & state
├── Providers/ # AI provider implementations
│ ├── Provider.swift # Protocol definition
│ ├── OpenRouterProvider.swift
│ ├── AnthropicProvider.swift
│ ├── OpenAIProvider.swift
│ └── OllamaProvider.swift
├── Services/ # Business logic & data
│ ├── DatabaseService.swift # SQLite operations (GRDB)
│ ├── SettingsService.swift # Settings persistence
│ ├── ProviderRegistry.swift # AI provider management
│ ├── MCPService.swift # File access (MCP)
│ ├── WebSearchService.swift # DuckDuckGo/Google search
│ ├── GitSyncService.swift # Git synchronization
│ ├── ContextSelectionService.swift # Smart context
│ ├── EmbeddingService.swift # Semantic search
│ ├── EmailService.swift # Email monitoring (IMAP)
│ └── EmailHandlerService.swift # Email AI responder
└── Resources/
└── oAI.help/ # macOS Help Book
```
## Key Technologies
- **SwiftUI** - Modern declarative UI framework
- **GRDB** - SQLite database wrapper for persistence
- **MarkdownUI** - Markdown rendering with syntax highlighting
- **os.Logger** - Native logging framework
- **Network Framework** - Pure Swift IMAP/SMTP implementation
- **Security Framework** - Keychain and encryption services
## Database Schema
**Conversations**: id, name, createdAt, updatedAt
**Messages**: id, conversationId, role, content, tokens, cost, timestamp
**Message Metadata**: message_id, importance_score, user_starred, summary
**Message Embeddings**: message_id, embedding (BLOB), model, dimension
**Conversation Summaries**: id, conversationId, startIndex, endIndex, summary
**Email Logs**: id, sender, subject, status, timestamp
**Location:** `~/Library/Application Support/oAI/oai_conversations.db`
## Building
### Build Scripts
| Script | Architecture | Output |
|--------|-------------|--------|
| `build.sh` | Apple Silicon (arm64) | Installs directly to `/Applications` |
| `build-dmg.sh` | Apple Silicon (arm64) | `oAI-<version>-AppleSilicon.dmg` on Desktop |
| `build-dmg-universal.sh` | Universal (arm64 + x86_64) | `oAI-<version>-Universal.dmg` on Desktop |
| `build_nb/sv/da/de/en.sh` | Apple Silicon (arm64) | Build + launch in specific language |
All scripts: find Developer ID cert, clean-build via `xcodebuild`, re-sign with `codesign --options runtime --timestamp`, verify. Version is read from `MARKETING_VERSION` in `project.pbxproj`.
### Manual Build Commands
```bash
# Clean build
xcodebuild clean -scheme oAI
# Debug build
xcodebuild -scheme oAI -configuration Debug
# Run tests
xcodebuild test -scheme oAI
```
**Output:** `~/Library/Developer/Xcode/DerivedData/oAI-*/Build/Products/Debug/oAI.app`
In Xcode: `⌘B` build, `⌘R` run, `⌘⇧K` clean, `⌘.` stop.
### XProtect Note
XProtect 5331 flags Debug builds (bash + IMAP + file access = RAT signature match). Use `./build.sh` (Developer ID signed) for all local testing.
## Logs
```
~/Library/Logs/oAI.log
```
## Performance Notes
- **Context Selection**: 50-80% token reduction for long conversations
- **Semantic Search**: ~$0.02-0.15/month for heavy users
- **Conversation Export**: Markdown format for human readability
- **Database**: Indexed queries for fast conversation retrieval
- **Streaming**: Efficient memory usage with `AsyncThrowingStream`
## Contributing
Contributions are welcome! By submitting a pull request you agree that your contribution will be licensed under the AGPL-3.0.
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
Please ensure:
- Code follows Swift style guidelines
- All tests pass
- Documentation is updated
- Commit messages are descriptive
## Acknowledgments
- **MarkdownUI** - Excellent markdown rendering library
- **GRDB** - Robust SQLite wrapper for Swift
- **Anthropic, OpenAI, OpenRouter** - AI API providers