Skip to content

Latest commit

ย 

History

History
916 lines (785 loc) ยท 30.4 KB

File metadata and controls

916 lines (785 loc) ยท 30.4 KB

OpenClaw Evolution Plugin - ๆžถๆž„่ฎพ่ฎกๆ–‡ๆกฃ

็‰ˆๆœฌ: 0.1.0

ๆœ€ๅŽๆ›ดๆ–ฐ: 2026-03-10


็ณป็ปŸๆฆ‚่งˆ

OpenClaw Evolution Plugin ้‡‡็”จ Monorepo ๆžถๆž„๏ผŒๅŒ…ๅซๅคšไธช็‹ฌ็ซ‹ไฝ†ๅๅŒๅทฅไฝœ็š„ๅŒ…ใ€‚็ณป็ปŸ้€š่ฟ‡ไบ‹ไปถ้ฉฑๅŠจๆžถๆž„ๅฎž็Žฐ้—ญ็Žฏ่ฟ›ๅŒ–ๆต็จ‹ใ€‚

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        OpenClaw Host Runtime                            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                    โ”‚
                                    โ”‚ Plugin Protocol
                                    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         Plugin Runtime                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”‚
โ”‚  โ”‚ Handshake    โ”‚  โ”‚ Event Bridge โ”‚  โ”‚ Card Adapter โ”‚                 โ”‚
โ”‚  โ”‚ Manager      โ”‚  โ”‚              โ”‚  โ”‚              โ”‚                 โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                                        โ”‚
โ”‚  โ”‚ Compatibility โ”‚                                                       โ”‚
โ”‚  โ”‚ Manager       โ”‚                                                       โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                    โ”‚                                    โ”‚
                    โ”‚ HTTP/WebSocket                    โ”‚
                    โ–ผ                                    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚     Evolution Service        โ”‚      โ”‚    Insight Console              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚      โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Event Store          โ”‚  โ”‚      โ”‚  โ”‚  Dashboard                โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚      โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚      โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Trigger Engine       โ”‚  โ”‚      โ”‚  โ”‚  Evolution Funnel         โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚      โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚      โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Candidate Extractor  โ”‚  โ”‚      โ”‚  โ”‚  Candidate Review         โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚      โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚      โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Evaluation Engine    โ”‚  โ”‚      โ”‚  โ”‚  Skill Registry           โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚      โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚      โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Card Manager         โ”‚  โ”‚      โ”‚  โ”‚  Compatibility Status     โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚      โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚      โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚   Skill Registry       โ”‚  โ”‚      โ”‚  โ”‚  Avatar View              โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚      โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                    โ”‚
                    โ”‚ Events
                    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    OpenClaw Evolution System                            โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”‚
โ”‚  โ”‚ Avatar       โ”‚  โ”‚ State        โ”‚  โ”‚ Animation   โ”‚                 โ”‚
โ”‚  โ”‚ Manager      โ”‚  โ”‚ Machine      โ”‚  โ”‚ Protocol    โ”‚                 โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                                        โ”‚
โ”‚  โ”‚ Replay       โ”‚                                                       โ”‚
โ”‚  โ”‚ Engine       โ”‚                                                       โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Monorepo ็ป“ๆž„

