higherup 1.0.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 +192 -0
- package/bin/higherup.js +14 -0
- package/dist/agent.d.ts +9 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +639 -0
- package/dist/agent.js.map +1 -0
- package/package.json +62 -0
package/README.md
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# @higherup/cli
|
|
2
|
+
|
|
3
|
+
**Give AI agents full access to your development machine.**
|
|
4
|
+
|
|
5
|
+
A CLI agent that connects your local environment to Higherup, enabling AI platforms to execute commands, manage files, capture screens, and work autonomously.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Install globally from npm
|
|
11
|
+
npm install -g higherup-agent
|
|
12
|
+
|
|
13
|
+
# Or clone and build locally
|
|
14
|
+
git clone https://github.com/higherup/agent
|
|
15
|
+
cd agent
|
|
16
|
+
npm install
|
|
17
|
+
npm run build
|
|
18
|
+
npm link
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
1. **Sign up** at [higherup.ai](https://higherup.ai) and create a workspace
|
|
24
|
+
2. **Copy your credentials** from the dashboard:
|
|
25
|
+
- Workspace ID
|
|
26
|
+
- API Token
|
|
27
|
+
3. **Configure the agent** (one-time setup):
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
higherup config --token YOUR_API_TOKEN
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
4. **Connect your workspace**:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
higherup connect -w YOUR_WORKSPACE_ID -p /path/to/your/project
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
5. **Enable autonomous mode** (optional - removes all restrictions):
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
higherup connect -w YOUR_WORKSPACE_ID -p . --autonomous
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Commands
|
|
46
|
+
|
|
47
|
+
### `higherup connect`
|
|
48
|
+
|
|
49
|
+
Connect a local workspace to Higherup.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
higherup connect [options]
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
-w, --workspace <id> Workspace ID from dashboard (required)
|
|
56
|
+
-p, --path <path> Local workspace path (default: current directory)
|
|
57
|
+
-t, --token <token> API token (or use config/env var)
|
|
58
|
+
-n, --name <name> Custom agent name for identification
|
|
59
|
+
--autonomous Enable autonomous mode (unrestricted access)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### `higherup config`
|
|
63
|
+
|
|
64
|
+
Manage agent configuration.
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Save your API token
|
|
68
|
+
higherup config --token YOUR_API_TOKEN
|
|
69
|
+
|
|
70
|
+
# Set default workspace
|
|
71
|
+
higherup config --workspace YOUR_WORKSPACE_ID
|
|
72
|
+
|
|
73
|
+
# Show current configuration
|
|
74
|
+
higherup config --show
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### `higherup status`
|
|
78
|
+
|
|
79
|
+
Check active agent sessions.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
higherup status
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Capabilities
|
|
86
|
+
|
|
87
|
+
When connected, AI agents can:
|
|
88
|
+
|
|
89
|
+
| Capability | Description |
|
|
90
|
+
|------------|-------------|
|
|
91
|
+
| `command_execute` | Run any shell command |
|
|
92
|
+
| `file_read` | Read file contents |
|
|
93
|
+
| `file_write` | Create/modify files |
|
|
94
|
+
| `file_list` | List directory contents |
|
|
95
|
+
| `screen_capture` | Take screenshots |
|
|
96
|
+
| `system_info` | Get machine details (OS, CPU, memory) |
|
|
97
|
+
|
|
98
|
+
## Autonomous Mode
|
|
99
|
+
|
|
100
|
+
Enable `--autonomous` to remove all restrictions:
|
|
101
|
+
|
|
102
|
+
- ✅ No command blocking
|
|
103
|
+
- ✅ Full system access
|
|
104
|
+
- ✅ Unrestricted file operations
|
|
105
|
+
- ✅ Complete AI control
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
higherup connect -w WORKSPACE_ID -p . --autonomous
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Security
|
|
112
|
+
|
|
113
|
+
- All connections use HTTPS encryption
|
|
114
|
+
- Path traversal attacks are blocked automatically
|
|
115
|
+
- Operations are restricted to your workspace directory only
|
|
116
|
+
- Dangerous command patterns blocked by default (unless autonomous)
|
|
117
|
+
- API tokens can be regenerated at any time
|
|
118
|
+
|
|
119
|
+
## Screen Capture Requirements
|
|
120
|
+
|
|
121
|
+
- **macOS**: Built-in `screencapture` (may need Screen Recording permission)
|
|
122
|
+
- **Windows**: PowerShell (built-in)
|
|
123
|
+
- **Linux**: `scrot` or `imagemagick` (`import` command)
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Linux: Install screen capture tools
|
|
127
|
+
sudo apt install scrot # Debian/Ubuntu
|
|
128
|
+
sudo dnf install scrot # Fedora
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## How It Works
|
|
132
|
+
|
|
133
|
+
1. Agent registers with Higherup using your API token
|
|
134
|
+
2. Polls the server for pending commands every 2 seconds
|
|
135
|
+
3. Executes commands locally in your workspace directory
|
|
136
|
+
4. Reports results back to the server
|
|
137
|
+
5. AI platforms receive command output in real-time
|
|
138
|
+
|
|
139
|
+
## Supported AI Platforms
|
|
140
|
+
|
|
141
|
+
Works with any AI assistant that integrates with Higherup:
|
|
142
|
+
- Claude (via MCP protocol)
|
|
143
|
+
- GPT/ChatGPT
|
|
144
|
+
- Lovable
|
|
145
|
+
- Bolt
|
|
146
|
+
- Cursor
|
|
147
|
+
- Other AI platforms via the Higherup API
|
|
148
|
+
|
|
149
|
+
## Requirements
|
|
150
|
+
|
|
151
|
+
- Node.js 18+
|
|
152
|
+
- macOS, Linux, or Windows
|
|
153
|
+
|
|
154
|
+
## Environment Variables
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# API endpoint (defaults to Higherup service)
|
|
158
|
+
HIGHERUP_API_URL=https://pltlcpqtivuvyeuywvql.supabase.co/functions/v1/agent-relay
|
|
159
|
+
|
|
160
|
+
# Your API token (alternative to --token flag)
|
|
161
|
+
HIGHERUP_API_TOKEN=your_token_here
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## API Integration
|
|
165
|
+
|
|
166
|
+
Once connected, AI platforms can control your machine via:
|
|
167
|
+
|
|
168
|
+
- **REST API** - Standard HTTP endpoints
|
|
169
|
+
- **WebSocket** - Real-time streaming
|
|
170
|
+
- **MCP Protocol** - Native AI assistant integration
|
|
171
|
+
|
|
172
|
+
See [API Documentation](https://higherup.ai/api) for details.
|
|
173
|
+
|
|
174
|
+
## Troubleshooting
|
|
175
|
+
|
|
176
|
+
### Connection Issues
|
|
177
|
+
- Ensure your API token is correct (regenerate from dashboard if needed)
|
|
178
|
+
- Check that the workspace ID matches your dashboard
|
|
179
|
+
- Verify your firewall allows outbound HTTPS connections
|
|
180
|
+
|
|
181
|
+
### Screen Capture Not Working
|
|
182
|
+
- macOS: Grant Screen Recording permission in System Preferences
|
|
183
|
+
- Linux: Install `scrot` or `imagemagick`
|
|
184
|
+
- Windows: Should work out of the box with PowerShell
|
|
185
|
+
|
|
186
|
+
### Permission Errors
|
|
187
|
+
- The agent can only access files within the specified workspace path
|
|
188
|
+
- Ensure you have read/write permissions for the workspace directory
|
|
189
|
+
|
|
190
|
+
## License
|
|
191
|
+
|
|
192
|
+
MIT
|
package/bin/higherup.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Higherup CLI Entry Point
|
|
5
|
+
* This file is the npm package binary entry point
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import('../dist/agent.js').catch((err) => {
|
|
9
|
+
console.error('Failed to load Higherup agent:', err.message);
|
|
10
|
+
console.error('');
|
|
11
|
+
console.error('If you are developing locally, run: npm run dev');
|
|
12
|
+
console.error('Otherwise, make sure to build first: npm run build');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
});
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Higherup Local Agent
|
|
3
|
+
*
|
|
4
|
+
* This agent runs on your local PC and connects to the Higherup service,
|
|
5
|
+
* enabling secure remote command execution, file operations, and screen capture
|
|
6
|
+
* from cloud-based AI coding platforms.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Higherup Local Agent
|
|
3
|
+
*
|
|
4
|
+
* This agent runs on your local PC and connects to the Higherup service,
|
|
5
|
+
* enabling secure remote command execution, file operations, and screen capture
|
|
6
|
+
* from cloud-based AI coding platforms.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import ora from 'ora';
|
|
11
|
+
import * as fs from 'fs/promises';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import * as os from 'os';
|
|
14
|
+
import { spawn } from 'child_process';
|
|
15
|
+
import { exec } from 'child_process';
|
|
16
|
+
import { promisify } from 'util';
|
|
17
|
+
const execAsync = promisify(exec);
|
|
18
|
+
// Configuration
|
|
19
|
+
const API_BASE_URL = process.env.HIGHERUP_API_URL || 'https://pltlcpqtivuvyeuywvql.supabase.co/functions/v1/agent-relay';
|
|
20
|
+
const CONFIG_DIR = path.join(os.homedir(), '.higherup');
|
|
21
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
22
|
+
const POLL_INTERVAL = 2000; // 2 seconds
|
|
23
|
+
// Colors for terminal output
|
|
24
|
+
const colors = {
|
|
25
|
+
success: chalk.green,
|
|
26
|
+
error: chalk.red,
|
|
27
|
+
info: chalk.cyan,
|
|
28
|
+
warning: chalk.yellow,
|
|
29
|
+
command: chalk.magenta,
|
|
30
|
+
file: chalk.blue,
|
|
31
|
+
dim: chalk.gray,
|
|
32
|
+
bold: chalk.bold,
|
|
33
|
+
};
|
|
34
|
+
class HigherupAgent {
|
|
35
|
+
workspacePath = '';
|
|
36
|
+
workspaceId = '';
|
|
37
|
+
sessionId = '';
|
|
38
|
+
apiToken = '';
|
|
39
|
+
agentName = 'local';
|
|
40
|
+
isRunning = false;
|
|
41
|
+
commandCount = 0;
|
|
42
|
+
pollTimer = null;
|
|
43
|
+
autonomousMode = false;
|
|
44
|
+
constructor() { }
|
|
45
|
+
async connect(workspacePath, workspaceId, apiToken, agentName, autonomous) {
|
|
46
|
+
this.workspacePath = path.resolve(workspacePath);
|
|
47
|
+
this.workspaceId = workspaceId;
|
|
48
|
+
this.apiToken = apiToken;
|
|
49
|
+
this.agentName = agentName || `${os.hostname()}-${os.platform()}`;
|
|
50
|
+
this.autonomousMode = autonomous || false;
|
|
51
|
+
const spinner = ora('Connecting to Higherup service...').start();
|
|
52
|
+
try {
|
|
53
|
+
// Validate workspace path
|
|
54
|
+
const stats = await fs.stat(this.workspacePath);
|
|
55
|
+
if (!stats.isDirectory()) {
|
|
56
|
+
spinner.fail('Invalid workspace path: must be a directory');
|
|
57
|
+
throw new Error('Invalid workspace path');
|
|
58
|
+
}
|
|
59
|
+
// Register with the relay service
|
|
60
|
+
const response = await this.apiCall('register', {
|
|
61
|
+
workspace_id: this.workspaceId,
|
|
62
|
+
agent_name: this.agentName,
|
|
63
|
+
capabilities: [
|
|
64
|
+
'command_execute',
|
|
65
|
+
'file_read',
|
|
66
|
+
'file_write',
|
|
67
|
+
'file_list',
|
|
68
|
+
'screen_capture',
|
|
69
|
+
'system_info',
|
|
70
|
+
],
|
|
71
|
+
autonomous_mode: this.autonomousMode,
|
|
72
|
+
});
|
|
73
|
+
if (!response.success) {
|
|
74
|
+
throw new Error(response.error || 'Registration failed');
|
|
75
|
+
}
|
|
76
|
+
this.sessionId = response.session_id;
|
|
77
|
+
spinner.succeed('Connected to Higherup service!');
|
|
78
|
+
this.printBanner();
|
|
79
|
+
this.isRunning = true;
|
|
80
|
+
// Start polling for commands
|
|
81
|
+
this.startPolling();
|
|
82
|
+
// Start heartbeat
|
|
83
|
+
this.startHeartbeat();
|
|
84
|
+
// Handle shutdown
|
|
85
|
+
process.on('SIGINT', () => this.disconnect());
|
|
86
|
+
process.on('SIGTERM', () => this.disconnect());
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
spinner.fail(`Failed to connect: ${error.message}`);
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async apiCall(action, body) {
|
|
94
|
+
const url = `${API_BASE_URL}?action=${action}`;
|
|
95
|
+
const response = await fetch(url, {
|
|
96
|
+
method: 'POST',
|
|
97
|
+
headers: {
|
|
98
|
+
'Content-Type': 'application/json',
|
|
99
|
+
'x-api-token': this.apiToken,
|
|
100
|
+
},
|
|
101
|
+
body: JSON.stringify(body),
|
|
102
|
+
});
|
|
103
|
+
return response.json();
|
|
104
|
+
}
|
|
105
|
+
startPolling() {
|
|
106
|
+
this.pollTimer = setInterval(async () => {
|
|
107
|
+
if (!this.isRunning)
|
|
108
|
+
return;
|
|
109
|
+
try {
|
|
110
|
+
const response = await this.apiCall('poll', {
|
|
111
|
+
session_id: this.sessionId,
|
|
112
|
+
});
|
|
113
|
+
if (response.commands && response.commands.length > 0) {
|
|
114
|
+
for (const cmd of response.commands) {
|
|
115
|
+
await this.processCommand(cmd);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error(colors.error('Polling error:'), error);
|
|
121
|
+
}
|
|
122
|
+
}, POLL_INTERVAL);
|
|
123
|
+
}
|
|
124
|
+
startHeartbeat() {
|
|
125
|
+
setInterval(async () => {
|
|
126
|
+
if (!this.isRunning)
|
|
127
|
+
return;
|
|
128
|
+
try {
|
|
129
|
+
await this.apiCall('heartbeat', {
|
|
130
|
+
session_id: this.sessionId,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error(colors.dim('Heartbeat failed'));
|
|
135
|
+
}
|
|
136
|
+
}, 30000); // Every 30 seconds
|
|
137
|
+
}
|
|
138
|
+
printBanner() {
|
|
139
|
+
console.log('\n');
|
|
140
|
+
console.log(colors.bold(' ╔═══════════════════════════════════════════╗'));
|
|
141
|
+
console.log(colors.bold(' ║') + colors.info(' HIGHERUP LOCAL AGENT ') + colors.bold('║'));
|
|
142
|
+
console.log(colors.bold(' ╚═══════════════════════════════════════════╝'));
|
|
143
|
+
console.log('');
|
|
144
|
+
console.log(colors.dim(` Workspace: ${this.workspacePath}`));
|
|
145
|
+
console.log(colors.dim(` Agent: ${this.agentName}`));
|
|
146
|
+
console.log(colors.dim(` Session: ${this.sessionId}`));
|
|
147
|
+
if (this.autonomousMode) {
|
|
148
|
+
console.log(colors.warning(' Mode: AUTONOMOUS (unrestricted)'));
|
|
149
|
+
}
|
|
150
|
+
console.log('');
|
|
151
|
+
console.log(colors.info(' Listening for commands... Press Ctrl+C to stop.\n'));
|
|
152
|
+
}
|
|
153
|
+
async processCommand(cmd) {
|
|
154
|
+
const commandText = cmd.command_text;
|
|
155
|
+
// Check for internal commands
|
|
156
|
+
if (commandText.startsWith('__INTERNAL_')) {
|
|
157
|
+
await this.handleInternalCommand(cmd);
|
|
158
|
+
}
|
|
159
|
+
else if (commandText.startsWith('__STREAM__')) {
|
|
160
|
+
await this.executeStreamingCommand(cmd);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
await this.executeCommand(cmd);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async handleInternalCommand(cmd) {
|
|
167
|
+
const commandText = cmd.command_text;
|
|
168
|
+
try {
|
|
169
|
+
if (commandText.startsWith('__INTERNAL_FILE_READ__')) {
|
|
170
|
+
await this.handleFileRead(cmd);
|
|
171
|
+
}
|
|
172
|
+
else if (commandText.startsWith('__INTERNAL_FILE_WRITE__')) {
|
|
173
|
+
await this.handleFileWrite(cmd);
|
|
174
|
+
}
|
|
175
|
+
else if (commandText.startsWith('__INTERNAL_FILE_LIST__')) {
|
|
176
|
+
await this.handleFileList(cmd);
|
|
177
|
+
}
|
|
178
|
+
else if (commandText.startsWith('__INTERNAL_SCREEN_CAPTURE__')) {
|
|
179
|
+
await this.handleScreenCapture(cmd);
|
|
180
|
+
}
|
|
181
|
+
else if (commandText.startsWith('__INTERNAL_SCREEN_STREAM_START__')) {
|
|
182
|
+
await this.handleScreenStreamStart(cmd);
|
|
183
|
+
}
|
|
184
|
+
else if (commandText.startsWith('__INTERNAL_SYSTEM_INFO__')) {
|
|
185
|
+
await this.handleSystemInfo(cmd);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
await this.reportResult(cmd.id, `Unknown internal command: ${commandText}`, -1, 0);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
await this.reportResult(cmd.id, error.message, -1, 0);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async handleFileRead(cmd) {
|
|
196
|
+
const match = cmd.command_text.match(/__INTERNAL_FILE_READ__\s+(.+?)(?:\s+--encoding=(\w+))?$/);
|
|
197
|
+
if (!match) {
|
|
198
|
+
await this.reportResult(cmd.id, 'Invalid file read command', -1, 0);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const filePath = path.resolve(this.workspacePath, match[1].trim());
|
|
202
|
+
const encoding = (match[2] || 'utf8');
|
|
203
|
+
console.log(colors.file(`[FILE READ] ${filePath}`));
|
|
204
|
+
// Security check - ensure file is within workspace
|
|
205
|
+
if (!filePath.startsWith(this.workspacePath)) {
|
|
206
|
+
await this.reportResult(cmd.id, 'Access denied: Path outside workspace', -1, 0);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const content = await fs.readFile(filePath, encoding);
|
|
211
|
+
const stats = await fs.stat(filePath);
|
|
212
|
+
const result = JSON.stringify({
|
|
213
|
+
success: true,
|
|
214
|
+
content,
|
|
215
|
+
path: match[1].trim(),
|
|
216
|
+
size: stats.size,
|
|
217
|
+
modified_at: stats.mtime.toISOString(),
|
|
218
|
+
});
|
|
219
|
+
await this.reportResult(cmd.id, result, 0, 0);
|
|
220
|
+
console.log(colors.success(` ✓ Read ${stats.size} bytes`));
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
await this.reportResult(cmd.id, JSON.stringify({ success: false, error: error.message }), -1, 0);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async handleFileWrite(cmd) {
|
|
227
|
+
const match = cmd.command_text.match(/__INTERNAL_FILE_WRITE__\s+(.+)$/);
|
|
228
|
+
if (!match) {
|
|
229
|
+
await this.reportResult(cmd.id, 'Invalid file write command', -1, 0);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const filePath = path.resolve(this.workspacePath, match[1].trim());
|
|
233
|
+
// Security check
|
|
234
|
+
if (!filePath.startsWith(this.workspacePath)) {
|
|
235
|
+
await this.reportResult(cmd.id, 'Access denied: Path outside workspace', -1, 0);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
console.log(colors.file(`[FILE WRITE] ${filePath}`));
|
|
239
|
+
try {
|
|
240
|
+
// Content is stored in cmd.output as JSON
|
|
241
|
+
const data = JSON.parse(cmd.output || '{}');
|
|
242
|
+
const { content, encoding = 'utf8', create_dirs = true } = data;
|
|
243
|
+
if (create_dirs) {
|
|
244
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
245
|
+
}
|
|
246
|
+
await fs.writeFile(filePath, content, encoding);
|
|
247
|
+
const stats = await fs.stat(filePath);
|
|
248
|
+
await this.reportResult(cmd.id, JSON.stringify({
|
|
249
|
+
success: true,
|
|
250
|
+
path: match[1].trim(),
|
|
251
|
+
size: stats.size,
|
|
252
|
+
}), 0, 0);
|
|
253
|
+
console.log(colors.success(` ✓ Wrote ${stats.size} bytes`));
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
await this.reportResult(cmd.id, JSON.stringify({ success: false, error: error.message }), -1, 0);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async handleFileList(cmd) {
|
|
260
|
+
const match = cmd.command_text.match(/__INTERNAL_FILE_LIST__\s+(.+?)(?:\s+--recursive=(true|false))?(?:\s+--hidden=(true|false))?$/);
|
|
261
|
+
if (!match) {
|
|
262
|
+
await this.reportResult(cmd.id, 'Invalid file list command', -1, 0);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const dirPath = path.resolve(this.workspacePath, match[1].trim());
|
|
266
|
+
const recursive = match[2] === 'true';
|
|
267
|
+
const includeHidden = match[3] === 'true';
|
|
268
|
+
console.log(colors.file(`[FILE LIST] ${dirPath}`));
|
|
269
|
+
// Security check
|
|
270
|
+
if (!dirPath.startsWith(this.workspacePath)) {
|
|
271
|
+
await this.reportResult(cmd.id, 'Access denied: Path outside workspace', -1, 0);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const files = await this.listDirectory(dirPath, recursive, includeHidden);
|
|
276
|
+
await this.reportResult(cmd.id, JSON.stringify({
|
|
277
|
+
success: true,
|
|
278
|
+
path: match[1].trim(),
|
|
279
|
+
files,
|
|
280
|
+
}), 0, 0);
|
|
281
|
+
console.log(colors.success(` ✓ Listed ${files.length} items`));
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
await this.reportResult(cmd.id, JSON.stringify({ success: false, error: error.message }), -1, 0);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async listDirectory(dirPath, recursive, includeHidden) {
|
|
288
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
289
|
+
const files = [];
|
|
290
|
+
for (const entry of entries) {
|
|
291
|
+
if (!includeHidden && entry.name.startsWith('.'))
|
|
292
|
+
continue;
|
|
293
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
294
|
+
const relativePath = path.relative(this.workspacePath, fullPath);
|
|
295
|
+
const item = {
|
|
296
|
+
name: entry.name,
|
|
297
|
+
path: relativePath,
|
|
298
|
+
type: entry.isDirectory() ? 'directory' : 'file',
|
|
299
|
+
};
|
|
300
|
+
if (entry.isFile()) {
|
|
301
|
+
try {
|
|
302
|
+
const stats = await fs.stat(fullPath);
|
|
303
|
+
item.size = stats.size;
|
|
304
|
+
item.modified_at = stats.mtime.toISOString();
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// Ignore stat errors
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
files.push(item);
|
|
311
|
+
if (recursive && entry.isDirectory()) {
|
|
312
|
+
try {
|
|
313
|
+
const subFiles = await this.listDirectory(fullPath, true, includeHidden);
|
|
314
|
+
files.push(...subFiles);
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
// Ignore subdirectory errors
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return files;
|
|
322
|
+
}
|
|
323
|
+
async handleScreenCapture(cmd) {
|
|
324
|
+
const match = cmd.command_text.match(/--display=(\d+)/);
|
|
325
|
+
const display = match ? parseInt(match[1]) : 0;
|
|
326
|
+
console.log(colors.info(`[SCREEN CAPTURE] Display ${display}`));
|
|
327
|
+
try {
|
|
328
|
+
let imagePath;
|
|
329
|
+
const tempFile = path.join(os.tmpdir(), `higherup-screen-${Date.now()}.png`);
|
|
330
|
+
if (os.platform() === 'darwin') {
|
|
331
|
+
// macOS
|
|
332
|
+
await execAsync(`screencapture -x -D ${display + 1} "${tempFile}"`);
|
|
333
|
+
}
|
|
334
|
+
else if (os.platform() === 'win32') {
|
|
335
|
+
// Windows - use PowerShell
|
|
336
|
+
const psScript = `
|
|
337
|
+
Add-Type -AssemblyName System.Windows.Forms
|
|
338
|
+
$screen = [System.Windows.Forms.Screen]::AllScreens[${display}]
|
|
339
|
+
$bitmap = New-Object System.Drawing.Bitmap($screen.Bounds.Width, $screen.Bounds.Height)
|
|
340
|
+
$graphics = [System.Drawing.Graphics]::FromImage($bitmap)
|
|
341
|
+
$graphics.CopyFromScreen($screen.Bounds.Location, [System.Drawing.Point]::Empty, $screen.Bounds.Size)
|
|
342
|
+
$bitmap.Save("${tempFile.replace(/\\/g, '\\\\')}")
|
|
343
|
+
`;
|
|
344
|
+
await execAsync(`powershell -Command "${psScript}"`);
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
// Linux - use scrot or import
|
|
348
|
+
try {
|
|
349
|
+
await execAsync(`scrot "${tempFile}"`);
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
await execAsync(`import -window root "${tempFile}"`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
imagePath = tempFile;
|
|
356
|
+
// Read the image and convert to base64
|
|
357
|
+
const imageBuffer = await fs.readFile(imagePath);
|
|
358
|
+
const base64Image = imageBuffer.toString('base64');
|
|
359
|
+
// Clean up temp file
|
|
360
|
+
await fs.unlink(imagePath).catch(() => { });
|
|
361
|
+
await this.reportResult(cmd.id, JSON.stringify({
|
|
362
|
+
success: true,
|
|
363
|
+
image: base64Image,
|
|
364
|
+
format: 'png',
|
|
365
|
+
display,
|
|
366
|
+
}), 0, 0);
|
|
367
|
+
console.log(colors.success(` ✓ Captured screen (${Math.round(base64Image.length / 1024)} KB)`));
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
console.log(colors.error(` ✗ Screen capture failed: ${error.message}`));
|
|
371
|
+
await this.reportResult(cmd.id, JSON.stringify({
|
|
372
|
+
success: false,
|
|
373
|
+
error: error.message,
|
|
374
|
+
hint: 'Screen capture may require additional permissions or tools (scrot on Linux)'
|
|
375
|
+
}), -1, 0);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
async handleScreenStreamStart(cmd) {
|
|
379
|
+
// Screen streaming would require WebSocket - just acknowledge for now
|
|
380
|
+
await this.reportResult(cmd.id, JSON.stringify({
|
|
381
|
+
success: true,
|
|
382
|
+
message: 'Screen streaming initiated. Use WebSocket for continuous frames.',
|
|
383
|
+
}), 0, 0);
|
|
384
|
+
}
|
|
385
|
+
async handleSystemInfo(cmd) {
|
|
386
|
+
console.log(colors.info('[SYSTEM INFO]'));
|
|
387
|
+
try {
|
|
388
|
+
const cpus = os.cpus();
|
|
389
|
+
const systemInfo = {
|
|
390
|
+
success: true,
|
|
391
|
+
os: os.platform(),
|
|
392
|
+
os_release: os.release(),
|
|
393
|
+
os_type: os.type(),
|
|
394
|
+
arch: os.arch(),
|
|
395
|
+
hostname: os.hostname(),
|
|
396
|
+
username: os.userInfo().username,
|
|
397
|
+
home_dir: os.homedir(),
|
|
398
|
+
cpu: {
|
|
399
|
+
model: cpus[0]?.model || 'Unknown',
|
|
400
|
+
cores: cpus.length,
|
|
401
|
+
speed: cpus[0]?.speed || 0,
|
|
402
|
+
},
|
|
403
|
+
memory: {
|
|
404
|
+
total: os.totalmem(),
|
|
405
|
+
free: os.freemem(),
|
|
406
|
+
used: os.totalmem() - os.freemem(),
|
|
407
|
+
},
|
|
408
|
+
uptime: os.uptime(),
|
|
409
|
+
workspace: {
|
|
410
|
+
path: this.workspacePath,
|
|
411
|
+
id: this.workspaceId,
|
|
412
|
+
},
|
|
413
|
+
agent: {
|
|
414
|
+
name: this.agentName,
|
|
415
|
+
session: this.sessionId,
|
|
416
|
+
autonomous: this.autonomousMode,
|
|
417
|
+
},
|
|
418
|
+
};
|
|
419
|
+
await this.reportResult(cmd.id, JSON.stringify(systemInfo), 0, 0);
|
|
420
|
+
console.log(colors.success(' ✓ System info collected'));
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
await this.reportResult(cmd.id, JSON.stringify({ success: false, error: error.message }), -1, 0);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
async executeStreamingCommand(cmd) {
|
|
427
|
+
const command = cmd.command_text.replace('__STREAM__ ', '');
|
|
428
|
+
console.log(colors.command(`\n[STREAM] $ ${command}`));
|
|
429
|
+
// For streaming, we execute normally but could implement chunk reporting
|
|
430
|
+
await this.executeShellCommand(cmd, command);
|
|
431
|
+
}
|
|
432
|
+
async executeCommand(cmd) {
|
|
433
|
+
console.log(colors.command(`\n[CMD] $ ${cmd.command_text}`));
|
|
434
|
+
await this.executeShellCommand(cmd, cmd.command_text);
|
|
435
|
+
}
|
|
436
|
+
async executeShellCommand(cmd, command) {
|
|
437
|
+
const startTime = Date.now();
|
|
438
|
+
// Security check for dangerous commands (unless autonomous mode)
|
|
439
|
+
if (!this.autonomousMode) {
|
|
440
|
+
const dangerousPatterns = ['rm -rf /', 'mkfs', 'dd if=', ':(){:|:&};:'];
|
|
441
|
+
for (const pattern of dangerousPatterns) {
|
|
442
|
+
if (command.includes(pattern)) {
|
|
443
|
+
console.log(colors.error(` ✗ Blocked dangerous command pattern: ${pattern}`));
|
|
444
|
+
await this.reportResult(cmd.id, 'Command blocked: Contains dangerous pattern. Enable autonomous mode to run.', -1, 0);
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
// Determine shell based on platform
|
|
450
|
+
const isWindows = os.platform() === 'win32';
|
|
451
|
+
const shell = isWindows ? 'cmd.exe' : '/bin/bash';
|
|
452
|
+
const shellArgs = isWindows ? ['/c', command] : ['-c', command];
|
|
453
|
+
try {
|
|
454
|
+
const result = await new Promise((resolve) => {
|
|
455
|
+
let output = '';
|
|
456
|
+
const childProcess = spawn(shell, shellArgs, {
|
|
457
|
+
cwd: this.workspacePath,
|
|
458
|
+
env: { ...process.env, FORCE_COLOR: '1' },
|
|
459
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
460
|
+
});
|
|
461
|
+
childProcess.stdout.on('data', (data) => {
|
|
462
|
+
const text = data.toString();
|
|
463
|
+
output += text;
|
|
464
|
+
process.stdout.write(colors.dim(text));
|
|
465
|
+
});
|
|
466
|
+
childProcess.stderr.on('data', (data) => {
|
|
467
|
+
const text = data.toString();
|
|
468
|
+
output += text;
|
|
469
|
+
process.stderr.write(colors.error(text));
|
|
470
|
+
});
|
|
471
|
+
childProcess.on('close', (exitCode) => {
|
|
472
|
+
resolve({ output, exitCode: exitCode ?? -1 });
|
|
473
|
+
});
|
|
474
|
+
childProcess.on('error', (error) => {
|
|
475
|
+
resolve({ output: error.message, exitCode: -1 });
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
const duration = Date.now() - startTime;
|
|
479
|
+
this.commandCount++;
|
|
480
|
+
const status = result.exitCode === 0 ? colors.success('✓') : colors.error('✗');
|
|
481
|
+
console.log(colors.dim(`\n[Completed in ${duration}ms] ${status} Exit code: ${result.exitCode}\n`));
|
|
482
|
+
await this.reportResult(cmd.id, result.output.slice(-10000), result.exitCode, duration);
|
|
483
|
+
}
|
|
484
|
+
catch (error) {
|
|
485
|
+
console.log(colors.error(`\n[ERROR] ${error.message}\n`));
|
|
486
|
+
await this.reportResult(cmd.id, error.message, -1, Date.now() - startTime);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
async reportResult(commandId, output, exitCode, duration) {
|
|
490
|
+
await this.apiCall('result', {
|
|
491
|
+
command_id: commandId,
|
|
492
|
+
output,
|
|
493
|
+
exit_code: exitCode,
|
|
494
|
+
duration,
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
async disconnect() {
|
|
498
|
+
console.log(colors.warning('\n\nDisconnecting from Higherup service...'));
|
|
499
|
+
this.isRunning = false;
|
|
500
|
+
if (this.pollTimer) {
|
|
501
|
+
clearInterval(this.pollTimer);
|
|
502
|
+
}
|
|
503
|
+
try {
|
|
504
|
+
await this.apiCall('disconnect', {
|
|
505
|
+
session_id: this.sessionId,
|
|
506
|
+
workspace_id: this.workspaceId,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
// Ignore disconnect errors
|
|
511
|
+
}
|
|
512
|
+
console.log(colors.success('Disconnected. Goodbye!\n'));
|
|
513
|
+
console.log(colors.dim(`Session stats: ${this.commandCount} commands executed\n`));
|
|
514
|
+
process.exit(0);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
// CLI Setup
|
|
518
|
+
async function loadConfig() {
|
|
519
|
+
try {
|
|
520
|
+
await fs.mkdir(CONFIG_DIR, { recursive: true });
|
|
521
|
+
const data = await fs.readFile(CONFIG_FILE, 'utf-8');
|
|
522
|
+
return JSON.parse(data);
|
|
523
|
+
}
|
|
524
|
+
catch {
|
|
525
|
+
return {};
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
async function saveConfig(config) {
|
|
529
|
+
await fs.mkdir(CONFIG_DIR, { recursive: true });
|
|
530
|
+
await fs.writeFile(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
531
|
+
}
|
|
532
|
+
const program = new Command();
|
|
533
|
+
program
|
|
534
|
+
.name('higherup')
|
|
535
|
+
.description('Higherup Local Agent - Give AI agents full access to your development environment')
|
|
536
|
+
.version('1.0.0');
|
|
537
|
+
program
|
|
538
|
+
.command('connect')
|
|
539
|
+
.description('Connect to Higherup service')
|
|
540
|
+
.requiredOption('-w, --workspace <id>', 'Workspace ID to connect')
|
|
541
|
+
.requiredOption('-p, --path <path>', 'Local workspace path', '.')
|
|
542
|
+
.option('-t, --token <token>', 'API token (or use HIGHERUP_API_TOKEN env var)')
|
|
543
|
+
.option('-n, --name <name>', 'Agent name for identification')
|
|
544
|
+
.option('--autonomous', 'Enable autonomous mode (unrestricted access)')
|
|
545
|
+
.action(async (options) => {
|
|
546
|
+
const config = await loadConfig();
|
|
547
|
+
const apiToken = options.token || process.env.HIGHERUP_API_TOKEN || config.apiToken;
|
|
548
|
+
if (!apiToken) {
|
|
549
|
+
console.error(colors.error('Error: API token is required'));
|
|
550
|
+
console.log(colors.info('\nProvide token via:'));
|
|
551
|
+
console.log(' --token <token>');
|
|
552
|
+
console.log(' HIGHERUP_API_TOKEN environment variable');
|
|
553
|
+
console.log(' or run: higherup config --token <token>');
|
|
554
|
+
process.exit(1);
|
|
555
|
+
}
|
|
556
|
+
const agent = new HigherupAgent();
|
|
557
|
+
try {
|
|
558
|
+
await agent.connect(options.path, options.workspace, apiToken, options.name, options.autonomous);
|
|
559
|
+
}
|
|
560
|
+
catch (error) {
|
|
561
|
+
console.error(colors.error(`\nFailed to connect: ${error.message}`));
|
|
562
|
+
process.exit(1);
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
program
|
|
566
|
+
.command('config')
|
|
567
|
+
.description('Configure default settings')
|
|
568
|
+
.option('-t, --token <token>', 'Set default API token')
|
|
569
|
+
.option('-w, --workspace <id>', 'Set default workspace')
|
|
570
|
+
.option('--show', 'Show current configuration')
|
|
571
|
+
.action(async (options) => {
|
|
572
|
+
const config = await loadConfig();
|
|
573
|
+
if (options.show) {
|
|
574
|
+
console.log(colors.bold('\nHigherup Configuration:'));
|
|
575
|
+
console.log(colors.dim(`Config file: ${CONFIG_FILE}\n`));
|
|
576
|
+
console.log(` API Token: ${config.apiToken ? colors.success('Set') : colors.warning('Not set')}`);
|
|
577
|
+
console.log(` Default Workspace: ${config.defaultWorkspace || colors.dim('Not set')}`);
|
|
578
|
+
console.log('');
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
if (options.token) {
|
|
582
|
+
config.apiToken = options.token;
|
|
583
|
+
console.log(colors.success('✓ API token saved'));
|
|
584
|
+
}
|
|
585
|
+
if (options.workspace) {
|
|
586
|
+
config.defaultWorkspace = options.workspace;
|
|
587
|
+
console.log(colors.success('✓ Default workspace saved'));
|
|
588
|
+
}
|
|
589
|
+
if (options.token || options.workspace) {
|
|
590
|
+
await saveConfig(config);
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
console.log('Use --help to see available options');
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
program
|
|
597
|
+
.command('status')
|
|
598
|
+
.description('Check connection status')
|
|
599
|
+
.option('-t, --token <token>', 'API token')
|
|
600
|
+
.action(async (options) => {
|
|
601
|
+
const config = await loadConfig();
|
|
602
|
+
const apiToken = options.token || process.env.HIGHERUP_API_TOKEN || config.apiToken;
|
|
603
|
+
if (!apiToken) {
|
|
604
|
+
console.error(colors.error('Error: API token is required'));
|
|
605
|
+
process.exit(1);
|
|
606
|
+
}
|
|
607
|
+
const spinner = ora('Checking status...').start();
|
|
608
|
+
try {
|
|
609
|
+
const response = await fetch(`${API_BASE_URL}?action=status`, {
|
|
610
|
+
method: 'POST',
|
|
611
|
+
headers: {
|
|
612
|
+
'Content-Type': 'application/json',
|
|
613
|
+
'x-api-token': apiToken,
|
|
614
|
+
},
|
|
615
|
+
body: JSON.stringify({}),
|
|
616
|
+
});
|
|
617
|
+
const data = await response.json();
|
|
618
|
+
spinner.stop();
|
|
619
|
+
if (data.active_sessions && data.active_sessions.length > 0) {
|
|
620
|
+
console.log(colors.success('\n✓ Connected sessions:\n'));
|
|
621
|
+
for (const session of data.active_sessions) {
|
|
622
|
+
console.log(` ${colors.bold(session.agent_name || 'Agent')}`);
|
|
623
|
+
console.log(colors.dim(` Workspace: ${session.workspaces?.name || session.workspace_id}`));
|
|
624
|
+
console.log(colors.dim(` Connected: ${new Date(session.connected_at).toLocaleString()}`));
|
|
625
|
+
console.log('');
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
else {
|
|
629
|
+
console.log(colors.warning('\n⚠ No active sessions'));
|
|
630
|
+
console.log(colors.dim('Run: higherup connect -w <workspace-id> -p <path>\n'));
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
catch (error) {
|
|
634
|
+
spinner.fail(`Failed to check status: ${error.message}`);
|
|
635
|
+
process.exit(1);
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
program.parse();
|
|
639
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "higherup",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Give AI agents full access to your development machine - command execution, file operations, screen capture, and autonomous mode",
|
|
6
|
+
"main": "dist/agent.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"higherup": "./bin/higherup.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"start": "node dist/agent.js",
|
|
12
|
+
"dev": "tsx src/agent.ts",
|
|
13
|
+
"build": "tsc && chmod +x bin/higherup.js",
|
|
14
|
+
"prepublishOnly": "npm run build",
|
|
15
|
+
"postinstall": "echo '✓ Higherup agent installed. Run: higherup connect --help'",
|
|
16
|
+
"test": "echo \"No tests yet\" && exit 0"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"bin",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"keywords": [
|
|
24
|
+
"higherup",
|
|
25
|
+
"ai",
|
|
26
|
+
"agent",
|
|
27
|
+
"mcp",
|
|
28
|
+
"screen-capture",
|
|
29
|
+
"remote-control",
|
|
30
|
+
"autonomous",
|
|
31
|
+
"cli",
|
|
32
|
+
"lovable",
|
|
33
|
+
"claude",
|
|
34
|
+
"gpt",
|
|
35
|
+
"automation",
|
|
36
|
+
"development"
|
|
37
|
+
],
|
|
38
|
+
"author": "Higherup",
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"homepage": "https://higherup.ai",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/hnibbo/HUagent"
|
|
44
|
+
},
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/hnibbo/HUagent/issues"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=18.0.0"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"chalk": "^5.4.1",
|
|
53
|
+
"commander": "^12.1.0",
|
|
54
|
+
"ora": "^8.1.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/node": "^20.17.9",
|
|
58
|
+
"tsx": "^4.19.0",
|
|
59
|
+
"typescript": "^5.6.0"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|