Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c4bb248d5 | ||
|
|
29b6cc9d01 |
No files matched your search
@@ -54,46 +54,7 @@ view, the Bus is the only legal way they talk. Subsystems live in
|
||||
single-purpose SPM packages; **18 boundary-gate scripts** keep the
|
||||
isolation honest.
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
User[User<br/>voice / text / hotkey]
|
||||
|
||||
subgraph Swift["Swift host (AppKit + SwiftUI)"]
|
||||
AppDel[AppDelegate<br/>install DAG + lifecycle]
|
||||
Orch[AgentOrchestrator<br/>tool-loop + streaming]
|
||||
Bridge[WebviewBridge<br/>typed JSON Bus]
|
||||
Voice[Voice<br/>wake / STT / TTS]
|
||||
Vision[Vision<br/>camera + frame-attach]
|
||||
Memory[Memory<br/>SQLite + vec + mem0]
|
||||
MCP[MCPRuntime<br/>helpers + in-proc tools]
|
||||
Replay[Replay<br/>turn-by-turn audit log]
|
||||
Boot[BootHealth<br/>NOT FAKED probes]
|
||||
end
|
||||
|
||||
LLM["LLMProvider<br/>Anthropic Opus 4.7 / Ollama"]
|
||||
|
||||
subgraph Web["WKWebView (React + R3F)"]
|
||||
Ring[Particle ring]
|
||||
Chat[Chat panel]
|
||||
DevOv[Dev Overlay]
|
||||
end
|
||||
|
||||
User --> Voice
|
||||
User --> Bridge
|
||||
AppDel --> Vision
|
||||
AppDel --> Orch
|
||||
AppDel --> Voice
|
||||
AppDel --> Boot
|
||||
Voice --> Orch
|
||||
Orch <--> LLM
|
||||
Orch --> MCP
|
||||
Orch --> Memory
|
||||
Orch --> Vision
|
||||
Orch --> Replay
|
||||
Orch --> Bridge
|
||||
Boot --> Bridge
|
||||
Bridge <-->|Bus protocol| Web
|
||||
```
|
||||

|
||||
|
||||
The deep architecture doc is [`ARCHITECTURE.md`](ARCHITECTURE.md) (subsystem
|
||||
deep-dives, anti-patterns, navigation cheat sheet). The v1.0 typed-API
|
||||
@@ -136,21 +97,7 @@ asserts the spawn-line ordering AND that `voiceInstallTask` awaits
|
||||
`agentInstallTask?.value` (a strictly stronger guarantee than spawn-order
|
||||
alone).
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
Boot([applicationWillFinishLaunching]) --> Vision[installVision]
|
||||
Boot --> Memory[installMemory]
|
||||
Boot --> MCP[installMCP]
|
||||
Boot --> Replay[installReplay]
|
||||
Vision --> Agent[installAgent]
|
||||
Memory --> Agent
|
||||
MCP --> Agent
|
||||
Replay --> Agent
|
||||
Agent --> Voice[installVoice]
|
||||
Voice --> Probes[registerBootHealthProbes]
|
||||
Probes --> Bridge[Webview handshake]
|
||||
Bridge --> Ready([HUD ready])
|
||||
```
|
||||