/openclaw-evolution-plugin
โ”œโ”€โ”€ packages/
โ”‚   โ”œโ”€โ”€ plugin-runtime/          # ๆ’ไปถ่ฟ่กŒๆ—ถ
โ”‚   โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ core/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ handshake.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ event-bridge.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ card-adapter.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ compatibility/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ manager.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ adapter.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ profiles/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ plugin.ts
โ”‚   โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”‚   โ””โ”€โ”€ tsconfig.json
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ evolution-service/       # ่ฟ›ๅŒ–ๆœๅŠก
โ”‚   โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ api/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ routes/
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ runtime.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ events.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ candidates.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ evaluations.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ cards.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ skills.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ insights.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ server.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ engines/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ trigger.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ extractor.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ evaluator.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ card-generator.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ storage/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ event-store.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ candidate-store.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ card-store.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ skill-registry.ts
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ service.ts
โ”‚   โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”‚   โ””โ”€โ”€ tsconfig.json
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ insight-console/         # ๆดžๅฏŸๆŽงๅˆถๅฐ
โ”‚   โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ pages/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ dashboard.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ funnel.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ candidates.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ evaluations.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ skills.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ compatibility.tsx
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ avatar.tsx
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ cards/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ charts/
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ avatar/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ hooks/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ api/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ app.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”‚   โ””โ”€โ”€ tsconfig.json
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ evolution-engine/        # ่ฟ›ๅŒ–ๅผ•ๆ“Ž
โ”‚   โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ avatar/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ avatar.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ stages.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ mutations.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ state-machine/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ machine.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ transitions.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ animations/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ protocol.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ effects.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ replay/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ logger.ts
โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ player.ts
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ engine.ts
โ”‚   โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”‚   โ””โ”€โ”€ tsconfig.json
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ shared-types/            # ๅ…ฑไบซ็ฑปๅž‹ๅฎšไน‰
โ”‚       โ”œโ”€โ”€ src/
โ”‚       โ”‚   โ”œโ”€โ”€ events/
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ runtime.ts
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ evolution.ts
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ avatar.ts
โ”‚       โ”‚   โ”œโ”€โ”€ api/
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ requests.ts
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ responses.ts
โ”‚       โ”‚   โ”œโ”€โ”€ models/
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ candidate.ts
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ card.ts
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ skill.ts
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ avatar.ts
โ”‚       โ”‚   โ””โ”€โ”€ index.ts
โ”‚       โ”œโ”€โ”€ package.json
โ”‚       โ””โ”€โ”€ tsconfig.json
โ”‚
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ PRD.md
โ”‚   โ”œโ”€โ”€ ARCHITECTURE.md
โ”‚   โ”œโ”€โ”€ EVENT_SCHEMA.md
โ”‚   โ”œโ”€โ”€ COMPATIBILITY.md
โ”‚   โ””โ”€โ”€ EVOLUTION_SYSTEM.md
โ”‚
โ”œโ”€โ”€ examples/
โ”‚   โ”œโ”€โ”€ plugin-manifest.json
โ”‚   โ”œโ”€โ”€ event-payloads/
โ”‚   โ”œโ”€โ”€ api-calls.sh
โ”‚   โ””โ”€โ”€ demo-scenarios/
โ”‚
โ”œโ”€โ”€ scripts/
โ”‚   โ”œโ”€โ”€ setup.sh
โ”‚   โ”œโ”€โ”€ build.sh
โ”‚   โ”œโ”€โ”€ test.sh
โ”‚   โ””โ”€โ”€ dev.sh
โ”‚
โ”œโ”€โ”€ tests/
โ”‚   โ”œโ”€โ”€ unit/
โ”‚   โ”œโ”€โ”€ integration/
โ”‚   โ””โ”€โ”€ e2e/
โ”‚
โ”œโ”€โ”€ package.json              # ๆ น package.json
โ”œโ”€โ”€ pnpm-workspace.yaml
โ”œโ”€โ”€ tsconfig.base.json
โ””โ”€โ”€ README.md

ๆ ธๅฟƒ็ป„ไปถ่ฎพ่ฎก

1. Plugin Runtime

่Œ่ดฃ

  • ไธŽ OpenClaw ไธปๆœบ่ฟ่กŒๆ—ถ้›†ๆˆ
  • ๅฎž็Žฐๆ’ไปถๅ่ฎฎ
  • ๆกฅๆŽฅไบ‹ไปถๅˆฐ Evolution Service
  • ๆธฒๆŸ“่ฟ›ๅŒ–ๅก็‰‡
  • ็ฎก็†ๅ…ผๅฎนๆ€ง

ๆ ธๅฟƒ็ฑป

// core/handshake.ts
export class HandshakeManager {
  async performHandshake(hostInfo: HostInfo): Promise<HandshakeResult>
  async negotiateCapabilities(hostCapabilities: string[]): Promise<string[]>
  validateHostVersion(version: string): boolean
}

