@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.
Files changed (82) hide show
  1. package/README.md +32 -0
  2. package/dist/agent/runner.js +41 -3
  3. package/dist/agent/runner.js.map +1 -1
  4. package/dist/commands/providers.js +28 -0
  5. package/dist/commands/providers.js.map +1 -1
  6. package/dist/commands/search-providers.d.ts +50 -0
  7. package/dist/commands/search-providers.js +134 -0
  8. package/dist/commands/search-providers.js.map +1 -0
  9. package/dist/commands/update.js +1 -1
  10. package/dist/index.js +8 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/llm/provider.js +9 -6
  13. package/dist/llm/provider.js.map +1 -1
  14. package/dist/prompts/index.d.ts +1 -1
  15. package/dist/prompts/index.js +6 -0
  16. package/dist/prompts/index.js.map +1 -1
  17. package/dist/repl.d.ts +1 -0
  18. package/dist/repl.js +139 -113
  19. package/dist/repl.js.map +1 -1
  20. package/dist/safety/classifier.js +40 -0
  21. package/dist/safety/classifier.js.map +1 -1
  22. package/dist/store/config.d.ts +5 -0
  23. package/dist/store/config.js +7 -0
  24. package/dist/store/config.js.map +1 -1
  25. package/dist/store/keys.d.ts +65 -0
  26. package/dist/store/keys.js +164 -28
  27. package/dist/store/keys.js.map +1 -1
  28. package/dist/tools/http.d.ts +12 -1
  29. package/dist/tools/http.js +8 -43
  30. package/dist/tools/http.js.map +1 -1
  31. package/dist/tools/registry.js +52 -0
  32. package/dist/tools/registry.js.map +1 -1
  33. package/dist/tools/shell.d.ts +25 -0
  34. package/dist/tools/shell.js +155 -6
  35. package/dist/tools/shell.js.map +1 -1
  36. package/dist/tools/web/audit.d.ts +154 -0
  37. package/dist/tools/web/audit.js +147 -0
  38. package/dist/tools/web/audit.js.map +1 -0
  39. package/dist/tools/web/budget.d.ts +76 -0
  40. package/dist/tools/web/budget.js +187 -0
  41. package/dist/tools/web/budget.js.map +1 -0
  42. package/dist/tools/web/capture.d.ts +201 -0
  43. package/dist/tools/web/capture.js +380 -0
  44. package/dist/tools/web/capture.js.map +1 -0
  45. package/dist/tools/web/fetch-core.d.ts +66 -0
  46. package/dist/tools/web/fetch-core.js +1123 -0
  47. package/dist/tools/web/fetch-core.js.map +1 -0
  48. package/dist/tools/web/fetch.d.ts +42 -0
  49. package/dist/tools/web/fetch.js +115 -0
  50. package/dist/tools/web/fetch.js.map +1 -0
  51. package/dist/tools/web/providers/brave.d.ts +46 -0
  52. package/dist/tools/web/providers/brave.js +263 -0
  53. package/dist/tools/web/providers/brave.js.map +1 -0
  54. package/dist/tools/web/providers/duckduckgo.d.ts +47 -0
  55. package/dist/tools/web/providers/duckduckgo.js +248 -0
  56. package/dist/tools/web/providers/duckduckgo.js.map +1 -0
  57. package/dist/tools/web/providers/provider.d.ts +99 -0
  58. package/dist/tools/web/providers/provider.js +38 -0
  59. package/dist/tools/web/providers/provider.js.map +1 -0
  60. package/dist/tools/web/providers/tavily.d.ts +52 -0
  61. package/dist/tools/web/providers/tavily.js +285 -0
  62. package/dist/tools/web/providers/tavily.js.map +1 -0
  63. package/dist/tools/web/readable.d.ts +67 -0
  64. package/dist/tools/web/readable.js +248 -0
  65. package/dist/tools/web/readable.js.map +1 -0
  66. package/dist/tools/web/redact.d.ts +120 -0
  67. package/dist/tools/web/redact.js +155 -0
  68. package/dist/tools/web/redact.js.map +1 -0
  69. package/dist/tools/web/search.d.ts +51 -0
  70. package/dist/tools/web/search.js +389 -0
  71. package/dist/tools/web/search.js.map +1 -0
  72. package/dist/tools/web/ssrf-guard.d.ts +85 -0
  73. package/dist/tools/web/ssrf-guard.js +265 -0
  74. package/dist/tools/web/ssrf-guard.js.map +1 -0
  75. package/dist/tools/web/types.d.ts +331 -0
  76. package/dist/tools/web/types.js +71 -0
  77. package/dist/tools/web/types.js.map +1 -0
  78. package/dist/ui/keys.js +3 -2
  79. package/dist/ui/keys.js.map +1 -1
  80. package/dist/ui/spinner.js +87 -14
  81. package/dist/ui/spinner.js.map +1 -1
  82. 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
@@ -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;AAC/C,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,CAAC;AAC/B,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"}
@@ -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
- // biome-ignore lint: ANSI escape pattern is intentional.
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
- const tail = preview
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
- const previewLine = chalk.dim.italic(` ${tail}`);
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)
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"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"}
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.10.4",
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"