@tecet/ollm 0.1.4-b → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/docs/README.md +3 -410
  2. package/package.json +2 -2
  3. package/docs/Context/CheckpointFlowDiagram.md +0 -673
  4. package/docs/Context/ContextArchitecture.md +0 -898
  5. package/docs/Context/ContextCompression.md +0 -1102
  6. package/docs/Context/ContextManagment.md +0 -750
  7. package/docs/Context/Index.md +0 -209
  8. package/docs/Context/README.md +0 -390
  9. package/docs/DevelopmentRoadmap/Index.md +0 -238
  10. package/docs/DevelopmentRoadmap/OLLM-CLI_Releases.md +0 -419
  11. package/docs/DevelopmentRoadmap/PlanedFeatures.md +0 -448
  12. package/docs/DevelopmentRoadmap/README.md +0 -174
  13. package/docs/DevelopmentRoadmap/Roadmap.md +0 -572
  14. package/docs/DevelopmentRoadmap/RoadmapVisual.md +0 -372
  15. package/docs/Hooks/Architecture.md +0 -885
  16. package/docs/Hooks/Index.md +0 -244
  17. package/docs/Hooks/KeyboardShortcuts.md +0 -248
  18. package/docs/Hooks/Protocol.md +0 -817
  19. package/docs/Hooks/README.md +0 -403
  20. package/docs/Hooks/UserGuide.md +0 -1483
  21. package/docs/Hooks/VisualGuide.md +0 -598
  22. package/docs/Index.md +0 -506
  23. package/docs/Installation.md +0 -586
  24. package/docs/Introduction.md +0 -367
  25. package/docs/LLM Models/Index.md +0 -239
  26. package/docs/LLM Models/LLM_GettingStarted.md +0 -748
  27. package/docs/LLM Models/LLM_Index.md +0 -701
  28. package/docs/LLM Models/LLM_MemorySystem.md +0 -337
  29. package/docs/LLM Models/LLM_ModelCompatibility.md +0 -499
  30. package/docs/LLM Models/LLM_ModelsArchitecture.md +0 -933
  31. package/docs/LLM Models/LLM_ModelsCommands.md +0 -839
  32. package/docs/LLM Models/LLM_ModelsConfiguration.md +0 -1094
  33. package/docs/LLM Models/LLM_ModelsList.md +0 -1071
  34. package/docs/LLM Models/LLM_ModelsList.md.backup +0 -400
  35. package/docs/LLM Models/README.md +0 -355
  36. package/docs/MCP/MCP_Architecture.md +0 -1086
  37. package/docs/MCP/MCP_Commands.md +0 -1111
  38. package/docs/MCP/MCP_GettingStarted.md +0 -590
  39. package/docs/MCP/MCP_Index.md +0 -524
  40. package/docs/MCP/MCP_Integration.md +0 -866
  41. package/docs/MCP/MCP_Marketplace.md +0 -160
  42. package/docs/MCP/README.md +0 -415
  43. package/docs/Prompts System/Architecture.md +0 -760
  44. package/docs/Prompts System/Index.md +0 -223
  45. package/docs/Prompts System/PromptsRouting.md +0 -1047
  46. package/docs/Prompts System/PromptsTemplates.md +0 -1102
  47. package/docs/Prompts System/README.md +0 -389
  48. package/docs/Prompts System/SystemPrompts.md +0 -856
  49. package/docs/Quickstart.md +0 -535
  50. package/docs/Tools/Architecture.md +0 -884
  51. package/docs/Tools/GettingStarted.md +0 -624
  52. package/docs/Tools/Index.md +0 -216
  53. package/docs/Tools/ManifestReference.md +0 -141
  54. package/docs/Tools/README.md +0 -440
  55. package/docs/Tools/UserGuide.md +0 -773
  56. package/docs/Troubleshooting.md +0 -1265
  57. package/docs/UI&Settings/Architecture.md +0 -729
  58. package/docs/UI&Settings/ColorASCII.md +0 -34
  59. package/docs/UI&Settings/Commands.md +0 -755
  60. package/docs/UI&Settings/Configuration.md +0 -872
  61. package/docs/UI&Settings/Index.md +0 -293
  62. package/docs/UI&Settings/Keybinds.md +0 -372
  63. package/docs/UI&Settings/README.md +0 -278
  64. package/docs/UI&Settings/Terminal.md +0 -637
  65. package/docs/UI&Settings/Themes.md +0 -604
  66. package/docs/UI&Settings/UIGuide.md +0 -550