// core/event-bridge.ts
export class EventBridge {
  onRuntimeEvent(event: RuntimeEvent): void
  normalizeEvent(event: RawRuntimeEvent): NormalizedEvent
  forwardEvent(event: NormalizedEvent): Promise<void>
  startBatching(config: BatchingConfig): void
  stopBatching(): void
}

// core/card-adapter.ts
export class CardAdapter {
  renderCard(card: EvolutionCard): RenderResult
  chooseBestRenderer(hostCapabilities: string[]): CardRenderer
  fallbackToSidebar(card: EvolutionCard): RenderResult
  fallbackToExternal(card: EvolutionCard): RenderResult
}

// compatibility/manager.ts
export class CompatibilityManager {
  detectHostVersion(): HostInfo
  loadCapabilityProfile(version: string): CapabilityProfile
  selectAdapter(hostInfo: HostInfo): AdapterProfile
  mapEvent(event: any, adapter: AdapterProfile): NormalizedEvent
  getCompatibilityStatus(): CompatibilityStatus
}

ๆ’ไปถๆธ…ๅ• (Manifest)

{
  "name": "@openclaw/evolution-plugin",
  "version": "0.1.0",
  "displayName": "OpenClaw Evolution Plugin",
  "description": "Evolution layer for OpenClaw",
  "author": "OpenClaw Team",
  "entry": "dist/plugin.js",
  "minHostVersion": "1.0.0",
  "maxHostVersion": "2.0.0",
  "permissions": [
    "read:conversations",
    "read:events",
    "write:cards",
    "read:capabilities"
  ],
  "capabilities": [
    "inlineCards",
    "eventStreaming",
    "bidirectional"
  ],
  "dependencies": [],
  "settings": {
    "serviceEndpoint": "http://localhost:3000",
    "enableAutoEvaluation": false,
    "cardExpiryHours": 72
  }
}

2. Evolution Service

่Œ่ดฃ

  • ๆŽฅๆ”ถๅ’Œๅญ˜ๅ‚จไบ‹ไปถ
  • ่ฟ่กŒ่งฆๅ‘ๅผ•ๆ“Ž
  • ็”Ÿๆˆๅ€™้€‰ๆ”น่ฟ›
  • ๅ่ฐƒ่ฏ„ไผฐ
  • ็ฎก็†ๅก็‰‡ๅ’ŒๆŠ€่ƒฝๆณจๅ†Œ่กจ

ๆžถๆž„ๆจกๅผ

ๅˆ†ๅฑ‚ๆžถๆž„:

API Layer (/routes)
    โ†“
Service Layer (/engines)
    โ†“
Storage Layer (/storage)
    โ†“
Database (PostgreSQL / SQLite)

ๆ ธๅฟƒ็ฑป

// engines/trigger.ts
export class TriggerEngine {
  registerTrigger(trigger: Trigger): void
  evaluateEvent(event: NormalizedEvent): TriggerMatch[]
  checkThresholds(matches: TriggerMatch[]): boolean
}

// engines/extractor.ts
export class CandidateExtractor {
  extractFromPattern(event: NormalizedEvent): Candidate[]
  extractFromFeedback(event: NormalizedEvent): Candidate[]
  extractFromCorrection(event: NormalizedEvent): Candidate[]
  extractFromDiscovery(event: NormalizedEvent): Candidate[]
}

// engines/evaluator.ts
export class EvaluationEngine {
  createEvaluationRun(candidateId: string): EvaluationRun
  runEvaluation(runId: string): Promise<EvaluationResult>
  runTests(candidate: Candidate): TestResult[]
  validateSafety(candidate: Candidate): SafetyCheck[]
}

// engines/card-generator.ts
export class CardGenerator {
  generateCard(candidate: Candidate): EvolutionCard
  formatCardContent(candidate: Candidate): CardContent
  chooseCardType(candidate: Candidate): CardType
}

API ่ทฏ็”ฑ่ฎพ่ฎก

POST /v1/runtime/handshake
  Request: { hostInfo, pluginInfo, capabilities }
  Response: { sessionId, capabilities, config }

