@pentoshi/clai 0.5.10 → 0.6.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 (45) hide show
  1. package/README.md +17 -9
  2. package/dist/agent/runner.js +49 -62
  3. package/dist/agent/runner.js.map +1 -1
  4. package/dist/commands/doctor.js +1 -1
  5. package/dist/commands/doctor.js.map +1 -1
  6. package/dist/commands/update.js +1 -1
  7. package/dist/commands/update.js.map +1 -1
  8. package/dist/context/manager.d.ts +4 -0
  9. package/dist/context/manager.js +48 -0
  10. package/dist/context/manager.js.map +1 -0
  11. package/dist/llm/router.js +23 -8
  12. package/dist/llm/router.js.map +1 -1
  13. package/dist/modes/ask.js +4 -3
  14. package/dist/modes/ask.js.map +1 -1
  15. package/dist/repl.js +27 -2
  16. package/dist/repl.js.map +1 -1
  17. package/dist/safety/classifier.js +76 -7
  18. package/dist/safety/classifier.js.map +1 -1
  19. package/dist/safety/patterns.js +6 -23
  20. package/dist/safety/patterns.js.map +1 -1
  21. package/dist/store/config.d.ts +2 -0
  22. package/dist/store/config.js +2 -0
  23. package/dist/store/config.js.map +1 -1
  24. package/dist/store/keys.js +2 -2
  25. package/dist/store/keys.js.map +1 -1
  26. package/dist/store/project.js +3 -1
  27. package/dist/store/project.js.map +1 -1
  28. package/dist/tools/artifacts.d.ts +9 -0
  29. package/dist/tools/artifacts.js +38 -0
  30. package/dist/tools/artifacts.js.map +1 -0
  31. package/dist/tools/fs.js +94 -28
  32. package/dist/tools/fs.js.map +1 -1
  33. package/dist/tools/http.d.ts +1 -0
  34. package/dist/tools/http.js +34 -4
  35. package/dist/tools/http.js.map +1 -1
  36. package/dist/tools/registry.js +51 -14
  37. package/dist/tools/registry.js.map +1 -1
  38. package/dist/tools/shell.d.ts +4 -0
  39. package/dist/tools/shell.js +96 -9
  40. package/dist/tools/shell.js.map +1 -1
  41. package/dist/types.d.ts +16 -0
  42. package/dist/ui/tool-output.d.ts +18 -0
  43. package/dist/ui/tool-output.js +135 -0
  44. package/dist/ui/tool-output.js.map +1 -0
  45. package/package.json +1 -1
