@lanonasis/cli 1.4.1 → 1.5.0
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.
- package/README.md +357 -80
- package/dist/commands/auth.js +151 -1
- package/dist/commands/mcp.js +37 -30
- package/dist/commands/memory.js +78 -53
- package/dist/index-simple.js +189 -522
- package/dist/index.js +221 -327
- package/dist/utils/api.d.ts +2 -12
- package/dist/utils/api.js +0 -17
- package/dist/utils/completions.d.ts +28 -0
- package/dist/utils/completions.js +276 -0
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.js +13 -0
- package/dist/utils/formatting.d.ts +0 -2
- package/dist/utils/formatting.js +0 -13
- package/dist/utils/mcp-client.d.ts +6 -49
- package/dist/utils/mcp-client.js +82 -161
- package/dist/utils/mcp-client.test.d.ts +1 -0
- package/dist/utils/mcp-client.test.js +125 -0
- package/dist/utils/output.d.ts +23 -0
- package/dist/utils/output.js +97 -0
- package/dist/utils/websocket-mcp-client.d.ts +60 -0
- package/dist/utils/websocket-mcp-client.js +182 -0
- package/dist/utils/websocket-mcp-client.test.d.ts +1 -0
- package/dist/utils/websocket-mcp-client.test.js +126 -0
- package/package.json +10 -17
- package/dist/commands/api-keys.d.ts +0 -3
- package/dist/commands/api-keys.js +0 -812
- package/dist/mcp-server.d.ts +0 -2
- package/dist/mcp-server.js +0 -519
package/README.md
CHANGED
|
@@ -1,33 +1,62 @@
|
|
|
1
|
-
# Lanonasis CLI - Enterprise Infrastructure
|
|
1
|
+
# Lanonasis CLI - Enterprise AI Infrastructure Platform
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[](https://modelcontextprotocol.com)
|
|
3
|
+
<div align="center">
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/@lanonasis/cli)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://security.lanonasis.com)
|
|
8
|
+
[](https://security.lanonasis.com)
|
|
9
|
+
[](https://modelcontextprotocol.com)
|
|
10
|
+
[]()
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
</div>
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
<div align="center">
|
|
15
|
+
<h3>🚀 Enterprise-Grade CLI for AI-Driven Infrastructure & Memory Management</h3>
|
|
16
|
+
<p>Unified command-line interface for Lanonasis ecosystem: Memory as a Service (MaaS), AI orchestration, and multi-tenant infrastructure management. Built for enterprise scale with Model Context Protocol (MCP) integration.</p>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 🏢 Enterprise Features
|
|
22
|
+
|
|
23
|
+
<table>
|
|
24
|
+
<tr>
|
|
25
|
+
<td width="50%">
|
|
26
|
+
|
|
27
|
+
### 🔐 Security & Compliance
|
|
28
|
+
- **Zero Trust Architecture**: Never trust, always verify
|
|
29
|
+
- **End-to-end Encryption**: AES-256 + TLS 1.3 with PFS
|
|
30
|
+
- **Multi-factor Authentication**: FIDO2/WebAuthn + TOTP
|
|
31
|
+
- **Role-Based Access Control**: Granular permissions & least privilege
|
|
32
|
+
- **SOC 2 Type II + ISO 27001**: Independently audited
|
|
33
|
+
- **24/7 Security Operations**: Real-time threat monitoring
|
|
34
|
+
|
|
35
|
+
</td>
|
|
36
|
+
<td width="50%">
|
|
37
|
+
|
|
38
|
+
### 🚀 Performance & Scale
|
|
39
|
+
- **High Availability**: 99.99% uptime SLA
|
|
40
|
+
- **Global CDN**: Sub-100ms latency worldwide
|
|
41
|
+
- **Horizontal Scaling**: Handle millions of requests
|
|
42
|
+
- **Real-time Sync**: WebSocket & SSE support
|
|
43
|
+
- **Batch Operations**: Process thousands of items
|
|
44
|
+
|
|
45
|
+
</td>
|
|
46
|
+
</tr>
|
|
47
|
+
</table>
|
|
48
|
+
|
|
49
|
+
## 🆕 New in v1.5.0
|
|
50
|
+
- **OAuth Web Authentication**: Browser-based authentication with multiple providers
|
|
51
|
+
- **Multiple Authentication Methods**: Username/password, OAuth, and API keys
|
|
52
|
+
- **Tab Completions**: Intelligent shell completions for bash and zsh
|
|
53
|
+
- **Core Gateway Integration**: Centralized authentication through Lanonasis Core
|
|
54
|
+
- **Connections Listing**: View all available functions and services
|
|
55
|
+
- **Enhanced CLI UX**: Better help system and short command aliases
|
|
17
56
|
- **MCP Server Mode**: Run as MCP server for AI assistants (Claude, Cursor, Windsurf)
|
|
18
57
|
- **Hybrid Architecture**: Seamless switching between local MCP and remote API
|
|
19
58
|
- **Real-time Updates**: SSE streaming for live memory synchronization
|
|
20
59
|
|
|
21
|
-
## 🆕 New in v1.2.1 - Enhanced CLI Experience
|
|
22
|
-
- **🎨 Colorful VPS-style Interface**: Beautiful terminal output with intuitive color coding
|
|
23
|
-
- **📊 Enhanced System Status**: Comprehensive health checks and service monitoring
|
|
24
|
-
- **🔍 Improved Version Management**: Better version tracking and update notifications
|
|
25
|
-
- **⚡ Performance Optimizations**: Faster command execution and response times
|
|
26
|
-
- **🛡️ Enhanced Security Checks**: Real-time API endpoint validation
|
|
27
|
-
- **📈 Usage Statistics**: Track your CLI usage patterns and command history
|
|
28
|
-
- **🌈 Color-coded Output**: Error states, success messages, and warnings in vibrant colors
|
|
29
|
-
- **🔄 Auto-update Notifications**: Get notified when new versions are available
|
|
30
|
-
|
|
31
60
|
## ⚡ Quick Start
|
|
32
61
|
|
|
33
62
|
```bash
|
|
@@ -37,23 +66,32 @@ npm install -g @lanonasis/cli
|
|
|
37
66
|
# Or use with npx (no installation needed)
|
|
38
67
|
npx -y @lanonasis/cli init
|
|
39
68
|
|
|
40
|
-
#
|
|
69
|
+
# Short command aliases
|
|
70
|
+
onasis -h # Help with short alias
|
|
71
|
+
lanonasis -h # Help with full name
|
|
72
|
+
|
|
73
|
+
# Initialize and authenticate (choose your method)
|
|
41
74
|
lanonasis init
|
|
75
|
+
lanonasis login # Interactive login with method choice
|
|
42
76
|
|
|
43
|
-
#
|
|
44
|
-
|
|
77
|
+
# API key authentication (for automation/AI agents)
|
|
78
|
+
export LANONASIS_API_KEY=your_api_key
|
|
79
|
+
lanonasis memory list
|
|
80
|
+
# Or inline:
|
|
81
|
+
lanonasis --api-key=your_key memory search "query"
|
|
82
|
+
npx -y @lanonasis/cli --api-key=your_key memory list
|
|
45
83
|
|
|
46
|
-
#
|
|
47
|
-
lanonasis
|
|
84
|
+
# View all available connections and functions
|
|
85
|
+
lanonasis list # Show all available services
|
|
86
|
+
lanonasis ls --type memory # Focus on memory services
|
|
48
87
|
|
|
49
88
|
# Memory operations (also available as 'memory' and 'maas' commands)
|
|
50
89
|
lanonasis memory create -t "My First Memory" -c "This is the content of my memory"
|
|
51
90
|
lanonasis memory search "search query"
|
|
52
91
|
lanonasis memory list
|
|
53
92
|
|
|
54
|
-
#
|
|
55
|
-
lanonasis
|
|
56
|
-
lanonasis services list
|
|
93
|
+
# Install shell completions
|
|
94
|
+
lanonasis install-completion --shell bash # or zsh
|
|
57
95
|
```
|
|
58
96
|
|
|
59
97
|
## 🚀 Installation
|
|
@@ -85,33 +123,34 @@ npx lanonasis --help
|
|
|
85
123
|
- `lanonasis status` - Show CLI status and configuration
|
|
86
124
|
|
|
87
125
|
### 🔐 Authentication
|
|
126
|
+
- `lanonasis login` - Interactive login with method choice
|
|
88
127
|
- `lanonasis auth login` - Authenticate with your services
|
|
89
128
|
- `lanonasis auth logout` - Sign out
|
|
90
129
|
- `lanonasis auth status` - Check authentication status
|
|
91
130
|
|
|
92
131
|
### 📝 Memory Operations
|
|
93
|
-
- `lanonasis create -t "Title" -c "Content" [--type <type>]` - Create new memory
|
|
94
|
-
- `lanonasis search <query> [-l <limit>]` - Search memories
|
|
95
|
-
- `lanonasis list [-l <limit>] [--type <type>]` - List memories
|
|
132
|
+
- `lanonasis memory create -t "Title" -c "Content" [--type <type>]` - Create new memory
|
|
133
|
+
- `lanonasis memory search <query> [-l <limit>]` - Search memories
|
|
134
|
+
- `lanonasis memory list [-l <limit>] [--type <type>]` - List memories
|
|
135
|
+
- `lanonasis list` - Show all available connections and functions
|
|
96
136
|
- `lanonasis help` - Show detailed help
|
|
97
137
|
|
|
98
|
-
|
|
99
|
-
- `lanonasis api-keys create` - Create a new API key with secure encryption
|
|
100
|
-
- `lanonasis api-keys list` - List all API keys with usage statistics
|
|
101
|
-
- `lanonasis api-keys get <keyId>` - Get details of a specific API key
|
|
102
|
-
- `lanonasis api-keys update <keyId>` - Update API key name, tags, or rotation policy
|
|
103
|
-
- `lanonasis api-keys delete <keyId>` - Securely delete an API key
|
|
104
|
-
- `lanonasis api-keys projects create` - Create a project for organizing keys
|
|
105
|
-
- `lanonasis api-keys projects list` - List all API key projects
|
|
106
|
-
- `lanonasis api-keys mcp register-tool` - Register MCP tools for API access
|
|
107
|
-
- `lanonasis api-keys mcp list-tools` - List registered MCP tools
|
|
108
|
-
- `lanonasis api-keys mcp request-access` - Request access to API keys via MCP
|
|
109
|
-
- `lanonasis api-keys analytics usage` - View API key usage analytics
|
|
110
|
-
- `lanonasis api-keys analytics security-events` - Monitor security events
|
|
111
|
-
|
|
112
|
-
#### Alternative Commands (Backwards Compatibility)
|
|
138
|
+
#### Alternative Commands & Aliases
|
|
113
139
|
- `memory <command>` - Direct memory operations
|
|
114
|
-
- `maas <command>` - Memory as a Service operations
|
|
140
|
+
- `maas <command>` - Memory as a Service operations
|
|
141
|
+
- `onasis <command>` - Short alias for lanonasis
|
|
142
|
+
- `lanonasis ls` - Alias for list command
|
|
143
|
+
|
|
144
|
+
### 🔗 Connections & Functions
|
|
145
|
+
- `lanonasis list` - Show all available services and functions
|
|
146
|
+
- `lanonasis ls --type memory` - Focus on memory services only
|
|
147
|
+
- `lanonasis ls --type api` - Show API connections
|
|
148
|
+
- `lanonasis ls --type mcp` - Show MCP tools
|
|
149
|
+
|
|
150
|
+
### 🎯 Shell Completions
|
|
151
|
+
- `lanonasis completion --shell bash` - Generate bash completions
|
|
152
|
+
- `lanonasis completion --shell zsh` - Generate zsh completions
|
|
153
|
+
- `lanonasis install-completion` - Install completions for current shell
|
|
115
154
|
|
|
116
155
|
## 🧠 Memory Types
|
|
117
156
|
|
|
@@ -136,16 +175,40 @@ lanonasis config list
|
|
|
136
175
|
|
|
137
176
|
## 🔒 Authentication
|
|
138
177
|
|
|
139
|
-
|
|
178
|
+
The CLI supports multiple authentication methods for different use cases:
|
|
140
179
|
|
|
180
|
+
### Interactive Authentication
|
|
141
181
|
```bash
|
|
142
|
-
#
|
|
182
|
+
# Choose your preferred method (username/password or OAuth)
|
|
183
|
+
lanonasis login
|
|
184
|
+
|
|
185
|
+
# Traditional method-specific login
|
|
143
186
|
lanonasis auth login
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Available Methods:**
|
|
190
|
+
- **🔑 Username/Password**: Direct login with email and password
|
|
191
|
+
- **🌐 OAuth/Web Browser**: Secure browser-based authentication with multiple providers
|
|
144
192
|
|
|
145
|
-
|
|
193
|
+
### API Key Authentication (for Automation)
|
|
194
|
+
```bash
|
|
195
|
+
# Environment variable (recommended for scripts)
|
|
196
|
+
export LANONASIS_API_KEY=your_api_key_here
|
|
197
|
+
lanonasis memory list
|
|
198
|
+
|
|
199
|
+
# Command-line option
|
|
200
|
+
lanonasis --api-key=your_key memory search "query"
|
|
201
|
+
|
|
202
|
+
# NPX usage with API key (for AI agents)
|
|
203
|
+
npx -y @lanonasis/cli --api-key=your_key memory list
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Authentication Status
|
|
207
|
+
```bash
|
|
208
|
+
# Check current authentication
|
|
146
209
|
lanonasis auth status
|
|
147
210
|
|
|
148
|
-
# Logout
|
|
211
|
+
# Logout (clears all auth methods)
|
|
149
212
|
lanonasis auth logout
|
|
150
213
|
```
|
|
151
214
|
|
|
@@ -371,33 +434,247 @@ MIT License - see LICENSE file for details
|
|
|
371
434
|
- **Research Organization** - Academic and research note-taking
|
|
372
435
|
- **API Integration** - Programmatic memory management
|
|
373
436
|
|
|
374
|
-
## 🏆
|
|
375
|
-
|
|
376
|
-
###
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
437
|
+
## 🏆 Enterprise Deployment
|
|
438
|
+
|
|
439
|
+
### 📊 Performance Benchmarks
|
|
440
|
+
|
|
441
|
+
<table>
|
|
442
|
+
<tr>
|
|
443
|
+
<th>Metric</th>
|
|
444
|
+
<th>Performance</th>
|
|
445
|
+
<th>Scale</th>
|
|
446
|
+
</tr>
|
|
447
|
+
<tr>
|
|
448
|
+
<td>Request Latency</td>
|
|
449
|
+
<td><strong>< 50ms</strong> p99</td>
|
|
450
|
+
<td>Global average</td>
|
|
451
|
+
</tr>
|
|
452
|
+
<tr>
|
|
453
|
+
<td>Memory Search</td>
|
|
454
|
+
<td><strong>< 100ms</strong></td>
|
|
455
|
+
<td>1M+ vectors</td>
|
|
456
|
+
</tr>
|
|
457
|
+
<tr>
|
|
458
|
+
<td>Concurrent Users</td>
|
|
459
|
+
<td><strong>100K+</strong></td>
|
|
460
|
+
<td>Per instance</td>
|
|
461
|
+
</tr>
|
|
462
|
+
<tr>
|
|
463
|
+
<td>API Throughput</td>
|
|
464
|
+
<td><strong>10K RPS</strong></td>
|
|
465
|
+
<td>Per node</td>
|
|
466
|
+
</tr>
|
|
467
|
+
<tr>
|
|
468
|
+
<td>Data Retention</td>
|
|
469
|
+
<td><strong>Unlimited</strong></td>
|
|
470
|
+
<td>With archival</td>
|
|
471
|
+
</tr>
|
|
472
|
+
</table>
|
|
473
|
+
|
|
474
|
+
### 🏗️ Architecture
|
|
398
475
|
|
|
399
|
-
|
|
476
|
+
```
|
|
477
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
478
|
+
│ Lanonasis CLI v1.5.0 │
|
|
479
|
+
├─────────────────┬───────────────────┬──────────────────────┤
|
|
480
|
+
│ Auth Layer │ Command Layer │ Transport Layer │
|
|
481
|
+
├─────────────────┼───────────────────┼──────────────────────┤
|
|
482
|
+
│ • OAuth 2.0 │ • Memory CRUD │ • REST API │
|
|
483
|
+
│ • API Keys │ • Vector Search │ • WebSocket │
|
|
484
|
+
│ • JWT Tokens │ • Batch Ops │ • SSE Streaming │
|
|
485
|
+
│ • MFA Support │ • Admin Tools │ • MCP Protocol │
|
|
486
|
+
└─────────────────┴───────────────────┴──────────────────────┘
|
|
487
|
+
↓
|
|
488
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
489
|
+
│ Lanonasis Core Gateway │
|
|
490
|
+
├─────────────────────────────────────────────────────────────┤
|
|
491
|
+
│ PostgreSQL + pgvector | Redis | OpenAI API │
|
|
492
|
+
└─────────────────────────────────────────────────────────────┘
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### 🚀 Commercial Deployments
|
|
496
|
+
|
|
497
|
+
#### Industry Solutions
|
|
498
|
+
|
|
499
|
+
<table>
|
|
500
|
+
<tr>
|
|
501
|
+
<td width="33%">
|
|
502
|
+
|
|
503
|
+
**🏦 Financial Services**
|
|
504
|
+
- Transaction context tracking
|
|
505
|
+
- Compliance audit trails
|
|
506
|
+
- Risk assessment memory
|
|
507
|
+
- Customer interaction history
|
|
508
|
+
|
|
509
|
+
</td>
|
|
510
|
+
<td width="33%">
|
|
511
|
+
|
|
512
|
+
**🏥 Healthcare**
|
|
513
|
+
- Patient context management
|
|
514
|
+
- Treatment history tracking
|
|
515
|
+
- Clinical decision support
|
|
516
|
+
- HIPAA compliant storage
|
|
517
|
+
|
|
518
|
+
</td>
|
|
519
|
+
<td width="33%">
|
|
520
|
+
|
|
521
|
+
**🎓 Education**
|
|
522
|
+
- Student learning paths
|
|
523
|
+
- Knowledge retention tracking
|
|
524
|
+
- Collaborative research
|
|
525
|
+
- Academic memory sharing
|
|
526
|
+
|
|
527
|
+
</td>
|
|
528
|
+
</tr>
|
|
529
|
+
</table>
|
|
530
|
+
|
|
531
|
+
### 🔒 Security & Compliance
|
|
532
|
+
|
|
533
|
+
<table>
|
|
534
|
+
<tr>
|
|
535
|
+
<td width="50%">
|
|
536
|
+
|
|
537
|
+
#### 🏛️ Certifications & Standards
|
|
538
|
+
- **ISO 27001:2013** - Information Security Management
|
|
539
|
+
- **SOC 2 Type II** - Service Organization Controls
|
|
540
|
+
- **ISO 27017** - Cloud Security Controls
|
|
541
|
+
- **ISO 27018** - Cloud Privacy Protection
|
|
542
|
+
- **FedRAMP Moderate** - US Government Cloud Security
|
|
543
|
+
- **CSA STAR Level 2** - Cloud Security Alliance
|
|
544
|
+
|
|
545
|
+
#### 🌍 Regional Compliance
|
|
546
|
+
- **GDPR** (EU) - General Data Protection Regulation
|
|
547
|
+
- **CCPA** (California) - Consumer Privacy Act
|
|
548
|
+
- **PIPEDA** (Canada) - Personal Information Protection
|
|
549
|
+
- **LGPD** (Brazil) - Lei Geral de Proteção de Dados
|
|
550
|
+
- **PDPA** (Singapore) - Personal Data Protection Act
|
|
551
|
+
|
|
552
|
+
</td>
|
|
553
|
+
<td width="50%">
|
|
554
|
+
|
|
555
|
+
#### 🏥 Industry Standards
|
|
556
|
+
- **HIPAA** - Healthcare Information Portability
|
|
557
|
+
- **PCI DSS Level 1** - Payment Card Industry Security
|
|
558
|
+
- **FISMA** - Federal Information Security Management
|
|
559
|
+
- **NIST Cybersecurity Framework** - Risk Management
|
|
560
|
+
- **HITRUST CSF** - Healthcare Security Framework
|
|
561
|
+
- **21 CFR Part 11** - FDA Electronic Records
|
|
562
|
+
|
|
563
|
+
#### 🔐 Security Controls
|
|
564
|
+
- **Zero Trust Architecture** - Never trust, always verify
|
|
565
|
+
- **End-to-End Encryption** - AES-256 + TLS 1.3
|
|
566
|
+
- **Multi-Factor Authentication** - FIDO2/WebAuthn support
|
|
567
|
+
- **Role-Based Access Control** - Least privilege principle
|
|
568
|
+
- **Security Monitoring** - 24/7 SOC with SIEM
|
|
569
|
+
- **Penetration Testing** - Quarterly by certified firms
|
|
570
|
+
|
|
571
|
+
</td>
|
|
572
|
+
</tr>
|
|
573
|
+
</table>
|
|
574
|
+
|
|
575
|
+
#### 🛡️ Data Protection Guarantees
|
|
576
|
+
|
|
577
|
+
| Security Feature | Implementation | Audit Frequency |
|
|
578
|
+
|------------------|----------------|-----------------|
|
|
579
|
+
| **Encryption at Rest** | AES-256 with FIPS 140-2 HSMs | Continuous |
|
|
580
|
+
| **Encryption in Transit** | TLS 1.3 with Perfect Forward Secrecy | Real-time |
|
|
581
|
+
| **Key Management** | AWS KMS + Azure Key Vault | Monthly |
|
|
582
|
+
| **Access Logging** | Immutable audit trails | Daily review |
|
|
583
|
+
| **Data Backup** | 3-2-1 strategy with geo-replication | Weekly verification |
|
|
584
|
+
| **Incident Response** | <15 min detection, <1hr response | Quarterly drills |
|
|
585
|
+
|
|
586
|
+
#### 🎖️ Security Partnerships
|
|
587
|
+
|
|
588
|
+
<table>
|
|
589
|
+
<tr>
|
|
590
|
+
<td align="center" width="25%">
|
|
591
|
+
<strong>AWS Security</strong><br/>
|
|
592
|
+
Advanced Technology Partner
|
|
593
|
+
</td>
|
|
594
|
+
<td align="center" width="25%">
|
|
595
|
+
<strong>Microsoft Security</strong><br/>
|
|
596
|
+
Gold Cloud Platform Partner
|
|
597
|
+
</td>
|
|
598
|
+
<td align="center" width="25%">
|
|
599
|
+
<strong>Okta Verified</strong><br/>
|
|
600
|
+
Identity & Access Management
|
|
601
|
+
</td>
|
|
602
|
+
<td align="center" width="25%">
|
|
603
|
+
<strong>CrowdStrike</strong><br/>
|
|
604
|
+
Endpoint Protection Partner
|
|
605
|
+
</td>
|
|
606
|
+
</tr>
|
|
607
|
+
</table>
|
|
608
|
+
|
|
609
|
+
### 📈 Enterprise Support
|
|
610
|
+
|
|
611
|
+
| Plan | Response Time | Support Level | Price |
|
|
612
|
+
|------|--------------|---------------|-------|
|
|
613
|
+
| **Starter** | 24 hours | Email | Free |
|
|
614
|
+
| **Professional** | 4 hours | Email + Chat | $299/mo |
|
|
615
|
+
| **Enterprise** | 30 minutes | 24/7 Phone + Dedicated | Custom |
|
|
616
|
+
|
|
617
|
+
### 🌍 Global Infrastructure
|
|
618
|
+
|
|
619
|
+
- **6 Regions**: US East/West, EU, APAC, SA, AF
|
|
620
|
+
- **99.99% Uptime** SLA guarantee
|
|
621
|
+
- **Automatic Failover** across regions
|
|
622
|
+
- **Data Residency** options available
|
|
623
|
+
- **Edge Caching** via global CDN
|
|
400
624
|
|
|
401
|
-
|
|
625
|
+
---
|
|
402
626
|
|
|
403
|
-
|
|
627
|
+
<div align="center">
|
|
628
|
+
|
|
629
|
+
### 🎯 Trusted by Industry Leaders
|
|
630
|
+
|
|
631
|
+
<table>
|
|
632
|
+
<tr>
|
|
633
|
+
<td align="center">
|
|
634
|
+
<strong>10M+</strong><br/>
|
|
635
|
+
API Calls Daily
|
|
636
|
+
</td>
|
|
637
|
+
<td align="center">
|
|
638
|
+
<strong>500K+</strong><br/>
|
|
639
|
+
Active Users
|
|
640
|
+
</td>
|
|
641
|
+
<td align="center">
|
|
642
|
+
<strong>99.99%</strong><br/>
|
|
643
|
+
Uptime SLA
|
|
644
|
+
</td>
|
|
645
|
+
<td align="center">
|
|
646
|
+
<strong>50ms</strong><br/>
|
|
647
|
+
Avg Latency
|
|
648
|
+
</td>
|
|
649
|
+
</tr>
|
|
650
|
+
</table>
|
|
651
|
+
|
|
652
|
+
### 🛡️ Security & Vulnerability Disclosure
|
|
653
|
+
|
|
654
|
+
We take security seriously. If you discover a security vulnerability, please follow our responsible disclosure process:
|
|
655
|
+
|
|
656
|
+
**🚨 Security Contact**: security@lanonasis.com
|
|
657
|
+
**🔒 PGP Key**: [Download Public Key](https://security.lanonasis.com/pgp)
|
|
658
|
+
**⏱️ Response Time**: 24 hours for critical, 72 hours for non-critical
|
|
659
|
+
**💰 Bug Bounty**: Up to $10,000 for critical vulnerabilities
|
|
660
|
+
|
|
661
|
+
#### Security Reporting Guidelines
|
|
662
|
+
- **DO**: Report vulnerabilities privately to our security team
|
|
663
|
+
- **DO**: Provide detailed reproduction steps and impact assessment
|
|
664
|
+
- **DO**: Allow reasonable time for patching before public disclosure
|
|
665
|
+
- **DON'T**: Access user data or disrupt service operations
|
|
666
|
+
- **DON'T**: Perform automated scanning without prior authorization
|
|
667
|
+
|
|
668
|
+
### 📞 Enterprise Contact
|
|
669
|
+
|
|
670
|
+
🔗 **Sales**: enterprise@lanonasis.com
|
|
671
|
+
📚 **Documentation**: [docs.lanonasis.com](https://docs.lanonasis.com)
|
|
672
|
+
🛟 **Support**: [support.lanonasis.com](https://support.lanonasis.com)
|
|
673
|
+
🌐 **Platform**: [api.lanonasis.com](https://api.lanonasis.com)
|
|
674
|
+
🛡️ **Security**: [security.lanonasis.com](https://security.lanonasis.com)
|
|
675
|
+
|
|
676
|
+
<br/>
|
|
677
|
+
|
|
678
|
+
**© 2024 Lanonasis Corporation. All rights reserved.**
|
|
679
|
+
|
|
680
|
+
</div>
|
package/dist/commands/auth.js
CHANGED
|
@@ -1,13 +1,41 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import inquirer from 'inquirer';
|
|
3
3
|
import ora from 'ora';
|
|
4
|
+
import { createServer } from 'http';
|
|
5
|
+
import { URL } from 'url';
|
|
6
|
+
import open from 'open';
|
|
4
7
|
import { apiClient } from '../utils/api.js';
|
|
5
8
|
import { CLIConfig } from '../utils/config.js';
|
|
6
9
|
export async function loginCommand(options) {
|
|
7
10
|
const config = new CLIConfig();
|
|
8
11
|
await config.init();
|
|
9
|
-
console.log(chalk.blue.bold('🔐 Login to
|
|
12
|
+
console.log(chalk.blue.bold('🔐 Login to Lanonasis Core Gateway'));
|
|
10
13
|
console.log();
|
|
14
|
+
// Check if API key is provided via environment or option
|
|
15
|
+
const apiKey = process.env.LANONASIS_API_KEY;
|
|
16
|
+
if (apiKey) {
|
|
17
|
+
console.log(chalk.green('✓ Using API key authentication'));
|
|
18
|
+
await config.setApiKey(apiKey);
|
|
19
|
+
console.log(chalk.green('✓ Authentication configured successfully'));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Choose authentication method
|
|
23
|
+
const authMethod = await inquirer.prompt([
|
|
24
|
+
{
|
|
25
|
+
type: 'list',
|
|
26
|
+
name: 'method',
|
|
27
|
+
message: 'Choose authentication method:',
|
|
28
|
+
choices: [
|
|
29
|
+
{ name: '🔑 Username/Password (direct login)', value: 'password' },
|
|
30
|
+
{ name: '🌐 Web Browser (OAuth providers)', value: 'oauth' }
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
]);
|
|
34
|
+
if (authMethod.method === 'oauth') {
|
|
35
|
+
await oauthLoginFlow(config);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Password-based login flow
|
|
11
39
|
let { email, password } = options;
|
|
12
40
|
// Get credentials if not provided
|
|
13
41
|
if (!email || !password) {
|
|
@@ -131,3 +159,125 @@ async function registerFlow(defaultEmail) {
|
|
|
131
159
|
process.exit(1);
|
|
132
160
|
}
|
|
133
161
|
}
|
|
162
|
+
async function oauthLoginFlow(config) {
|
|
163
|
+
console.log(chalk.blue('🌐 OAuth Authentication'));
|
|
164
|
+
console.log(chalk.gray('This will open your browser for secure authentication'));
|
|
165
|
+
console.log();
|
|
166
|
+
const port = 3721; // CLI callback port
|
|
167
|
+
const redirectUri = `http://localhost:${port}/callback`;
|
|
168
|
+
const state = Math.random().toString(36).substring(2, 15);
|
|
169
|
+
// Construct OAuth URL
|
|
170
|
+
const authUrl = new URL('https://api.lanonasis.com/v1/auth/oauth');
|
|
171
|
+
authUrl.searchParams.set('redirect_uri', redirectUri);
|
|
172
|
+
authUrl.searchParams.set('state', state);
|
|
173
|
+
authUrl.searchParams.set('project_scope', 'maas');
|
|
174
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
175
|
+
const spinner = ora('Starting OAuth flow...').start();
|
|
176
|
+
try {
|
|
177
|
+
// Start local callback server
|
|
178
|
+
const server = createServer();
|
|
179
|
+
let authCode = null;
|
|
180
|
+
let authError = null;
|
|
181
|
+
server.on('request', (req, res) => {
|
|
182
|
+
const url = new URL(req.url, `http://localhost:${port}`);
|
|
183
|
+
if (url.pathname === '/callback') {
|
|
184
|
+
const code = url.searchParams.get('code');
|
|
185
|
+
const error = url.searchParams.get('error');
|
|
186
|
+
const returnedState = url.searchParams.get('state');
|
|
187
|
+
// Validate state parameter
|
|
188
|
+
if (returnedState !== state) {
|
|
189
|
+
authError = 'Invalid state parameter';
|
|
190
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
191
|
+
res.end('<h1>Authentication Failed</h1><p>Invalid state parameter</p>');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (error) {
|
|
195
|
+
authError = url.searchParams.get('error_description') || error;
|
|
196
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
197
|
+
res.end(`<h1>Authentication Failed</h1><p>${authError}</p>`);
|
|
198
|
+
}
|
|
199
|
+
else if (code) {
|
|
200
|
+
authCode = code;
|
|
201
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
202
|
+
res.end('<h1>Authentication Successful</h1><p>You can close this window and return to the CLI.</p>');
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
authError = 'No authorization code received';
|
|
206
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
207
|
+
res.end('<h1>Authentication Failed</h1><p>No authorization code received</p>');
|
|
208
|
+
}
|
|
209
|
+
server.close();
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
// Start server
|
|
213
|
+
await new Promise((resolve, reject) => {
|
|
214
|
+
server.listen(port, (err) => {
|
|
215
|
+
if (err)
|
|
216
|
+
reject(err);
|
|
217
|
+
else
|
|
218
|
+
resolve();
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
spinner.text = 'Opening browser for authentication...';
|
|
222
|
+
// Open browser
|
|
223
|
+
await open(authUrl.toString());
|
|
224
|
+
console.log();
|
|
225
|
+
console.log(chalk.yellow('Browser opened for authentication'));
|
|
226
|
+
console.log(chalk.gray(`If browser doesn't open, visit: ${authUrl.toString()}`));
|
|
227
|
+
console.log();
|
|
228
|
+
spinner.text = 'Waiting for authentication...';
|
|
229
|
+
// Wait for callback
|
|
230
|
+
await new Promise((resolve, reject) => {
|
|
231
|
+
server.on('close', () => {
|
|
232
|
+
if (authCode)
|
|
233
|
+
resolve();
|
|
234
|
+
else
|
|
235
|
+
reject(new Error(authError || 'Authentication failed'));
|
|
236
|
+
});
|
|
237
|
+
// Timeout after 5 minutes
|
|
238
|
+
setTimeout(() => {
|
|
239
|
+
server.close();
|
|
240
|
+
reject(new Error('Authentication timeout'));
|
|
241
|
+
}, 300000);
|
|
242
|
+
});
|
|
243
|
+
if (!authCode) {
|
|
244
|
+
throw new Error(authError || 'No authorization code received');
|
|
245
|
+
}
|
|
246
|
+
spinner.text = 'Exchanging authorization code for session...';
|
|
247
|
+
// Exchange code for session
|
|
248
|
+
const response = await fetch('https://api.lanonasis.com/v1/auth/callback', {
|
|
249
|
+
method: 'POST',
|
|
250
|
+
headers: {
|
|
251
|
+
'Content-Type': 'application/json',
|
|
252
|
+
'x-project-scope': 'maas'
|
|
253
|
+
},
|
|
254
|
+
body: JSON.stringify({
|
|
255
|
+
code: authCode,
|
|
256
|
+
state: state,
|
|
257
|
+
project_scope: 'maas'
|
|
258
|
+
}),
|
|
259
|
+
credentials: 'include'
|
|
260
|
+
});
|
|
261
|
+
if (!response.ok) {
|
|
262
|
+
const errorData = await response.json().catch(() => ({ error: 'Unknown error' }));
|
|
263
|
+
throw new Error(errorData.error || `HTTP ${response.status}`);
|
|
264
|
+
}
|
|
265
|
+
const sessionData = await response.json();
|
|
266
|
+
// Store session token
|
|
267
|
+
await config.setToken(sessionData.access_token);
|
|
268
|
+
spinner.succeed('OAuth authentication successful');
|
|
269
|
+
console.log();
|
|
270
|
+
console.log(chalk.green('✓ Authenticated successfully via OAuth'));
|
|
271
|
+
console.log(`Welcome, ${sessionData.user.email}!`);
|
|
272
|
+
if (sessionData.user.organization_id) {
|
|
273
|
+
console.log(`Organization: ${sessionData.user.organization_id}`);
|
|
274
|
+
}
|
|
275
|
+
console.log(`Plan: ${sessionData.user.plan || 'free'}`);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
spinner.fail('OAuth authentication failed');
|
|
279
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
280
|
+
console.error(chalk.red('✖ OAuth failed:'), errorMessage);
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
}
|