POST /v1/events
  Request: NormalizedEvent[]
  Response: { received, errors }

GET /v1/events?session_id=&type=&limit=
  Response: NormalizedEvent[]

POST /v1/candidates
  Request: { content, type, source }
  Response: Candidate

GET /v1/candidates?status=&session_id=
  Response: Candidate[]

POST /v1/evaluations/run
  Request: { candidateId, testConfig }
  Response: EvaluationRun

GET /v1/evaluations/:id
  Response: EvaluationRun

GET /v1/cards?session_id=&status=
  Response: EvolutionCard[]

POST /v1/cards/:id/decision
  Request: { decision, notes }
  Response: { updatedCard, nextActions }

POST /v1/skills/promote
  Request: { candidateId, cardId }
  Response: SkillRegistryItem

POST /v1/skills/rollback
  Request: { skillId, toVersion }
  Response: SkillRegistryItem

GET /v1/insights/dashboard
  Response: DashboardMetrics

GET /v1/insights/funnel
  Response: FunnelMetrics

GET /v1/insights/skills
  Response: SkillsInsights

GET /v1/insights/compatibility
  Response: CompatibilityReport

ๆ•ฐๆฎๅบ“ๆจกๅผ

-- Events
CREATE TABLE events (
  id UUID PRIMARY KEY,
  session_id VARCHAR(255) NOT NULL,
  type VARCHAR(100) NOT NULL,
  data JSONB NOT NULL,
  normalized_data JSONB,
  created_at TIMESTAMP DEFAULT NOW(),
  INDEX idx_session (session_id),
  INDEX idx_type (type)
);

-- Candidates
CREATE TABLE candidates (
  id UUID PRIMARY KEY,
  session_id VARCHAR(255) NOT NULL,
  type VARCHAR(50) NOT NULL,
  source VARCHAR(50) NOT NULL,
  content JSONB NOT NULL,
  confidence DECIMAL(3,2),
  status VARCHAR(50),
  created_at TIMESTAMP DEFAULT NOW(),
  INDEX idx_status (status),
  INDEX idx_session (session_id)
);

-- Evaluation Runs
CREATE TABLE evaluation_runs (
  id UUID PRIMARY KEY,
  candidate_id UUID REFERENCES candidates(id),
  status VARCHAR(50),
  result JSONB,
  started_at TIMESTAMP,
  completed_at TIMESTAMP,
  INDEX idx_candidate (candidate_id)
);

-- Cards
CREATE TABLE cards (
  id UUID PRIMARY KEY,
  session_id VARCHAR(255) NOT NULL,
  type VARCHAR(50),
  candidate_id UUID REFERENCES candidates(id),
  content JSONB NOT NULL,
  status VARCHAR(50),
  decision JSONB,
  created_at TIMESTAMP,
  expires_at TIMESTAMP,
  INDEX idx_session (session_id),
  INDEX idx_status (status)
);

-- Skills Registry
CREATE TABLE skills_registry (
  id UUID PRIMARY KEY,
  type VARCHAR(50) NOT NULL,
  name VARCHAR(255) NOT NULL,
  content JSONB NOT NULL,
  version INTEGER DEFAULT 1,
  promoted_at TIMESTAMP,
  rollback_version INTEGER,
  INDEX idx_type (type),
  INDEX idx_name (name)
);

3. Insight Console

ๆŠ€ๆœฏๆ ˆ

  • ๆก†ๆžถ: React 18
  • ๆž„ๅปบๅทฅๅ…ท: Vite
  • UI ๅบ“: shadcn/ui + Tailwind CSS
  • ็Šถๆ€็ฎก็†: Zustand
  • ๆ•ฐๆฎ่Žทๅ–: React Query
  • ่ทฏ็”ฑ: React Router

้กต้ข็ป“ๆž„

// pages/dashboard.tsx
export function DashboardPage() {
  const metrics = useDashboardMetrics()
  return <DashboardView metrics={metrics} />
}

// pages/funnel.tsx
export function FunnelPage() {
  const funnel = useFunnelMetrics()
  return <FunnelView data={funnel} />
}

