> ๐ŸŒ Language: [English](Architecture) | **ไธญๆ–‡** # ๆžถๆž„ๆ€ป่งˆ KinetAios ๆ˜ฏ Electron + TypeScript ๅบ”็”จ,ๅ…ธๅž‹็š„ไธ‰่ฟ›็จ‹ๆจกๅž‹ใ€‚ ## ไธ‰ๅฑ‚็ป“ๆž„ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Main process (src/main/*) โ”‚ โ”‚ - app ็”Ÿๅ‘ฝๅ‘จๆœŸใ€็ช—ๅฃใ€ๅ…จๅฑ€็ƒญ้”ฎใ€IPC handler โ”‚ โ”‚ - agent ่ฟ่กŒๆ—ถ(ไธ‰ๅผ•ๆ“Ž)ใ€SQLiteใ€settingsใ€CLI spawn โ”‚ โ”‚ - ๅฎŒๆ•ด Node ่ฎฟ้—ฎ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ–ฒ โ”‚ contextBridge (typed KinetAPI) โ–ฒ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Preload (src/preload/preload.ts) โ”‚ โ”‚ - ๅ”ฏไธ€ๆกฅ:ๆŠŠ KinetAPI ็ป‘ๅˆฐ window.kinet โ”‚ โ”‚ - ipcRenderer.invoke / on โ†’ ipcMain.handle / on โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ–ฒ โ”‚ window.kinet.* โ–ฒ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Renderer (src/renderer/*) โ”‚ โ”‚ - vanilla TS + HTML/CSS,esbuild bundle โ”‚ โ”‚ - ๆ—  Node ่ฎฟ้—ฎ(contextIsolation: true) โ”‚ โ”‚ - dashboard / quick panel / files window โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ## ๅ•ไธ€็œŸ็†ๆบ:`shared/types.ts` `src/shared/types.ts` ่ขซ main ๅ’Œ renderer ๅŒๆ—ถ import,**็บฏ็ฑปๅž‹ + ็บฏๅ‡ฝๆ•ฐ**(ๆ—  Node/DOM API)ใ€‚ ้‡Œ้ขๅ…ณ้”ฎ็š„ไธœ่ฅฟ: - ๆ‰€ๆœ‰ๅ…ฑไบซ็ฑปๅž‹(`Conversation`ใ€`Turn`ใ€`ChatMsg`ใ€`AgentEvent`ใ€`AppSettings`โ€ฆ) - **`applyEvent(conv, ev)`** โ€”โ€” ๆŠŠไธ€ไธชๆตๅผไบ‹ไปถ fold ๅˆฐๅฝ“ๅ‰ turn ็š„็Šถๆ€ใ€‚**main ๅ†™ๅ…ฅๅ‰่ฐƒไธ€ๆฌก,renderer ๆธฒๆŸ“ๆ—ถ่ฐƒๅŒไธ€ๆฌก**ใ€‚ไบ‹ไปถๅฆ‚ไฝ•ๆ›ดๆ–ฐ็Šถๆ€ๆ”น่ฟ™ไธ€ไธชๅœฐๆ–นๅฐฑๅคŸ(Swift ๅŽŸ็‰ˆ็š„ `apply()` ไนŸๆ˜ฏๅŒๆ€่ทฏ)ใ€‚ - `KinetAPI` interface โ€”โ€” preload ๆšด้œฒ็ป™ renderer ็š„**ๅฅ‘็บฆ**ใ€‚ ## `KinetAPI`:ไธ‰ๅฑ‚ๅฅ‘็บฆ ๅŠ ไธ€ไธช mainโ†”renderer ็š„่ƒฝๅŠ› = ไธ‰ๅค„ๅŒๆญฅ: 1. `KinetAPI` ๅŠ ๆ–นๆณ•็ญพๅ(`src/shared/types.ts`) 2. preload ๅŠ  `ipcRenderer.invoke` / `on`(`src/preload/preload.ts`) 3. main ๅŠ ๅฏนๅบ” `ipcMain.handle` / `on`(`src/main/main.ts`) ไปปไธ€ๅค„็ผบๅคฑ โ†’ renderer ่ฐƒ็”จ็›ดๆŽฅๆŠฅ้”™ใ€‚ไธ‰ๅค„ๅฏนๅพ—ไธŠๆ‰่ƒฝ shipใ€‚ `KinetAPI` ๅฝ“ๅ‰่ฆ†็›–็š„ๆ–นๆณ•่ง `src/shared/types.ts:133`ใ€‚็ฒ—ๅˆ†: - ไผš่ฏ็ฎก็†:`newConversation` / `send` / `cancel` / `deleteConversation` / `clearConversation` / `rename` / `setCwd` / `setEngine` / `setModel` - ่ฎพ็ฝฎ:`getSettings` / `saveSettings` / `testConnection` - ๆ–‡ไปถ:`pickDirectory` / `readFile` / `fileRead` / `fileWrite` / `listDir` / `shellOpen` - Git:`gitSnapshot` / `gitDiff` - ่ง„ๅˆ™:`readRules` / `writeRules` / `readContext` / `writeContext` - ่ฎฐๅฟ†:`memoryList` / `memoryUpdate` / `memoryDelete` / `memoryExport` / `memoryImport` - Skills / MCP:`listSkills` / `listMcp` - ไบ‹ไปถๆต:`onAgentEvent` / `onFilesCwd` / `onConversation` / `onConversationRemoved` / `onConfirmRequest` + `confirmResponse` - ็ช—ๅฃ:`openDashboard` / `openFiles` / `quickSubmit` ## ็ปŸไธ€ไบ‹ไปถๆจกๅž‹ ๆฏไธชๅผ•ๆ“Ž(Direct / Claude Code / Codex)้ƒฝๆŠŠ่‡ชๅฎถๆตๅผๆ ผๅผ normalize ๆˆๅŒไธ€ไธช `AgentEvent` union: ```ts type AgentEvent = | { type: 'token'; text: string } | { type: 'tool'; name: string; args: string; result: string } | { type: 'cost'; usd: number; tokens: number; tokensIn?: number; tokensOut?: number } | { type: 'status'; text: string } | { type: 'sessionStarted'; id: string } | { type: 'done' } | { type: 'error'; message: string }; ``` ๅผ•ๆ“Žๅช็ฎกๅ‘ไบ‹ไปถ;`TaskManager` ๆŽฅๅˆฐ โ†’ `applyEvent` ๆ›ดๆ–ฐ `Conversation` โ†’ ๆŒไน…ๅŒ– โ†’ ๆŽจ็ป™ renderer โ†’ renderer ไนŸ่ฐƒ `applyEvent` ๆ›ดๆ–ฐ่ง†ๅ›พใ€‚**ไธ€ๅค„ๅฎšไน‰,ไธค่พนๅ…ฑ็”จ**ใ€‚ ## Main ่ฟ›็จ‹็š„ๅ…ณ้”ฎๆจกๅ— | ๆจกๅ— | ่Œ่ดฃ | |---|---| | `main.ts` | ็ช—ๅฃใ€ๆ‰˜็›˜ใ€็ƒญ้”ฎใ€IPCใ€shell-confirm ๆกฅ | | `TaskManager.ts` | ไผš่ฏ็”Ÿๅ‘ฝๅ‘จๆœŸ + ๅผ•ๆ“Žๅˆ†ๅ‘ + ๅŽๅฐ่ฎฐๅฟ†ๆŠฝๅ– | | `engines.ts` | `Engine` interface + ไธ‰ๅฎž็Žฐ + ่ทจๅนณๅฐ CLI spawn | | `AgentLoop.ts` | Direct ็š„ ReAct loop + ๅކๅฒๅŽ‹็ผฉ + ๅๅบ”ๅผ trim | | `glm.ts` | Provider + OpenAI/Anthropic SSE ๅŒๅ่ฎฎๆตๅผ + ้‡่ฏ• | | `tools.ts` | 10 ไธชๅ†…็ฝฎๅทฅๅ…ท + ่ทจๅนณๅฐ shell + dispatch_agent | | `mcp.ts` | MCP client(ๆ‰ซๆ + stdio + ้‡่ฟž) | | `skills.ts` | skills / commands / agents / plugin ๆ‰ซๆ | | `store.ts` | better-sqlite3 + FTS5 schema | | `settings.ts` | ้…็ฝฎ(API key ๅŠ ๅฏ†ใ€่ฏญ่จ€) | ## Renderer ็š„ๅ…ณ้”ฎๆจกๅ— | ๆจกๅ— | ่Œ่ดฃ | |---|---| | `app.ts` | ไธป็ช—ๅฃ้€ป่พ‘(่Šๅคฉ / ๆ–‡ไปถ / Git / ่ง„ๅˆ™ tab) | | `quick.ts` | ๅ…จๅฑ€็ƒญ้”ฎ็š„ๅฟซ้€Ÿ้ขๆฟ | | `dashboard.ts` | ็‹ฌ็ซ‹ metrics ็ช—ๅฃ | | `files-pane.ts` | ๆ–‡ไปถๆ ‘ + webview + ็ผ–่พ‘ๅ™จ(็‹ฌ็ซ‹็ช—ๅฃ & ๅ†…่” tab ๅ…ฑ็”จ) | | `markdown.ts` | ๆž็ฎ€ markdown ๆธฒๆŸ“ๅ™จ | | `i18n.ts`(shared) | ๅ››่ฏญ่จ€ string table + `t(lang, key, params)` | ## SQLite schema ่ฏฆ่ง `src/main/store.ts`ใ€‚ไธ‰ๅผ ไธป่ฆ่กจ: - **`conversations`** + **`turns`** โ€”โ€” ไผš่ฏไธŽ่ฝฎๆฌก(turn body ๅญ˜ไธบ JSON)ใ€‚`conversations` ่กจๅซ `created_at` ๅ’Œ `updated_at` ๅˆ—,ๅŽ่€…ๅœจๆฏๆฌก็”จๆˆทๅ‘ๆถˆๆฏๆˆ–ๅผ•ๆ“Žๅ›žๅคๆ—ถๆ›ดๆ–ฐ,้ฉฑๅŠจไพงๆ "ๆŒ‰ๆœ€่ฟ‘ๆดปๅŠจๆŽ’ๅบ"ใ€‚ - **`history`** โ€”โ€” FTS5 ่™š่กจ,ไพ› `recall_memory` ๅ…จๆ–‡ๆœ - **`memories`** โ€”โ€” ๆŠฝๅ–ๅ‡บ็š„้•ฟๆœŸไบ‹ๅฎž(่ทจไผš่ฏใ€่ทจๅผ•ๆ“Ž) Schema ๅœจ init ๆ—ถๅน‚็ญ‰ migrate(`hasColumn` ้˜ฒ ALTER ๆŠฅ้”™)ใ€‚่ฏฆ่ง [[Long-Term-Memory]]ใ€‚ ## Shell-confirm ๆกฅ `shell`(Direct)ๅ’Œๆฒ™็ฎฑๅŒ–็š„ CLI ๅผ•ๆ“Žๅฏ่ƒฝ้œ€่ฆ็”จๆˆท้ข„ๆ‰นๅ‡†ใ€‚Main ไธ่ƒฝๅผน UI,ๆ‰€ไปฅ `main.ts` ็š„ `confirm()` ๅ‘ `confirm-request` ๅˆฐ dashboard ็ช—ๅฃ,ๆŠŠ resolver ๆš‚ๅญ˜ๅˆฐ `pendingConfirms` map;renderer ็š„ modal ๅ›ž `confirm-response`;main ๆ‰พๅˆฐๅฏนๅบ” resolver ่งฃๆމใ€‚ `approval: 'never'` ็›ดๆŽฅ็ป•่ฟ‡(ไธๅผน)ใ€‚ ## ไธ‰ๅผ•ๆ“ŽๆŠฝ่ฑก ```ts interface Engine { readonly name: EngineKind; run(opts: EngineRunOpts): Promise; } ``` ไธ‰ๅฎž็Žฐ:`DirectEngine`(ๅ†…็ฝฎ ReAct)ใ€`ClaudeCodeEngine`(spawn `claude -p`)ใ€`CodexEngine`(spawn `codex exec`)ใ€‚`TaskManager` ๆ‹ฅๆœ‰ๆ‰€ๆœ‰ไผš่ฏ,ๆŒ‰ conv.engine ๅˆ†ๅ‘ใ€‚่ฏฆ่ง [[Engines]]ใ€‚