|
||||
|
||||
## Build & run
|
||||
|
||||
@@ -216,21 +163,7 @@ subscribers that need it. If a subsystem is degraded, the orchestrator
|
||||
**injects a system-prompt preamble** so the agent doesn't promise to
|
||||
remember things the memory store can't actually persist.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
In[User input<br/>text / voice transcript] --> Orch[AgentOrchestrator]
|
||||
Health[BootHealth.rollup] -->|degradation preamble| Orch
|
||||
Orch --> Provider[LLMProvider.stream]
|
||||
Provider --> Events[(streaming events<br/>token / thinking / tool-use / stop)]
|
||||
Events --> Bcast[Broadcaster<br/>single consumer]
|
||||
Bcast --> Tx[Transcript]
|
||||
Bcast --> Mem[Memory extractor]
|
||||
Bcast --> Dev[DevOverlay]
|
||||
Bcast --> Voice[Voice / TTS]
|
||||
Bcast --> Bus[WebviewBridge → HUD]
|
||||
Orch --> Tools[MCP tool calls]
|
||||
Tools --> Provider
|
||||
```
|
||||

|
||||
|
||||
## Boot-health probes
|
||||
|
||||
@@ -241,32 +174,7 @@ failures turn the menu-bar icon **red**, raise a non-dismissible HUD
|
||||
banner, and inject the degradation preamble into the agent's system
|
||||
prompt.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
M[MemoryBootHealthProbe<br/>vec0 + FTS5 reachable]
|
||||
A[AnthropicBootHealthProbe<br/>keychain has API key]
|
||||
O[OllamaBootHealthProbe<br/>service reachable + model loaded]
|
||||
Vc[VoiceBootHealthProbe<br/>audio graph alive]
|
||||
Vi[VisionBootHealthProbe<br/>AVCapture authorized]
|
||||
Mc[MCPBootHealthProbe<br/>helper apps + in-proc tools]
|
||||
R[ReplayBootHealthProbe<br/>WAL writable]
|
||||
W[WebviewBootHealthProbe<br/>handshake completed]
|
||||
Roll[BootHealthOrchestrator.rollup]
|
||||
Icon[Menu-bar icon<br/>red on critical]
|
||||
Banner[Non-dismissible banner]
|
||||
Pre[Agent system-prompt<br/>degradation preamble]
|
||||
M --> Roll
|
||||
A --> Roll
|
||||
O --> Roll
|
||||
Vc --> Roll
|
||||
Vi --> Roll
|
||||
Mc --> Roll
|
||||
R --> Roll
|
||||
W --> Roll
|
||||
Roll --> Icon
|
||||
Roll --> Banner
|
||||
Roll --> Pre
|
||||
```
|
||||

|
||||
|
||||
## Project culture
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
@@ -22,7 +22,7 @@
|
||||
"@types/react": "^19.0.0",
|
||||
"@types/react-dom": "^19.0.0",
|
||||
"@types/three": "^0.184.0",
|
||||
"@vitejs/plugin-react": "^6.0.2",
|
||||
"@vitejs/plugin-react": "^6.0.1",
|
||||
"typescript": "^5.9.0",
|
||||
"vite": "^8.0.0",
|
||||
"vitest": "^3.0.0",
|
||||
|
||||
Generated
+9
-9
@@ -71,8 +71,8 @@ importers:
|
||||
specifier: ^0.184.0
|
||||
version: 0.184.0
|
||||
'@vitejs/plugin-react':
|
||||
specifier: ^6.0.2
|
||||
version: 6.0.2(vite@8.0.12(@types/node@20.19.39))
|
||||
specifier: ^6.0.1
|
||||
version: 6.0.1(vite@8.0.12(@types/node@20.19.39))
|
||||
jsdom:
|
||||
specifier: ^29.1.1
|
||||
version: 29.1.1
|
||||
@@ -333,8 +333,8 @@ packages:
|
||||
'@rolldown/pluginutils@1.0.0':
|
||||
resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==}
|
||||
|
||||
'@rolldown/pluginutils@1.0.1':
|
||||
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
|
||||
'@rolldown/pluginutils@1.0.0-rc.7':
|
||||
resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==}
|
||||
|
||||
'@testing-library/dom@10.4.1':
|
||||
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
|
||||
@@ -416,8 +416,8 @@ packages:
|
||||
peerDependencies:
|
||||
react: '>= 16.8.0'
|
||||
|
||||
'@vitejs/plugin-react@6.0.2':
|
||||
resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==}
|
||||
'@vitejs/plugin-react@6.0.1':
|
||||
resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
peerDependencies:
|
||||
'@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
|
||||
@@ -1333,7 +1333,7 @@ snapshots:
|
||||
|
||||
'@rolldown/pluginutils@1.0.0': {}
|
||||
|
||||
'@rolldown/pluginutils@1.0.1': {}
|
||||
'@rolldown/pluginutils@1.0.0-rc.7': {}
|
||||
|
||||
'@testing-library/dom@10.4.1':
|
||||
dependencies:
|
||||
@@ -1423,9 +1423,9 @@ snapshots:
|
||||
'@use-gesture/core': 10.3.1
|
||||
react: 19.2.5
|
||||
|
||||
'@vitejs/plugin-react@6.0.2(vite@8.0.12(@types/node@20.19.39))':
|
||||
'@vitejs/plugin-react@6.0.1(vite@8.0.12(@types/node@20.19.39))':
|
||||
dependencies:
|
||||
'@rolldown/pluginutils': 1.0.1
|
||||
'@rolldown/pluginutils': 1.0.0-rc.7
|
||||
vite: 8.0.12(@types/node@20.19.39)
|
||||
|
||||
'@vitest/expect@3.2.4':
|
||||
|
||||
Reference in new issue
Block a user