// pages/candidates.tsx
export function CandidatesPage() {
  const { data, filters } = useCandidates()
  return <CandidateList data={data} filters={filters} />
}

// pages/skills.tsx
export function SkillsPage() {
  const skills = useSkillsRegistry()
  return <SkillsRegistry skills={skills} />
}

// pages/avatar.tsx
export function AvatarPage() {
  const avatar = useAvatar()
  const mutations = useMutations()
  return <AvatarView avatar={avatar} mutations={mutations} />
}

็ป„ไปถๆžถๆž„

components/
โ”œโ”€โ”€ cards/
โ”‚   โ”œโ”€โ”€ SkillCard.tsx
โ”‚   โ”œโ”€โ”€ RuleCard.tsx
โ”‚   โ”œโ”€โ”€ MemoryCard.tsx
โ”‚   โ””โ”€โ”€ CardRenderer.tsx
โ”œโ”€โ”€ charts/
โ”‚   โ”œโ”€โ”€ FunnelChart.tsx
โ”‚   โ”œโ”€โ”€ TimelineChart.tsx
โ”‚   โ””โ”€โ”€ MetricsCard.tsx
โ”œโ”€โ”€ avatar/
โ”‚   โ”œโ”€โ”€ AvatarDisplay.tsx
โ”‚   โ”œโ”€โ”€ StageBadge.tsx
โ”‚   โ””โ”€โ”€ MutationIndicator.tsx
โ””โ”€โ”€ layout/
    โ”œโ”€โ”€ Sidebar.tsx
    โ”œโ”€โ”€ Header.tsx
    โ””โ”€โ”€ ConsoleLayout.tsx

4. OpenClaw Evolution System

ๆ ธๅฟƒๆฆ‚ๅฟต

// avatar/avatar.ts
export class OpenClawAvatar {
  private currentStage: AvatarStage
  private stageHistory: StageTransition[]
  private activeMutations: Mutation[]
  private stats: AvatarStats

  initialize(): void
  transitionTo(stage: AvatarStage): void
  applyMutation(mutation: Mutation): void
  triggerAnimation(type: AnimationType): void
  getDisplayState(): AvatarDisplayState
}

// state-machine/machine.ts
export class AvatarStateMachine {
  private states: StateMap
  private transitions: TransitionMap

  addState(stage: AvatarStage, config: StateConfig): void
  addTransition(from: AvatarStage, to: AvatarStage, trigger: string): void
  canTransition(from: AvatarStage, to: AvatarStage): boolean
  executeTransition(from: AvatarStage, to: AvatarStage): void
}

// animations/protocol.ts
export interface AnimationProtocol {
  triggerAnimation(event: AnimationEvent): void
  cancelAnimation(animationId: string): void
  getActiveAnimations(): Animation[]
}

// replay/logger.ts
export class ReplayLogger {
  logEvent(event: EvolutionEvent): void
  getReplay(sessionId: string): ReplaySession
  exportReplay(sessionId: string): ReplayExport
}

็Šถๆ€ๆœบ่ฎพ่ฎก

     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚  base   โ”‚  ๅˆๅง‹็Šถๆ€
     โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
          โ”‚ candidate_detected
          โ–ผ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚awakened โ”‚  ้ฆ–ๆฌกๆฃ€ๆต‹ๅˆฐๅ€™้€‰ๆ”น่ฟ›
     โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
          โ”‚ evaluation_passed
          โ–ผ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚ learned โ”‚  ่ฏ„ไผฐ้€š่ฟ‡
     โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
          โ”‚ skill_promoted
          โ–ผ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚ evolved โ”‚  ๆŠ€่ƒฝๆๅ‡
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๅŠจ็”ปไบ‹ไปถๅ่ฎฎ

interface AnimationEvent {
  id: string
  type: AnimationType
  stage: AvatarStage
  intensity: 'low' | 'medium' | 'high'
  duration: number
  metadata: Record<string, unknown>
}

