@pentoshi/clai 0.2.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 (102) hide show
  1. package/README.md +287 -0
  2. package/bin/clai.mjs +2 -0
  3. package/dist/agent/runner.d.ts +12 -0
  4. package/dist/agent/runner.js +249 -0
  5. package/dist/agent/runner.js.map +1 -0
  6. package/dist/commands/doctor.d.ts +1 -0
  7. package/dist/commands/doctor.js +29 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/providers.d.ts +13 -0
  10. package/dist/commands/providers.js +137 -0
  11. package/dist/commands/providers.js.map +1 -0
  12. package/dist/commands/update.d.ts +5 -0
  13. package/dist/commands/update.js +123 -0
  14. package/dist/commands/update.js.map +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.js +172 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/llm/anthropic.d.ts +2 -0
  19. package/dist/llm/anthropic.js +127 -0
  20. package/dist/llm/anthropic.js.map +1 -0
  21. package/dist/llm/gemini.d.ts +2 -0
  22. package/dist/llm/gemini.js +109 -0
  23. package/dist/llm/gemini.js.map +1 -0
  24. package/dist/llm/groq.d.ts +2 -0
  25. package/dist/llm/groq.js +49 -0
  26. package/dist/llm/groq.js.map +1 -0
  27. package/dist/llm/http.d.ts +35 -0
  28. package/dist/llm/http.js +112 -0
  29. package/dist/llm/http.js.map +1 -0
  30. package/dist/llm/ollama.d.ts +2 -0
  31. package/dist/llm/ollama.js +95 -0
  32. package/dist/llm/ollama.js.map +1 -0
  33. package/dist/llm/openai.d.ts +2 -0
  34. package/dist/llm/openai.js +49 -0
  35. package/dist/llm/openai.js.map +1 -0
  36. package/dist/llm/openrouter.d.ts +2 -0
  37. package/dist/llm/openrouter.js +55 -0
  38. package/dist/llm/openrouter.js.map +1 -0
  39. package/dist/llm/provider.d.ts +23 -0
  40. package/dist/llm/provider.js +58 -0
  41. package/dist/llm/provider.js.map +1 -0
  42. package/dist/llm/router.d.ts +8 -0
  43. package/dist/llm/router.js +103 -0
  44. package/dist/llm/router.js.map +1 -0
  45. package/dist/modes/agent.d.ts +17 -0
  46. package/dist/modes/agent.js +6 -0
  47. package/dist/modes/agent.js.map +1 -0
  48. package/dist/modes/ask.d.ts +8 -0
  49. package/dist/modes/ask.js +46 -0
  50. package/dist/modes/ask.js.map +1 -0
  51. package/dist/os/detect.d.ts +10 -0
  52. package/dist/os/detect.js +17 -0
  53. package/dist/os/detect.js.map +1 -0
  54. package/dist/os/pkgmgr.d.ts +6 -0
  55. package/dist/os/pkgmgr.js +32 -0
  56. package/dist/os/pkgmgr.js.map +1 -0
  57. package/dist/prompts/index.d.ts +2 -0
  58. package/dist/prompts/index.js +60 -0
  59. package/dist/prompts/index.js.map +1 -0
  60. package/dist/repl.d.ts +7 -0
  61. package/dist/repl.js +216 -0
  62. package/dist/repl.js.map +1 -0
  63. package/dist/safety/classifier.d.ts +8 -0
  64. package/dist/safety/classifier.js +118 -0
  65. package/dist/safety/classifier.js.map +1 -0
  66. package/dist/safety/patterns.d.ts +5 -0
  67. package/dist/safety/patterns.js +45 -0
  68. package/dist/safety/patterns.js.map +1 -0
  69. package/dist/store/config.d.ts +20 -0
  70. package/dist/store/config.js +46 -0
  71. package/dist/store/config.js.map +1 -0
  72. package/dist/store/history.d.ts +24 -0
  73. package/dist/store/history.js +145 -0
  74. package/dist/store/history.js.map +1 -0
  75. package/dist/store/keys.d.ts +10 -0
  76. package/dist/store/keys.js +115 -0
  77. package/dist/store/keys.js.map +1 -0
  78. package/dist/store/logs.d.ts +2 -0
  79. package/dist/store/logs.js +31 -0
  80. package/dist/store/logs.js.map +1 -0
  81. package/dist/store/project.d.ts +2 -0
  82. package/dist/store/project.js +14 -0
  83. package/dist/store/project.js.map +1 -0
  84. package/dist/tools/fs.d.ts +5 -0
  85. package/dist/tools/fs.js +82 -0
  86. package/dist/tools/fs.js.map +1 -0
  87. package/dist/tools/http.d.ts +6 -0
  88. package/dist/tools/http.js +14 -0
  89. package/dist/tools/http.js.map +1 -0
  90. package/dist/tools/registry.d.ts +5 -0
  91. package/dist/tools/registry.js +79 -0
  92. package/dist/tools/registry.js.map +1 -0
  93. package/dist/tools/shell.d.ts +7 -0
  94. package/dist/tools/shell.js +16 -0
  95. package/dist/tools/shell.js.map +1 -0
  96. package/dist/types.d.ts +40 -0
  97. package/dist/types.js +9 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/ui/banner.d.ts +12 -0
  100. package/dist/ui/banner.js +55 -0
  101. package/dist/ui/banner.js.map +1 -0
  102. package/package.json +66 -0
