Merge branch 'main' into exec-approvals
This commit is contained in:
commit
3c303df8f1
61 changed files with 4538 additions and 1024 deletions
847
docs/product-capabilities.md
Normal file
847
docs/product-capabilities.md
Normal file
|
|
@ -0,0 +1,847 @@
|
|||
# Super Multica Product Capabilities
|
||||
|
||||
> This document is the single source of truth for all product capabilities. It describes **what exists**, not how to design or how to use it. All subsequent documents (user journeys, UI design, copywriting, design systems) should reference this document.
|
||||
|
||||
---
|
||||
|
||||
## 1. Product Definition
|
||||
|
||||
**Super Multica** is a distributed AI Agent framework. Users can create, customize, and deploy AI Agents with persistent memory, fine-grained capability control, and multi-provider LLM support. Agents run locally on the user's machine; remote access is optional.
|
||||
|
||||
**Core architecture**:
|
||||
|
||||
```
|
||||
Desktop App (standalone, recommended)
|
||||
└─ Hub (embedded, manages agents)
|
||||
└─ Agent Engine (LLM execution, sessions, skills, tools)
|
||||
└─ (Optional) Gateway connection → remote clients (web/mobile)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. User Roles
|
||||
|
||||
| Role | Definition | Platform | Authority |
|
||||
|------|-----------|----------|-----------|
|
||||
| **Owner** | Runs the Desktop app, owns Hub and Agents | Desktop (Electron) | Full: create/delete agents, approve devices, configure providers, manage profiles/skills |
|
||||
| **Collaborator** | Connects to Owner's Agent via Gateway | Web / Mobile | Limited: chat with agent, view message history. No agent management. |
|
||||
|
||||
There is no formal role/permission system. The Owner is implicit admin by virtue of running the Hub.
|
||||
|
||||
---
|
||||
|
||||
## 3. Functional Modules
|
||||
|
||||
### 3.1 Agent Engine
|
||||
|
||||
The core execution unit. An Agent receives user messages, calls an LLM, executes tools, and returns responses.
|
||||
|
||||
#### 3.1.1 Agent Lifecycle
|
||||
|
||||
| State | Description |
|
||||
|-------|-------------|
|
||||
| Created | AsyncAgent instantiated, assigned UUIDv7 session ID |
|
||||
| Idle | Awaiting `write()` call (user message) |
|
||||
| Running | Processing message: LLM call → tool execution → response |
|
||||
| Closed | Agent terminated, no further messages accepted |
|
||||
|
||||
Each `write()` call is queued. Messages are processed sequentially (one at a time).
|
||||
|
||||
#### 3.1.2 Agent Execution Loop
|
||||
|
||||
1. Receive user message via `write(content)`
|
||||
2. Resolve API credentials (with auth profile rotation)
|
||||
3. Build/update system prompt from profile
|
||||
4. Call LLM provider with message history
|
||||
5. If LLM requests tool calls → execute tools → feed results back to LLM → repeat
|
||||
6. Save all messages to session storage
|
||||
7. Check context window utilization → compact if needed
|
||||
8. Emit events to subscribers (streaming to UI)
|
||||
|
||||
#### 3.1.3 Auth Profile Rotation
|
||||
|
||||
When an API call fails, the system classifies the error and may rotate to a different API key:
|
||||
|
||||
| Error Type | Examples | Rotates? |
|
||||
|-----------|----------|----------|
|
||||
| `auth` | 401, 403, invalid key | Yes |
|
||||
| `rate_limit` | 429, rate limit exceeded | Yes |
|
||||
| `billing` | Out of credits, quota exceeded | Yes |
|
||||
| `timeout` | Connection timeout | Yes |
|
||||
| `format` | 400, malformed request | No |
|
||||
| `unknown` | Other errors | No |
|
||||
|
||||
Failed profiles enter cooldown. Rotation continues until success or all profiles exhausted.
|
||||
|
||||
Tracking file: `~/.super-multica/.auth-profiles/usage-stats.json`
|
||||
|
||||
#### 3.1.4 Subagent Spawning
|
||||
|
||||
Agents can spawn child agents via the `sessions_spawn` tool:
|
||||
|
||||
- Subagents get isolated sessions
|
||||
- Tool restrictions: `sessions_spawn` denied (no nested spawning)
|
||||
- System prompt mode: `minimal` or `none`
|
||||
- Parameters: task (required), label, model override, cleanup policy (`delete` or `keep`), timeout
|
||||
- Results announced back to parent automatically
|
||||
|
||||
#### 3.1.5 Agent Configuration Options
|
||||
|
||||
| Option | Type | Default | Description |
|
||||
|--------|------|---------|-------------|
|
||||
| `profileId` | string | none | Agent profile to load |
|
||||
| `provider` | string | `kimi-coding` | LLM provider |
|
||||
| `model` | string | provider default | Model within provider |
|
||||
| `reasoningMode` | `off` / `on` / `stream` | `off` | Display thinking/reasoning |
|
||||
| `compactionMode` | `count` / `tokens` / `summary` | `tokens` | Context compaction strategy |
|
||||
| `contextWindowTokens` | number | 200,000 | Override model's context window |
|
||||
| `enableSkills` | boolean | `true` | Enable skills system |
|
||||
|
||||
---
|
||||
|
||||
### 3.2 LLM Providers
|
||||
|
||||
Ten providers supported. Two auth methods: OAuth (CLI login) and API Key.
|
||||
|
||||
| ID | Display Name | Auth | Default Model | Available Models |
|
||||
|----|-------------|------|---------------|------------------|
|
||||
| `claude-code` | Claude Code | OAuth | claude-opus-4-5 | claude-opus-4-5, claude-sonnet-4-5, claude-haiku-4-5 |
|
||||
| `openai-codex` | Codex | OAuth | gpt-5.2 | gpt-5.2, gpt-5.2-codex, gpt-5.1-codex, gpt-5.1-codex-mini, gpt-5.1-codex-max |
|
||||
| `anthropic` | Anthropic | API Key | claude-sonnet-4-5 | claude-opus-4-5, claude-sonnet-4-5, claude-haiku-4-5 |
|
||||
| `openai` | OpenAI | API Key | gpt-4o | gpt-4o, gpt-4o-mini, o1, o1-mini |
|
||||
| `kimi-coding` | Kimi Code | API Key | kimi-k2-thinking | kimi-k2-thinking, k2p5 |
|
||||
| `google` | Google AI | API Key | gemini-2.0-flash | gemini-2.0-flash, gemini-1.5-pro |
|
||||
| `groq` | Groq | API Key | llama-3.3-70b-versatile | llama-3.3-70b-versatile, mixtral-8x7b-32768 |
|
||||
| `mistral` | Mistral | API Key | mistral-large-latest | mistral-large-latest, codestral-latest |
|
||||
| `xai` | xAI (Grok) | API Key | grok-beta | grok-beta, grok-vision-beta |
|
||||
| `openrouter` | OpenRouter | API Key | anthropic/claude-3.5-sonnet | anthropic/claude-3.5-sonnet, openai/gpt-4o |
|
||||
|
||||
**Default provider fallback**: config > credentials.json5 > `kimi-coding`
|
||||
|
||||
**OAuth providers** require external CLI login (`claude login` / `codex login`).
|
||||
|
||||
**API Key providers** are configured in `~/.super-multica/credentials.json5`.
|
||||
|
||||
**Multiple API keys per provider** are supported via auth profiles (e.g., `openai`, `openai:backup`). The system rotates between them on failure.
|
||||
|
||||
---
|
||||
|
||||
### 3.3 Tools
|
||||
|
||||
Tools are capabilities the Agent can invoke during execution.
|
||||
|
||||
#### 3.3.1 Built-in Tools
|
||||
|
||||
| Tool | Category | Description |
|
||||
|------|----------|-------------|
|
||||
| `read` | File | Read file contents (with optional offset/limit) |
|
||||
| `write` | File | Create or overwrite files |
|
||||
| `edit` | File | Make precise edits to existing files |
|
||||
| `glob` | File | Find files by pattern (default limit: 100, max: 1000) |
|
||||
| `exec` | Runtime | Run shell commands (auto-backgrounds after 10s) |
|
||||
| `process` | Runtime | Manage background processes (start, stop, list, output) |
|
||||
| `web_search` | Web | Search the web (Brave or Perplexity provider) |
|
||||
| `web_fetch` | Web | Fetch and extract URL content (markdown/text, max 50k chars, 15min cache) |
|
||||
| `memory_get` | Memory | Read from agent's persistent memory |
|
||||
| `memory_set` | Memory | Write to agent's persistent memory (max 1MB per value) |
|
||||
| `memory_list` | Memory | List memory entries (default limit: 100, max: 1000) |
|
||||
| `memory_delete` | Memory | Delete memory entries |
|
||||
| `sessions_spawn` | Subagent | Spawn a child agent for a specific task |
|
||||
|
||||
#### 3.3.2 Tool Groups (shortcuts for policy)
|
||||
|
||||
| Group | Tools Included |
|
||||
|-------|---------------|
|
||||
| `group:fs` | read, write, edit, glob |
|
||||
| `group:runtime` | exec, process |
|
||||
| `group:web` | web_search, web_fetch |
|
||||
| `group:memory` | memory_get, memory_set, memory_delete, memory_list |
|
||||
| `group:subagent` | sessions_spawn |
|
||||
| `group:core` | read, write, edit, glob, exec, process, web_search, web_fetch |
|
||||
|
||||
#### 3.3.3 Tool Policy System (3 layers)
|
||||
|
||||
| Layer | Scope | Description |
|
||||
|-------|-------|-------------|
|
||||
| 1. Global | All agents | `allow` / `deny` lists (wildcard supported: `mem*`, `*`) |
|
||||
| 2. Provider | Per LLM provider | Narrower restrictions per provider (e.g., deny `exec` for Google) |
|
||||
| 3. Subagent | Child agents only | `sessions_spawn` denied by default |
|
||||
|
||||
**Priority**: Deny always overrides Allow. Empty allow list = deny all.
|
||||
|
||||
#### 3.3.4 Exec Tool Details
|
||||
|
||||
- Default yield timeout: 10,000ms (auto-backgrounds if not complete)
|
||||
- Supports `timeoutMs` for hard kill (SIGTERM)
|
||||
- Output includes: stdout+stderr, exitCode, truncation flag, process ID if backgrounded
|
||||
|
||||
#### 3.3.5 Web Search Details
|
||||
|
||||
- Brave provider: up to 10 results, country filtering, freshness filters (`pd`/`pw`/`pm`/`py`)
|
||||
- Perplexity provider: AI-synthesized answers
|
||||
- Default count: 5 results, 1 hour cache
|
||||
|
||||
---
|
||||
|
||||
### 3.4 Profile System
|
||||
|
||||
A Profile defines an Agent's identity, personality, knowledge, and configuration.
|
||||
|
||||
#### 3.4.1 Profile File Structure
|
||||
|
||||
```
|
||||
~/.super-multica/agent-profiles/{profileId}/
|
||||
├── soul.md # Identity: name, role, personality, behavior boundaries
|
||||
├── user.md # User information: name, preferences, context
|
||||
├── workspace.md # Workspace conventions, coding standards, project rules
|
||||
├── memory.md # Long-term knowledge base (read by agent at startup)
|
||||
├── config.json # Optional: provider, model, thinking level, tool policy
|
||||
├── memory/ # Key-value persistent memory storage
|
||||
│ ├── key1.json
|
||||
│ └── key2.json
|
||||
└── skills/ # Profile-specific skills (override global)
|
||||
└── {skill-name}/
|
||||
└── SKILL.md
|
||||
```
|
||||
|
||||
#### 3.4.2 Profile Config (config.json)
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Jarvis",
|
||||
"style": "concise and direct",
|
||||
"provider": "anthropic",
|
||||
"model": "claude-sonnet-4-5",
|
||||
"thinkingLevel": "medium",
|
||||
"tools": {
|
||||
"allow": ["group:fs", "web_fetch"],
|
||||
"deny": ["exec"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.4.3 Profile Operations
|
||||
|
||||
| Operation | CLI | Desktop |
|
||||
|-----------|-----|---------|
|
||||
| List profiles | `multica profile list` | Via Hub info |
|
||||
| Create profile | `multica profile new <id>` | - |
|
||||
| Interactive setup | `multica profile setup <id>` | - |
|
||||
| View profile | `multica profile show <id>` | - |
|
||||
| Edit in file manager | `multica profile edit <id>` | - |
|
||||
| Delete profile | `multica profile delete <id>` | - |
|
||||
|
||||
**Profile ID rules**: alphanumeric, hyphens, underscores only.
|
||||
|
||||
#### 3.4.4 System Prompt Composition
|
||||
|
||||
The system prompt is built dynamically from profile files:
|
||||
|
||||
| Section | Source | Mode: full | Mode: minimal | Mode: none |
|
||||
|---------|--------|-----------|--------------|-----------|
|
||||
| Identity | soul.md + config | Yes | Partial | Single line |
|
||||
| User | user.md | On-demand | No | No |
|
||||
| Workspace | workspace.md | Yes | No | No |
|
||||
| Memory | memory.md | On-demand | No | No |
|
||||
| Safety | Built-in constitution | Yes | Yes | Yes |
|
||||
| Tools | Active tool list | Yes | Core only | No |
|
||||
| Skills | Skill instructions | Yes | No | No |
|
||||
| Runtime | OS, model, hostname | Yes | Essential | No |
|
||||
| Subagent | Task context | If applicable | Yes | Yes |
|
||||
|
||||
**Progressive disclosure**: soul.md, user.md, memory.md are loaded on-demand (not injected in full at startup) to save tokens.
|
||||
|
||||
---
|
||||
|
||||
### 3.5 Memory System
|
||||
|
||||
Agents can persistently store and recall information across sessions.
|
||||
|
||||
#### 3.5.1 Storage
|
||||
|
||||
- Location: `~/.super-multica/agent-profiles/{profileId}/memory/`
|
||||
- Format: One JSON file per key
|
||||
- Key rules: alphanumeric, underscore, dot, hyphen. Max 128 chars.
|
||||
- Dots in keys are escaped as `__DOT__` in filenames
|
||||
- Max value size: 1MB
|
||||
|
||||
#### 3.5.2 Entry Format
|
||||
|
||||
```json
|
||||
{
|
||||
"value": "any JSON value",
|
||||
"description": "optional human-readable description",
|
||||
"createdAt": 1717689600000,
|
||||
"updatedAt": 1717689600000
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.5.3 Memory Tools
|
||||
|
||||
| Tool | Input | Output |
|
||||
|------|-------|--------|
|
||||
| `memory_get` | `{ key }` | `{ found, value?, description?, updatedAt? }` |
|
||||
| `memory_set` | `{ key, value, description? }` | `{ success, error? }` |
|
||||
| `memory_delete` | `{ key }` | `{ success, existed, error? }` |
|
||||
| `memory_list` | `{ prefix?, limit? }` | `{ keys[], total, truncated }` |
|
||||
|
||||
**Design principle**: Agents cannot "remember" mentally. All persistence must be file-based ("TEXT > BRAIN").
|
||||
|
||||
---
|
||||
|
||||
### 3.6 Skills System
|
||||
|
||||
Skills are modular, self-contained capabilities defined via `SKILL.md` files. They extend what an Agent can do.
|
||||
|
||||
#### 3.6.1 Skill File Format (SKILL.md)
|
||||
|
||||
```yaml
|
||||
---
|
||||
name: Skill Name
|
||||
description: What this skill does
|
||||
version: 1.0.0
|
||||
metadata:
|
||||
emoji: "📝"
|
||||
os: [darwin, linux] # Platform restriction (optional)
|
||||
always: false # Skip eligibility checks (optional)
|
||||
tags: [productivity, coding]
|
||||
requires:
|
||||
bins: [node, npm] # ALL must exist in PATH
|
||||
anyBins: [python3, python] # At least ONE must exist
|
||||
env: [OPENAI_API_KEY] # ALL must be set
|
||||
config: [custom.setting] # Config paths must be truthy
|
||||
---
|
||||
# Full markdown instructions follow...
|
||||
```
|
||||
|
||||
#### 3.6.2 Skill Sources & Precedence
|
||||
|
||||
| Source | Location | Precedence |
|
||||
|--------|----------|-----------|
|
||||
| Bundled | `skills/` in project | Lowest |
|
||||
| Global (user-installed) | `~/.super-multica/skills/` | Medium |
|
||||
| Profile-specific | `~/.super-multica/agent-profiles/{id}/skills/` | Highest (overrides) |
|
||||
|
||||
Profile skills with the same ID completely replace global/bundled versions.
|
||||
|
||||
#### 3.6.3 Bundled Skills
|
||||
|
||||
| Skill | ID | Description | Requirements |
|
||||
|-------|----|-------------|-------------|
|
||||
| Git Commit Helper | `commit` | Create well-formatted conventional commits | `git` binary |
|
||||
| Code Review | `code-review` | Structured code review with security focus | None |
|
||||
| Profile Setup | `profile-setup` | Interactive wizard to personalize agent profile | None |
|
||||
| Skill Creator | `skill-creator` | Create, edit, manage custom skills | None (always eligible) |
|
||||
|
||||
#### 3.6.4 Eligibility Check Sequence
|
||||
|
||||
1. Explicit disable in config → ineligible
|
||||
2. Bundled + not in allowlist → ineligible
|
||||
3. Platform mismatch (OS) → ineligible
|
||||
4. `always: true` flag → eligible (skip remaining)
|
||||
5. Missing required binary → ineligible
|
||||
6. No alternative binary found → ineligible
|
||||
7. Missing env var → ineligible
|
||||
8. Missing config path → ineligible
|
||||
9. All checks pass → eligible
|
||||
|
||||
Returns human-readable failure reasons (e.g., "Required binary not found: git").
|
||||
|
||||
#### 3.6.5 Skill Invocation
|
||||
|
||||
- **User invocation**: `/skillname args` in interactive CLI
|
||||
- **Model invocation**: Agent reads skill instructions from system prompt and follows them
|
||||
- **Hot reload**: File watcher detects SKILL.md changes, reloads automatically (250ms debounce)
|
||||
|
||||
#### 3.6.6 Skill Installation
|
||||
|
||||
```bash
|
||||
multica skills add owner/repo # Clone entire repository
|
||||
multica skills add owner/repo/skill-name # Clone single skill
|
||||
multica skills add owner/repo@branch # Specific branch/tag
|
||||
multica skills add owner/repo -p my-agent # Install to profile
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.7 Session Management
|
||||
|
||||
Sessions persist conversation history across interactions.
|
||||
|
||||
#### 3.7.1 Session Storage
|
||||
|
||||
- Location: `~/.super-multica/sessions/{sessionId}/session.jsonl`
|
||||
- Format: JSON Lines (one JSON object per line)
|
||||
- Session IDs: UUIDv7 (time-ordered)
|
||||
- Each line is either a message entry, meta entry, or compaction entry
|
||||
|
||||
#### 3.7.2 Message Format
|
||||
|
||||
Messages follow the LLM API format:
|
||||
|
||||
```json
|
||||
{"type": "message", "role": "user", "content": [{"type": "text", "text": "Hello"}]}
|
||||
{"type": "message", "role": "assistant", "content": [{"type": "text", "text": "Hi!"}, {"type": "tool_use", "id": "...", "name": "read", "input": {"path": "/foo"}}]}
|
||||
{"type": "message", "role": "user", "content": [{"type": "tool_result", "tool_use_id": "...", "content": "file contents"}]}
|
||||
```
|
||||
|
||||
#### 3.7.3 Session Metadata
|
||||
|
||||
```json
|
||||
{"type": "meta", "provider": "anthropic", "model": "claude-sonnet-4-5", "reasoningMode": "off", "contextWindowTokens": 200000}
|
||||
```
|
||||
|
||||
#### 3.7.4 Context Window Management
|
||||
|
||||
| Parameter | Value | Description |
|
||||
|-----------|-------|-------------|
|
||||
| Hard minimum | 16,000 tokens | Block execution below this |
|
||||
| Warning threshold | 32,000 tokens | Warn if context window smaller |
|
||||
| Default context | 200,000 tokens | Fallback if model unknown |
|
||||
| Safety margin | 20% | Buffer for estimation inaccuracy |
|
||||
| Compaction trigger | 80% utilization | Start compacting |
|
||||
| Compaction target | 50% utilization | Target after compaction |
|
||||
| Min keep messages | 10 | Never remove below this |
|
||||
| Reserve tokens | 1,024 | Reserved for response generation |
|
||||
|
||||
#### 3.7.5 Compaction Modes
|
||||
|
||||
| Mode | Strategy | Speed | Quality |
|
||||
|------|----------|-------|---------|
|
||||
| `tokens` (default) | Remove oldest messages until reaching 50% target | Fast | Good (preserves recent context) |
|
||||
| `count` | Remove oldest when count > 80, keep last 60 | Fastest | Adequate |
|
||||
| `summary` | LLM generates incremental summary of removed messages | Slow (API call) | Best (preserves meaning) |
|
||||
|
||||
#### 3.7.6 Session Operations
|
||||
|
||||
| Operation | CLI Command |
|
||||
|-----------|-------------|
|
||||
| List sessions | `multica session list` |
|
||||
| View session | `multica session show <id>` (supports partial ID) |
|
||||
| Delete session | `multica session delete <id>` |
|
||||
| Resume session | `multica --session <id> "continue..."` |
|
||||
|
||||
---
|
||||
|
||||
### 3.8 Hub
|
||||
|
||||
The Hub is the central coordinator. It manages agent lifecycle, routes messages, and handles device verification.
|
||||
|
||||
#### 3.8.1 Responsibilities
|
||||
|
||||
- Create, list, restore, close agents
|
||||
- Persist agent metadata to disk (`~/.super-multica/agents/agents.json`)
|
||||
- Route messages between local IPC and remote Gateway
|
||||
- Handle device verification and whitelisting
|
||||
- Process RPC requests from connected clients
|
||||
|
||||
#### 3.8.2 Hub RPC Methods
|
||||
|
||||
| Method | Description | Error Codes |
|
||||
|--------|-------------|-------------|
|
||||
| `verify` | Verify device with token | UNAUTHORIZED, REJECTED |
|
||||
| `getAgentMessages` | Fetch message history (default: 50, offset: 0) | INVALID_PARAMS, AGENT_NOT_FOUND |
|
||||
| `getHubInfo` | Get Hub ID and status | - |
|
||||
| `listAgents` | List all agents | - |
|
||||
| `createAgent` | Create new agent | - |
|
||||
| `deleteAgent` | Delete agent | - |
|
||||
| `updateGateway` | Update Gateway connection | - |
|
||||
|
||||
#### 3.8.3 Hub Singleton
|
||||
|
||||
One Hub per ecosystem. In Desktop mode, it's embedded in the Electron main process. It generates a persistent Hub ID stored at `~/.super-multica/hub-id`.
|
||||
|
||||
---
|
||||
|
||||
### 3.9 Gateway
|
||||
|
||||
NestJS WebSocket server that enables remote client access to the Hub.
|
||||
|
||||
#### 3.9.1 Purpose
|
||||
|
||||
Bridges remote clients (web/mobile) to the Hub. Not needed for local Desktop use.
|
||||
|
||||
#### 3.9.2 Connection Protocol
|
||||
|
||||
- Transport: Socket.io
|
||||
- Path: `/ws`
|
||||
- Port: 3000 (default)
|
||||
|
||||
#### 3.9.3 Timeouts
|
||||
|
||||
| Parameter | Value |
|
||||
|-----------|-------|
|
||||
| Ping interval | 25 seconds |
|
||||
| Ping timeout | 20 seconds |
|
||||
| RPC default timeout | 10 seconds |
|
||||
| Verify timeout | 30 seconds |
|
||||
| Reconnect delay | 1 second |
|
||||
|
||||
#### 3.9.4 Message Routing
|
||||
|
||||
- Each message has `from` (sender device ID) and `to` (target device ID)
|
||||
- Gateway validates: sender is registered, `from` matches socket, target exists
|
||||
- Supports streaming via `StreamAction` (message_start, message_update, message_end, tool events)
|
||||
|
||||
#### 3.9.5 Error Codes
|
||||
|
||||
| Code | Meaning |
|
||||
|------|---------|
|
||||
| NOT_REGISTERED | Sender not registered |
|
||||
| INVALID_MESSAGE | `from` field mismatch |
|
||||
| DEVICE_NOT_FOUND | Target device not online |
|
||||
|
||||
---
|
||||
|
||||
### 3.10 Device Pairing & Verification
|
||||
|
||||
How remote devices (web/mobile) connect to the Owner's Hub.
|
||||
|
||||
#### 3.10.1 QR Code Generation (Desktop)
|
||||
|
||||
The Desktop app generates a QR code containing:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "multica-connect",
|
||||
"gateway": "http://localhost:3000",
|
||||
"hubId": "uuid",
|
||||
"agentId": "uuid",
|
||||
"token": "random-uuid",
|
||||
"expires": 1694000000000
|
||||
}
|
||||
```
|
||||
|
||||
- Token: one-time use, random UUID
|
||||
- Expiry: 30 seconds from generation
|
||||
- Auto-refresh: new token generated when expired
|
||||
- Also available as URL: `multica://connect?gateway=...&hub=...&agent=...&token=...&exp=...`
|
||||
|
||||
#### 3.10.2 Connection Code Formats (accepted by client)
|
||||
|
||||
| Format | Example |
|
||||
|--------|---------|
|
||||
| JSON | `{"type":"multica-connect","gateway":"..."}` |
|
||||
| Base64 JSON | Base64-encoded JSON string |
|
||||
| URL | `multica://connect?gateway=...&hub=...&agent=...&token=...&exp=...` |
|
||||
|
||||
#### 3.10.3 Verification Flow
|
||||
|
||||
```
|
||||
1. Mobile scans QR / pastes code
|
||||
2. Client parses code, validates expiry
|
||||
3. Client connects to Gateway via Socket.io
|
||||
4. Gateway sends "registered" event
|
||||
5. Client auto-sends "verify" RPC with token + device metadata
|
||||
6. Hub validates token (one-time, checks expiry)
|
||||
7. Hub triggers confirmation dialog on Desktop
|
||||
- Shows: device name (parsed from User-Agent), device ID
|
||||
- Options: "Allow" or "Reject"
|
||||
- Timeout: 60 seconds (auto-reject)
|
||||
8. If allowed: device added to whitelist, persisted to disk
|
||||
9. If rejected: connection closed
|
||||
```
|
||||
|
||||
#### 3.10.4 Device Whitelist
|
||||
|
||||
- Location: `~/.super-multica/client-devices/whitelist.json`
|
||||
- Format:
|
||||
|
||||
```json
|
||||
{
|
||||
"version": 1,
|
||||
"devices": [{
|
||||
"deviceId": "uuid",
|
||||
"agentId": "uuid",
|
||||
"addedAt": 1694000000000,
|
||||
"meta": {
|
||||
"userAgent": "Mozilla/5.0...",
|
||||
"platform": "Linux",
|
||||
"language": "en-US"
|
||||
}
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.10.5 Reconnection (whitelisted device)
|
||||
|
||||
Whitelisted devices reconnect without needing a new token or user confirmation. Hub checks `isAllowed(deviceId)` and returns immediately.
|
||||
|
||||
#### 3.10.6 Device Management (Desktop)
|
||||
|
||||
- View verified devices list with metadata
|
||||
- Revoke individual devices (remove from whitelist)
|
||||
- No fine-grained permissions (all-or-nothing access)
|
||||
|
||||
#### 3.10.7 Security Model
|
||||
|
||||
| Aspect | Detail |
|
||||
|--------|--------|
|
||||
| Token lifetime | 30 seconds |
|
||||
| Token usage | One-time (deleted after consumption) |
|
||||
| Token storage | In-memory only (lost on Hub restart) |
|
||||
| Device ID | Browser: UUID in localStorage. Persistent until cleared. |
|
||||
| Whitelist | Persisted to disk. Survives restarts. |
|
||||
| Authorization | All verified devices have equal access |
|
||||
| Message auth | Hub checks whitelist on every non-verify message |
|
||||
|
||||
---
|
||||
|
||||
### 3.11 Credentials System
|
||||
|
||||
#### 3.11.1 Files
|
||||
|
||||
| File | Purpose | Permissions |
|
||||
|------|---------|-------------|
|
||||
| `~/.super-multica/credentials.json5` | LLM providers + tool API keys | 0o600 |
|
||||
| `~/.super-multica/skills.env.json5` | Skill/plugin environment variables | 0o600 |
|
||||
|
||||
Format: JSON5 (supports comments, trailing commas, unquoted keys).
|
||||
|
||||
#### 3.11.2 credentials.json5 Structure
|
||||
|
||||
```json5
|
||||
{
|
||||
version: 1,
|
||||
llm: {
|
||||
provider: "openai", // Default provider
|
||||
providers: {
|
||||
openai: { apiKey: "sk-...", model: "gpt-4o" },
|
||||
anthropic: { apiKey: "sk-ant-...", model: "claude-sonnet-4-5" },
|
||||
"openai:backup": { apiKey: "sk-..." }, // Auth profile for rotation
|
||||
},
|
||||
order: {
|
||||
openai: ["openai", "openai:backup"], // Rotation order
|
||||
},
|
||||
},
|
||||
tools: {
|
||||
brave: { apiKey: "brv-..." },
|
||||
perplexity: { apiKey: "pplx-...", model: "perplexity/sonar-pro" },
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.11.3 skills.env.json5 Structure
|
||||
|
||||
```json5
|
||||
{
|
||||
env: {
|
||||
LINEAR_API_KEY: "lin-...",
|
||||
GITHUB_TOKEN: "ghp_...",
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.11.4 Environment Variable Overrides
|
||||
|
||||
| Variable | Purpose |
|
||||
|----------|---------|
|
||||
| `SMC_CREDENTIALS_PATH` | Override credentials.json5 path |
|
||||
| `SMC_SKILLS_ENV_PATH` | Override skills.env.json5 path |
|
||||
| `SMC_CREDENTIALS_DISABLE=1` | Disable credentials loading |
|
||||
|
||||
---
|
||||
|
||||
## 4. Platform Details
|
||||
|
||||
### 4.1 Desktop App (Primary)
|
||||
|
||||
**Technology**: Electron + Vite + React 19
|
||||
|
||||
**Window**: 1200x800, context isolation enabled, node integration disabled
|
||||
|
||||
#### 4.1.1 Pages
|
||||
|
||||
| Route | Page | Purpose |
|
||||
|-------|------|---------|
|
||||
| `/` | Home | Hub status, QR code, provider selector, agent settings, device list |
|
||||
| `/chat` | Chat | Message history, chat input, mode switcher (local/remote) |
|
||||
| `/tools` | Tools | Tool listing and inspection |
|
||||
| `/skills` | Skills | Skill listing and management |
|
||||
|
||||
**Navigation**: Tab bar at top (Home, Chat, Tools, Skills)
|
||||
|
||||
#### 4.1.2 Home Page Components
|
||||
|
||||
| Component | Description |
|
||||
|-----------|-------------|
|
||||
| QR Code | Left side. Shows connection code with 30s countdown. Refresh/copy link buttons. |
|
||||
| Hub Status | Right side. Hub ID, connection state indicator (green/yellow/red). |
|
||||
| Agent Settings | Agent name (editable). |
|
||||
| Provider Selector | Dropdown showing all providers with availability status. API Key dialog or OAuth dialog based on provider type. |
|
||||
| Device List | Verified devices with name, platform, revoke button. |
|
||||
| Open Chat | Button. Disabled if Hub not connected. |
|
||||
| Connect to Remote Agent | Button. Navigate to remote agent connection. |
|
||||
|
||||
#### 4.1.3 Chat Page Modes
|
||||
|
||||
| Mode | Transport | When Used |
|
||||
|------|-----------|-----------|
|
||||
| Local Agent | IPC (Electron) | Desktop user talks directly to embedded agent |
|
||||
| Remote Agent | WebSocket via Gateway | Desktop user connects to another Hub's agent |
|
||||
|
||||
Mode switcher available at top of chat page.
|
||||
|
||||
#### 4.1.4 Desktop IPC Channels
|
||||
|
||||
| Channel | Direction | Purpose |
|
||||
|---------|-----------|---------|
|
||||
| `localChat:send` | Renderer → Main | Send message to agent |
|
||||
| `localChat:subscribe` | Renderer → Main | Subscribe to agent events |
|
||||
| `hub:device-confirm-request` | Main → Renderer | Show device confirmation dialog |
|
||||
| `hub:device-confirm-response` | Renderer → Main | User's allow/reject decision |
|
||||
|
||||
---
|
||||
|
||||
### 4.2 Web App
|
||||
|
||||
**Technology**: Next.js 16 + App Router
|
||||
|
||||
**Port**: 3001
|
||||
|
||||
**Features**:
|
||||
- Always requires Gateway connection (no local agent)
|
||||
- Uses shared `@multica/ui` Chat component
|
||||
- PWA-capable (service worker, offline page)
|
||||
- Responsive layout (mobile-first)
|
||||
- Light/dark theme toggle
|
||||
|
||||
**Page**: Single page rendering `<Chat />` component with `ConnectPrompt` for initial connection.
|
||||
|
||||
---
|
||||
|
||||
### 4.3 Mobile App
|
||||
|
||||
**Technology**: Expo + React Native
|
||||
|
||||
**Status**: Demo/prototype (hardcoded mock messages)
|
||||
|
||||
**Features**:
|
||||
- QR code scanner for device pairing
|
||||
- Keyboard-avoiding input bar
|
||||
- Auto-expanding text input (max 120px)
|
||||
- Auto-scroll to bottom on new messages
|
||||
|
||||
---
|
||||
|
||||
### 4.4 CLI
|
||||
|
||||
**Entry point**: `multica` (alias: `mu`)
|
||||
|
||||
#### 4.4.1 Commands
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `multica` | Interactive chat mode (default) |
|
||||
| `multica run "<prompt>"` | Non-interactive single prompt |
|
||||
| `multica chat` | Explicit interactive mode |
|
||||
| `multica session list/show/delete` | Session management |
|
||||
| `multica profile list/new/setup/show/edit/delete` | Profile management |
|
||||
| `multica skills list/status/install/add/remove` | Skill management |
|
||||
| `multica tools list/groups/profiles` | Tool inspection |
|
||||
| `multica credentials init/show/edit` | Credentials management |
|
||||
| `multica dev [service]` | Development servers |
|
||||
|
||||
#### 4.4.2 Interactive Mode Commands
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `/help` | Show help |
|
||||
| `/exit` `/quit` `/q` | Exit |
|
||||
| `/clear` | Clear session |
|
||||
| `/session` | Show current session ID |
|
||||
| `/new` | Start new session |
|
||||
| `/multiline` | Toggle multi-line input mode |
|
||||
| `/provider` | Show provider status |
|
||||
| `/model [name]` | Switch model |
|
||||
| `/{skillName} [args]` | Execute skill |
|
||||
|
||||
**Features**: Autocomplete (Shift+Tab), status bar (session/provider/model), multi-line mode (end with `.`).
|
||||
|
||||
#### 4.4.3 Development Servers
|
||||
|
||||
| Service | Command | Port |
|
||||
|---------|---------|------|
|
||||
| Desktop (default) | `multica dev` | Electron window |
|
||||
| Gateway | `multica dev gateway` | 3000 |
|
||||
| Web | `multica dev web` | 3001 |
|
||||
| All | `multica dev all` | 3000 + 3001 |
|
||||
|
||||
---
|
||||
|
||||
## 5. UI Component Library
|
||||
|
||||
Shared package: `@multica/ui`. Used by Desktop, Web, and Mobile.
|
||||
|
||||
### 5.1 Chat Components
|
||||
|
||||
| Component | Props | Description |
|
||||
|-----------|-------|-------------|
|
||||
| `Chat` | (none, uses stores) | Full chat view: connect prompt + message list + input |
|
||||
| `ChatInput` | `onSubmit`, `disabled`, `placeholder` | Tiptap editor. Enter=send, Shift+Enter=newline, IME-safe |
|
||||
| `ChatInputRef` | (imperative) | `getText()`, `setText()`, `focus()`, `clear()` |
|
||||
| `MessageList` | `messages`, `streamingIds` | Renders messages with markdown, tool calls, streaming |
|
||||
| `ConnectPrompt` | (none, uses stores) | QR scan + paste code UI for remote connection |
|
||||
| `ChatSkeleton` | (none) | Loading skeleton |
|
||||
| `ToolCallItem` | `message` | Tool execution display: status dot, label, subtitle, expandable results |
|
||||
|
||||
### 5.2 Markdown Components
|
||||
|
||||
| Component | Props | Description |
|
||||
|-----------|-------|-------------|
|
||||
| `Markdown` | `children`, `mode` (`minimal`/`full`) | Rendered markdown with syntax highlighting |
|
||||
| `StreamingMarkdown` | `content`, `isStreaming`, `mode` | Incremental markdown with animated cursor |
|
||||
| `CodeBlock` | (internal) | Syntax-highlighted code block with copy button |
|
||||
|
||||
### 5.3 Base UI Components (Shadcn/UI)
|
||||
|
||||
button, input, textarea, card, dialog, alert-dialog, dropdown-menu, select, combobox, badge, label, field, input-group, switch, skeleton, separator, sheet, sidebar, tooltip, sonner (toasts)
|
||||
|
||||
### 5.4 Utility Components
|
||||
|
||||
| Component | Description |
|
||||
|-----------|-------------|
|
||||
| `QRScannerView` | Camera-based QR scanner |
|
||||
| `QRScannerSheet` | Sheet variant of QR scanner |
|
||||
| `Spinner` | Animated loading spinner |
|
||||
| `ThemeProvider` | Light/dark theme context |
|
||||
| `ThemeToggle` | Theme switch button |
|
||||
|
||||
---
|
||||
|
||||
## 6. Data Persistence Locations
|
||||
|
||||
| Data | Location | Format | Lifetime |
|
||||
|------|----------|--------|----------|
|
||||
| Credentials | `~/.super-multica/credentials.json5` | JSON5 | User-managed |
|
||||
| Skills env | `~/.super-multica/skills.env.json5` | JSON5 | User-managed |
|
||||
| Agent profiles | `~/.super-multica/agent-profiles/{id}/` | MD + JSON | User-managed |
|
||||
| Agent memory | `~/.super-multica/agent-profiles/{id}/memory/` | JSON per key | Agent-managed |
|
||||
| Sessions | `~/.super-multica/sessions/{id}/session.jsonl` | JSONL | Until deleted |
|
||||
| Agent records | `~/.super-multica/agents/agents.json` | JSON | Persistent |
|
||||
| Hub ID | `~/.super-multica/hub-id` | Plain text UUID | Generated once |
|
||||
| Device whitelist | `~/.super-multica/client-devices/whitelist.json` | JSON | Until revoked |
|
||||
| Auth profile stats | `~/.super-multica/.auth-profiles/usage-stats.json` | JSON | Runtime tracking |
|
||||
| Verification tokens | In-memory | Map | Lost on restart |
|
||||
| Browser device ID | localStorage: `multica-device` | UUID string | Until cleared |
|
||||
| Saved connection | localStorage: `multica-connection` | JSON | Until disconnected |
|
||||
|
||||
---
|
||||
|
||||
## 7. Current Limitations
|
||||
|
||||
| Area | Limitation | Notes |
|
||||
|------|-----------|-------|
|
||||
| Agent count | Desktop creates 1 primary agent on startup | Hub API supports multi-agent (`createAgent`/`listAgents`), but UI only shows one |
|
||||
| Device permissions | All-or-nothing access | No per-device capability restrictions |
|
||||
| Role system | No formal RBAC | Owner is implicit admin |
|
||||
| Mobile app | Demo/prototype | Hardcoded mock data, no real agent connection |
|
||||
| Offline web | PWA shell only | Cannot function without Gateway |
|
||||
| Skill marketplace | No registry | Install via GitHub URL only |
|
||||
| Real-time collaboration | Single agent, sequential messages | No concurrent message processing |
|
||||
| File upload | Not supported | Agent can only read files on Owner's filesystem |
|
||||
|
||||
---
|
||||
|
||||
*Document generated: 2026-02-05*
|
||||
*Source: codebase analysis at commit fc6c3e3 on branch feat/mobile-pwa-optimization*
|
||||
Loading…
Add table
Add a link
Reference in a new issue