type AnimationType =
  | 'pulse'           // ้˜ถๆฎตๅฟƒ่ทณ
  | 'evaluating'      // ่ฏ„ไผฐไธญ
  | 'activation'      // ๆŠ€่ƒฝๆฟ€ๆดป
  | 'mutation'        // ็ชๅ˜ๅบ”็”จ
  | 'transition'      // ้˜ถๆฎต่ฝฌๆข

5. CompatibilityManager

่ฎพ่ฎกๆจกๅผ

็ญ–็•ฅๆจกๅผ - ๆ นๆฎไธปๆœบ็‰ˆๆœฌ้€‰ๆ‹ฉไธๅŒ็š„้€‚้…ๅ™จ็ญ–็•ฅ

้€‚้…ๅ™จๆจกๅผ - ๅฐ†ไธๅŒ็‰ˆๆœฌ็š„ไบ‹ไปถๆจกๅผ่ฝฌๆขไธบๆ–ฐ็‰ˆๆœฌ

้™็บงๆจกๅผ - ๅฝ“ๅŠŸ่ƒฝไธๅฏ็”จๆ—ถๆไพ›ๆ›ฟไปฃๆ–นๆกˆ

ๆ ธๅฟƒ็ฑป

export class CompatibilityManager {
  private hostVersion: string
  private capabilityProfile: CapabilityProfile
  private currentAdapter: AdapterProfile

  detectHostVersion(): string
  loadCapabilityProfile(version: string): CapabilityProfile
  selectAdapter(hostInfo: HostInfo): AdapterProfile
  mapEvent(event: any, adapter: AdapterProfile): NormalizedEvent
  getBestRenderingMode(): RenderingMode
  getCompatibilityStatus(): CompatibilityStatus
}

export interface AdapterProfile {
  name: string
  supportedHostVersions: SemVerRange[]
  eventMapping: EventMapping
  apiMapping: ApiMapping
  degradedFeatures: string[]
  fallbackStrategies: FallbackConfig
}

export interface EventMapping {
  [originalEvent: string]: string | ((event: any) => NormalizedEvent)
}

้™็บง็ญ–็•ฅ

interface FallbackConfig {
  cardRendering: {
    primary: 'inline' | 'sidebar' | 'external'
    fallbacks: RenderingMode[]
  }
  eventStreaming: {
    primary: 'websocket' | 'polling'
    fallbacks: StreamingMode[]
  }
}

type RenderingMode =
  | 'inline'      // ๅ†…่”ๆธฒๆŸ“
  | 'sidebar'     // ไพง่พนๆ 
  | 'console'     // ๆŽงๅˆถๅฐ
  | 'external'    // ๅค–้ƒจ H5 ้กต้ข

้€šไฟกๅ่ฎฎ

ๆ’ไปถๅˆฐๆœๅŠก้€šไฟก

// ๆกๆ‰‹ๅ่ฎฎ
interface HandshakeRequest {
  pluginInfo: PluginInfo
  hostInfo?: HostInfo
  requestedCapabilities: string[]
}

interface HandshakeResponse {
  sessionId: string
  grantedCapabilities: string[]
  config: ServiceConfig
  compatibility: CompatibilityStatus
}

// ไบ‹ไปถๆไบคๅ่ฎฎ
interface EventBatch {
  sessionId: string
  events: NormalizedEvent[]
  metadata: {
    batchId: string
    timestamp: Date
    count: number
  }
}

// ๅก็‰‡ๆธฒๆŸ“ๅ่ฎฎ
interface CardRenderRequest {
  card: EvolutionCard
  renderingContext: RenderingContext
}

interface CardRenderResult {
  success: boolean
  mode: RenderingMode
  renderId?: string
  fallbackUrl?: string
}

ๆœๅŠกๅˆฐๆ’ไปถ้€šไฟก

// ๅก็‰‡ๆŽจ้€ๅ่ฎฎ
interface CardPush {
  card: EvolutionCard
  urgency: 'low' | 'medium' | 'high'
  expiresAt: Date
}

// ้…็ฝฎๆ›ดๆ–ฐๅ่ฎฎ
interface ConfigUpdate {
  key: string
  value: unknown
  version: number
}

