chivgent 0.18.1 → 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 +67 -34
- package/README.zh-CN.md +57 -27
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +5 -0
- package/dist/cli-options.js.map +1 -1
- package/dist/cli.js +13 -25
- package/dist/cli.js.map +1 -1
- package/dist/providers/deferred-client.d.ts +2 -1
- package/dist/providers/deferred-client.d.ts.map +1 -1
- package/dist/providers/deferred-client.js +4 -0
- package/dist/providers/deferred-client.js.map +1 -1
- package/dist/providers/interactive.d.ts +31 -0
- package/dist/providers/interactive.d.ts.map +1 -0
- package/dist/providers/interactive.js +184 -0
- package/dist/providers/interactive.js.map +1 -0
- package/dist/remote/repl.d.ts.map +1 -1
- package/dist/remote/repl.js +6 -5
- package/dist/remote/repl.js.map +1 -1
- package/dist/repl.d.ts +32 -4
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +209 -29
- package/dist/repl.js.map +1 -1
- package/dist/tui/input.d.ts +6 -0
- package/dist/tui/input.d.ts.map +1 -1
- package/dist/tui/input.js +98 -12
- package/dist/tui/input.js.map +1 -1
- package/dist/tui/menu.d.ts +26 -0
- package/dist/tui/menu.d.ts.map +1 -0
- package/dist/tui/menu.js +75 -0
- package/dist/tui/menu.js.map +1 -0
- package/dist/tui/text.d.ts +2 -0
- package/dist/tui/text.d.ts.map +1 -1
- package/dist/tui/text.js +19 -0
- package/dist/tui/text.js.map +1 -1
- package/dist/tui/view.d.ts.map +1 -1
- package/dist/tui/view.js +57 -23
- package/dist/tui/view.js.map +1 -1
- package/dist/tui/welcome.d.ts +2 -1
- package/dist/tui/welcome.d.ts.map +1 -1
- package/dist/tui/welcome.js +26 -24
- package/dist/tui/welcome.js.map +1 -1
- package/dist/update.d.ts +13 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +145 -0
- package/dist/update.js.map +1 -0
- package/package.json +4 -2
package/dist/tui/menu.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { fitLine } from "./text.js";
|
|
2
|
+
/** A small transient region beneath readline, with the cursor left in the draft. */
|
|
3
|
+
export class InputMenu {
|
|
4
|
+
readline;
|
|
5
|
+
output;
|
|
6
|
+
items = [];
|
|
7
|
+
selected = 0;
|
|
8
|
+
reserved = 0;
|
|
9
|
+
painted = 0;
|
|
10
|
+
constructor(readline, output) {
|
|
11
|
+
this.readline = readline;
|
|
12
|
+
this.output = output;
|
|
13
|
+
}
|
|
14
|
+
get active() { return this.items.length > 0; }
|
|
15
|
+
get selection() { return this.items[this.selected]?.value; }
|
|
16
|
+
show(items, preserveSelection = false) {
|
|
17
|
+
const previous = this.selection;
|
|
18
|
+
this.clear();
|
|
19
|
+
this.items = items;
|
|
20
|
+
this.selected = preserveSelection ? Math.max(0, items.findIndex((item) => item.value === previous)) : 0;
|
|
21
|
+
if (items.length === 0)
|
|
22
|
+
return;
|
|
23
|
+
const height = Math.min(items.length, 12, Math.max(0, (this.output.rows ?? 24) - 2));
|
|
24
|
+
if (height === 0)
|
|
25
|
+
return;
|
|
26
|
+
if (height > this.reserved) {
|
|
27
|
+
const extra = height - this.reserved;
|
|
28
|
+
const column = this.readline.getCursorPos().cols + 1;
|
|
29
|
+
this.output.write("\r\n".repeat(extra) + `\u001b[${extra}A\u001b[${column}G`);
|
|
30
|
+
this.reserved = height;
|
|
31
|
+
}
|
|
32
|
+
const start = Math.max(0, Math.min(this.selected - height + 1, items.length - height));
|
|
33
|
+
const width = Math.max(1, (this.output.columns ?? 80) - 1);
|
|
34
|
+
this.output.write("\u001b7" + this.belowInput());
|
|
35
|
+
for (let index = 0; index < height; index++) {
|
|
36
|
+
const itemIndex = start + index;
|
|
37
|
+
const item = items[itemIndex];
|
|
38
|
+
this.output.write(`\r\u001b[2K${fitLine(`${itemIndex === this.selected ? "❯" : " "} ${item?.label ?? ""}`, width)}`);
|
|
39
|
+
if (index < height - 1)
|
|
40
|
+
this.output.write("\u001b[1B");
|
|
41
|
+
}
|
|
42
|
+
this.output.write("\u001b8");
|
|
43
|
+
this.painted = height;
|
|
44
|
+
}
|
|
45
|
+
move(delta) {
|
|
46
|
+
if (!this.active)
|
|
47
|
+
return;
|
|
48
|
+
this.selected = (this.selected + delta + this.items.length) % this.items.length;
|
|
49
|
+
this.show(this.items, true);
|
|
50
|
+
}
|
|
51
|
+
clear() {
|
|
52
|
+
if (this.painted > 0) {
|
|
53
|
+
this.output.write("\u001b7" + this.belowInput());
|
|
54
|
+
for (let index = 0; index < this.painted; index++) {
|
|
55
|
+
this.output.write("\r\u001b[2K");
|
|
56
|
+
if (index < this.painted - 1)
|
|
57
|
+
this.output.write("\u001b[1B");
|
|
58
|
+
}
|
|
59
|
+
this.output.write("\u001b8");
|
|
60
|
+
}
|
|
61
|
+
this.painted = 0;
|
|
62
|
+
this.items = [];
|
|
63
|
+
}
|
|
64
|
+
reset() {
|
|
65
|
+
this.clear();
|
|
66
|
+
this.reserved = 0;
|
|
67
|
+
}
|
|
68
|
+
belowInput() {
|
|
69
|
+
const columns = Math.max(1, this.output.columns ?? 80);
|
|
70
|
+
const endRow = Math.floor((2 + this.readline.line.length) / columns);
|
|
71
|
+
const distance = Math.max(1, endRow - this.readline.getCursorPos().rows + 1);
|
|
72
|
+
return `\u001b[${distance}B\r`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/tui/menu.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/text.d.ts
CHANGED
|
@@ -4,4 +4,6 @@ export declare function terminalText(text: string): string;
|
|
|
4
4
|
export { stringWidth as displayWidth };
|
|
5
5
|
/** Fit terminal cells, preserving whole graphemes (including joined emoji). */
|
|
6
6
|
export declare function fitLine(text: string, columns: number): string;
|
|
7
|
+
/** Show the newest part of a changing line, keeping whole terminal cells. */
|
|
8
|
+
export declare function fitLineTail(text: string, columns: number): string;
|
|
7
9
|
//# sourceMappingURL=text.d.ts.map
|
package/dist/tui/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,cAAc,CAAC;AAIvC,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,CAAC;AAEvC,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc7D"}
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,cAAc,CAAC;AAIvC,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,CAAC;AAEvC,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc7D;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAcjE"}
|
package/dist/tui/text.js
CHANGED
|
@@ -28,4 +28,23 @@ export function fitLine(text, columns) {
|
|
|
28
28
|
}
|
|
29
29
|
return `${result}…`;
|
|
30
30
|
}
|
|
31
|
+
/** Show the newest part of a changing line, keeping whole terminal cells. */
|
|
32
|
+
export function fitLineTail(text, columns) {
|
|
33
|
+
const width = Math.max(0, Math.floor(columns));
|
|
34
|
+
const clean = terminalText(text).replace(/\n/g, " ");
|
|
35
|
+
if (width === 0)
|
|
36
|
+
return "";
|
|
37
|
+
if (stringWidth(clean) <= width)
|
|
38
|
+
return clean;
|
|
39
|
+
let result = "";
|
|
40
|
+
let used = 0;
|
|
41
|
+
for (const { segment } of [...graphemes.segment(clean)].reverse()) {
|
|
42
|
+
const size = stringWidth(segment);
|
|
43
|
+
if (used + size > width - 1)
|
|
44
|
+
break;
|
|
45
|
+
result = segment + result;
|
|
46
|
+
used += size;
|
|
47
|
+
}
|
|
48
|
+
return `…${result}`;
|
|
49
|
+
}
|
|
31
50
|
//# sourceMappingURL=text.js.map
|
package/dist/tui/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;AAE7E,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,wBAAwB,CAAC,IAAI,CAAC;SAClC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,4CAA4C,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,CAAC;AAEvC,+EAA+E;AAC/E,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC;YAAE,MAAM;QACnC,MAAM,IAAI,OAAO,CAAC;QAClB,IAAI,IAAI,IAAI,CAAC;IACf,CAAC;IACD,OAAO,GAAG,MAAM,GAAG,CAAC;AACtB,CAAC"}
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;AAE7E,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,wBAAwB,CAAC,IAAI,CAAC;SAClC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,4CAA4C,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,CAAC;AAEvC,+EAA+E;AAC/E,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC;YAAE,MAAM;QACnC,MAAM,IAAI,OAAO,CAAC;QAClB,IAAI,IAAI,IAAI,CAAC;IACf,CAAC;IACD,OAAO,GAAG,MAAM,GAAG,CAAC;AACtB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC;YAAE,MAAM;QACnC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;QAC1B,IAAI,IAAI,IAAI,CAAC;IACf,CAAC;IACD,OAAO,IAAI,MAAM,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/tui/view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/tui/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,YAAY,CAAC;AAQzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/tui/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,YAAY,CAAC;AAQzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AA2DD;;;;;;GAMG;AACH,wBAAgB,IAAI,CAClB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,GACnB,SAAS,MAAM,EAAE,CAwBnB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CActE"}
|
package/dist/tui/view.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { formatTokens } from "../providers/usage.js";
|
|
2
2
|
import { callTarget } from "../tools/target.js";
|
|
3
|
-
import { fitLine } from "./text.js";
|
|
3
|
+
import { displayWidth, fitLine, fitLineTail, terminalText } from "./text.js";
|
|
4
4
|
/** Tools listed individually before the rest are summarised as a count. */
|
|
5
5
|
const MAX_LISTED_TOOLS = 3;
|
|
6
6
|
/** Lines of the answer kept visible while it streams. */
|
|
@@ -12,13 +12,58 @@ function elapsed(from, now) {
|
|
|
12
12
|
}
|
|
13
13
|
return `${Math.floor(seconds / 60)}m${String(seconds % 60).padStart(2, "0")}s`;
|
|
14
14
|
}
|
|
15
|
-
function
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
function toolHead(tool, now, width) {
|
|
16
|
+
const prefix = ` ${terminalText(tool.name)}`;
|
|
17
|
+
const duration = ` (${elapsed(tool.startedAt, now)})`;
|
|
18
|
+
if (displayWidth(prefix) + displayWidth(duration) > width)
|
|
19
|
+
return fitLine(prefix, width);
|
|
20
|
+
if (tool.target === undefined)
|
|
21
|
+
return fitLine(`${prefix}${duration}`, width);
|
|
22
|
+
const targetWidth = width - displayWidth(prefix) - displayWidth(duration) - 1;
|
|
23
|
+
if (targetWidth < 2)
|
|
24
|
+
return fitLine(`${prefix}${duration}`, width);
|
|
25
|
+
return `${prefix} ${fitLineTail(tool.target, targetWidth)}${duration}`;
|
|
26
|
+
}
|
|
27
|
+
function describeTool(tool, now, width) {
|
|
28
|
+
// Preserve the tool name, the end of a long path, and the latest progress.
|
|
29
|
+
const latest = terminalText(tool.progress.split("\n").filter((line) => line.length > 0).at(-1) ?? "");
|
|
30
|
+
if (latest.length === 0)
|
|
31
|
+
return toolHead(tool, now, width);
|
|
32
|
+
const fullHead = toolHead(tool, now, width);
|
|
33
|
+
if (displayWidth(fullHead) + 2 + displayWidth(latest) <= width) {
|
|
34
|
+
return `${fullHead} ${latest}`;
|
|
35
|
+
}
|
|
36
|
+
const progressWidth = Math.max(6, Math.floor(width * 0.35));
|
|
37
|
+
if (width - progressWidth < 14)
|
|
38
|
+
return fullHead;
|
|
39
|
+
return `${toolHead(tool, now, width - progressWidth - 2)} ${fitLineTail(latest, progressWidth)}`;
|
|
40
|
+
}
|
|
41
|
+
function statusLine(run, now, width) {
|
|
42
|
+
const status = run.status === "thinking" ? "thinking" : "running tools";
|
|
43
|
+
const shortStatus = run.status === "thinking" ? "thinking" : "tools";
|
|
44
|
+
const duration = elapsed(run.startedAt, now);
|
|
45
|
+
const usage = run.usage;
|
|
46
|
+
const tokens = usage !== undefined && usage.usage.totalTokens > 0
|
|
47
|
+
? `${formatTokens(usage.usage.totalTokens)} tokens${usage.complete ? "" : "+"}`
|
|
48
|
+
: undefined;
|
|
49
|
+
const candidates = [
|
|
50
|
+
[status, `turn ${run.turn}/${run.maxTurns}`, duration, ...(tokens === undefined ? [] : [tokens]), "ctrl+c to stop"],
|
|
51
|
+
[status, `turn ${run.turn}/${run.maxTurns}`, duration, "ctrl+c to stop"],
|
|
52
|
+
[status, `${run.turn}/${run.maxTurns}`, duration, "^C stop"],
|
|
53
|
+
[status, duration, "^C stop"],
|
|
54
|
+
[shortStatus, duration, "^C stop"],
|
|
55
|
+
[shortStatus, "^C stop"],
|
|
56
|
+
];
|
|
57
|
+
for (const parts of candidates) {
|
|
58
|
+
const line = parts.join(" · ");
|
|
59
|
+
if (displayWidth(line) <= width)
|
|
60
|
+
return line;
|
|
61
|
+
}
|
|
62
|
+
for (const line of [`${shortStatus} ^C stop`, `${shortStatus} ^C`]) {
|
|
63
|
+
if (displayWidth(line) <= width)
|
|
64
|
+
return line;
|
|
65
|
+
}
|
|
66
|
+
return fitLine("^C stop", width);
|
|
22
67
|
}
|
|
23
68
|
/**
|
|
24
69
|
* Renders the live region. Pure: no terminal, no clock, no colour.
|
|
@@ -33,29 +78,18 @@ export function view(state, options) {
|
|
|
33
78
|
return [];
|
|
34
79
|
}
|
|
35
80
|
const lines = [];
|
|
36
|
-
const tail = run.text.split("\n").slice(-MAX_TEXT_LINES);
|
|
81
|
+
const tail = run.text.split("\n").filter((line) => line.length > 0).slice(-MAX_TEXT_LINES);
|
|
37
82
|
for (const line of tail) {
|
|
38
|
-
|
|
39
|
-
lines.push(fitLine(line, options.width));
|
|
40
|
-
}
|
|
83
|
+
lines.push(fitLineTail(line, options.width));
|
|
41
84
|
}
|
|
42
85
|
for (const tool of run.running.slice(0, MAX_LISTED_TOOLS)) {
|
|
43
|
-
lines.push(
|
|
86
|
+
lines.push(describeTool(tool, options.now, options.width));
|
|
44
87
|
}
|
|
45
88
|
const hidden = run.running.length - MAX_LISTED_TOOLS;
|
|
46
89
|
if (hidden > 0) {
|
|
47
90
|
lines.push(fitLine(` and ${hidden} more`, options.width));
|
|
48
91
|
}
|
|
49
|
-
|
|
50
|
-
run.status === "thinking" ? "thinking" : "running tools",
|
|
51
|
-
`turn ${run.turn}/${run.maxTurns}`,
|
|
52
|
-
elapsed(run.startedAt, options.now),
|
|
53
|
-
];
|
|
54
|
-
if (run.usage !== undefined && run.usage.usage.totalTokens > 0) {
|
|
55
|
-
status.push(`${formatTokens(run.usage.usage.totalTokens)} tokens${run.usage.complete ? "" : "+"}`);
|
|
56
|
-
}
|
|
57
|
-
status.push("ctrl+c to stop");
|
|
58
|
-
lines.push(fitLine(status.join(" · "), options.width));
|
|
92
|
+
lines.push(statusLine(run, options.now, options.width));
|
|
59
93
|
return lines.slice(-Math.max(1, options.height ?? lines.length));
|
|
60
94
|
}
|
|
61
95
|
/**
|
package/dist/tui/view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/tui/view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/tui/view.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/welcome.d.ts
CHANGED
|
@@ -3,10 +3,11 @@ export interface WelcomeOptions {
|
|
|
3
3
|
readonly provider: string;
|
|
4
4
|
readonly model: string;
|
|
5
5
|
readonly cwd: string;
|
|
6
|
-
readonly sessionId: string;
|
|
7
6
|
readonly resumed: boolean;
|
|
8
7
|
readonly signedOut: boolean;
|
|
8
|
+
readonly setupIssue?: "model" | "base-url";
|
|
9
9
|
readonly width: number;
|
|
10
|
+
readonly color?: boolean;
|
|
10
11
|
}
|
|
11
12
|
export declare function welcome(options: WelcomeOptions): string;
|
|
12
13
|
//# sourceMappingURL=welcome.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AASD,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAqBvD"}
|
package/dist/tui/welcome.js
CHANGED
|
@@ -1,28 +1,30 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { fitLine, fitLineTail } from "./text.js";
|
|
2
|
+
const glyphs = {
|
|
3
|
+
C: ["█▀▀", "█ ", "█▄▄"], H: ["█ █", "█▀█", "█ █"], I: ["█", "█", "█"],
|
|
4
|
+
V: ["█ █", "█ █", " ▀ "], G: ["█▀▀", "█ ▄", "█▄█"], E: ["█▀▀", "█▀ ", "█▄▄"],
|
|
5
|
+
N: ["█▄█", "█▀█", "█ █"], T: ["▀█▀", " █ ", " █ "],
|
|
6
|
+
};
|
|
7
|
+
const wordmark = [0, 1, 2].map((row) => [..."CHIVGENT"].map((letter) => glyphs[letter]?.[row] ?? "").join(" "));
|
|
2
8
|
export function welcome(options) {
|
|
3
|
-
const width = Math.max(1,
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
`
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
options.
|
|
11
|
-
|
|
9
|
+
const width = Math.max(1, options.width - 1);
|
|
10
|
+
const brand = width >= 38 ? wordmark.map((row) => ` ${row}`) : [" ◆ chivgent"];
|
|
11
|
+
const lines = [
|
|
12
|
+
...brand,
|
|
13
|
+
` v${options.version}${options.resumed ? " · continued session" : ""}`,
|
|
14
|
+
` ${options.provider} / ${options.model}`,
|
|
15
|
+
` ${fitLineTail(options.cwd, width - 2)}`,
|
|
16
|
+
options.setupIssue === "model"
|
|
17
|
+
? " Set a model with /model MODEL"
|
|
18
|
+
: options.setupIssue === "base-url"
|
|
19
|
+
? " Set the API URL with /endpoint URL"
|
|
20
|
+
: options.signedOut
|
|
21
|
+
? " Start with /provider → choose a Provider"
|
|
22
|
+
: " Ready. Type a task or use /provider to switch.",
|
|
23
|
+
" / commands · ↑↓ select · Ctrl+C exit",
|
|
12
24
|
];
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const lines = content.map((line) => {
|
|
18
|
-
const fitted = fitLine(line, inner);
|
|
19
|
-
return `│ ${fitted}${" ".repeat(inner - displayWidth(fitted))} │`;
|
|
20
|
-
});
|
|
21
|
-
return [
|
|
22
|
-
`╭${"─".repeat(width - 2)}╮`,
|
|
23
|
-
...lines,
|
|
24
|
-
`╰${"─".repeat(width - 2)}╯`,
|
|
25
|
-
"",
|
|
26
|
-
].join("\n");
|
|
25
|
+
return `\n${lines.map((line, index) => {
|
|
26
|
+
const fitted = fitLine(line, width);
|
|
27
|
+
return options.color && index < brand.length ? `\u001b[1;36m${fitted}\u001b[0m` : fitted;
|
|
28
|
+
}).join("\n")}\n\n`;
|
|
27
29
|
}
|
|
28
30
|
//# sourceMappingURL=welcome.js.map
|
package/dist/tui/welcome.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAcjD,MAAM,MAAM,GAAsC;IAChD,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACtE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAC5E,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;CACnD,CAAC;AACF,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEhH,MAAM,UAAU,OAAO,CAAC,OAAuB;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG;QACZ,GAAG,KAAK;QACR,MAAM,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE;QACzE,KAAK,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,KAAK,EAAE;QAC1C,KAAK,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE;QAC1C,OAAO,CAAC,UAAU,KAAK,OAAO;YAC5B,CAAC,CAAC,iCAAiC;YACnC,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU;gBACjC,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,OAAO,CAAC,SAAS;oBACjB,CAAC,CAAC,4CAA4C;oBAC9C,CAAC,CAAC,kDAAkD;QAC1D,4CAA4C;KAC7C,CAAC;IACF,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3F,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AACtB,CAAC"}
|
package/dist/update.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type NpmRunner = (args: readonly string[], timeout: number) => Promise<string>;
|
|
2
|
+
export interface UpdateOptions {
|
|
3
|
+
readonly version: string;
|
|
4
|
+
readonly packageRoot?: string;
|
|
5
|
+
readonly nodeVersion?: string;
|
|
6
|
+
readonly npm?: NpmRunner;
|
|
7
|
+
readonly write?: (text: string) => void;
|
|
8
|
+
readonly error?: (text: string) => void;
|
|
9
|
+
}
|
|
10
|
+
/** Runs before provider configuration, session creation or project extensions. */
|
|
11
|
+
export declare function runUpdate(argv: readonly string[], options: UpdateOptions): Promise<number>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAoBA,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAiB/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AA2BD,kFAAkF;AAClF,wBAAsB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAoFhG"}
|
package/dist/update.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { lstat, readFile, realpath } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, isAbsolute, join, sep } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
import semver from "semver";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
const MANUAL_UPDATE = "npm install -g chivgent@latest";
|
|
10
|
+
const HELP = `Usage: chivgent update [--check]
|
|
11
|
+
|
|
12
|
+
Update an npm global installation to the latest published version.
|
|
13
|
+
--check Check versions without installing
|
|
14
|
+
-h, --help Show this help
|
|
15
|
+
|
|
16
|
+
Source checkouts, local dependencies and npx runs receive manual instructions.
|
|
17
|
+
To send the word update as a question, use: chivgent -- update
|
|
18
|
+
`;
|
|
19
|
+
/** No shell interpolation; on Windows invoke npm's JS entry point directly. */
|
|
20
|
+
const runNpm = async (args, timeout) => {
|
|
21
|
+
const windows = process.platform === "win32";
|
|
22
|
+
const command = windows ? process.execPath : "npm";
|
|
23
|
+
const argv = windows
|
|
24
|
+
? [join(dirname(process.execPath), "node_modules/npm/bin/npm-cli.js"), ...args]
|
|
25
|
+
: [...args];
|
|
26
|
+
const pending = execFileAsync(command, argv, {
|
|
27
|
+
cwd: homedir(), encoding: "utf8", timeout, maxBuffer: 1024 * 1024,
|
|
28
|
+
windowsHide: true,
|
|
29
|
+
});
|
|
30
|
+
pending.child.stdin?.end();
|
|
31
|
+
return (await pending).stdout;
|
|
32
|
+
};
|
|
33
|
+
function installationHint(root) {
|
|
34
|
+
const parts = root.split(sep);
|
|
35
|
+
if (parts.includes("_npx")) {
|
|
36
|
+
return "This is a temporary npx installation. Start the latest version with: npx chivgent@latest";
|
|
37
|
+
}
|
|
38
|
+
if (parts.includes("node_modules")) {
|
|
39
|
+
return "This is not the active npm global installation. For a project dependency, run npm install chivgent@latest in that project; for another package manager, use its update command.";
|
|
40
|
+
}
|
|
41
|
+
return "This is a source checkout or linked installation. In your checkout, run git pull --ff-only, npm ci, then npm run build. If needed, install it again with npm install -g .";
|
|
42
|
+
}
|
|
43
|
+
function absolutePath(output) {
|
|
44
|
+
const value = output.trim();
|
|
45
|
+
if (!isAbsolute(value) || /[\r\n\0]/.test(value)) {
|
|
46
|
+
throw new Error("npm returned an invalid installation path.");
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
function failureMessage(error) {
|
|
51
|
+
const detail = error instanceof Error ? error.message : "Unknown error";
|
|
52
|
+
// Registry and subprocess output must not execute terminal controls.
|
|
53
|
+
return detail.replace(/[\u0000-\u001f\u007f-\u009f]/g, " ").slice(0, 500);
|
|
54
|
+
}
|
|
55
|
+
/** Runs before provider configuration, session creation or project extensions. */
|
|
56
|
+
export async function runUpdate(argv, options) {
|
|
57
|
+
const write = options.write ?? ((text) => { process.stdout.write(text); });
|
|
58
|
+
const error = options.error ?? ((text) => { process.stderr.write(text); });
|
|
59
|
+
const npm = options.npm ?? runNpm;
|
|
60
|
+
if (argv.length === 1 && (argv[0] === "--help" || argv[0] === "-h")) {
|
|
61
|
+
write(HELP);
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
if (argv.length > 1 || (argv.length === 1 && argv[0] !== "--check")) {
|
|
65
|
+
error(HELP);
|
|
66
|
+
return 1;
|
|
67
|
+
}
|
|
68
|
+
const checkOnly = argv[0] === "--check";
|
|
69
|
+
write(`Current version: ${options.version}\n`);
|
|
70
|
+
let phase = "check for updates";
|
|
71
|
+
try {
|
|
72
|
+
const root = await realpath(options.packageRoot ?? fileURLToPath(new URL("..", import.meta.url)));
|
|
73
|
+
// Source and npx use cases need no npm executable or registry request.
|
|
74
|
+
if (!root.split(sep).includes("node_modules") || root.split(sep).includes("_npx")) {
|
|
75
|
+
write(`${installationHint(root)}\n`);
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
const prefix = absolutePath(await npm(["prefix", "--global"], 15_000));
|
|
79
|
+
const globalRoot = absolutePath(await npm(["root", "--global", "--prefix", prefix], 15_000));
|
|
80
|
+
const target = join(globalRoot, "chivgent");
|
|
81
|
+
let globalInstallation = false;
|
|
82
|
+
try {
|
|
83
|
+
// npm link and other package-manager symlinks must not be replaced.
|
|
84
|
+
globalInstallation = !(await lstat(target)).isSymbolicLink() && await realpath(target) === root;
|
|
85
|
+
}
|
|
86
|
+
catch (cause) {
|
|
87
|
+
if (cause.code !== "ENOENT")
|
|
88
|
+
throw cause;
|
|
89
|
+
}
|
|
90
|
+
if (!globalInstallation) {
|
|
91
|
+
write(`${installationHint(root)}\n`);
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
write("Checking npm for the latest version…\n");
|
|
95
|
+
const metadata = JSON.parse(await npm([
|
|
96
|
+
"view", "chivgent@latest", "version", "engines", "--json", "--global", "--prefer-online",
|
|
97
|
+
], 30_000));
|
|
98
|
+
if (typeof metadata !== "object" || metadata === null || !("version" in metadata)
|
|
99
|
+
|| typeof metadata.version !== "string" || semver.valid(metadata.version) !== metadata.version) {
|
|
100
|
+
throw new Error("npm returned invalid version metadata.");
|
|
101
|
+
}
|
|
102
|
+
const latest = metadata.version;
|
|
103
|
+
if (semver.valid(options.version) === null)
|
|
104
|
+
throw new Error("Cannot compare the current version.");
|
|
105
|
+
write(`Latest version: ${latest}\n`);
|
|
106
|
+
if (!semver.gt(latest, options.version)) {
|
|
107
|
+
write(semver.eq(latest, options.version)
|
|
108
|
+
? "Already up to date.\n" : "Your version is newer than npm latest; no downgrade performed.\n");
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
if ("engines" in metadata && typeof metadata.engines === "object" && metadata.engines !== null
|
|
112
|
+
&& "node" in metadata.engines) {
|
|
113
|
+
const required = metadata.engines.node;
|
|
114
|
+
if (typeof required !== "string" || semver.validRange(required) === null) {
|
|
115
|
+
throw new Error("npm returned an invalid Node.js version requirement.");
|
|
116
|
+
}
|
|
117
|
+
const nodeVersion = options.nodeVersion ?? process.versions.node;
|
|
118
|
+
if (!semver.satisfies(nodeVersion, required)) {
|
|
119
|
+
error(`Version ${latest} needs Node.js ${required}; you have ${nodeVersion}. Upgrade Node.js first.\n`);
|
|
120
|
+
return 1;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (checkOnly) {
|
|
124
|
+
write("Update available. Run chivgent update to install it.\n");
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
phase = "install the update";
|
|
128
|
+
write(`Updating chivgent ${options.version} → ${latest}…\n`);
|
|
129
|
+
// Pin both the checked version and the prefix belonging to this install.
|
|
130
|
+
await npm(["install", "--global", "--prefix", prefix, `chivgent@${latest}`,
|
|
131
|
+
"--engine-strict", "--no-audit", "--no-fund"], 300_000);
|
|
132
|
+
phase = "verify the installed version";
|
|
133
|
+
const installed = JSON.parse(await readFile(join(target, "package.json"), "utf8"));
|
|
134
|
+
if (installed.version !== latest)
|
|
135
|
+
throw new Error("The installed version does not match the requested update.");
|
|
136
|
+
write(`Updated to ${latest}. Restart chivgent to use the new version.\n`);
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
catch (cause) {
|
|
140
|
+
error(`Could not ${phase}: ${failureMessage(cause)}\n`);
|
|
141
|
+
error(`Check npm availability, network access and global-directory permissions, then retry.\nManual update: ${MANUAL_UPDATE}\n`);
|
|
142
|
+
return 1;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chivgent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A terminal coding agent with a streaming TUI and configurable AI providers.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -48,10 +48,12 @@
|
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"ignore": "7.0.6",
|
|
50
50
|
"openai": "7.5.0",
|
|
51
|
+
"semver": "7.8.5",
|
|
51
52
|
"string-width": "7.2.0"
|
|
52
53
|
},
|
|
53
54
|
"devDependencies": {
|
|
54
55
|
"@types/node": "26.2.0",
|
|
56
|
+
"@types/semver": "7.7.1",
|
|
55
57
|
"@xterm/headless": "5.5.0",
|
|
56
58
|
"typescript": "7.0.2",
|
|
57
59
|
"vitest": "4.1.11"
|