@pentoshi/clai 0.10.4 → 0.11.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 +32 -0
- package/dist/agent/runner.js +41 -3
- package/dist/agent/runner.js.map +1 -1
- package/dist/commands/providers.js +28 -0
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/search-providers.d.ts +50 -0
- package/dist/commands/search-providers.js +134 -0
- package/dist/commands/search-providers.js.map +1 -0
- package/dist/commands/update.js +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/provider.js +9 -6
- package/dist/llm/provider.js.map +1 -1
- package/dist/prompts/index.d.ts +1 -1
- package/dist/prompts/index.js +6 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/repl.d.ts +1 -0
- package/dist/repl.js +139 -113
- package/dist/repl.js.map +1 -1
- package/dist/safety/classifier.js +40 -0
- package/dist/safety/classifier.js.map +1 -1
- package/dist/store/config.d.ts +5 -0
- package/dist/store/config.js +7 -0
- package/dist/store/config.js.map +1 -1
- package/dist/store/keys.d.ts +65 -0
- package/dist/store/keys.js +164 -28
- package/dist/store/keys.js.map +1 -1
- package/dist/tools/http.d.ts +12 -1
- package/dist/tools/http.js +8 -43
- package/dist/tools/http.js.map +1 -1
- package/dist/tools/registry.js +52 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/shell.d.ts +25 -0
- package/dist/tools/shell.js +155 -6
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/web/audit.d.ts +154 -0
- package/dist/tools/web/audit.js +147 -0
- package/dist/tools/web/audit.js.map +1 -0
- package/dist/tools/web/budget.d.ts +76 -0
- package/dist/tools/web/budget.js +187 -0
- package/dist/tools/web/budget.js.map +1 -0
- package/dist/tools/web/capture.d.ts +201 -0
- package/dist/tools/web/capture.js +380 -0
- package/dist/tools/web/capture.js.map +1 -0
- package/dist/tools/web/fetch-core.d.ts +66 -0
- package/dist/tools/web/fetch-core.js +1123 -0
- package/dist/tools/web/fetch-core.js.map +1 -0
- package/dist/tools/web/fetch.d.ts +42 -0
- package/dist/tools/web/fetch.js +115 -0
- package/dist/tools/web/fetch.js.map +1 -0
- package/dist/tools/web/providers/brave.d.ts +46 -0
- package/dist/tools/web/providers/brave.js +263 -0
- package/dist/tools/web/providers/brave.js.map +1 -0
- package/dist/tools/web/providers/duckduckgo.d.ts +47 -0
- package/dist/tools/web/providers/duckduckgo.js +248 -0
- package/dist/tools/web/providers/duckduckgo.js.map +1 -0
- package/dist/tools/web/providers/provider.d.ts +99 -0
- package/dist/tools/web/providers/provider.js +38 -0
- package/dist/tools/web/providers/provider.js.map +1 -0
- package/dist/tools/web/providers/tavily.d.ts +52 -0
- package/dist/tools/web/providers/tavily.js +285 -0
- package/dist/tools/web/providers/tavily.js.map +1 -0
- package/dist/tools/web/readable.d.ts +67 -0
- package/dist/tools/web/readable.js +248 -0
- package/dist/tools/web/readable.js.map +1 -0
- package/dist/tools/web/redact.d.ts +120 -0
- package/dist/tools/web/redact.js +155 -0
- package/dist/tools/web/redact.js.map +1 -0
- package/dist/tools/web/search.d.ts +51 -0
- package/dist/tools/web/search.js +389 -0
- package/dist/tools/web/search.js.map +1 -0
- package/dist/tools/web/ssrf-guard.d.ts +85 -0
- package/dist/tools/web/ssrf-guard.js +265 -0
- package/dist/tools/web/ssrf-guard.js.map +1 -0
- package/dist/tools/web/types.d.ts +331 -0
- package/dist/tools/web/types.js +71 -0
- package/dist/tools/web/types.js.map +1 -0
- package/dist/ui/keys.js +3 -2
- package/dist/ui/keys.js.map +1 -1
- package/dist/ui/spinner.js +87 -14
- package/dist/ui/spinner.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/web/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,oEAAoE;AACpE,MAAM,CAAC,MAAM,iBAAiB,GAAgC;IAC5D,OAAO;IACP,QAAQ;IACR,YAAY;CACJ,CAAC;AAeX,wEAAwE;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAgBpC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AA6DvC,sDAAsD;AACtD,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,UAAU;IACV,KAAK;CACG,CAAC;AA0BX,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAElC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C,iFAAiF;AACjF,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAEnD,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAiB,UAAU,CAAC;AAE9D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAEjD,gEAAgE;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAElD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC"}
|
package/dist/ui/keys.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export function isCtrlC(key) {
|
|
2
|
-
return Boolean(key.ctrl) && key.name === "c"
|
|
2
|
+
return ((Boolean(key.ctrl) && key.name?.toLowerCase() === "c") ||
|
|
3
|
+
key.sequence === "\x03");
|
|
3
4
|
}
|
|
4
5
|
export function isCtrlT(key) {
|
|
5
6
|
return Boolean(key.ctrl) && key.name === "t";
|
|
@@ -9,6 +10,6 @@ export function isCtrlO(key) {
|
|
|
9
10
|
key.sequence === "\x0f");
|
|
10
11
|
}
|
|
11
12
|
export function isEscape(key) {
|
|
12
|
-
return key.name === "escape";
|
|
13
|
+
return key.name === "escape" || key.sequence === "\x1b";
|
|
13
14
|
}
|
|
14
15
|
//# sourceMappingURL=keys.js.map
|
package/dist/ui/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/ui/keys.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,OAAO,CAAC,GAAa;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/ui/keys.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,OAAO,CAAC,GAAa;IACnC,OAAO,CACL,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC;QACtD,GAAG,CAAC,QAAQ,KAAK,MAAM,CACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAa;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAa;IACnC,OAAO,CACL,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC;QACtD,GAAG,CAAC,QAAQ,KAAK,MAAM,CACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAa;IACpC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;AAC1D,CAAC"}
|
package/dist/ui/spinner.js
CHANGED
|
@@ -7,13 +7,78 @@ import chalk from "chalk";
|
|
|
7
7
|
const FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
8
8
|
const FRAME_INTERVAL_MS = 80;
|
|
9
9
|
const PREVIEW_TAIL_CHARS = 220;
|
|
10
|
+
/**
|
|
11
|
+
* Hard SGR reset emitted at the end of every spinner-rendered line and
|
|
12
|
+
* before/after every erase. Without this the dim+italic style chalk
|
|
13
|
+
* applies to the preview line can leak past the spinner's lifetime —
|
|
14
|
+
* e.g. when {@link truncateForWidth} slices off the closing reset
|
|
15
|
+
* sequence — and the next thing written to the terminal (the model's
|
|
16
|
+
* visible answer, the markdown header, etc.) renders dim until the
|
|
17
|
+
* next ANSI sequence happens to reset it. Always emitting `\x1b[0m`
|
|
18
|
+
* here makes the leak impossible.
|
|
19
|
+
*/
|
|
20
|
+
const SGR_RESET = "\x1b[0m";
|
|
21
|
+
const ANSI_RE = /\x1b\[[0-9;]*m/g;
|
|
10
22
|
function stripAnsi(text) {
|
|
11
|
-
|
|
12
|
-
return text.replace(/\x1b\[[0-9;]*m/g, "");
|
|
23
|
+
return text.replace(ANSI_RE, "");
|
|
13
24
|
}
|
|
14
25
|
function clamp(n, lo, hi) {
|
|
15
26
|
return Math.max(lo, Math.min(hi, n));
|
|
16
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Truncate `text` to at most `width` *visible* characters while keeping
|
|
30
|
+
* any embedded ANSI escape sequences intact. The previous implementation
|
|
31
|
+
* sliced the raw string at byte index `width - 1`, which routinely cut
|
|
32
|
+
* the closing `\x1b[22;23m` reset off the end of a `chalk.dim.italic`
|
|
33
|
+
* preview line — leaving the dim attribute "on" so the model's first
|
|
34
|
+
* visible tokens after the spinner stopped rendered in light grey until
|
|
35
|
+
* the markdown writer happened to emit its own ANSI sequence.
|
|
36
|
+
*
|
|
37
|
+
* This rewrite walks the string token-by-token: it copies ANSI escape
|
|
38
|
+
* sequences verbatim (they consume zero visible columns), counts each
|
|
39
|
+
* non-escape character against `width`, and truncates at the visible
|
|
40
|
+
* boundary. The returned string is always followed by a hard
|
|
41
|
+
* {@link SGR_RESET} so any open style is closed before the cursor moves
|
|
42
|
+
* on.
|
|
43
|
+
*/
|
|
44
|
+
function truncateForWidth(text, width) {
|
|
45
|
+
if (width <= 0)
|
|
46
|
+
return SGR_RESET;
|
|
47
|
+
const visibleLen = stripAnsi(text).length;
|
|
48
|
+
if (visibleLen <= width)
|
|
49
|
+
return text;
|
|
50
|
+
let out = "";
|
|
51
|
+
let visible = 0;
|
|
52
|
+
let i = 0;
|
|
53
|
+
// Reserve the trailing ellipsis from the visible budget.
|
|
54
|
+
const cap = Math.max(0, width - 1);
|
|
55
|
+
while (i < text.length && visible < cap) {
|
|
56
|
+
if (text.startsWith("\x1b[", i)) {
|
|
57
|
+
// Copy a full ANSI sequence so we never split it mid-byte.
|
|
58
|
+
const m = ANSI_RE.exec(text.slice(i));
|
|
59
|
+
// ANSI_RE is global, but we only want a single match starting at i.
|
|
60
|
+
// Fall back to a manual scan if exec doesn't anchor at 0.
|
|
61
|
+
if (m && m.index === 0) {
|
|
62
|
+
out += m[0];
|
|
63
|
+
i += m[0].length;
|
|
64
|
+
ANSI_RE.lastIndex = 0;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
ANSI_RE.lastIndex = 0;
|
|
68
|
+
// Defensive: scan for the terminating letter (m / K / etc.).
|
|
69
|
+
let j = i + 2;
|
|
70
|
+
while (j < text.length && !/[a-zA-Z]/.test(text[j]))
|
|
71
|
+
j += 1;
|
|
72
|
+
out += text.slice(i, j + 1);
|
|
73
|
+
i = j + 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
out += text[i];
|
|
77
|
+
visible += 1;
|
|
78
|
+
i += 1;
|
|
79
|
+
}
|
|
80
|
+
return `${out}…${SGR_RESET}`;
|
|
81
|
+
}
|
|
17
82
|
export function startThinkingSpinner(initialLabel = "thinking", signal) {
|
|
18
83
|
if (!process.stdout.isTTY) {
|
|
19
84
|
return {
|
|
@@ -34,21 +99,19 @@ export function startThinkingSpinner(initialLabel = "thinking", signal) {
|
|
|
34
99
|
if (renderedLines === 0)
|
|
35
100
|
return;
|
|
36
101
|
// Cursor is currently after the last rendered line. Move back up,
|
|
37
|
-
// clearing each line as we go.
|
|
102
|
+
// clearing each line as we go. Always emit a hard SGR reset before
|
|
103
|
+
// and after the clear so any open style attribute (dim, italic,
|
|
104
|
+
// colored) cannot persist past the spinner — `\x1b[2K` clears the
|
|
105
|
+
// visible cells but leaves SGR untouched.
|
|
106
|
+
process.stdout.write(SGR_RESET);
|
|
38
107
|
for (let i = 0; i < renderedLines; i += 1) {
|
|
39
108
|
process.stdout.write("\r\x1b[2K"); // clear current line
|
|
40
109
|
if (i < renderedLines - 1)
|
|
41
110
|
process.stdout.write("\x1b[1A"); // move up
|
|
42
111
|
}
|
|
112
|
+
process.stdout.write(SGR_RESET);
|
|
43
113
|
renderedLines = 0;
|
|
44
114
|
};
|
|
45
|
-
const truncateForWidth = (text, width) => {
|
|
46
|
-
const visibleLen = stripAnsi(text).length;
|
|
47
|
-
if (visibleLen <= width)
|
|
48
|
-
return text;
|
|
49
|
-
// For preview text that has no ANSI codes, simple slice works.
|
|
50
|
-
return text.slice(0, Math.max(0, width - 1)) + "…";
|
|
51
|
-
};
|
|
52
115
|
const render = () => {
|
|
53
116
|
if (stopped)
|
|
54
117
|
return;
|
|
@@ -61,20 +124,27 @@ export function startThinkingSpinner(initialLabel = "thinking", signal) {
|
|
|
61
124
|
chalk.magenta(FRAMES[frame % FRAMES.length]) +
|
|
62
125
|
" " +
|
|
63
126
|
chalk.dim(`${label} ${elapsed}s`) +
|
|
64
|
-
tokenSuffix
|
|
127
|
+
tokenSuffix +
|
|
128
|
+
// Belt-and-braces SGR reset at end-of-line.
|
|
129
|
+
SGR_RESET;
|
|
65
130
|
const cols = clamp(process.stdout.columns ?? 80, 40, 200);
|
|
66
131
|
let lines = [headLine];
|
|
67
132
|
if (preview) {
|
|
68
133
|
// Take last N chars, drop ANSI/control noise, collapse whitespace,
|
|
69
|
-
// and indent so the preview lines up under the spinner.
|
|
70
|
-
|
|
134
|
+
// and indent so the preview lines up under the spinner. Strip any
|
|
135
|
+
// ANSI escapes that leaked in from the upstream stream so we are
|
|
136
|
+
// the sole source of styling on the preview line.
|
|
137
|
+
const tail = stripAnsi(preview)
|
|
71
138
|
.slice(-PREVIEW_TAIL_CHARS)
|
|
72
139
|
// biome-ignore lint: control char strip
|
|
73
140
|
.replace(/[\x00-\x09\x0b-\x1f\x7f]/g, "")
|
|
74
141
|
.replace(/\s+/g, " ")
|
|
75
142
|
.trim();
|
|
76
143
|
if (tail) {
|
|
77
|
-
|
|
144
|
+
// Always end the styled run with SGR_RESET so the truncator (or
|
|
145
|
+
// a terminal that doesn't process the trailing CR/clear in time)
|
|
146
|
+
// can never carry the dim+italic attribute past this line.
|
|
147
|
+
const previewLine = `${chalk.dim.italic(` ${tail}`)}${SGR_RESET}`;
|
|
78
148
|
lines.push(truncateForWidth(previewLine, cols));
|
|
79
149
|
}
|
|
80
150
|
}
|
|
@@ -92,6 +162,9 @@ export function startThinkingSpinner(initialLabel = "thinking", signal) {
|
|
|
92
162
|
stopped = true;
|
|
93
163
|
clearInterval(timer);
|
|
94
164
|
erase();
|
|
165
|
+
// Final, unconditional SGR reset so nothing emitted after the
|
|
166
|
+
// spinner inherits its style attributes.
|
|
167
|
+
process.stdout.write(SGR_RESET);
|
|
95
168
|
};
|
|
96
169
|
if (signal) {
|
|
97
170
|
if (signal.aborted)
|
package/dist/ui/spinner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,wEAAwE;AACxE,uBAAuB;AACvB,4CAA4C;AAC5C,+CAA+C;AAC/C,uEAAuE;AAEvE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAClE,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,kBAAkB,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pentoshi/clai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "A fast, cross-platform AI CLI assistant with ask and agent modes for shell tasks, file operations, and cybersecurity workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@inquirer/prompts": "^8.4.2",
|
|
48
48
|
"chalk": "^5.4.1",
|
|
49
|
+
"cheerio": "^1.0.0",
|
|
49
50
|
"commander": "^14.0.3",
|
|
50
51
|
"conf": "^13.1.0",
|
|
51
52
|
"execa": "^9.5.2",
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|
|
59
60
|
"@types/node": "^25.6.0",
|
|
61
|
+
"fast-check": "^4.3.0",
|
|
60
62
|
"tsx": "^4.21.0",
|
|
61
63
|
"typescript": "^6.0.3",
|
|
62
64
|
"vitest": "^4.1.5"
|