// ๅ…ผๅฎนๆ€ง่ญฆๅ‘Šๅ่ฎฎ
interface CompatibilityWarning {
  level: 'info' | 'warning' | 'error'
  message: string
  affectedFeatures: string[]
  recommendedAction: string
}

้ƒจ็ฝฒๆžถๆž„

ๅผ€ๅ‘็Žฏๅขƒ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Developer Machine                         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ Plugin Dev  โ”‚  โ”‚ Service Dev โ”‚  โ”‚ Console Dev         โ”‚  โ”‚
โ”‚  โ”‚ (Plugin RT) โ”‚  โ”‚ (API+DB)    โ”‚  โ”‚ (Vite Dev Server)   โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

็”Ÿไบง็Žฏๅขƒ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     User Environment                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚              OpenClaw Desktop/App                   โ”‚   โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚   โ”‚
โ”‚  โ”‚  โ”‚         Plugin Runtime (Embedded)            โ”‚  โ”‚   โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ”‚ HTTPS/WSS
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Evolution Service                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ API Server   โ”‚  โ”‚ Worker       โ”‚  โ”‚ Database         โ”‚  โ”‚
โ”‚  โ”‚ (Node.js)    โ”‚  โ”‚ (Evaluation) โ”‚  โ”‚ (PostgreSQL)     โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Insight Console                          โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚         Web Server (Static + SPA)                    โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆŠ€ๆœฏ้€‰ๅž‹

็ป„ไปถ ๆŠ€ๆœฏ ็†็”ฑ
Plugin Runtime TypeScript ็ฑปๅž‹ๅฎ‰ๅ…จ๏ผŒๆ˜“ไบŽ็ปดๆŠค
Evolution Service Node.js + Express/Hono ไธŽๆ’ไปถๅ…ฑไบซ็ฑปๅž‹๏ผŒๅผ‚ๆญฅๆ€ง่ƒฝๅฅฝ
Database PostgreSQL / SQLite ็”Ÿไบง็”จ PG๏ผŒๅผ€ๅ‘็”จ SQLite
Insight Console React + Vite ๅฟซ้€Ÿๅผ€ๅ‘๏ผŒ็ƒญๆ›ดๆ–ฐ
UI Library shadcn/ui + Tailwind ็ŽฐไปฃๅŒ–๏ผŒๅฏๅฎšๅˆถ
State Management Zustand ่ฝป้‡๏ผŒ็ฑปๅž‹ๅฎ‰ๅ…จ
Data Fetching React Query ็ผ“ๅญ˜๏ผŒ้‡่ฏ•๏ผŒไน่ง‚ๆ›ดๆ–ฐ
Monorepo Tool pnpm workspaces ๅฟซ้€Ÿ๏ผŒ่Š‚็œ็ฃ็›˜็ฉบ้—ด
Build Tool tsup ๅฟซ้€Ÿ TypeScript ๆ‰“ๅŒ…
Testing Vitest + Playwright ็ปŸไธ€ๆต‹่ฏ•ๆก†ๆžถ

ๅฎ‰ๅ…จ่€ƒ่™‘

API ๅฎ‰ๅ…จ

  • HTTPS/WSS ๅŠ ๅฏ†้€šไฟก
  • JWT ไผš่ฏ่ฎค่ฏ
  • Rate Limiting
  • CORS ้…็ฝฎ
  • ่พ“ๅ…ฅ้ชŒ่ฏ (Zod schemas)

ๆ’ไปถๅฎ‰ๅ…จ

  • ๆƒ้™ๆœ€ๅฐๅŒ–ๅŽŸๅˆ™
  • ๆฒ™็ฎฑๆ‰ง่กŒ็Žฏๅขƒ
  • ๆ•ๆ„Ÿๆ•ฐๆฎไธ่ฎฐๅฝ•
  • ๅก็‰‡ๅ†…ๅฎน่ฝฌไน‰

