termux-dev 1.4.14 → 1.4.16
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/assets/banner.svg +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/headless.js +1 -1
- package/dist/cli/index.js +6 -6
- package/dist/cli/prompt.js +21 -13
- package/dist/cli/server.js +1 -1
- package/dist/cli/smooth.js +7 -0
- package/dist/mcp/client.js +1 -1
- package/package.json +1 -1
package/assets/banner.svg
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
<!-- Tagline & Badge -->
|
|
27
27
|
<text x="425" y="142" font-family="system-ui, -apple-system, sans-serif" font-size="14" font-weight="600" fill="#8b949e" text-anchor="middle" letter-spacing="3">
|
|
28
|
-
THE TERMINAL-NATIVE AI CODING AGENT <tspan fill="#00f2fe" font-weight="bold">v1.4.
|
|
28
|
+
THE TERMINAL-NATIVE AI CODING AGENT <tspan fill="#00f2fe" font-weight="bold">v1.4.16</tspan>
|
|
29
29
|
</text>
|
|
30
30
|
|
|
31
31
|
<!-- Top Accent Line -->
|
package/dist/cli/doctor.js
CHANGED
|
@@ -18,7 +18,7 @@ async function pingUrl(url) {
|
|
|
18
18
|
const req = https.get(url, {
|
|
19
19
|
timeout: 3000,
|
|
20
20
|
headers: {
|
|
21
|
-
'User-Agent': 'devx-doctor/1.4.
|
|
21
|
+
'User-Agent': 'devx-doctor/1.4.16'
|
|
22
22
|
}
|
|
23
23
|
}, (res) => {
|
|
24
24
|
res.resume(); // consume response data to free up memory and release socket
|
package/dist/cli/headless.js
CHANGED
|
@@ -35,7 +35,7 @@ export async function runHeadlessMode(userPrompt, config, options = {}) {
|
|
|
35
35
|
});
|
|
36
36
|
try {
|
|
37
37
|
if (!isQuiet && !isJson) {
|
|
38
|
-
console.log(pc.bold(pc.cyan(`⚡ devx v1.4.
|
|
38
|
+
console.log(pc.bold(pc.cyan(`⚡ devx v1.4.16 (headless) | ${planMode ? 'PLAN' : 'AGENT'} | ${config.model}`)));
|
|
39
39
|
console.log(pc.dim(`Task: ${userPrompt}\n`));
|
|
40
40
|
}
|
|
41
41
|
for await (const event of agent.run(abortController.signal)) {
|
package/dist/cli/index.js
CHANGED
|
@@ -484,7 +484,7 @@ function drawLogo() {
|
|
|
484
484
|
theme.colorFn(' █▀▀▄ █▀▀▀ █ █ █ █'),
|
|
485
485
|
theme.colorFn(' █ █ █▀▀▀ ▀▄▀ ▀▄▀ '),
|
|
486
486
|
theme.colorFn(' █▄▄▀ █▄▄▄ ▀ ▀ ▀ '),
|
|
487
|
-
' ' + theme.boldFn('v1.4.
|
|
487
|
+
' ' + theme.boldFn('v1.4.16'),
|
|
488
488
|
''
|
|
489
489
|
];
|
|
490
490
|
for (const line of logo) {
|
|
@@ -499,7 +499,7 @@ function drawLogo() {
|
|
|
499
499
|
indent + theme.colorFn('▀▀▀█▀▀▀ █▀▀▀ █▀▀█ █▄ ▄█ █ █ ▀▄ ▄▀ █▀▀▄ █▀▀▀ █ █'),
|
|
500
500
|
indent + theme.colorFn(' █ █▀▀▀ █▄▄▀ █ █ █ █ █ █ ▀▀ █ █ █▀▀▀ █ █'),
|
|
501
501
|
indent + theme.colorFn(' █ █▄▄▄ █ ▀▄ █ █ ▀▄▄▀ ▄▀ ▀▄ █▄▄▀ █▄▄▄ ▀▄▀ '),
|
|
502
|
-
indent + theme.boldFn('v1.4.
|
|
502
|
+
indent + theme.boldFn('v1.4.16'),
|
|
503
503
|
''
|
|
504
504
|
];
|
|
505
505
|
for (const line of logo) {
|
|
@@ -645,7 +645,7 @@ async function handleSettings(config) {
|
|
|
645
645
|
const maxIterLabel = maxIter >= 9999 ? 'Unlimited' : `${maxIter} steps`;
|
|
646
646
|
const currentTh = getCurrentTheme();
|
|
647
647
|
const choice = await select({
|
|
648
|
-
message: `${pc.bold('⚙️ Settings')} ${pc.dim(`(devx v1.4.
|
|
648
|
+
message: `${pc.bold('⚙️ Settings')} ${pc.dim(`(devx v1.4.16 • theme: ${currentTh.name})`)}`,
|
|
649
649
|
choices: [
|
|
650
650
|
{
|
|
651
651
|
name: `🎨 Color Theme: ${currentTh.emoji} ${currentTh.name}`,
|
|
@@ -686,7 +686,7 @@ async function handleSettings(config) {
|
|
|
686
686
|
description: 'Limit how many tool steps (file edits, terminal commands) agent can do per request'
|
|
687
687
|
},
|
|
688
688
|
{
|
|
689
|
-
name: `${currentTh.colorFn('✨ About devx')} ${pc.dim('(v1.4.
|
|
689
|
+
name: `${currentTh.colorFn('✨ About devx')} ${pc.dim('(v1.4.16 by ApvCode)')}`,
|
|
690
690
|
value: 'about',
|
|
691
691
|
description: 'Terminal-Native AI Coding Agent created by ApvCode (https://github.com/apvcode/Termux-Dev)'
|
|
692
692
|
},
|
|
@@ -702,7 +702,7 @@ async function handleSettings(config) {
|
|
|
702
702
|
continue;
|
|
703
703
|
}
|
|
704
704
|
if (choice === 'about') {
|
|
705
|
-
p.note(`⚡ devx v1.4.
|
|
705
|
+
p.note(`⚡ devx v1.4.16 — Terminal-Native AI Coding Agent\n` +
|
|
706
706
|
`🎨 Theme: ${currentTh.emoji} ${currentTh.name}\n` +
|
|
707
707
|
`👤 Author: ApvCode (https://github.com/apvcode)\n` +
|
|
708
708
|
`🌟 Repository: https://github.com/apvcode/Termux-Dev\n` +
|
|
@@ -798,7 +798,7 @@ export async function main() {
|
|
|
798
798
|
program
|
|
799
799
|
.name('devx')
|
|
800
800
|
.description('Terminal-native AI coding assistant and vibe-coding agent')
|
|
801
|
-
.version('1.4.
|
|
801
|
+
.version('1.4.16')
|
|
802
802
|
.option('-p, --prompt <task>', 'Run one-shot task non-interactively (headless mode)')
|
|
803
803
|
.option('-y, --yolo', 'Automatically approve all tool executions without confirmation')
|
|
804
804
|
.option('-m, --model <model>', 'Specify AI model to use for this execution')
|
package/dist/cli/prompt.js
CHANGED
|
@@ -177,7 +177,9 @@ export function askPrompt(opts = {}) {
|
|
|
177
177
|
selectedIndex = items.length - 1;
|
|
178
178
|
if (selectedIndex < 0)
|
|
179
179
|
selectedIndex = 0;
|
|
180
|
-
|
|
180
|
+
// On very small screens (keyboard open on Android), limit dropdown aggressively
|
|
181
|
+
const maxDropdownRows = Math.max(2, Math.min(rows - 3, 6));
|
|
182
|
+
const pageSize = Math.min(4, Math.max(2, Math.min(maxDropdownRows - 2, Math.floor(rows / 4))));
|
|
181
183
|
const innerBoxWidth = Math.max(10, Math.min(cols - 8, 48));
|
|
182
184
|
const total = items.length;
|
|
183
185
|
let startIndex = 0;
|
|
@@ -236,6 +238,8 @@ export function askPrompt(opts = {}) {
|
|
|
236
238
|
}
|
|
237
239
|
dropdownLines.push(pc.dim('│') + ' ' + pc.dim('╰' + botBorderStr + '╯') + '\x1b[0m');
|
|
238
240
|
}
|
|
241
|
+
// === SAFE RENDERING: Use \x1b7/\x1b8 save/restore + \x1b[B (down) instead of \n ===
|
|
242
|
+
// This prevents hardware scroll when cursor is at the bottom of a small screen.
|
|
239
243
|
// 1. Format and write the Prompt line safely (guaranteed <= cols - 1 chars)
|
|
240
244
|
let inputDisplay = pc.dim('│') + ' ';
|
|
241
245
|
let renderCursorCol = 3;
|
|
@@ -261,22 +265,24 @@ export function askPrompt(opts = {}) {
|
|
|
261
265
|
renderCursorCol = 3 + (prefix ? 1 : 0) + (cursorPos - start);
|
|
262
266
|
}
|
|
263
267
|
}
|
|
268
|
+
// Write prompt line (no \n — stays on same line)
|
|
264
269
|
process.stdout.write(`\x1b[0m\r\x1b[2K${inputDisplay}\x1b[0m`);
|
|
265
|
-
// 2. Draw dropdown
|
|
270
|
+
// 2. Draw dropdown below using \x1b[1B (cursor down) + \r without scrolling viewport
|
|
266
271
|
const maxDropdowns = Math.max(dropdownLines.length, lastRenderedDropdownLines);
|
|
267
272
|
if (maxDropdowns > 0) {
|
|
273
|
+
// Save cursor position on the prompt line
|
|
274
|
+
process.stdout.write('\x1b7');
|
|
268
275
|
for (let i = 0; i < maxDropdowns; i++) {
|
|
276
|
+
// Move to next line: \x1b[1B moves down 1 without scrolling, \r returns to col 0, \x1b[2K clears line
|
|
277
|
+
process.stdout.write(`\x1b[1B\r\x1b[0m\x1b[2K`);
|
|
269
278
|
if (i < dropdownLines.length) {
|
|
270
|
-
process.stdout.write(
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
process.stdout.write(`\n\x1b[0m\x1b[2K`);
|
|
279
|
+
process.stdout.write(dropdownLines[i] + '\x1b[0m');
|
|
274
280
|
}
|
|
275
281
|
}
|
|
276
|
-
//
|
|
277
|
-
process.stdout.write(
|
|
282
|
+
// Restore cursor position (back to prompt line)
|
|
283
|
+
process.stdout.write('\x1b8');
|
|
278
284
|
}
|
|
279
|
-
// 3. Place cursor precisely
|
|
285
|
+
// 3. Place cursor precisely on the prompt line
|
|
280
286
|
process.stdout.write(`\r\x1b[${renderCursorCol}C`);
|
|
281
287
|
lastRenderedDropdownLines = dropdownLines.length;
|
|
282
288
|
}
|
|
@@ -295,10 +301,11 @@ export function askPrompt(opts = {}) {
|
|
|
295
301
|
}
|
|
296
302
|
function clearBoxAndExit(finalInput) {
|
|
297
303
|
if (lastRenderedDropdownLines > 0) {
|
|
304
|
+
process.stdout.write('\x1b7');
|
|
298
305
|
for (let i = 0; i < lastRenderedDropdownLines; i++) {
|
|
299
|
-
process.stdout.write(`\
|
|
306
|
+
process.stdout.write(`\x1b[1B\r\x1b[0m\x1b[2K`);
|
|
300
307
|
}
|
|
301
|
-
process.stdout.write(
|
|
308
|
+
process.stdout.write('\x1b8');
|
|
302
309
|
lastRenderedDropdownLines = 0;
|
|
303
310
|
}
|
|
304
311
|
const fullText = expandPastes(finalInput);
|
|
@@ -353,10 +360,11 @@ export function askPrompt(opts = {}) {
|
|
|
353
360
|
// Ctrl+C / SIGINT
|
|
354
361
|
if (str === '\x03') {
|
|
355
362
|
if (lastRenderedDropdownLines > 0) {
|
|
363
|
+
process.stdout.write('\x1b7');
|
|
356
364
|
for (let i = 0; i < lastRenderedDropdownLines; i++) {
|
|
357
|
-
process.stdout.write(`\
|
|
365
|
+
process.stdout.write(`\x1b[1B\r\x1b[0m\x1b[2K`);
|
|
358
366
|
}
|
|
359
|
-
process.stdout.write(
|
|
367
|
+
process.stdout.write('\x1b8');
|
|
360
368
|
lastRenderedDropdownLines = 0;
|
|
361
369
|
}
|
|
362
370
|
process.stdout.write(`\x1b[0m\r\x1b[2K\n`);
|
package/dist/cli/server.js
CHANGED
|
@@ -139,7 +139,7 @@ function renderDirectoryHtml(dirPath, relPath, files, port) {
|
|
|
139
139
|
${parentLink}
|
|
140
140
|
${items || '<li style="padding: 20px; text-align: center; color: #6e7681;">No visible files in this directory</li>'}
|
|
141
141
|
</ul>
|
|
142
|
-
<div class="footer">devx v1.4.
|
|
142
|
+
<div class="footer">devx v1.4.16 • Terminal-Native AI Assistant</div>
|
|
143
143
|
</div>
|
|
144
144
|
</body>
|
|
145
145
|
</html>`;
|
package/dist/cli/smooth.js
CHANGED
|
@@ -49,6 +49,13 @@ export class SmoothStreamer {
|
|
|
49
49
|
else {
|
|
50
50
|
take = 4;
|
|
51
51
|
}
|
|
52
|
+
if (take < fullStr.length) {
|
|
53
|
+
const code = fullStr.charCodeAt(take - 1);
|
|
54
|
+
// If take ends on a high surrogate (0xD800..0xDBFF), advance by 1 to include low surrogate
|
|
55
|
+
if (code >= 0xD800 && code <= 0xDBFF) {
|
|
56
|
+
take++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
52
59
|
const chunk = fullStr.slice(0, take);
|
|
53
60
|
const rest = fullStr.slice(take);
|
|
54
61
|
if (rest) {
|
package/dist/mcp/client.js
CHANGED
package/package.json
CHANGED