@@ -1,1086 +0,0 @@
1
- # MCP Architecture
2
-
3
- **Model Context Protocol Integration for OLLM CLI**
4
-
5
- ---
6
-
7
- ## Table of Contents
8
-
9
- 1. [Overview](#overview)
10
- 2. [System Architecture](#system-architecture)
11
- 3. [Core Components](#core-components)
12
- 4. [Data Flow](#data-flow)
13
- 5. [Integration Points](#integration-points)
14
- 6. [Design Decisions](#design-decisions)
15
- 7. [Security Model](#security-model)
16
-
17
- ---
18
-
19
- ## Overview
20
-
21
- The MCP (Model Context Protocol) integration in OLLM CLI provides a comprehensive extensibility framework that enables:
22
-
23
- - **External Tool Integration**: Connect to MCP servers to access external tools
24
- - **Event-Driven Hooks**: Execute custom scripts at specific lifecycle points
25
- - **Extension System**: Package and distribute functionality via manifests
26
- - **OAuth Authentication**: Secure access to protected MCP servers
27
- - **Health Monitoring**: Automatic detection and recovery from server failures
28
-
29
- ### Key Features
30
-
31
- - ✅ Multiple transport types (stdio, SSE, HTTP)
32
- - ✅ OAuth 2.0 with PKCE flow
33
- - ✅ Automatic health monitoring and restart
34
- - ✅ Tools, resources, and prompts support
35
- - ✅ Event-driven hook system
36
- - ✅ Extension marketplace with hot-reload
37
- - ✅ Permission-based sandboxing
38
-
39
- ---
40
-
41
- ## System Architecture
42
-
43
- ### High-Level Architecture
44
-
45
- ```mermaid
46
- graph TB
47
- subgraph OLLM_CLI["OLLM CLI"]
48
- HookSystem["Hook System"]
49
- ExtManager["Extension Manager"]
50
- MCPClient["MCP Client"]
51
-
52
- MessageBus["MessageBus"]
53
- ManifestParser["Manifest Parser"]
54
- ToolWrapper["Tool Wrapper"]
55
-
56
- TrustModel["Trust Model"]
57
- SettingsInt["Settings Integration"]
58
- HealthMonitor["Health Monitor"]
59
-
60
- ExtManager --> HookSystem
61
- ExtManager --> MCPClient
62
-
63
- HookSystem --> MessageBus
64
- ExtManager --> ManifestParser
65
- MCPClient --> ToolWrapper
66
-
67
- MessageBus --> TrustModel
68
- ManifestParser --> SettingsInt
69
- ToolWrapper --> HealthMonitor
70
- end
71
-
72
- OLLM_CLI --> ToolRegistry["Tool Registry"]
73
- ToolRegistry --> Agent["Agent/Model"]
74
-
75
- style OLLM_CLI fill:#f9f,stroke:#333,stroke-width:2px
76
- style ToolRegistry fill:#bbf,stroke:#333,stroke-width:2px
77
- style Agent fill:#bfb,stroke:#333,stroke-width:2px
78
- ```
79
-
80
- ### Component Interaction Flow
81
-
82
- **Extension Loading:**
83
-
84
- ```mermaid
85
- flowchart LR
86
- EM[Extension Manager] --> MP[Manifest Parser]
87
- MP --> VS[Validate Schema]
88
- VS --> HR[Hook Registry]
89
- VS --> MC[MCP Client]
90
- VS --> TR[Tool Registry]
91
-
92
- HR -.register hooks.-> HR
93
- MC -.start servers.-> MC
94
- TR -.register tools.-> TR
95
-
96
- style EM fill:#e1f5ff
97
- style VS fill:#fff4e1
98
- style HR fill:#e8f5e9
99
- style MC fill:#f3e5f5
100
- style TR fill:#fce4ec
101
- ```
102
-
103
- **Hook Execution:**
104
-
105
- ```mermaid
106
- flowchart TD
107
- ET[Event Trigger] --> MB[MessageBus]
108
- MB --> HP[Hook Planner]
109
- HP --> IH[Identify Hooks]
110
- IH --> TM[Trust Model]
111
- TM --> VA[Verify Approval]
112
- VA --> HR[Hook Runner]
113
- HR --> EX[Execute with Timeout]
114
- EX --> HT[Hook Translator]
115
- HT --> PO[Parse Output]
116
- PO --> SYS[System]
117
- SYS --> PR[Process Results]
118
-
119
- style ET fill:#e1f5ff
120
- style MB fill:#fff4e1
121
- style TM fill:#ffe1e1
122
- style HR fill:#e8f5e9
123
- style SYS fill:#f3e5f5
124
- ```
125
-
126
- **MCP Tool Call:**
127
-
128
- ```mermaid
129
- flowchart LR
130
- A[Agent] --> TR[Tool Registry]
131
- TR --> TW[Tool Wrapper]
132
- TW --> MC[MCP Client]
133
- MC --> MS[MCP Server]
134
- MS --> MC
135
- MC --> TW
136
- TW --> FR[Format Response]
137
- FR --> A
138
-
139
- style A fill:#e1f5ff
140
- style TR fill:#fff4e1
141
- style MC fill:#f3e5f5
142
- style MS fill:#e8f5e9
143
- ```
144
-
145
- ---
146
-
147
- ## Core Components
148
-
149
- ### 1. MCP Client
150
-
151
- **Location:** `packages/core/src/mcp/mcpClient.ts`
152
-
153
- **Responsibilities:**
154
-
155
- - Manage MCP server lifecycle (start, stop, status)
156
- - Handle multiple servers simultaneously
157
- - Discover tools, resources, and prompts
158
- - Route tool calls to appropriate servers
159
- - Handle connection timeouts and failures
160
-
161
- **Key Methods:**
162
-
163
- ```typescript
164
- interface MCPClient {
165
- startServer(name: string, config: MCPServerConfig): Promise<void>;
166
- stopServer(name: string): Promise<void>;
167
- getServerStatus(name: string): MCPServerStatus;
168
- listServers(): MCPServerInfo[];
169
- callTool(serverName: string, toolName: string, args: unknown): Promise<unknown>;
170
- getTools(serverName: string): Promise<MCPTool[]>;
171
- getResources(serverName: string): Promise<MCPResource[]>;
172
- getPrompts(serverName: string): Promise<MCPPrompt[]>;
173
- }
174
- ```
175
-
176
- **Features:**
177
-
178
- - Connection timeout handling (default: 10 seconds)
179
- - Automatic retry with exponential backoff
180
- - Multi-server management
181
- - Server status tracking (starting, connected, disconnected, error)
182
-
183
- ### 2. MCP Transport
184
-
185
- **Location:** `packages/core/src/mcp/mcpTransport.ts`
186
-
187
- **Responsibilities:**
188
-
189
- - Handle communication with MCP servers
190
- - Support multiple transport types
191
- - Manage connection lifecycle
192
- - Parse server responses
193
-
194
- **Transport Types:**
195
-
196
- #### Stdio Transport
197
-
198
- - Communicates via stdin/stdout
199
- - Primary transport for local MCP servers
200
- - Process spawning and management
201
-
202
- ```typescript
203
- {
204
- command: 'node',
205
- args: ['server.js'],
206
- transport: 'stdio'
207
- }
208
- ```
209
-
210
- #### SSE Transport
211
-
212
- - Server-Sent Events over HTTP
213
- - Suitable for remote servers
214
- - Long-lived connections
215
-
216
- ```typescript
217
- {
218
- command: 'http://localhost:3000/mcp',
219
- transport: 'sse'
220
- }
221
- ```
222
-
223
- #### HTTP Transport
224
-
225
- - Standard HTTP requests
226
- - Stateless communication
227
- - Simple integration
228
-
229
- ```typescript
230
- {
231
- command: 'http://localhost:3000/mcp',
232
- transport: 'http'
233
- }
234
- ```
235
-
236
- ### 3. MCP Schema Converter
237
-
238
- **Location:** `packages/core/src/mcp/mcpSchemaConverter.ts`
239
-
240
- **Responsibilities:**
241
-
242
- - Convert MCP tool schemas to internal format
243
- - Map parameter types correctly
244
- - Preserve descriptions and constraints
245
- - Handle optional and required parameters
246
-
247
- **Type Mapping:**
248
-
249
- ```typescript
250
- MCP Type → Internal Type
251
- string → string
252
- number → number
253
- boolean → boolean
254
- object → object
255
- array → array
256
- ```
257
-
258
- ### 4. MCP Tool Wrapper
259
-
260
- **Location:** `packages/core/src/mcp/mcpToolWrapper.ts`
261
-
262
- **Responsibilities:**
263
-
264
- - Wrap MCP tools as internal tools
265
- - Convert arguments to MCP format
266
- - Convert results from MCP format
267
- - Handle errors and timeouts
268
- - Format responses for display
269
-
270
- **Workflow:**
271
-
272
- 1. Agent selects tool from registry
273
- 2. Wrapper converts arguments to MCP format
274
- 3. Wrapper sends request to MCP client
275
- 4. MCP client routes to appropriate server
276
- 5. Server executes tool and returns result
277
- 6. Wrapper converts result to internal format
278
- 7. Result displayed to user
279
-
280
- ### 5. MCP Health Monitor
281
-
282
- **Location:** `packages/core/src/mcp/mcpHealthMonitor.ts`
283
-
284
- **Responsibilities:**
285
-
286
- - Periodic health checks (default: 30 seconds)
287
- - Detect server failures
288
- - Automatic restart with exponential backoff
289
- - Track restart attempts (max: 3)
290
- - Emit health events
291
-
292
- **Health States:**
293
-
294
- - `healthy` - Server responding normally
295
- - `degraded` - Server slow or intermittent
296
- - `failed` - Server not responding
297
- - `restarting` - Attempting to restart
298
-
299
- **Features:**
300
-
301
- - Configurable check interval
302
- - Configurable max restart attempts
303
- - Event emission for monitoring
304
- - Manual restart capability
305
- - Status tracking per server
306
-
307
- ### 6. MCP OAuth Provider
308
-
309
- **Location:** `packages/core/src/mcp/mcpOAuth.ts`
310
-
311
- **Responsibilities:**
312
-
313
- - OAuth 2.0 authentication with PKCE
314
- - Secure token storage (keychain + encrypted file)
315
- - Automatic token refresh
316
- - Browser-based authorization flow
317
- - Token revocation
318
-
319
- **OAuth Flow:**
320
-
321
- 1. Discover OAuth endpoints from server
322
- 2. Generate PKCE code verifier and challenge
323
- 3. Open browser for user authorization
324
- 4. Start local callback server
325
- 5. Receive authorization code
326
- 6. Exchange code for access token
327
- 7. Store token securely
328
- 8. Refresh token before expiration
329
-
330
- **Token Storage:**
331
-
332
- - **Primary:** Platform keychain (via keytar)
333
- - **Fallback:** Encrypted file storage
334
- - **Encryption:** AES-256-GCM
335
- - **Isolation:** Per-server tokens
336
-
337
- ### 7. Hook System
338
-
339
- **Location:** `packages/core/src/hooks/`
340
-
341
- **Components:**
342
-
343
- - **HookRegistry**: Registration and storage
344
- - **HookPlanner**: Execution strategy planning
345
- - **HookRunner**: Execution with timeout
346
- - **HookTranslator**: Input/output translation
347
- - **TrustedHooks**: Trust verification
348
- - **MessageBus**: Event-driven architecture
349
-
350
- **Hook Events (12 types):**
351
-
352
- 1. `session_start` - Session initialization
353
- 2. `session_end` - Session cleanup
354
- 3. `before_agent` - Before agent processes request
355
- 4. `after_agent` - After agent response
356
- 5. `before_model` - Before model invocation
357
- 6. `after_model` - After model response
358
- 7. `before_tool_selection` - Before tool selection
359
- 8. `before_tool` - Before tool execution
360
- 9. `after_tool` - After tool execution
361
- 10. `pre_compress` - Before context compression
362
- 11. `post_compress` - After context compression
363
- 12. `notification` - System notifications
364
-
365
- **Execution Strategies:**
366
-
367
- - **Sequential**: Execute hooks one after another
368
- - **Parallel**: Execute hooks concurrently
369
- - **Optimized**: Smart parallel detection
370
- - **Priority**: Execute by priority order
371
-
372
- ### 8. Extension Manager
373
-
374
- **Location:** `packages/core/src/extensions/extensionManager.ts`
375
-
376
- **Responsibilities:**
377
-
378
- - Discover extensions from directories
379
- - Parse and validate manifests
380
- - Enable/disable extensions
381
- - Register hooks and MCP servers
382
- - Manage extension lifecycle
383
- - Hot-reload during development
384
-
385
- **Extension Discovery:**
386
-
387
- - User directory: `~/.ollm/extensions/`
388
- - Workspace directory: `.ollm/extensions/`
389
- - Recursive scanning for `manifest.json`
390
-
391
- **Extension Lifecycle:**
392
-
393
- 1. Discovery (scan directories)
394
- 2. Parsing (validate manifest)
395
- 3. Registration (hooks, servers, settings)
396
- 4. Enabling (start servers, register tools)
397
- 5. Disabling (stop servers, unregister tools)
398
- 6. Reloading (graceful restart)
399
-
400
- ### 9. Extension Registry
401
-
402
- **Location:** `packages/core/src/extensions/extensionRegistry.ts`
403
-
404
- **Responsibilities:**
405
-
406
- - Extension marketplace integration
407
- - Search and discovery
408
- - Installation from remote URLs
409
- - Checksum verification (SHA-256)
410
- - Version management
411
- - Update checking
412
-
413
- **Features:**
414
-
415
- - Full-text search with relevance scoring
416
- - Registry caching (5-minute expiry)
417
- - Integrity verification
418
- - Automatic updates (optional)
419
-
420
- ### 10. Extension Sandbox
421
-
422
- **Location:** `packages/core/src/extensions/extensionSandbox.ts`
423
-
424
- **Responsibilities:**
425
-
426
- - Permission-based access control
427
- - Runtime enforcement
428
- - User approval prompts
429
- - Dynamic permission management
430
-
431
- **Permission Types:**
432
-
433
- 1. **filesystem**: File system access (path-based)
434
- 2. **network**: Network access (domain-based)
435
- 3. **env**: Environment variable access
436
- 4. **shell**: Shell command execution
437
- 5. **mcp**: MCP server access
438
-
439
- ---
440
-
441
- ## Data Flow
442
-
443
- ### Extension Loading Flow
444
-
445
- ```mermaid
446
- flowchart TD
447
- Start[CLI Startup] --> Init[Extension Manager Initialization]
448
- Init --> Scan[Scan Extension Directories]
449
- Scan --> UserDir["~/.ollm/extensions/"]
450
- Scan --> WorkDir[".ollm/extensions/"]
451
-
452
- UserDir --> ForEach[For Each Extension Directory]
453
- WorkDir --> ForEach
454
-
455
- ForEach --> FindManifest[Find manifest.json]
456
- FindManifest --> Parse[Parse and Validate Manifest]
457
- Parse --> CheckEnabled{Check Enabled State}
458
-
459
- CheckEnabled -->|Enabled| RegHooks[Register Hooks]
460
- CheckEnabled -->|Disabled| Skip[Skip Extension]
461
-
462
- RegHooks --> StartServers[Start MCP Servers]
463
- StartServers --> RegTools[Register Tools]
464
- RegTools --> MergeSettings[Merge Settings]
465
-
466
- MergeSettings --> Ready[Extension System Ready]
467
- Skip --> Ready
468
-
469
- style Start fill:#e1f5ff
470
- style Ready fill:#e8f5e9
471
- style CheckEnabled fill:#fff4e1
472
- ```
473
-
474
- ### Hook Execution Flow
475
-
476
- ```mermaid
477
- flowchart TD
478
- Event[Event Occurs] --> MB[MessageBus Emits Event]
479
- MB --> Handler[Hook Event Handler Receives Event]
480
- Handler --> Planner[Hook Planner Plans Execution]
481
-
482
- Planner --> Identify[Identify Registered Hooks]
483
- Planner --> Strategy[Determine Execution Strategy]
484
- Planner --> Plan[Create Execution Plan]
485
-
486
- Plan --> ForEach[For Each Hook]
487
- ForEach --> Trust{Trust Model Checks Approval}
488
-
489
- Trust -->|Approved| Execute[Hook Runner Executes Hook]
490
- Trust -->|Not Approved| RequestApproval[Request User Approval]
491
-
492
- Execute --> Translate[Hook Translator Converts I/O]
493
- Translate --> Capture[Capture Output]
494
-
495
- Capture --> Process[Process Hook Outputs]
496
- RequestApproval --> Process
497
-
498
- Process --> CheckContinue{Check continue Flag}
499
- Process --> AddMessages[Add systemMessages to Context]
500
- Process --> PassData[Pass Data to Next Hook]
501
-
502
- CheckContinue --> Return[Return Aggregated Results]
503
- AddMessages --> Return
504
- PassData --> Return
505
-
506
- style Event fill:#e1f5ff
507
- style Trust fill:#ffe1e1
508
- style Execute fill:#e8f5e9
509
- style Return fill:#f3e5f5
510
- ```
511
-
512
- ### MCP Tool Call Flow
513
-
514
- ```mermaid
515
- flowchart TD
516
- Agent[Agent Selects Tool] --> Lookup[Tool Registry Lookup]
517
- Lookup --> Wrapper[Tool Wrapper Receives Call]
518
- Wrapper --> Convert[Convert Arguments to MCP Format]
519
- Convert --> Route[MCP Client Routes to Server]
520
- Route --> Transport[MCP Transport Sends Request]
521
-
522
- Transport --> Stdio[Stdio: Write to stdin]
523
- Transport --> SSE[SSE: POST to endpoint]
524
- Transport --> HTTP[HTTP: POST request]
525
-
526
- Stdio --> Server[MCP Server Processes Request]
527
- SSE --> Server
528
- HTTP --> Server
529
-
530
- Server --> Receive[MCP Transport Receives Response]
531
- Receive --> ConvertResult[Tool Wrapper Converts Result]
532
- ConvertResult --> Format[Format for Display]
533
- Format --> Return[Return to Agent]
534
-
535
- style Agent fill:#e1f5ff
536
- style Server fill:#e8f5e9
537
- style Return fill:#f3e5f5
538
- ```
539
-
540
- ### OAuth Authentication Flow
541
-
542
- ```mermaid
543
- flowchart TD
544
- Start[Extension Requires OAuth Server] --> Check{MCP Client Checks for Token}
545
-
546
- Check -->|No Token| Discover[OAuth Provider Discovers Endpoints]
547
- Check -->|Token Exists| CheckExp{Check Expiration}
548
-
549
- Discover --> PKCE[Generate PKCE Challenge]
550
- PKCE --> Browser[Open Browser for Authorization]
551
- Browser --> Callback[Start Local Callback Server]
552
- Callback --> UserAuth[User Authorizes in Browser]
553
- UserAuth --> ReceiveCode[Receive Authorization Code]
554
- ReceiveCode --> Exchange[Exchange Code for Token]
555
- Exchange --> Store[Store Token Securely]
556
-
557
- Store --> AddToken[Add Token to Request Headers]
558
-
559
- CheckExp -->|Expired| Refresh[Refresh Token]
560
- CheckExp -->|Valid| AddToken
561
-
562
- Refresh --> AddToken
563
- AddToken --> Validate[MCP Server Validates Token]
564
- Validate --> Process[Process Request]
565
-
566
- style Start fill:#e1f5ff
567
- style Check fill:#fff4e1
568
- style UserAuth fill:#ffe1e1
569
- style Store fill:#e8f5e9
570
- style Process fill:#f3e5f5
571
- ```
572
-
573
- ---
574
-
575
- ## Integration Points
576
-
577
- ### 1. Tool Registry Integration
578
-
579
- **Purpose:** Make MCP tools available to the agent
580
-
581
- **Flow:**
582
-
583
- ```typescript
584
- // Extension loads MCP server
585
- extensionManager.loadExtension(extension);
586
-
587
- // MCP client starts server
588
- mcpClient.startServer('github', config);
589
-
590
- // Discover tools
591
- const tools = await mcpClient.getTools('github');
592
-
593
- // Wrap and register each tool
594
- tools.forEach((tool) => {
595
- const wrappedTool = mcpToolWrapper.wrapTool('github', tool);
596
- toolRegistry.register(wrappedTool);
597
- });
598
-
599
- // Agent can now use tools
600
- const result = await agent.useTool('github_create_issue', args);
601
- ```
602
-
603
- ### 2. Hook System Integration
604
-
605
- **Purpose:** Allow extensions to customize behavior
606
-
607
- **Flow:**
608
-
609
- ```typescript
610
- // Extension declares hooks in manifest
611
- {
612
- "hooks": {
613
- "before_model": [
614
- {
615
- "name": "validate-input",
616
- "command": "node",
617
- "args": ["hooks/validate.js"]
618
- }
619
- ]
620
- }
621
- }
622
-
623
- // Extension manager registers hooks
624
- extensionManager.registerHooks(extension);
625
-
626
- // MessageBus emits event
627
- messageBus.emit('before_model', { messages, model });
628
-
629
- // Hook executes and returns output
630
- const output = await hookRunner.executeHook(hook, input);
631
-
632
- // System processes output
633
- if (!output.continue) {
634
- throw new Error('Hook aborted operation');
635
- }
636
- if (output.systemMessage) {
637
- messages.push({ role: 'system', content: output.systemMessage });
638
- }
639
- ```
640
-
641
- ### 3. Settings Integration
642
-
643
- **Purpose:** Allow extensions to declare configuration
644
-
645
- **Flow:**
646
-
647
- ```typescript
648
- // Extension declares settings in manifest
649
- {
650
- "settings": [
651
- {
652
- "name": "githubToken",
653
- "envVar": "GITHUB_TOKEN",
654
- "sensitive": true,
655
- "description": "GitHub personal access token"
656
- }
657
- ]
658
- }
659
-
660
- // Extension manager merges settings
661
- extensionManager.mergeSettings(extension);
662
-
663
- // Settings available to hooks and MCP servers
664
- const token = process.env.GITHUB_TOKEN;
665
-
666
- // Sensitive settings redacted in logs
667
- logger.info('Token: [REDACTED]');
668
- ```
669
-
670
- ### 4. Service Container Integration
671
-
672
- **Purpose:** Centralized service management
673
-
674
- **Flow:**
675
-
676
- ```typescript
677
- // Service container manages all services
678
- const serviceContainer = new ServiceContainer({
679
- provider,
680
- config,
681
- workspacePath,
682
- userHome,
683
- });
684
-
685
- // Services available via getters
686
- const mcpHealthMonitor = serviceContainer.getMCPHealthMonitor();
687
- const mcpOAuthProvider = serviceContainer.getMCPOAuthProvider();
688
- const extensionManager = serviceContainer.getExtensionManager();
689
- const hookService = serviceContainer.getHookService();
690
-
691
- // Automatic initialization and cleanup
692
- await serviceContainer.initializeAll();
693
- await serviceContainer.shutdown();
694
- ```
695
-
696
- ---
697
-
698
- ## Design Decisions
699
-
700
- ### 1. Custom MCP Client vs Official SDK
701
-
702
- **Decision:** Custom implementation initially, SDK migration deferred
703
-
704
- **Rationale:**
705
-
706
- - Custom implementation provides full control
707
- - Meets all current requirements
708
- - SDK can be integrated later if needed
709
- - No breaking changes to API
710
-
711
- **Trade-offs:**
712
-
713
- - ✅ Full control over implementation
714
- - ✅ No external dependencies
715
- - ❌ Must maintain compatibility manually
716
- - ❌ Missing some SDK features
717
-
718
- ### 2. Event-Driven Architecture (MessageBus)
719
-
720
- **Decision:** Implement MessageBus for hook system
721
-
722
- **Rationale:**
723
-
724
- - Decouples components
725
- - Enables parallel execution
726
- - Supports complex workflows
727
- - Easy to extend
728
-
729
- **Benefits:**
730
-
731
- - ✅ Loose coupling
732
- - ✅ Testability
733
- - ✅ Extensibility
734
- - ✅ Performance (parallel execution)
735
-
736
- ### 3. Trust Model with Approval
737
-
738
- **Decision:** Require approval for untrusted hooks
739
-
740
- **Rationale:**
741
-
742
- - Security first approach
743
- - Prevent malicious code execution
744
- - User control over extensions
745
- - Hash verification for changes
746
-
747
- **Trust Levels:**
748
-
749
- 1. **Built-in**: Always trusted
750
- 2. **User**: Trusted by default
751
- 3. **Workspace**: Requires approval
752
- 4. **Downloaded**: Requires approval
753
-
754
- ### 4. OAuth with PKCE
755
-
756
- **Decision:** Implement OAuth 2.0 with PKCE flow
757
-
758
- **Rationale:**
759
-
760
- - Industry standard for secure authentication
761
- - PKCE prevents authorization code interception
762
- - Supports refresh tokens
763
- - Works with major providers (GitHub, Google, etc.)
764
-
765
- **Security Features:**
766
-
767
- - ✅ PKCE code challenge
768
- - ✅ Secure token storage
769
- - ✅ Automatic refresh
770
- - ✅ Token revocation
771
-
772
- ### 5. Health Monitoring with Auto-Restart
773
-
774
- **Decision:** Implement automatic health checks and restart
775
-
776
- **Rationale:**
777
-
778
- - Improve reliability
779
- - Reduce manual intervention
780
- - Better user experience
781
- - Detect failures early
782
-
783
- **Configuration:**
784
-
785
- - Check interval: 30 seconds (configurable)
786
- - Max restart attempts: 3 (configurable)
787
- - Exponential backoff: 1s, 2s, 4s
788
- - Manual restart available
789
-
790
- ### 6. Extension Sandboxing
791
-
792
- **Decision:** Implement permission-based sandboxing
793
-
794
- **Rationale:**
795
-
796
- - Security and safety
797
- - User control
798
- - Prevent malicious extensions
799
- - Granular permissions
800
-
801
- **Permission Model:**
802
-
803
- - Declared in manifest
804
- - Runtime enforcement
805
- - User approval prompts
806
- - Dynamic granting/revoking
807
-
808
- ---
809
-
810
- ## Security Model
811
-
812
- ### 1. Hook Trust Model
813
-
814
- **Threat:** Malicious hooks executing arbitrary code
815
-
816
- **Mitigation:**
817
-
818
- - Approval required for untrusted hooks
819
- - Hash verification for changes
820
- - Source tracking (user/workspace/downloaded)
821
- - Persistent approval storage
822
-
823
- **Implementation:**
824
-
825
- ```typescript
826
- // Check if hook is trusted
827
- const trusted = await trustedHooks.isTrusted(hook);
828
-
829
- if (!trusted) {
830
- // Request user approval
831
- const approved = await trustedHooks.requestApproval(hook);
832
-
833
- if (approved) {
834
- // Compute and store hash
835
- const hash = await trustedHooks.computeHash(hook);
836
- await trustedHooks.storeApproval(hook, hash);
837
- } else {
838
- // Skip hook execution
839
- return;
840
- }
841
- }
842
-
843
- // Execute hook
844
- await hookRunner.executeHook(hook, input);
845
- ```
846
-
847
- ### 2. OAuth Token Security
848
-
849
- **Threat:** Token theft or exposure
850
-
851
- **Mitigation:**
852
-
853
- - Secure storage (keychain + encrypted file)
854
- - AES-256-GCM encryption
855
- - Per-server token isolation
856
- - Automatic token refresh
857
- - Token revocation support
858
-
859
- **Storage Hierarchy:**
860
-
861
- 1. **Primary:** Platform keychain (keytar)
862
- - Windows: Credential Manager
863
- - macOS: Keychain
864
- - Linux: Secret Service API
865
- 2. **Fallback:** Encrypted file
866
- - AES-256-GCM encryption
867
- - Unique key per installation
868
- - Restricted file permissions
869
-
870
- ### 3. Extension Sandboxing
871
-
872
- **Threat:** Malicious extensions accessing sensitive resources
873
-
874
- **Mitigation:**
875
-
876
- - Permission-based access control
877
- - Runtime enforcement
878
- - User approval prompts
879
- - Granular permissions
880
-
881
- **Permission Enforcement:**
882
-
883
- ```typescript
884
- // Check permission before access
885
- const allowed = await sandbox.checkPermission(extensionName, 'filesystem', '/path/to/file');
886
-
887
- if (!allowed) {
888
- // Request user approval
889
- const granted = await sandbox.requestPermission(extensionName, 'filesystem', '/path/to/file');
890
-
891
- if (!granted) {
892
- throw new Error('Permission denied');
893
- }
894
- }
895
-
896
- // Proceed with access
897
- fs.readFileSync('/path/to/file');
898
- ```
899
-
900
- ### 4. MCP Server Isolation
901
-
902
- **Threat:** MCP server compromise affecting CLI
903
-
904
- **Mitigation:**
905
-
906
- - Process isolation (separate processes)
907
- - Error isolation (catch and log)
908
- - Timeout enforcement
909
- - Health monitoring
910
- - Automatic restart
911
-
912
- **Error Handling:**
913
-
914
- ```typescript
915
- try {
916
- const result = await mcpClient.callTool(server, tool, args);
917
- return result;
918
- } catch (error) {
919
- // Log error
920
- logger.error(`MCP tool call failed: ${error.message}`);
921
-
922
- // Mark server as unhealthy
923
- healthMonitor.markUnhealthy(server);
924
-
925
- // Return error to agent (don't crash CLI)
926
- return { error: error.message };
927
- }
928
- ```
929
-
930
- ### 5. Environment Variable Sanitization
931
-
932
- **Threat:** Sensitive data exposure in logs
933
-
934
- **Mitigation:**
935
-
936
- - Sensitive setting redaction
937
- - Environment variable filtering
938
- - Secure substitution
939
- - Warning for missing variables
940
-
941
- **Redaction:**
942
-
943
- ```typescript
944
- // Mark setting as sensitive
945
- {
946
- "name": "apiKey",
947
- "envVar": "API_KEY",
948
- "sensitive": true
949
- }
950
-
951
- // Redact in logs
952
- logger.info(`API Key: ${redact(apiKey)}`); // "API Key: [REDACTED]"
953
- ```
954
-
955
- ---
956
-
957
- ## Performance Considerations
958
-
959
- ### 1. Parallel Hook Execution
960
-
961
- **Optimization:** Execute independent hooks in parallel
962
-
963
- **Implementation:**
964
-
965
- ```typescript
966
- // Determine if hooks can run in parallel
967
- const canParallel = hookPlanner.canExecuteInParallel(hooks, event);
968
-
969
- if (canParallel) {
970
- // Execute in parallel
971
- const results = await Promise.all(hooks.map((hook) => hookRunner.executeHook(hook, input)));
972
- } else {
973
- // Execute sequentially
974
- const results = [];
975
- for (const hook of hooks) {
976
- const result = await hookRunner.executeHook(hook, input);
977
- results.push(result);
978
- }
979
- }
980
- ```
981
-
982
- ### 2. MCP Connection Pooling
983
-
984
- **Optimization:** Reuse connections to MCP servers
985
-
986
- **Implementation:**
987
-
988
- - Keep connections alive
989
- - Reuse for multiple tool calls
990
- - Close on idle timeout
991
- - Reconnect on failure
992
-
993
- ### 3. Extension Hot-Reload
994
-
995
- **Optimization:** Reload without full restart
996
-
997
- **Implementation:**
998
-
999
- ```typescript
1000
- // Watch for file changes
1001
- watcher.on('change', async (path) => {
1002
- // Debounce changes
1003
- await debounce(1000);
1004
-
1005
- // Gracefully unload extension
1006
- await extensionManager.disableExtension(name);
1007
-
1008
- // Reload extension
1009
- await extensionManager.enableExtension(name);
1010
- });
1011
- ```
1012
-
1013
- ### 4. Registry Caching
1014
-
1015
- **Optimization:** Cache extension registry
1016
-
1017
- **Implementation:**
1018
-
1019
- - Cache duration: 5 minutes
1020
- - Automatic refresh on expiry
1021
- - Manual refresh available
1022
- - Offline fallback
1023
-
1024
- ---
1025
-
1026
- ## Future Enhancements
1027
-
1028
- ### Planned Features
1029
-
1030
- 1. **Official SDK Integration**
1031
- - Migrate to `@modelcontextprotocol/sdk`
1032
- - Leverage SDK features
1033
- - Maintain API compatibility
1034
-
1035
- 2. **Advanced Health Monitoring**
1036
- - Metrics collection
1037
- - Performance tracking
1038
- - Alerting system
1039
- - Dashboard view
1040
-
1041
- 3. **Extension Marketplace**
1042
- - Public registry
1043
- - Community extensions
1044
- - Ratings and reviews
1045
- - Automatic updates
1046
-
1047
- 4. **Enhanced Sandboxing**
1048
- - Container-based isolation
1049
- - Resource limits (CPU, memory)
1050
- - Network policies
1051
- - Audit logging
1052
-
1053
- 5. **Telemetry and Observability**
1054
- - Hook execution metrics
1055
- - MCP call tracing
1056
- - Performance profiling
1057
- - Error tracking
1058
-
1059
- ---
1060
-
1061
- ## References
1062
-
1063
- ### Internal Documentation
1064
-
1065
- - [MCP Integration Guide](MCP_integration.md)
1066
- - [MCP Commands Reference](MCP_commands.md)
1067
- - [Hook System Guide](3%20projects/OLLM%20CLI/Hooks/README.md)
1068
- - [Extension Development Guide](3%20projects/OLLM%20CLI/Extensions/README.md)
1069
-
1070
- ### Specifications
1071
-
1072
- - Requirements (.kiro/specs/stage-05-hooks-extensions-mcp/requirements.md)
1073
- - Design (.kiro/specs/stage-05-hooks-extensions-mcp/design.md)
1074
- - Tasks (.kiro/specs/stage-05-hooks-extensions-mcp/tasks.md)
1075
-
1076
- ### External References
1077
-
1078
- - MCP Specification (https://spec.modelcontextprotocol.io/)
1079
- - OAuth 2.0 RFC 6749 (https://tools.ietf.org/html/rfc6749)
1080
- - PKCE RFC 7636 (https://tools.ietf.org/html/rfc7636)
1081
-
1082
- ---
1083
-
1084
- **Document Version:** 1.0
1085
- **Last Updated:** 2026-01-16
1086
- **Status:** ✅ Complete