ๆ•ฐๆฎๅฎ‰ๅ…จ

  • ๆ•ๆ„ŸไฟกๆฏๅŠ ๅฏ†ๅญ˜ๅ‚จ
  • ๅฎšๆœŸๆ•ฐๆฎๆธ…็†
  • ็”จๆˆทๆ•ฐๆฎ้š”็ฆป
  • ๅฎก่ฎกๆ—ฅๅฟ—

ๆ€ง่ƒฝไผ˜ๅŒ–

ไบ‹ไปถๅค„็†

  • ๆ‰น้‡ๆไบค (batching)
  • ๅผ‚ๆญฅๅค„็†้˜Ÿๅˆ—
  • ไบ‹ไปถๅŽ‹็ผฉ
  • ็ดขๅผ•ไผ˜ๅŒ–

API ๆ€ง่ƒฝ

  • ๅ“ๅบ”็ผ“ๅญ˜
  • ๅˆ†้กตๆŸฅ่ฏข
  • ่ฟžๆŽฅๆฑ 
  • CDN ้™ๆ€่ต„ๆบ

ๆŽงๅˆถๅฐๆ€ง่ƒฝ

  • ไปฃ็ ๅˆ†ๅ‰ฒ
  • ่™šๆ‹ŸๆปšๅŠจ
  • ๅ›พ็‰‡ๆ‡’ๅŠ ่ฝฝ
  • ๆœๅŠก็ซฏๆธฒๆŸ“ (ๅฏ้€‰)

็›‘ๆŽงๅ’Œๅฏ่ง‚ๆต‹ๆ€ง

ๆ—ฅๅฟ—

  • ็ป“ๆž„ๅŒ–ๆ—ฅๅฟ—
  • ๆ—ฅๅฟ—็บงๅˆซ็ฎก็†
  • ้”™่ฏฏ่ฟฝ่ธช

ๆŒ‡ๆ ‡

  • API ๅ“ๅบ”ๆ—ถ้—ด
  • ไบ‹ไปถๅค„็†้‡
  • ๅก็‰‡ๅฑ•็คบ็އ
  • ่ฝฌๅŒ–็އ

ๅ‘Š่ญฆ

  • ๆœๅŠกๅฏ็”จๆ€ง
  • ้”™่ฏฏ็އ้˜ˆๅ€ผ
  • ๆ€ง่ƒฝไธ‹้™

็‰ˆๆœฌๆŽงๅˆถ็ญ–็•ฅ

่ฏญไน‰็‰ˆๆœฌๆŽงๅˆถ

  • Major: ไธๅ…ผๅฎน็š„ API ๅ˜ๆ›ด
  • Minor: ๅ‘ๅŽๅ…ผๅฎน็š„ๅŠŸ่ƒฝๆทปๅŠ 
  • Patch: ๅ‘ๅŽๅ…ผๅฎน็š„้—ฎ้ข˜ไฟฎๅค

ๅ…ผๅฎนๆ€งไฟ่ฏ

  • ่‡ณๅฐ‘ๆ”ฏๆŒๆœ€ๅŽ 2 ไธช Major ็‰ˆๆœฌ
  • ๆๅ‰ 3 ไธชๆœˆ้€š็Ÿฅ Breaking Changes
  • ๆไพ›่ฟ็งปๆŒ‡ๅ—

ๆœชๆฅๆ‰ฉๅฑ•

Phase 2 ๅŠŸ่ƒฝ

  • ๅคšๆ’ไปถๅๅŒ
  • ๅˆ†ๅธƒๅผ่ฏ„ไผฐ
  • A/B ๆต‹่ฏ•ๆก†ๆžถ
  • ้ซ˜็บงๅˆ†ๆž

Phase 3 ๅŠŸ่ƒฝ

  • ๆœบๅ™จๅญฆไน ไผ˜ๅŒ–
  • ่‡ชๅŠจ็‰นๅพๅทฅ็จ‹
  • ๅผบๅŒ–ๅญฆไน ้›†ๆˆ

ๆ–‡ๆกฃ็‰ˆๆœฌ: 0.1.0 ๆœ€ๅŽๆ›ดๆ–ฐ: 2026-03-10 ็ปดๆŠค่€…: OpenClaw Evolution Team