@@ -0,0 +1,137 @@
1
+ import { password, select } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import { getProvider, pingProvider } from "../llm/router.js";
4
+ import { assertProvider, maskSecret } from "../llm/provider.js";
5
+ import { getConfig, getProviderModel, setDefaultProvider, updateConfig, } from "../store/config.js";
6
+ import { envValue, getFallbackKeysPath, getProviderSecret, listProviderStatuses, setProviderSecret, unsetProviderSecret, } from "../store/keys.js";
7
+ async function readStdin() {
8
+ const chunks = [];
9
+ for await (const chunk of process.stdin) {
10
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
11
+ }
12
+ return Buffer.concat(chunks).toString("utf8").trim();
13
+ }
14
+ async function promptForSecret(provider) {
15
+ return password({
16
+ message: `Enter API key for ${provider} (input hidden, leave blank to cancel):`,
17
+ mask: "•",
18
+ });
19
+ }
20
+ function invalidFormatHint(provider) {
21
+ if (provider === "groq")
22
+ return "Groq keys usually start with gsk_";
23
+ if (provider === "gemini")
24
+ return "Gemini keys usually start with AIza";
25
+ if (provider === "openrouter")
26
+ return "OpenRouter keys usually start with sk-or-";
27
+ if (provider === "openai")
28
+ return "OpenAI keys usually start with sk-";
29
+ if (provider === "anthropic")
30
+ return "Anthropic keys usually start with sk-ant-";
31
+ return "Ollama expects a URL such as http://localhost:11434";
32
+ }
33
+ export async function setProviderKey(providerValue, keyArg, options) {
34
+ const provider = assertProvider(providerValue);
35
+ const providerImpl = getProvider(provider);
36
+ let secret = options.url ?? keyArg;
37
+ if (options.fromEnv) {
38
+ secret = process.env[options.fromEnv];
39
+ if (!secret)
40
+ throw new Error(`Environment variable ${options.fromEnv} is empty or missing`);
41
+ }
42
+ if (options.stdin) {
43
+ secret = await readStdin();
44
+ }
45
+ if (!secret) {
46
+ secret = await promptForSecret(provider);
47
+ }
48
+ if (!secret) {
49
+ console.log("cancelled");
50
+ return;
51
+ }
52
+ if (!providerImpl.validateKey(secret)) {
53
+ process.exitCode = 2;
54
+ throw new Error(`Invalid ${provider} format. ${invalidFormatHint(provider)}.`);
55
+ }
56
+ if (provider === "ollama") {
57
+ updateConfig({ ollamaHost: secret });
58
+ setDefaultProvider(provider);
59
+ }
60
+ else {
61
+ const storage = await setProviderSecret(provider, secret);
62
+ if (storage === "fallback") {
63
+ process.exitCode = 3;
64
+ console.warn(chalk.yellow(`Warning: OS keychain unavailable; stored in ${getFallbackKeysPath()} with restricted permissions.`));
65
+ }
66
+ }
67
+ if (!options.skipPing) {
68
+ try {
69
+ await pingProvider(provider, secret);
70
+ }
71
+ catch (error) {
72
+ process.exitCode = 4;
73
+ console.warn(chalk.yellow(`Saved, but ping failed: ${error instanceof Error ? error.message : String(error)}`));
74
+ return;
75
+ }
76
+ }
77
+ console.log(`saved ${provider} ${provider === "ollama" ? secret : maskSecret(secret)}`);
78
+ }
79
+ export async function unsetProviderKey(providerValue) {
80
+ const provider = assertProvider(providerValue);
81
+ await unsetProviderSecret(provider);
82
+ console.log(`unset ${provider}`);
83
+ }
84
+ export async function printProviderKeys() {
85
+ const config = getConfig();
86
+ const statuses = await listProviderStatuses(config.defaultProvider);
87
+ for (const status of statuses) {
88
+ const active = status.active ? chalk.green("active") : " ";
89
+ const configured = status.configured ? chalk.green("✓") : chalk.red("✗");
90
+ const source = status.source === "missing" ? "no key" : status.source;
91
+ const secret = status.maskedKey ? ` ${status.maskedKey}` : "";
92
+ const note = status.note ? ` ${status.note}` : "";
93
+ console.log(`${active} ${configured} ${status.provider.padEnd(10)} ${source}${secret}${note} model=${status.model}`);
94
+ }
95
+ }
96
+ export async function ensureProviderConfigured(provider) {
97
+ const secret = await getProviderSecret(provider);
98
+ if (secret.value || envValue(provider) || provider === "ollama")
99
+ return;
100
+ if (!process.stdin.isTTY)
101
+ return;
102
+ const entered = await promptForSecret(provider);
103
+ if (!entered)
104
+ return;
105
+ await setProviderKey(provider, entered, { skipPing: false });
106
+ }
107
+ export async function useProvider(providerValue) {
108
+ const provider = assertProvider(providerValue);
109
+ const secret = await getProviderSecret(provider);
110
+ if (!secret.value && !envValue(provider) && provider !== "ollama") {
111
+ const entered = await promptForSecret(provider);
112
+ if (!entered) {
113
+ console.log("provider unchanged");
114
+ return;
115
+ }
116
+ await setProviderKey(provider, entered, { skipPing: false });
117
+ }
118
+ setDefaultProvider(provider);
119
+ console.log(`now using ${provider} · model=${getProviderModel(provider)}`);
120
+ }
121
+ export async function providerSwitcher(providerValue) {
122
+ if (providerValue) {
123
+ await useProvider(providerValue);
124
+ return;
125
+ }
126
+ const config = getConfig();
127
+ const statuses = await listProviderStatuses(config.defaultProvider);
128
+ const selected = await select({
129
+ message: "Select provider:",
130
+ choices: statuses.map((status) => ({
131
+ name: `${status.provider.padEnd(10)} ${status.configured ? "✓ key set" : "✗ no key"}${status.active ? " (active)" : ""}`,
132
+ value: status.provider,
133
+ })),
134
+ });
135
+ await useProvider(selected);
136
+ }
137
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/commands/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAU1B,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAoB;IACjD,OAAO,QAAQ,CAAC;QACd,OAAO,EAAE,qBAAqB,QAAQ,yCAAyC;QAC/E,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAoB;IAC7C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,mCAAmC,CAAC;IACpE,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,qCAAqC,CAAC;IACxE,IAAI,QAAQ,KAAK,YAAY;QAC3B,OAAO,2CAA2C,CAAC;IACrD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,oCAAoC,CAAC;IACvE,IAAI,QAAQ,KAAK,WAAW;QAC1B,OAAO,2CAA2C,CAAC;IACrD,OAAO,qDAAqD,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAAqB,EACrB,MAA0B,EAC1B,OAAsB;IAEtB,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;IACnC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,CAAC,OAAO,sBAAsB,CAC9D,CAAC;IACN,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,WAAW,QAAQ,YAAY,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAC9D,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,YAAY,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,+CAA+C,mBAAmB,EAAE,+BAA+B,CACpG,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACpF,CACF,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,SAAS,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAC3E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,aAAqB;IAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACpE,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAChE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,IAAI,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,GAAG,MAAM,GAAG,IAAI,UAAU,MAAM,CAAC,KAAK,EAAE,CACxG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAAoB;IAEpB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO;IACxE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO;IACjC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,aAAqB;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,YAAY,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAkC;IAElC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,WAAW,CAAC,aAAa,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE;YACxH,KAAK,EAAE,MAAM,CAAC,QAAQ;SACvB,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function getCurrentVersion(): string;
2
+ /** Non-blocking startup check — prints a notice if a new version exists */
3
+ export declare function checkForUpdateSilent(): void;
4
+ /** Interactive update command */
5
+ export declare function runUpdate(): Promise<void>;
@@ -0,0 +1,123 @@
1
+ import chalk from "chalk";
2
+ import { getConfig, updateConfig } from "../store/config.js";
3
+ const REPO = "pentoshi007/clai";
4
+ const CURRENT_VERSION = "0.2.0";
5
+ const CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours
6
+ function parseVersion(v) {
7
+ return v.replace(/^v/, "").split(".").map(Number);
8
+ }
9
+ function isNewer(remote, local) {
10
+ const r = parseVersion(remote);
11
+ const l = parseVersion(local);
12
+ for (let i = 0; i < 3; i++) {
13
+ if ((r[i] ?? 0) > (l[i] ?? 0))
14
+ return true;
15
+ if ((r[i] ?? 0) < (l[i] ?? 0))
16
+ return false;
17
+ }
18
+ return false;
19
+ }
20
+ export function getCurrentVersion() {
21
+ return CURRENT_VERSION;
22
+ }
23
+ /** Fetch the latest release from GitHub (5s timeout, swallows errors) */
24
+ async function fetchLatestRelease() {
25
+ try {
26
+ const controller = new AbortController();
27
+ const timeout = setTimeout(() => controller.abort(), 5000);
28
+ const res = await fetch(`https://api.github.com/repos/${REPO}/releases/latest`, {
29
+ headers: {
30
+ Accept: "application/vnd.github.v3+json",
31
+ "User-Agent": "clai-updater",
32
+ },
33
+ signal: controller.signal,
34
+ });
35
+ clearTimeout(timeout);
36
+ if (!res.ok)
37
+ return null;
38
+ return (await res.json());
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /** Non-blocking startup check — prints a notice if a new version exists */
45
+ export function checkForUpdateSilent() {
46
+ const config = getConfig();
47
+ if (config.lastUpdateCheck && Date.now() - config.lastUpdateCheck < CHECK_INTERVAL_MS)
48
+ return;
49
+ fetchLatestRelease()
50
+ .then((release) => {
51
+ if (!release)
52
+ return;
53
+ updateConfig({ lastUpdateCheck: Date.now() });
54
+ if (isNewer(release.tag_name, CURRENT_VERSION)) {
55
+ const ver = release.tag_name.replace(/^v/, "");
56
+ console.log(chalk.yellow(`\n ⬆ Update available: ${CURRENT_VERSION} → ${ver}`) +
57
+ chalk.dim(" Run: /update or clai update\n"));
58
+ }
59
+ })
60
+ .catch(() => { });
61
+ }
62
+ /** Interactive update command */
63
+ export async function runUpdate() {
64
+ console.log(chalk.dim(" Checking for updates..."));
65
+ const release = await fetchLatestRelease();
66
+ if (!release) {
67
+ console.log(chalk.red(" ✗ Could not reach GitHub. Check your connection."));
68
+ return;
69
+ }
70
+ const remoteVer = release.tag_name.replace(/^v/, "");
71
+ if (!isNewer(release.tag_name, CURRENT_VERSION)) {
72
+ console.log(chalk.green(` ✓ Already on latest version (${CURRENT_VERSION})`));
73
+ updateConfig({ lastUpdateCheck: Date.now() });
74
+ return;
75
+ }
76
+ console.log(chalk.yellow(` ⬆ New version available: ${CURRENT_VERSION} → ${remoteVer}`));
77
+ console.log(chalk.dim(` Released: ${release.published_at}\n`));
78
+ // Detect install method and give specific instructions
79
+ const methods = detectInstallMethod();
80
+ if (methods.includes("npm")) {
81
+ console.log(chalk.cyan(" npm:"));
82
+ console.log(chalk.white(" npm update -g clai\n"));
83
+ }
84
+ if (methods.includes("brew")) {
85
+ console.log(chalk.cyan(" Homebrew:"));
86
+ console.log(chalk.white(" brew upgrade clai\n"));
87
+ }
88
+ // Always show binary download for the current platform
89
+ const platform = process.platform === "darwin"
90
+ ? "darwin"
91
+ : process.platform === "win32"
92
+ ? "windows"
93
+ : "linux";
94
+ const arch = process.arch === "arm64" ? "arm64" : "x64";
95
+ const suffix = platform === "windows" ? ".exe" : "";
96
+ const assetName = `clai-bun-${platform}-${arch}${suffix}`;
97
+ const asset = release.assets.find((a) => a.name === assetName);
98
+ if (asset) {
99
+ console.log(chalk.cyan(" Direct download:"));
100
+ if (platform === "windows") {
101
+ console.log(chalk.white(` curl -fsSL ${asset.browser_download_url} -o %LOCALAPPDATA%\\\\clai\\\\clai.exe\n`));
102
+ }
103
+ else {
104
+ console.log(chalk.white(` curl -fsSL ${asset.browser_download_url} -o /usr/local/bin/clai && chmod +x /usr/local/bin/clai\n`));
105
+ }
106
+ }
107
+ console.log(chalk.cyan(" GitHub release:"));
108
+ console.log(chalk.white(` ${release.html_url}\n`));
109
+ console.log(chalk.dim(" After updating, restart clai to use the new version."));
110
+ updateConfig({ lastUpdateCheck: Date.now() });
111
+ }
112
+ function detectInstallMethod() {
113
+ const methods = [];
114
+ const argv1 = process.argv[1] ?? "";
115
+ // npm global install paths
116
+ if (argv1.includes("node_modules") || argv1.includes("npm"))
117
+ methods.push("npm");
118
+ if (process.platform === "darwin")
119
+ methods.push("brew");
120
+ methods.push("binary");
121
+ return methods;
122
+ }
123
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,172 @@
1
+ import { Command, Option } from "commander";
2
+ import chalk from "chalk";
3
+ import { runAskStream } from "./modes/ask.js";
4
+ import { runAgent } from "./modes/agent.js";
5
+ import { startRepl } from "./repl.js";
6
+ import { providerSwitcher, printProviderKeys, setProviderKey, unsetProviderKey, useProvider, ensureProviderConfigured, } from "./commands/providers.js";
7
+ import { runDoctor } from "./commands/doctor.js";
8
+ import { runUpdate, getCurrentVersion } from "./commands/update.js";
9
+ import { getConfig, setDefaultMode, setProviderModel, updateConfig, } from "./store/config.js";
10
+ import { assertProvider } from "./llm/provider.js";
11
+ import { listSessions, saveSession, getSession } from "./store/history.js";
12
+ function modeOption() {
13
+ return new Option("--mode <mode>", "execution mode").choices([
14
+ "ask",
15
+ "agent",
16
+ ]);
17
+ }
18
+ function resolveProvider(value) {
19
+ return value ? assertProvider(value) : undefined;
20
+ }
21
+ async function oneShot(promptParts, options) {
22
+ const prompt = promptParts?.join(" ").trim();
23
+ const provider = resolveProvider(options.provider);
24
+ const mode = options.mode ?? getConfig().defaultMode;
25
+ const model = options.model ?? getConfig().defaultModel;
26
+ await ensureProviderConfigured(provider ?? getConfig().defaultProvider);
27
+ if (!prompt) {
28
+ await startRepl({ mode, provider, model });
29
+ return;
30
+ }
31
+ const answer = mode === "ask"
32
+ ? await runAskStream(prompt, (token) => process.stdout.write(token), {
33
+ provider,
34
+ model,
35
+ })
36
+ : await runAgent(prompt, { provider, model, autoConfirm: options.yes });
37
+ if (mode === "ask")
38
+ process.stdout.write("\n");
39
+ await saveSession([
40
+ { role: "user", content: prompt },
41
+ { role: "assistant", content: answer },
42
+ ]);
43
+ }
44
+ function printError(error) {
45
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
46
+ }
47
+ async function main() {
48
+ const program = new Command();
49
+ program
50
+ .name("clai")
51
+ .description("A cross-platform AI CLI assistant with ask and agent modes")
52
+ .version(getCurrentVersion())
53
+ .addOption(modeOption())
54
+ .option("--provider <provider>", "LLM provider to use")
55
+ .option("--model <model>", "model to use")
56
+ .option("-y, --yes", "auto-confirm tool execution for one-shot agent mode")
57
+ .argument("[prompt...]", "one-shot prompt")
58
+ .action(async (promptParts, options) => {
59
+ await oneShot(promptParts, options);
60
+ });
61
+ program
62
+ .command("config")
63
+ .description("print config path and current non-secret settings")
64
+ .action(() => {
65
+ console.log(JSON.stringify(getConfig(), null, 2));
66
+ });
67
+ program
68
+ .command("set")
69
+ .description("store an API key or Ollama URL")
70
+ .argument("<provider>", "provider id")
71
+ .argument("[apiKey]", "API key")
72
+ .option("--from-env <envVar>", "import key from environment variable")
73
+ .option("--stdin", "read key from stdin")
74
+ .option("--url <url>", "Ollama base URL")
75
+ .option("--skip-ping", "save without pinging provider")
76
+ .action(async (provider, apiKey, options) => {
77
+ await setProviderKey(provider, apiKey, options);
78
+ });
79
+ program
80
+ .command("unset")
81
+ .description("remove a stored API key")
82
+ .argument("<provider>", "provider id")
83
+ .action(async (provider) => {
84
+ await unsetProviderKey(provider);
85
+ });
86
+ program
87
+ .command("keys")
88
+ .description("list configured providers with masked keys")
89
+ .action(async () => {
90
+ await printProviderKeys();
91
+ });
92
+ program
93
+ .command("use")
94
+ .description("set the active default provider")
95
+ .argument("<provider>", "provider id")
96
+ .action(async (provider) => {
97
+ await useProvider(provider);
98
+ });
99
+ program
100
+ .command("provider")
101
+ .description("switch provider or open interactive provider picker")
102
+ .argument("[provider]", "provider id")
103
+ .action(async (provider) => {
104
+ await providerSwitcher(provider);
105
+ });
106
+ program
107
+ .command("model")
108
+ .description("set the active model for the current provider")
109
+ .argument("<model>", "model name")
110
+ .action((model) => {
111
+ const config = getConfig();
112
+ setProviderModel(config.defaultProvider, model);
113
+ console.log(`model=${model}`);
114
+ });
115
+ program
116
+ .command("mode")
117
+ .description("set default mode")
118
+ .argument("<mode>", "ask or agent")
119
+ .action((mode) => {
120
+ if (mode !== "ask" && mode !== "agent")
121
+ throw new Error("Mode must be ask or agent");
122
+ setDefaultMode(mode);
123
+ console.log(`mode=${mode}`);
124
+ });
125
+ program
126
+ .command("doctor")
127
+ .description("check dependencies and provider configuration")
128
+ .action(async () => {
129
+ await runDoctor();
130
+ });
131
+ program
132
+ .command("history")
133
+ .description("list saved sessions")
134
+ .option("--show <sessionId>", "print a saved session")
135
+ .action(async (options) => {
136
+ if (options.show) {
137
+ const session = await getSession(options.show);
138
+ if (!session)
139
+ throw new Error(`No session found: ${options.show}`);
140
+ console.log(JSON.stringify(session, null, 2));
141
+ return;
142
+ }
143
+ const sessions = await listSessions();
144
+ for (const session of sessions) {
145
+ console.log(`${session.updatedAt} ${session.name ?? session.id} (${session.messages.length} messages) ${session.cwd}`);
146
+ }
147
+ });
148
+ program
149
+ .command("update")
150
+ .description("check for updates and show upgrade instructions")
151
+ .action(async () => {
152
+ await runUpdate();
153
+ });
154
+ program
155
+ .command("authorize-pentest")
156
+ .description("store the pentest authorization acknowledgement")
157
+ .argument("<ack>", "type AGREE to acknowledge")
158
+ .action((ack) => {
159
+ if (ack !== "AGREE")
160
+ throw new Error("Type AGREE to continue");
161
+ updateConfig({ pentestAuthorized: true });
162
+ console.log("Pentest authorization acknowledgement stored. Only test systems you own or have written permission to test.");
163
+ });
164
+ await program.parseAsync(process.argv);
165
+ }
166
+ main().catch((error) => {
167
+ printError(error);
168
+ if (!process.exitCode) {
169
+ process.exitCode = 1;
170
+ }
171
+ });
172
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type LlmProvider } from "./provider.js";
2
+ export declare const anthropicProvider: LlmProvider;
@@ -0,0 +1,127 @@
1
+ import { defaultModels, } from "./provider.js";
2
+ import { readJson } from "./http.js";
3
+ const baseUrl = "https://api.anthropic.com/v1";
4
+ const anthropicVersion = "2023-06-01";
5
+ export const anthropicProvider = {
6
+ id: "anthropic",
7
+ displayName: "Anthropic",
8
+ defaultModel: defaultModels.anthropic,
9
+ envVar: "ANTHROPIC_API_KEY",
10
+ validateKey: (key) => /^sk-ant-[A-Za-z0-9_-]{12,}$/.test(key),
11
+ async ping(auth) {
12
+ if (!auth.apiKey)
13
+ throw new Error("Anthropic API key is required");
14
+ const response = await fetch(`${baseUrl}/models`, {
15
+ headers: {
16
+ "x-api-key": auth.apiKey,
17
+ "anthropic-version": anthropicVersion,
18
+ },
19
+ });
20
+ await readJson(response);
21
+ },
22
+ async complete(request, auth) {
23
+ if (!auth.apiKey)
24
+ throw new Error("Anthropic API key is required");
25
+ const model = request.model ?? defaultModels.anthropic;
26
+ const system = request.messages.find((message) => message.role === "system")?.content;
27
+ const messages = request.messages
28
+ .filter((message) => message.role !== "system")
29
+ .map((message) => ({
30
+ role: message.role === "assistant" ? "assistant" : "user",
31
+ content: message.content,
32
+ }));
33
+ const response = await fetch(`${baseUrl}/messages`, {
34
+ method: "POST",
35
+ signal: request.signal ?? null,
36
+ headers: {
37
+ "content-type": "application/json",
38
+ "x-api-key": auth.apiKey,
39
+ "anthropic-version": anthropicVersion,
40
+ },
41
+ body: JSON.stringify({
42
+ model,
43
+ system,
44
+ messages,
45
+ max_tokens: request.maxTokens ?? 1_024,
46
+ temperature: request.temperature ?? 0.2,
47
+ }),
48
+ });
49
+ const data = await readJson(response);
50
+ const text = data.content
51
+ ?.filter((part) => part.type === "text")
52
+ .map((part) => part.text ?? "")
53
+ .join("")
54
+ .trim();
55
+ if (!text) {
56
+ throw new Error("Anthropic returned no completion text");
57
+ }
58
+ return { text, provider: "anthropic", model };
59
+ },
60
+ async stream(request, auth, onToken) {
61
+ if (!auth.apiKey)
62
+ throw new Error("Anthropic API key is required");
63
+ const model = request.model ?? defaultModels.anthropic;
64
+ const system = request.messages.find((message) => message.role === "system")?.content;
65
+ const messages = request.messages
66
+ .filter((message) => message.role !== "system")
67
+ .map((message) => ({
68
+ role: message.role === "assistant" ? "assistant" : "user",
69
+ content: message.content,
70
+ }));
71
+ const response = await fetch(`${baseUrl}/messages`, {
72
+ method: "POST",
73
+ signal: request.signal ?? null,
74
+ headers: {
75
+ "content-type": "application/json",
76
+ "x-api-key": auth.apiKey,
77
+ "anthropic-version": anthropicVersion,
78
+ },
79
+ body: JSON.stringify({
80
+ model,
81
+ system,
82
+ messages,
83
+ max_tokens: request.maxTokens ?? 1_024,
84
+ temperature: request.temperature ?? 0.2,
85
+ stream: true,
86
+ }),
87
+ });
88
+ if (!response.ok) {
89
+ await readJson(response);
90
+ }
91
+ if (!response.body) {
92
+ throw new Error("Anthropic returned no stream body");
93
+ }
94
+ const decoder = new TextDecoder();
95
+ const reader = response.body.getReader();
96
+ let buffer = "";
97
+ let full = "";
98
+ while (true) {
99
+ const { done, value } = await reader.read();
100
+ if (done)
101
+ break;
102
+ buffer += decoder.decode(value, { stream: true });
103
+ const lines = buffer.split("\n");
104
+ buffer = lines.pop() ?? "";
105
+ for (const line of lines) {
106
+ const trimmed = line.trim();
107
+ if (!trimmed.startsWith("data:"))
108
+ continue;
109
+ const payload = trimmed.slice(5).trim();
110
+ if (payload === "[DONE]")
111
+ return { text: full, provider: "anthropic", model };
112
+ try {
113
+ const parsed = JSON.parse(payload);
114
+ if (parsed.type === "content_block_delta" && parsed.delta?.text) {
115
+ full += parsed.delta.text;
116
+ onToken(parsed.delta.text);
117
+ }
118
+ }
119
+ catch {
120
+ // Ignore malformed keepalive lines.
121
+ }
122
+ }
123
+ }
124
+ return { text: full, provider: "anthropic", model };
125
+ },
126
+ };
127
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/llm/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type LlmProvider } from "./provider.js";
2
+ export declare const geminiProvider: LlmProvider;