@@ -0,0 +1,135 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import chalk from "chalk";
3
+ let lastSnapshot;
4
+ let expanded = false;
5
+ let renderedLines = 0;
6
+ function stripAnsi(text) {
7
+ return text.replace(/\x1b\[[0-9;]*m/g, "");
8
+ }
9
+ function countRows(text) {
10
+ if (!text)
11
+ return 0;
12
+ return text.split("\n").length;
13
+ }
14
+ function eraseRenderedBlock() {
15
+ if (!process.stdout.isTTY || renderedLines === 0) {
16
+ renderedLines = 0;
17
+ return;
18
+ }
19
+ for (let i = 0; i < renderedLines; i += 1) {
20
+ process.stdout.write("\r\x1b[2K");
21
+ if (i < renderedLines - 1)
22
+ process.stdout.write("\x1b[1A");
23
+ }
24
+ renderedLines = 0;
25
+ }
26
+ function formatHint(snapshot, next = "show") {
27
+ const suffix = snapshot.artifactPath
28
+ ? chalk.dim(` saved: ${snapshot.artifactPath}`)
29
+ : "";
30
+ return chalk.dim(` Ctrl+O ${next} full output`) + suffix;
31
+ }
32
+ async function loadFullOutput(snapshot) {
33
+ if (snapshot.artifactPath) {
34
+ return readFile(snapshot.artifactPath, "utf8");
35
+ }
36
+ return snapshot.fullText ?? "";
37
+ }
38
+ function renderExpandedBlock(snapshot, fullOutput) {
39
+ const summary = snapshot.summary?.trim() || "AI summary is not available yet.";
40
+ return [
41
+ chalk.dim(`--- full output: ${snapshot.label} ---`),
42
+ chalk.dim(fullOutput.trimEnd()),
43
+ chalk.dim(`--- summary ---`),
44
+ summary,
45
+ formatHint(snapshot, "hide"),
46
+ "",
47
+ ].join("\n");
48
+ }
49
+ export function rememberToolOutput(snapshot) {
50
+ eraseRenderedBlock();
51
+ lastSnapshot = snapshot;
52
+ expanded = false;
53
+ }
54
+ export function updateLastToolSummary(summary) {
55
+ if (!lastSnapshot)
56
+ return;
57
+ lastSnapshot = { ...lastSnapshot, summary };
58
+ }
59
+ export function renderToolOutputHint() {
60
+ return lastSnapshot ? formatHint(lastSnapshot) : "";
61
+ }
62
+ export function hasToolOutputSnapshot() {
63
+ return Boolean(lastSnapshot);
64
+ }
65
+ export async function toggleLastToolOutput() {
66
+ if (!lastSnapshot) {
67
+ process.stdout.write(chalk.dim("\n No tool output to show.\n"));
68
+ return;
69
+ }
70
+ if (expanded) {
71
+ eraseRenderedBlock();
72
+ expanded = false;
73
+ return;
74
+ }
75
+ eraseRenderedBlock();
76
+ const full = await loadFullOutput(lastSnapshot);
77
+ const block = renderExpandedBlock(lastSnapshot, full);
78
+ process.stdout.write(`\n${block}`);
79
+ renderedLines = countRows(stripAnsi(`\n${block}`));
80
+ expanded = true;
81
+ }
82
+ export function createToolLivePane(label, maxRows = 10) {
83
+ if (!process.stdout.isTTY) {
84
+ return {
85
+ append: () => { },
86
+ finish: () => { },
87
+ };
88
+ }
89
+ let lines = [];
90
+ let partial = "";
91
+ let liveRows = 0;
92
+ const erase = () => {
93
+ if (liveRows === 0)
94
+ return;
95
+ for (let i = 0; i < liveRows; i += 1) {
96
+ process.stdout.write("\r\x1b[2K");
97
+ if (i < liveRows - 1)
98
+ process.stdout.write("\x1b[1A");
99
+ }
100
+ liveRows = 0;
101
+ };
102
+ const render = () => {
103
+ erase();
104
+ const width = Math.max(40, Math.min(process.stdout.columns ?? 100, 180));
105
+ const visible = [...lines, partial]
106
+ .filter((line) => line.length > 0)
107
+ .slice(-maxRows)
108
+ .map((line) => line.length > width - 4 ? `${line.slice(0, width - 5)}...` : line);
109
+ const body = [
110
+ chalk.dim(` running ${label}`),
111
+ ...visible.map((line) => chalk.dim(` ${line}`)),
112
+ ].join("\n");
113
+ process.stdout.write(body);
114
+ liveRows = countRows(body);
115
+ };
116
+ return {
117
+ append(chunk) {
118
+ const normalized = chunk.replace(/\r/g, "");
119
+ const parts = normalized.split("\n");
120
+ partial += parts.shift() ?? "";
121
+ if (parts.length > 0) {
122
+ lines.push(partial);
123
+ lines.push(...parts.slice(0, -1));
124
+ partial = parts[parts.length - 1] ?? "";
125
+ }
126
+ if (lines.length > maxRows * 4)
127
+ lines = lines.slice(-maxRows * 2);
128
+ render();
129
+ },
130
+ finish() {
131
+ erase();
132
+ },
133
+ };
134
+ }
135
+ //# sourceMappingURL=tool-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-output.js","sourceRoot":"","sources":["../../src/ui/tool-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,IAAI,YAA4C,CAAC;AACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACjD,aAAa,GAAG,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,aAAa,GAAG,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,CAAC;IACD,aAAa,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,UAAU,CAAC,QAA4B,EAAE,IAAI,GAAG,MAAM;IAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY;QAClC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,YAAY,EAAE,CAAC;QAChD,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,CAAC,GAAG,MAAM,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAA4B;IACxD,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB,CAAC,QAA4B,EAAE,UAAkB;IAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,kCAAkC,CAAC;IAC/E,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,oBAAoB,QAAQ,CAAC,KAAK,MAAM,CAAC;QACnD,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC5B,OAAO;QACP,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC5B,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAA4B;IAC7D,kBAAkB,EAAE,CAAC;IACrB,YAAY,GAAG,QAAQ,CAAC;IACxB,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,IAAI,CAAC,YAAY;QAAE,OAAO;IAC1B,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,kBAAkB,EAAE,CAAC;QACrB,QAAQ,GAAG,KAAK,CAAC;QACjB,OAAO;IACT,CAAC;IAED,kBAAkB,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACnC,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;IACnD,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,OAAO,GAAG,EAAE;IAC5D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;YAChB,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxD,CAAC;QACD,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,KAAK,EAAE,CAAC;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC;aAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACjC,KAAK,CAAC,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAClE,CAAC;QACJ,MAAM,IAAI,GAAG;YACX,KAAK,CAAC,GAAG,CAAC,aAAa,KAAK,EAAE,CAAC;YAC/B,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;SACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,CAAC,KAAa;YAClB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC;gBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAClE,MAAM,EAAE,CAAC;QACX,CAAC;QACD,MAAM;YACJ,KAAK,EAAE,CAAC;QACV,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pentoshi/clai",
3
- "version": "0.5.10",
3
+ "version": "0.6.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",