@mmmbuto/nexuscli 0.9.10 → 0.9.11
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/CHANGELOG.md +74 -0
- package/README.md +28 -32
- package/lib/setup/postinstall-pty-check.js +183 -0
- package/lib/setup/postinstall.js +11 -1
- package/package.json +4 -3
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.9.10] - 2026-01-09
|
|
6
|
+
### Fixed
|
|
7
|
+
- Added PTY dependency check in postinstall to verify node-pty installation
|
|
8
|
+
- Added pty-termux-utils verification to ensure .cjs files are built
|
|
9
|
+
- Platform detection now installs correct PTY provider:
|
|
10
|
+
- `@mmmbuto/node-pty-android-arm64` for Termux
|
|
11
|
+
- `@lydell/node-pty-linux-arm64` for Linux ARM64
|
|
12
|
+
- Provides helpful error messages when PTY dependencies are missing
|
|
13
|
+
## [0.9.11] - 2026-01-09
|
|
14
|
+
### Fixed
|
|
15
|
+
- Added PTY dependency verification in postinstall
|
|
16
|
+
- Added platform-specific PTY provider installation
|
|
17
|
+
- Added @mmmbuto/pty-termux-utils installation check
|
|
18
|
+
- All PTY dependencies now verified during npm install
|
|
19
|
+
- Updated @mmmbuto/pty-termux-utils to ^1.1.2
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## [0.9.9] - 2026-01-01
|
|
24
|
+
### Added
|
|
25
|
+
- Auto-update check on `nexuscli start` (npm + GitHub) with interactive prompt.
|
|
26
|
+
- `nexuscli update` / `nexuscli upgrade` command to update and restart server.
|
|
27
|
+
- Warnings when changing config while server is running.
|
|
28
|
+
- Live refresh of default model in UI (periodic + on focus).
|
|
29
|
+
|
|
30
|
+
## [0.9.8] - 2025-12-30
|
|
31
|
+
### Changed
|
|
32
|
+
- Update GLM routing to GLM-4.7 for Z.ai in Claude wrapper and model catalog.
|
|
33
|
+
### Docs
|
|
34
|
+
- README updated for GLM-4.7 and release version.
|
|
35
|
+
|
|
36
|
+
## [0.9.7004-termux] - 2025-12-28
|
|
37
|
+
### Fixed
|
|
38
|
+
- Force Qwen model selection so `vision-model` is honored for image prompts.
|
|
39
|
+
- Parse Qwen stream-json tool events to keep statusbar live.
|
|
40
|
+
- Improve light theme contrast and update mobile statusbar theme colors.
|
|
41
|
+
|
|
42
|
+
## [0.9.7-termux] - 2025-12-28
|
|
43
|
+
### Added
|
|
44
|
+
- QWEN engine integration (Qwen Code CLI) with SSE streaming.
|
|
45
|
+
- QWEN models in catalog: `coder-model`, `vision-model`.
|
|
46
|
+
- QWEN session import + resume support.
|
|
47
|
+
### Changed
|
|
48
|
+
- Statusbar now reflects QWEN tool activity in real time (stream-json parsing).
|
|
49
|
+
|
|
50
|
+
## [0.9.6] - 2025-12-26
|
|
51
|
+
### Fixed
|
|
52
|
+
- Restore Jobs CLI wrapper and Termux PTY adapter removed during cleanup.
|
|
53
|
+
- Use Termux-safe shell/runtime resolution for job execution (no hardcoded /bin or /usr/bin paths).
|
|
54
|
+
- Surface job stream errors correctly in the UI.
|
|
55
|
+
|
|
56
|
+
## [0.9.5] - 2025-12-25
|
|
57
|
+
### Added
|
|
58
|
+
- GPT-5.2 Codex set as default Codex model.
|
|
59
|
+
### Changed
|
|
60
|
+
- Updated Codex model catalog to match OpenAI CLI.
|
|
61
|
+
### Fixed
|
|
62
|
+
- i18n import after cleanup.
|
|
63
|
+
|
|
64
|
+
## [0.9.4] - 2025-12-25
|
|
65
|
+
### Added
|
|
66
|
+
- Dark/Light theme toggle with CSS variables and localStorage persistence.
|
|
67
|
+
- Rate limiting on chat endpoints (10 req/min per user).
|
|
68
|
+
- Architecture documentation (`docs/ARCHITECTURE.md`).
|
|
69
|
+
|
|
70
|
+
## [0.9.3] - 2025-12-19
|
|
71
|
+
### Fixed
|
|
72
|
+
- Normalize Termux workspace paths (auto-correct `/data/data/com/termux/...`) to prevent Claude spawn ENOENT and stalled GLM-4.6/DeepSeek runs.
|
|
73
|
+
- Workspaces API now filters and merges invalid paths to keep the UI dropdown clean.
|
|
74
|
+
- Session importer reads `cwd` from Claude session files when available for accurate workspace mapping.
|
package/README.md
CHANGED
|
@@ -6,39 +6,18 @@
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## Overview
|
|
10
|
-
|
|
11
|
-
NexusCLI is a lightweight, Termux-first AI cockpit that orchestrates Claude Code, Codex CLI, Gemini CLI, and Qwen Code CLI from a single web/terminal UI. It supports live streaming, interrupts, session resume, workspace isolation, and remote voice input with auto HTTPS setup.
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
9
|
[](https://www.npmjs.com/package/@mmmbuto/nexuscli)
|
|
16
10
|
[](https://www.npmjs.com/package/@mmmbuto/nexuscli)
|
|
17
11
|
[](https://ko-fi.com/dionanos)
|
|
18
12
|
|
|
19
13
|
---
|
|
20
14
|
|
|
21
|
-
##
|
|
15
|
+
## Overview
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
<img src="docs/assets/screenshots/nexuscli-multilang-preview.png" width="45%" />
|
|
25
|
-
<img src="docs/assets/screenshots/nexuscli-mobile-glm.png" width="45%" />
|
|
26
|
-
</p>
|
|
17
|
+
NexusCLI is a lightweight, Termux-first AI cockpit that orchestrates Claude Code, Codex CLI, Gemini CLI, and Qwen Code CLI from a single web/terminal UI. It supports live streaming, interrupts, session resume, workspace isolation, and remote voice input with auto HTTPS setup.
|
|
27
18
|
|
|
28
19
|
---
|
|
29
20
|
|
|
30
|
-
## Highlights (v0.9.9)
|
|
31
|
-
|
|
32
|
-
- **Auto-update**: Update check on start (npm + GitHub) with interactive prompt
|
|
33
|
-
- **Update command**: `nexuscli update` / `nexuscli upgrade` (stop → update → restart)
|
|
34
|
-
- **Live default model**: UI refreshes config on focus/interval without restart
|
|
35
|
-
- **Restart warnings**: CLI warns when changes require stop/start
|
|
36
|
-
|
|
37
|
-
### Stable (v0.9.9)
|
|
38
|
-
|
|
39
|
-
- Update check is cached and non-blocking for normal startup
|
|
40
|
-
- GitHub-only releases show a notice without prompting
|
|
41
|
-
|
|
42
21
|
## Features
|
|
43
22
|
|
|
44
23
|
- Multi-engine orchestration (Claude, Codex, Gemini, Qwen)
|
|
@@ -52,6 +31,8 @@ NexusCLI is a lightweight, Termux-first AI cockpit that orchestrates Claude Code
|
|
|
52
31
|
- Conversation search + pin/bookmark
|
|
53
32
|
- Built-in jobs runner API for shell tasks
|
|
54
33
|
- Config API + rate limiting on chat endpoints
|
|
34
|
+
- Auto-update check on start with interactive prompt
|
|
35
|
+
- `nexuscli update` command to update and restart server
|
|
55
36
|
|
|
56
37
|
## Supported Engines
|
|
57
38
|
|
|
@@ -65,6 +46,15 @@ NexusCLI is a lightweight, Termux-first AI cockpit that orchestrates Claude Code
|
|
|
65
46
|
|
|
66
47
|
---
|
|
67
48
|
|
|
49
|
+
## Screenshots
|
|
50
|
+
|
|
51
|
+
<p align="center">
|
|
52
|
+
<img src="docs/assets/screenshots/nexuscli-multilang-preview.png" width="45%" />
|
|
53
|
+
<img src="docs/assets/screenshots/nexuscli-mobile-glm.png" width="45%" />
|
|
54
|
+
</p>
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
68
58
|
## Install
|
|
69
59
|
|
|
70
60
|
```bash
|
|
@@ -128,8 +118,6 @@ nexuscli start
|
|
|
128
118
|
| `nexuscli upgrade` | Alias for update |
|
|
129
119
|
| `nexuscli uninstall` | Remove NexusCLI |
|
|
130
120
|
|
|
131
|
-
---
|
|
132
|
-
|
|
133
121
|
> **Note**: On `nexuscli start`, an update check runs (cached) and will prompt in interactive shells.
|
|
134
122
|
|
|
135
123
|
## API Keys
|
|
@@ -195,8 +183,8 @@ engine CLIs alive in background; it spawns them on demand and resumes sessions.
|
|
|
195
183
|
- Install Termux:Boot to auto-restart after reboot or app kill.
|
|
196
184
|
- Keep a persistent notification (Termux:API helps prevent background kill).
|
|
197
185
|
|
|
198
|
-
**Reduce battery usage (when you don
|
|
199
|
-
- Stop
|
|
186
|
+
**Reduce battery usage (when you don't need it always-on):**
|
|
187
|
+
- Stop server when idle: `nexuscli stop`.
|
|
200
188
|
- Disable wake-lock and notifications when not needed.
|
|
201
189
|
- Prefer lighter models and lower reasoning settings.
|
|
202
190
|
|
|
@@ -240,11 +228,6 @@ npm run dev
|
|
|
240
228
|
|
|
241
229
|
---
|
|
242
230
|
|
|
243
|
-
## License
|
|
244
|
-
|
|
245
|
-
MIT License.
|
|
246
|
-
See `LICENSE` for details.
|
|
247
|
-
|
|
248
231
|
## PTY Support (Shared Library)
|
|
249
232
|
|
|
250
233
|
NexusCLI uses `@mmmbuto/pty-termux-utils` as a shared library for PTY
|
|
@@ -260,3 +243,16 @@ management across all Termux CLI projects (Gemini, Qwen, Nexus).
|
|
|
260
243
|
# Enable PTY debug logging
|
|
261
244
|
PTY_DEBUG=1 nexuscli start
|
|
262
245
|
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Changelog
|
|
250
|
+
|
|
251
|
+
See [CHANGELOG.md](CHANGELOG.md) for version history.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## License
|
|
256
|
+
|
|
257
|
+
MIT License.
|
|
258
|
+
See `LICENSE` for details.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PTY Dependency Check for NexusCLI Post-Install
|
|
3
|
+
* Detects platform and installs appropriate PTY provider
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { execSync } = require('child_process');
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
|
|
10
|
+
const colors = {
|
|
11
|
+
green: (s) => `\x1b[32m${s}\x1b[0m`,
|
|
12
|
+
yellow: (s) => `\x1b[33m${s}\x1b[0m`,
|
|
13
|
+
red: (s) => `\x1b[31m${s}\x1b[0m`,
|
|
14
|
+
cyan: (s) => `\x1b[36m${s}\x1b[0m`,
|
|
15
|
+
gray: (s) => `\x1b[90m${s}\x1b[0m`
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
function log(msg) { console.log(msg); }
|
|
19
|
+
function success(msg) { console.log(colors.green(` ✓ ${msg}`)); }
|
|
20
|
+
function warn(msg) { console.log(colors.yellow(` ⚠ ${msg}`)); }
|
|
21
|
+
function error(msg) { console.log(colors.red(` ✗ ${msg}`)); }
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Detect platform
|
|
25
|
+
*/
|
|
26
|
+
function detectPlatform() {
|
|
27
|
+
const isTermux =
|
|
28
|
+
process.env.PREFIX?.includes('com.termux') ||
|
|
29
|
+
fs.existsSync('/data/data/com.termux') ||
|
|
30
|
+
process.env.TERMUX_VERSION !== undefined;
|
|
31
|
+
|
|
32
|
+
const isLinuxArm64 = process.platform === 'linux' && process.arch === 'arm64';
|
|
33
|
+
|
|
34
|
+
if (isTermux) return 'termux';
|
|
35
|
+
if (isLinuxArm64) return 'linux-arm64';
|
|
36
|
+
return 'other';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Check if npm package is installed
|
|
41
|
+
*/
|
|
42
|
+
function isNpmPackageInstalled(packageName) {
|
|
43
|
+
try {
|
|
44
|
+
const nodeModulesPath = path.join(__dirname, '..', '..', 'node_modules', packageName);
|
|
45
|
+
return fs.existsSync(nodeModulesPath);
|
|
46
|
+
} catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Check if pty.node exists (native module)
|
|
53
|
+
*/
|
|
54
|
+
function checkPtyNode() {
|
|
55
|
+
try {
|
|
56
|
+
const nodeModulesPath = path.join(__dirname, '..', '..', 'node_modules');
|
|
57
|
+
|
|
58
|
+
// Check @mmmbuto/node-pty-android-arm64
|
|
59
|
+
const androidPtyPath = path.join(nodeModulesPath, '@mmmbuto', 'node-pty-android-arm64', 'build', 'Release', 'pty.node');
|
|
60
|
+
if (fs.existsSync(androidPtyPath)) {
|
|
61
|
+
return { found: true, provider: '@mmmbuto/node-pty-android-arm64', path: androidPtyPath };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Check @lydell/node-pty-linux-arm64
|
|
65
|
+
const linuxPtyPath = path.join(nodeModulesPath, '@lydell', 'node-pty-linux-arm64', 'build', 'Release', 'pty.node');
|
|
66
|
+
if (fs.existsSync(linuxPtyPath)) {
|
|
67
|
+
return { found: true, provider: '@lydell/node-pty-linux-arm64', path: linuxPtyPath };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return { found: false };
|
|
71
|
+
} catch {
|
|
72
|
+
return { found: false };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Install PTY provider
|
|
78
|
+
*/
|
|
79
|
+
function installPtyProvider(provider) {
|
|
80
|
+
try {
|
|
81
|
+
log(` Installing ${provider}...`);
|
|
82
|
+
|
|
83
|
+
const npmCmd = process.env.npm_execpath || 'npm';
|
|
84
|
+
execSync(`${npmCmd} install ${provider}`, {
|
|
85
|
+
stdio: 'inherit',
|
|
86
|
+
cwd: path.join(__dirname, '..', '..')
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
success(`${provider} installed`);
|
|
90
|
+
return true;
|
|
91
|
+
} catch (err) {
|
|
92
|
+
warn(`${provider} installation failed: ${err.message}`);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Main PTY check function
|
|
99
|
+
*/
|
|
100
|
+
function checkPtyDependencies() {
|
|
101
|
+
console.log('');
|
|
102
|
+
console.log(colors.cyan('Checking PTY dependencies:'));
|
|
103
|
+
|
|
104
|
+
const platform = detectPlatform();
|
|
105
|
+
let targetProvider = null;
|
|
106
|
+
|
|
107
|
+
// Determine target provider based on platform
|
|
108
|
+
if (platform === 'termux') {
|
|
109
|
+
targetProvider = '@mmmbuto/node-pty-android-arm64';
|
|
110
|
+
} else if (platform === 'linux-arm64') {
|
|
111
|
+
targetProvider = '@lydell/node-pty-linux-arm64';
|
|
112
|
+
} else {
|
|
113
|
+
log(colors.gray(' Skipped: Unsupported platform for PTY (not Termux/Linux ARM64)'));
|
|
114
|
+
log(colors.gray(' PTY will use fallback adapter (child_process)'));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Check if PTY native module exists
|
|
119
|
+
const ptyCheck = checkPtyNode();
|
|
120
|
+
|
|
121
|
+
if (ptyCheck.found) {
|
|
122
|
+
success(`Native PTY found: ${ptyCheck.provider}`);
|
|
123
|
+
} else {
|
|
124
|
+
// Check if package is installed but pty.node is missing
|
|
125
|
+
if (isNpmPackageInstalled(targetProvider)) {
|
|
126
|
+
warn(`${targetProvider} installed but pty.node missing - may need rebuild`);
|
|
127
|
+
warn(` Run: npm rebuild ${targetProvider}`);
|
|
128
|
+
} else {
|
|
129
|
+
warn(`${targetProvider} not installed`);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Try to install
|
|
133
|
+
const installed = installPtyProvider(targetProvider);
|
|
134
|
+
if (installed) {
|
|
135
|
+
// Verify installation
|
|
136
|
+
const verify = checkPtyNode();
|
|
137
|
+
if (verify.found) {
|
|
138
|
+
success(`Native PTY verified: ${verify.provider}`);
|
|
139
|
+
} else {
|
|
140
|
+
warn(`PTY package installed but pty.node not found`);
|
|
141
|
+
warn(` You may need to rebuild: npm rebuild ${targetProvider}`);
|
|
142
|
+
}
|
|
143
|
+
} else {
|
|
144
|
+
warn(`Cannot install ${targetProvider} - PTY will use fallback`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
console.log('');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Check if pty-termux-utils is installed and has .cjs files
|
|
154
|
+
*/
|
|
155
|
+
function checkPtyTermuxUtils() {
|
|
156
|
+
try {
|
|
157
|
+
const ptyUtilsPath = path.join(__dirname, '..', '..', 'node_modules', '@mmmbuto', 'pty-termux-utils');
|
|
158
|
+
|
|
159
|
+
if (!fs.existsSync(ptyUtilsPath)) {
|
|
160
|
+
warn('@mmmbuto/pty-termux-utils not installed');
|
|
161
|
+
warn(' This is required for PTY support');
|
|
162
|
+
warn(' Run: npm install @mmmbuto/pty-termux-utils');
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const indexCjsPath = path.join(ptyUtilsPath, 'dist', 'index.cjs');
|
|
167
|
+
if (fs.existsSync(indexCjsPath)) {
|
|
168
|
+
success('@mmmbuto/pty-termux-utils installed with CJS support');
|
|
169
|
+
return true;
|
|
170
|
+
} else {
|
|
171
|
+
warn('@mmmbuto/pty-termux-utils installed but .cjs files missing');
|
|
172
|
+
warn(' Run: cd node_modules/@mmmbuto/pty-termux-utils && npm run build:cjs');
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
} catch (err) {
|
|
176
|
+
warn('Error checking @mmmbuto/pty-termux-utils: ' + err.message);
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
module.exports = { checkPtyDependencies ,
|
|
182
|
+
checkPtyTermuxUtils
|
|
183
|
+
};
|
package/lib/setup/postinstall.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Termux-only: auto-run wizard if not configured
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
|
|
8
|
+
const { checkPtyDependencies, checkPtyTermuxUtils } = require('./postinstall-pty-check');
|
|
7
9
|
const { execSync, spawn } = require('child_process');
|
|
8
10
|
const fs = require('fs');
|
|
9
11
|
const path = require('path');
|
|
@@ -22,7 +24,6 @@ const colors = {
|
|
|
22
24
|
red: (s) => `\x1b[31m${s}\x1b[0m`,
|
|
23
25
|
cyan: (s) => `\x1b[36m${s}\x1b[0m`,
|
|
24
26
|
bold: (s) => `\x1b[1m${s}\x1b[0m`,
|
|
25
|
-
gray: (s) => `\x1b[90m${s}\x1b[0m`
|
|
26
27
|
};
|
|
27
28
|
|
|
28
29
|
function log(msg) {
|
|
@@ -144,6 +145,15 @@ async function main() {
|
|
|
144
145
|
for (const pkg of packages) {
|
|
145
146
|
installPackage(pkg);
|
|
146
147
|
}
|
|
148
|
+
|
|
149
|
+
// Check PTY dependencies
|
|
150
|
+
checkPtyDependencies();
|
|
151
|
+
|
|
152
|
+
// Check pty-termux-utils
|
|
153
|
+
checkPtyTermuxUtils();
|
|
154
|
+
|
|
155
|
+
// Check pty-termux-utils
|
|
156
|
+
checkPtyTermuxUtils();
|
|
147
157
|
console.log('');
|
|
148
158
|
|
|
149
159
|
// Create directories
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmmbuto/nexuscli",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.11",
|
|
4
4
|
"description": "NexusCLI - TRI CLI Control Plane (Claude/Codex/Gemini/Qwen)",
|
|
5
5
|
"main": "lib/server/server.js",
|
|
6
6
|
"bin": {
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"frontend/dist/",
|
|
45
45
|
"package.json",
|
|
46
46
|
"README.md",
|
|
47
|
+
"CHANGELOG.md",
|
|
47
48
|
"LICENSE"
|
|
48
49
|
],
|
|
49
50
|
"engines": {
|
|
@@ -58,7 +59,7 @@
|
|
|
58
59
|
"x64"
|
|
59
60
|
],
|
|
60
61
|
"dependencies": {
|
|
61
|
-
"@mmmbuto/pty-termux-utils": "^1.1.
|
|
62
|
+
"@mmmbuto/pty-termux-utils": "^1.1.2",
|
|
62
63
|
"bcryptjs": "^3.0.3",
|
|
63
64
|
"chalk": "^4.1.2",
|
|
64
65
|
"commander": "^12.1.0",
|
|
@@ -80,4 +81,4 @@
|
|
|
80
81
|
"optionalDependencies": {
|
|
81
82
|
"@mmmbuto/node-pty-android-arm64": "~1.1.0"
|
|
82
83
|
}
|
|
83
|
-
}
|
|
84
|
+
}
|