kooni-bot 0.2.10 → 0.2.13

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 (2) hide show
  1. package/bin/kooni.js +27 -5
  2. package/package.json +2 -2
package/bin/kooni.js CHANGED
@@ -22,7 +22,7 @@ import { execFileSync, spawnSync } from "node:child_process";
22
22
  import { randomUUID } from "node:crypto";
23
23
  import { fileURLToPath } from "node:url";
24
24
 
25
- const CLI_VERSION = "0.2.10";
25
+ const CLI_VERSION = "0.2.13";
26
26
 
27
27
  const REPO = process.env.KOONI_REPO || "iamnocodeveloper/kooni-bot";
28
28
  const BRANCH = process.env.KOONI_BRANCH || "main";
@@ -219,6 +219,7 @@ function normBotLang(v) {
219
219
  const BRAINS = {
220
220
  claude: { provider: "anthropic", secret: "ANTHROPIC_API_KEY", label: "Claude" },
221
221
  chatgpt: { provider: "openai", secret: "OPENAI_API_KEY", label: "ChatGPT" },
222
+ aisa: { provider: "openai", secret: "OPENAI_API_KEY", label: "AIsa" },
222
223
  grok: { provider: "xai", secret: "XAI_API_KEY", label: "Grok" },
223
224
  minimax: { provider: "minimax", secret: "MINIMAX_API_KEY", label: "MiniMax" },
224
225
  gateway: { provider: "openai", secret: "OPENAI_API_KEY", label: "Gateway" },
@@ -742,7 +743,7 @@ function writeDevVars(dir, answers, kbToken) {
742
743
 
743
744
  function collectAnswers(flags) {
744
745
  const rawBrain = String(flags.cerebro || flags.brain || "").trim().toLowerCase();
745
- const brainKey = ({ claude: "claude", anthropic: "claude", chatgpt: "chatgpt", openai: "chatgpt", gpt: "chatgpt", grok: "grok", xai: "grok", minimax: "minimax", gateway: "gateway" })[rawBrain] || null;
746
+ const brainKey = ({ claude: "claude", anthropic: "claude", chatgpt: "chatgpt", openai: "chatgpt", gpt: "chatgpt", aisa: "aisa", grok: "grok", xai: "grok", minimax: "minimax", gateway: "gateway" })[rawBrain] || null;
746
747
  const tone = ({ cercano: "cercano", friendly: "cercano", formal: "formal", divertido: "divertido", playful: "divertido" })[String(flags.tono || "").trim().toLowerCase()] || null;
747
748
 
748
749
  // Lo que vino por flag se conserva; lo que NO vino queda undefined para que
@@ -794,10 +795,13 @@ async function onboarding(rl, answers, defaultDir) {
794
795
  // hace después desde el dashboard. Aquí solo fijamos el default.
795
796
  answers.tier = answers.tier || "free";
796
797
 
797
- const brainKeys = ["claude", "chatgpt", "grok", "minimax", "gateway"];
798
+ const brainKeys = ["claude", "chatgpt", "aisa", "grok", "minimax", "gateway"];
798
799
  const brainIdx = await select(rl, t().brainQ, brainKeys.map((k) => ({
799
800
  key: k, label: BRAINS[k].label,
800
- desc: k === "claude" ? t().brainDesc : "",
801
+ desc: k === "claude" ? t().brainDesc
802
+ : k === "chatgpt" ? "key directa de OpenAI (sk-proj-…)"
803
+ : k === "aisa" ? "key de AIsa (sk-ais…) · gateway api.aisa.one/v1"
804
+ : k === "gateway" ? "OpenRouter / cualquier gateway" : "",
801
805
  })), { value: answers.brainKey, default: 0 });
802
806
  answers.brainKey = brainKeys[brainIdx] || "claude";
803
807
  answers.provider = BRAINS[answers.brainKey].provider;
@@ -805,6 +809,10 @@ async function onboarding(rl, answers, defaultDir) {
805
809
  if (answers.brainKey === "gateway" && !answers.baseUrl) {
806
810
  answers.baseUrl = await ask(rl, t().qBaseUrl, undefined) || "https://api.aisa.one/v1";
807
811
  }
812
+ if (answers.brainKey === "aisa" && !answers.baseUrl) {
813
+ answers.baseUrl = "https://api.aisa.one/v1";
814
+ console.log(" " + C.yellow("ℹ️ AIsa configurado con OPENAI_API_BASE_URL=https://api.aisa.one/v1."));
815
+ }
808
816
 
809
817
  // La API key se pide aquí, apenas se elige el cerebro — y se conserva para el
810
818
  // deploy (se guarda como secret sin mostrarla). En no-interactivo se salta.
@@ -812,6 +820,20 @@ async function onboarding(rl, answers, defaultDir) {
812
820
  answers.apiKey = await promptSecret(rl, t().qApiKey(BRAINS[answers.brainKey].label));
813
821
  }
814
822
 
823
+ // Guard de gateway: si la key es de AIsa (o un gateway) y NO hay base URL, el
824
+ // bot desplegaría pero contestaría "Algo falló de mi lado" (401 contra OpenAI
825
+ // directo). Detectamos la key y la arreglamos o avisamos en el acto.
826
+ if (answers.provider === "openai" && !answers.baseUrl && answers.apiKey) {
827
+ const raw = String(answers.apiKey).trim();
828
+ const k = raw.toLowerCase();
829
+ if (k.startsWith("sk-ais") || k.includes("aisa")) {
830
+ answers.baseUrl = "https://api.aisa.one/v1";
831
+ console.log(" " + C.yellow("ℹ️ Detecté una key de AIsa — configuré OPENAI_API_BASE_URL=https://api.aisa.one/v1 automáticamente."));
832
+ } else if (!/^sk-proj-/.test(raw) && !/^sk-[A-Za-z0-9]{48}$/.test(raw)) {
833
+ console.warn(" " + C.yellow("⚠️ Tu key de OpenAI no parece directa (sk-proj-…). Si es de un gateway (AIsa/OpenRouter), el bot NO contestará sin OPENAI_API_BASE_URL en wrangler.toml — agrega el var o repite init eligiendo 'Gateway'."));
834
+ }
835
+ }
836
+
815
837
  answers.what = answers.what ?? (await ask(rl, t().qWhat, undefined) || "");
816
838
  answers.offer = answers.offer ?? (await ask(rl, t().qOffer, undefined) || "");
817
839
  answers.hours = answers.hours ?? (await ask(rl, t().qHours, undefined) || "");
@@ -1226,7 +1248,7 @@ async function cmdDeploy(flags, rest) {
1226
1248
  try {
1227
1249
  const wt = readFileSync(join(dir, "wrangler.toml"), "utf8");
1228
1250
  const p = (wt.match(/LLM_PROVIDER\s*=\s*"([^"]+)"/) || [])[1] || "anthropic";
1229
- brainKey = ({ anthropic: "claude", openai: "chatgpt", xai: "grok", minimax: "minimax" })[p] || "claude";
1251
+ brainKey = ({ anthropic: "claude", openai: "chatgpt", aisa: "aisa", xai: "grok", minimax: "minimax" })[p] || "claude";
1230
1252
  } catch {}
1231
1253
  flags.brainKey = brainKey;
1232
1254
  await deployBot(dir, { flags, rl });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kooni-bot",
3
- "version": "0.2.10",
3
+ "version": "0.2.13",
4
4
  "description": "Kooni — instala tu asistente de IA multicanal (WhatsApp, Instagram, Messenger, Telegram) en TU Cloudflare, en un comando.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -22,4 +22,4 @@
22
22
  "files": [
23
23
  "bin"
24
24
  ]
25
- }
25
+ }