diff --git a/CHANGELOG.md b/CHANGELOG.md index 31096d1..4426014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Align Router help, manifest, root examples, and login/whoami guidance with + the current credential store: `tokens.json` is authoritative, `AISA_API_KEY` + overrides stored credentials, compatibility key files are mirrors, and + `aisa whoami` is not protected auth proof. Root help starts at `aisa login` + or `https://tools.aisa.one/mcp`; `aisa connect` is scoped to domain MCP. + The connect journal reports `AISA_API_KEY` or the CLI credential store, + not a key file. Manual file-read warnings apply to users and agents; the + bundled VS Code extension may still read the compatibility mirror. + ## [0.6.1] — 2026-09-11 ### Changed diff --git a/README.md b/README.md index a7a98bc..d217c45 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,11 @@ aisa quote --input '{"calls":[{"call_id":"c1","tool":"get_financial_company_fact `aisa login` opens a browser, signs you in, and stores OAuth tokens. You do not need to create or paste a key from the console. For CI or scripts, set -`AISA_API_KEY` or run `aisa login --key `. New accounts receive $5 in +`AISA_API_KEY` or run `aisa login --key `. `AISA_API_KEY` overrides stored +credentials and never refreshes. Prove protected auth with `aisa balance`. +`aisa whoami` may refresh stored tokens and is not auth proof. Users and +agents must not manually read, copy, or refresh credential files; the CLI +and bundled integrations manage compatibility mirrors. New accounts receive $5 in free credits. This first block does not run `aisa chat` or `aisa call`. Quote is a price @@ -326,13 +330,16 @@ Settings: independent of `baseUrl`); overridden by `AISA_ROUTER_BASE_URL` - `outputFormat` — `text` or `json` -`aisa login` stores OAuth credentials in `~/.aisa/tokens.json`. -`aisa login --key ` stores a static credential without refresh metadata. -Legacy mirrors contain the current access token; older CLIs cannot refresh it. +`aisa login` stores OAuth credentials in the CLI credential store +(`~/.aisa/tokens.json` is authoritative). `aisa login --key ` stores a +static credential without refresh metadata. Compatibility key files and conf +mirrors are not authority. Users and agents must not manually read, copy, or +refresh them; the CLI and bundled integrations (including the VS Code +extension shipped with `aisa connect`) manage those mirrors. Third-party client configurations written by `aisa connect` also contain a snapshot of the credential, not a refresh-capable OAuth session. Environment variables: -`AISA_API_KEY` takes precedence over the stored key. +`AISA_API_KEY` overrides stored credentials and never refreshes. `AISA_ROUTER_BASE_URL` is the Router origin/prefix before `/v1/tool-router/...` and overrides the default `https://tools.aisa.one`. `AISA_CACHE_DIR` relocates the cache. `GITHUB_TOKEN` diff --git a/src/commands/auth.ts b/src/commands/auth.ts index ce9bd62..6da890e 100644 --- a/src/commands/auth.ts +++ b/src/commands/auth.ts @@ -44,6 +44,13 @@ export async function logoutAction(): Promise { if (process.env[ENV_VAR_NAME]) info(`${ENV_VAR_NAME} is still set. Unset it to stop using that API key.`); } +/** Commander after-help for `aisa whoami`. Mechanics only; runtime is unchanged. */ +export function whoamiHelpAfter(): string { + return ` +Shows the current credential source (AISA_API_KEY or the CLI credential store). May refresh stored OAuth tokens. This is not protected auth proof — use aisa balance. Users and agents must not manually read, copy, or refresh credential files; the CLI and bundled integrations manage compatibility mirrors. +`; +} + export async function whoamiAction(): Promise { const key = await getAccessToken(); const source = getKeySource(); diff --git a/src/commands/connect.ts b/src/commands/connect.ts index 423da95..d59da33 100644 --- a/src/commands/connect.ts +++ b/src/commands/connect.ts @@ -9,7 +9,7 @@ import chalk from "chalk"; import { success, error, info, hint } from "../utils/display.js"; import { expandHome } from "../utils/file.js"; import { MCP_CONFIGS, MCP_DEFAULT_SLUGS, AISA_PROVIDER_ID } from "../constants.js"; -import { getAccessToken, getConfig, setConfig } from "../config.js"; +import { getAccessToken, getConfig, getKeySource, setConfig } from "../config.js"; import { fetchLiveServers, writeClientConfig, buildEntry, stripped, type LiveServer } from "./mcp.js"; import { INSTALLERS, installAgent, isInstalled, supported } from "./install.js"; import { @@ -2265,8 +2265,7 @@ async function offerLaunch( * The closing block of a run: what changed on this machine, which commands * the user now has, and what to run next. It is the part someone reads * after the browser tab is gone — and the part that teaches them to do this - * by hand next time, so it names files and commands rather than describing - * them. + * by hand next time. Credential source is semantic only: no file path or value. */ function summarise( log: Journal, @@ -2303,7 +2302,14 @@ function summarise( log.line("write", "AIsa added beside your setup", r.steps.find((s) => s.id === "llm-backup")?.detail); } if (done("install:aisa-cli")) log.line("write", "AIsa CLI available as `aisa`"); - log.record(`credential: ~/.aisa/key (0600)`); + const credentialSource = getKeySource(); + log.record( + credentialSource === "env" + ? "credential: AISA_API_KEY" + : credentialSource === "config" + ? "credential: CLI credential store" + : "credential: none" + ); log.section("Commands you now have"); for (const c of launchChoices(r.clientId, r.llmMode)) log.command(c.cmd, c.desc); diff --git a/src/commands/flow.ts b/src/commands/flow.ts index abc66cb..117e9d9 100644 --- a/src/commands/flow.ts +++ b/src/commands/flow.ts @@ -527,8 +527,8 @@ export const RUNTIME_COPY = { zh: "想用 AIsa 的模型时就跑 {bin};删掉那一个文件就等于移除。", }, noKeyStored: { - en: "No key stored here — run aisa login, then copy it from ~/.aisa/key.", - zh: "本机没有存 key —— 先跑 aisa login,再从 ~/.aisa/key 复制。", + en: "No credential stored here — run aisa login, then aisa balance. Do not copy token files. For a static key use AISA_API_KEY or aisa login --key.", + zh: "本机没有存凭证 —— 先跑 aisa login,再用 aisa balance 验证。不要复制 token 文件。静态密钥用 AISA_API_KEYaisa login --key。", }, cannotStartApp: { en: "Could not start {name} — open it from your Applications folder.", diff --git a/src/commands/skills.ts b/src/commands/skills.ts index 06ea397..019e5d8 100644 --- a/src/commands/skills.ts +++ b/src/commands/skills.ts @@ -38,7 +38,7 @@ Describe how an AI agent should use this skill. export AISA_API_KEY=sk-your-key \`\`\` -Same key as \`aisa login\`: \`AISA_API_KEY\`, then \`~/.aisa/key\`, then legacy login. +Prefer \`aisa login\`. \`AISA_API_KEY\` overrides stored credentials. Users and agents must not manually read, copy, or refresh credential files; the CLI and bundled integrations manage compatibility mirrors. Prove auth with \`aisa balance\`. ## Published tools diff --git a/src/commands/tool-help.ts b/src/commands/tool-help.ts index 0675e2b..a820d62 100644 --- a/src/commands/tool-help.ts +++ b/src/commands/tool-help.ts @@ -61,11 +61,11 @@ const JSON_CONTRACT = "--json writes the unmodified application body, including MCP identifiers and numeric tokens. Human output maps only AISA_SEARCH_TOOL, AISA_BATCH_GET_SCHEMA, AISA_BATCH_QUOTE, and AISA_BATCH_USE to aisa search / schema / quote / call."; const KEY_RESOLUTION = - "Prefer aisa login (stores a CLI key). Resolution: AISA_API_KEY, then ~/.aisa/key, then legacy login. CI: AISA_API_KEY or aisa login --key."; + "Prefer aisa login (stores OAuth or a static key in the CLI credential store). AISA_API_KEY overrides stored credentials and never refreshes. Users and agents must not manually read, copy, or refresh credential files; the CLI and bundled integrations manage compatibility mirrors. Prove protected auth with aisa balance; aisa whoami may refresh stored tokens and is not proof. CI: AISA_API_KEY or aisa login --key."; -const ENFORCED_OPTIONAL = `Enforced: invalid local input exits 2 and is not sent. A configured AIsa API key is optional (${KEY_RESOLUTION}).`; +const ENFORCED_OPTIONAL = `Enforced: invalid local input exits 2 and is not sent. A configured OAuth session or static AIsa API key is optional (${KEY_RESOLUTION}).`; -const ENFORCED_REQUIRED = `Enforced: quote and call refuse to run without a configured AIsa API key (${KEY_RESOLUTION}). Invalid local input exits 2 and is not sent. search and schema may be anonymous.`; +const ENFORCED_REQUIRED = `Enforced: quote and call refuse to run without an OAuth session or static AIsa API key (${KEY_RESOLUTION}). Invalid local input exits 2 and is not sent. search and schema may be anonymous.`; const NOT_ENFORCED = "Not enforced: the CLI does not record quotes, approvals, or budget caps and does not reject an unquoted aisa call."; @@ -137,7 +137,7 @@ export function routerContract(kind: RouterOperation): RouterCommandContract { "Instruction: A missing or failed quote is never free.", "A data request or credentials alone is not spending approval.", "Instruction: Call only an independently approved successful subset. Do not silently retry or expand the set.", - "Instruction: Without a configured AIsa API key, do not invent a business result.", + "Instruction: Without an OAuth session or static AIsa API key, do not invent a business result.", ], examples: [example("call", EXAMPLE_BATCH)], }; @@ -223,18 +223,21 @@ export function callHelpAfter(): string { export function rootHelpAfter(): string { return ` Examples (POSIX sh; single-quoted --input): - $ aisa connect wire your coding agent to AIsa (start here) + $ aisa login sign in (prove with aisa balance) $ aisa search "company facts" --json $ aisa schema ${EXAMPLE_PUBLISHED_TOOL} --json $ aisa quote ${shellInputFlag(EXAMPLE_BATCH_JSON)} --json $ aisa call ${shellInputFlag(EXAMPLE_BATCH_JSON)} --json $ aisa api list browse the provider catalog $ aisa api show coingecko browse one provider's endpoints + $ aisa connect optional: domain MCP for local coding agents (not the four-tool Router) +General setup: aisa login for CLI credentials, or native MCP at https://tools.aisa.one/mcp. +aisa connect installs domain MCP servers into local agents; its default web-search server is not the four-tool Router. Router: ${MCP_CLI_MAP.search.identifier}→search, ${MCP_CLI_MAP.schema.identifier}→schema, ${MCP_CLI_MAP.quote.identifier}→quote, ${MCP_CLI_MAP.call.identifier}→call. --json keeps MCP identifiers. Human output maps those four names to CLI commands. ${FLOW} -Use aisa --help or aisa manifest for complete JSON/file/stdin examples, shared API-key sources, exit codes, and cost constraints. +Use aisa --help or aisa manifest for complete JSON/file/stdin examples, credential sources, exit codes, and cost constraints. Catalog list/show are browsing metadata, not a substitute for schema or quote. `; } diff --git a/src/index.ts b/src/index.ts index 6faa0b4..10df0a9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import { CliError } from "./cli-error.js"; import type { RouterIoOptions } from "./commands/tool-input.js"; // Auth -import { loginAction, logoutAction, whoamiAction } from "./commands/auth.js"; +import { loginAction, logoutAction, whoamiAction, whoamiHelpAfter } from "./commands/auth.js"; import { loginHelpAfter } from "./commands/oauth-login.js"; // Account import { balanceAction, topupAction, usageAction } from "./commands/account.js"; @@ -105,6 +105,7 @@ program program .command("whoami") .description("Show authentication status") + .addHelpText("after", whoamiHelpAfter()) .action(wrap(whoamiAction)); // ── Account ── @@ -276,6 +277,13 @@ skills program .command("connect") .description("Connect AIsa MCP servers to your local coding agents via a one-shot local page") + .addHelpText( + "after", + ` +Optional local-agent domain MCP setup. Not general CLI sign-in and not the four-tool Router at https://tools.aisa.one/mcp. +General setup: aisa login (prove with aisa balance) or native MCP at that Router URL. The default connect server is domain web-search. +` + ) .option("--no-open", "Print the URL instead of opening the browser") .option("--port ", "Bind a specific port (default: random)") .option("--dry-run", "Show what would be configured without writing anything") diff --git a/tests/__snapshots__/connect-snapshot.test.ts.snap b/tests/__snapshots__/connect-snapshot.test.ts.snap index 0da469e..db849d6 100644 --- a/tests/__snapshots__/connect-snapshot.test.ts.snap +++ b/tests/__snapshots__/connect-snapshot.test.ts.snap @@ -549,7 +549,7 @@ exports[`T2 page — byte-exact snapshots > done view 1`] = ` var MODEL_FOR = {"claude-code":"claude-sonnet-5","codex":"gpt-5.3-codex","opencode":"claude-sonnet-5","vscode":"claude-sonnet-5","cursor":"claude-sonnet-5","claude-desktop":"claude-sonnet-5"}; var EXAMPLES = {"web-search":["Using AIsa, search the web for this week's biggest AI news and summarize the top 3 results with links.","Using AIsa, research how teams are adopting MCP servers in production and give me a sourced brief."],"twitter-api":["Using AIsa, fetch the latest tweets from @AnthropicAI and summarize the main themes.","Using AIsa, pull @sama's five most recent tweets with their engagement numbers."],"crypto-market-data":["Using AIsa, get Bitcoin's current price and 24h change, then compare it with Ethereum.","Using AIsa's crypto data, list today's trending coins with prices and market caps."],"marketpulse":["Using AIsa, pull AAPL's latest income statement and summarize the revenue and margin trend.","Using AIsa's market data, screen for US stocks with a market cap above $1T and compare their P/E ratios."],"stock-pulse":["Using AIsa, show what X/Twitter is saying about NVDA today, joined with its market data.","Using AIsa, find which tickers are trending on X right now and why."],"prediction-market-data":["Using AIsa, list the most active prediction markets right now with their implied probabilities.","Using AIsa, compare what Polymarket and Kalshi imply about the next Fed rate decision."],"reddit":["Using AIsa, find today's top posts in r/MachineLearning and summarize the discussion.","Using AIsa, search Reddit for real-world Claude Code workflows people recommend."],"youtube-search":["Using AIsa, find the three most relevant YouTube videos about MCP servers and list their channels.","Using AIsa, find beginner YouTube tutorials for Claude Code and pick the best one to start with."],"instagram":["Using AIsa, fetch the Instagram profile and recent posts of @nasa and describe their content strategy.","Using AIsa, compare the recent Instagram engagement of @natgeo and @nasa."],"pinterest":["Using AIsa, search Pinterest for 'mid-century interior' and summarize the visual trends.","Using AIsa, find trending home-office ideas on Pinterest and summarize them with links."],"apollo":["Using AIsa, enrich the company anthropic.com — size, industry, and key people.","Using AIsa, find five AI infrastructure startups in San Francisco with their CEOs."]}; var BACKUP_COPY = {"claude-code":"Installs one small command, claude-aisa, next to your other tools. Your original claude keeps its login, models and settings exactly as they are.
You can use the newly added claude-aisa whenever you want AIsa's models at lower prices. Delete that one file to remove it.","codex":"Adds an aisa profile inside Codex's own config and a codex-aisa command. Your default Codex is untouched.
You can use the newly added codex-aisa (or codex --profile aisa) whenever you want AIsa's models; it applies to that session only.","vscode":"Adds a Custom Endpoint group named AIsa to VS Code's chat models — Claude, GPT, DeepSeek, Kimi, GLM, Qwen — beside Copilot's own. Your Copilot setup is untouched.
A small AIsa extension is installed so VS Code stores your key itself — nothing to paste. Then pick any AIsa model from the chat model picker; inline completions stay on Copilot.","opencode":"Adds AIsa as an extra provider in opencode's config. Your default model is untouched.
You can pick the newly added aisa/… models from opencode's model list whenever you want them."}; - var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No key stored here — run aisa login, then copy it from ~/.aisa/key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; + var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No credential stored here — run aisa login, then aisa balance. Do not copy token files. For a static key use AISA_API_KEY or aisa login --key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; var AGENT_NOTES = {"claude-code":"Servers are added with claude mcp add in user scope — the official mechanism, reversible with claude mcp remove. Models, if you choose to, are set through Claude Code's own settings file.","codex":"Servers are added with codex mcp add, Codex's own command. Models go in an aisa provider inside ~/.codex/config.toml — only keys we wrote are ever touched.","opencode":"Servers are added with opencode mcp add. Models become an extra aisa provider in opencode.json; pick aisa/… from its model list.","vscode":"Nothing is done by hand. The AIsa servers go into VS Code's mcp.json (with your key, or VS Code signs in to them itself), and a small AIsa extension is installed that asks VS Code to store your key and add the models as a Custom Endpoint group named AIsa — beside Copilot's own, which stay. Inline completions keep using Copilot.","cursor":"One click per server: each becomes an Add to Cursor link on the last step. Cursor opens, shows you the exact entry, and writes it into its own MCP settings when you confirm. Models stay as they are — Cursor picks its own.","claude-desktop":"Claude Desktop's config file only takes MCP servers over stdio, so each AIsa server is written in as a small mcp-remote bridge carrying your key (plus the free aisa-docs server). The bridges live and die with the app — no background service, no open ports. Models cannot be changed: Claude Desktop runs Anthropic's own. Restart the app and the servers appear under its tools menu.","claude-ai":"Nothing is installed. claude.ai takes remote MCP servers as Connectors: on the last step you get one URL per server with a Copy button, and add each under Settings → Connectors → Add custom connector, then press Connect — claude.ai runs the AIsa sign-in itself. Models cannot be changed: claude.ai runs Anthropic's own."}; var HAVE_NOTES = {"claude-code":"Nothing of yours is replaced. Your claude keeps its login, models and settings; the next step lets you add AIsa beside it as a separate claude-aisa command, or switch — your call.","codex":"Nothing of yours is replaced. Your codex keeps its login and config; the next step lets you add AIsa beside it as an aisa profile and a codex-aisa command, or switch — your call.","opencode":"Nothing of yours is replaced. Your default model stays; the next step can add AIsa as an extra aisa/… provider you pick from the model list, or switch — your call.","claude-desktop":"Nothing of yours is replaced. Anything already in claude_desktop_config.json stays; AIsa's entries are added beside it under aisa-* names and removing them is deleting those entries.","claude-ai":"Nothing of yours is touched — the connectors live in your claude.ai account, beside any you already have, and can be removed there in one click.","vscode":"Nothing of yours is replaced. Other MCP servers and model groups in those two files stay; only the aisa-* entries and the AIsa group are ours, and removing them is deleting those entries.","cursor":"Nothing of yours is replaced. Cursor adds each AIsa server beside your existing MCP entries under aisa-* names, and you approve every one inside Cursor first."}; var FILE_MODEL_NOTE = {"claude-desktop":"Claude Desktop runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents on the same AIsa account; Claude Desktop gets the MCP tools.","claude-ai":"claude.ai runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents (Claude Code, Codex, opencode) on the same AIsa account; claude.ai gets the MCP connectors.","cursor":"Cursor picks its models inside the app, so nothing changes here — only the MCP servers are added."}; @@ -2030,7 +2030,7 @@ exports[`T2 page — byte-exact snapshots > nothing detected — every card is a var MODEL_FOR = {"claude-code":"claude-sonnet-5","codex":"gpt-5.3-codex","opencode":"claude-sonnet-5","vscode":"claude-sonnet-5","cursor":"claude-sonnet-5","claude-desktop":"claude-sonnet-5"}; var EXAMPLES = {"web-search":["Using AIsa, search the web for this week's biggest AI news and summarize the top 3 results with links.","Using AIsa, research how teams are adopting MCP servers in production and give me a sourced brief."],"twitter-api":["Using AIsa, fetch the latest tweets from @AnthropicAI and summarize the main themes.","Using AIsa, pull @sama's five most recent tweets with their engagement numbers."],"crypto-market-data":["Using AIsa, get Bitcoin's current price and 24h change, then compare it with Ethereum.","Using AIsa's crypto data, list today's trending coins with prices and market caps."],"marketpulse":["Using AIsa, pull AAPL's latest income statement and summarize the revenue and margin trend.","Using AIsa's market data, screen for US stocks with a market cap above $1T and compare their P/E ratios."],"stock-pulse":["Using AIsa, show what X/Twitter is saying about NVDA today, joined with its market data.","Using AIsa, find which tickers are trending on X right now and why."],"prediction-market-data":["Using AIsa, list the most active prediction markets right now with their implied probabilities.","Using AIsa, compare what Polymarket and Kalshi imply about the next Fed rate decision."],"reddit":["Using AIsa, find today's top posts in r/MachineLearning and summarize the discussion.","Using AIsa, search Reddit for real-world Claude Code workflows people recommend."],"youtube-search":["Using AIsa, find the three most relevant YouTube videos about MCP servers and list their channels.","Using AIsa, find beginner YouTube tutorials for Claude Code and pick the best one to start with."],"instagram":["Using AIsa, fetch the Instagram profile and recent posts of @nasa and describe their content strategy.","Using AIsa, compare the recent Instagram engagement of @natgeo and @nasa."],"pinterest":["Using AIsa, search Pinterest for 'mid-century interior' and summarize the visual trends.","Using AIsa, find trending home-office ideas on Pinterest and summarize them with links."],"apollo":["Using AIsa, enrich the company anthropic.com — size, industry, and key people.","Using AIsa, find five AI infrastructure startups in San Francisco with their CEOs."]}; var BACKUP_COPY = {"claude-code":"Installs one small command, claude-aisa, next to your other tools. Your original claude keeps its login, models and settings exactly as they are.
You can use the newly added claude-aisa whenever you want AIsa's models at lower prices. Delete that one file to remove it.","codex":"Adds an aisa profile inside Codex's own config and a codex-aisa command. Your default Codex is untouched.
You can use the newly added codex-aisa (or codex --profile aisa) whenever you want AIsa's models; it applies to that session only.","vscode":"Adds a Custom Endpoint group named AIsa to VS Code's chat models — Claude, GPT, DeepSeek, Kimi, GLM, Qwen — beside Copilot's own. Your Copilot setup is untouched.
A small AIsa extension is installed so VS Code stores your key itself — nothing to paste. Then pick any AIsa model from the chat model picker; inline completions stay on Copilot.","opencode":"Adds AIsa as an extra provider in opencode's config. Your default model is untouched.
You can pick the newly added aisa/… models from opencode's model list whenever you want them."}; - var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No key stored here — run aisa login, then copy it from ~/.aisa/key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; + var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No credential stored here — run aisa login, then aisa balance. Do not copy token files. For a static key use AISA_API_KEY or aisa login --key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; var AGENT_NOTES = {"claude-code":"Servers are added with claude mcp add in user scope — the official mechanism, reversible with claude mcp remove. Models, if you choose to, are set through Claude Code's own settings file.","codex":"Servers are added with codex mcp add, Codex's own command. Models go in an aisa provider inside ~/.codex/config.toml — only keys we wrote are ever touched.","opencode":"Servers are added with opencode mcp add. Models become an extra aisa provider in opencode.json; pick aisa/… from its model list.","vscode":"Nothing is done by hand. The AIsa servers go into VS Code's mcp.json (with your key, or VS Code signs in to them itself), and a small AIsa extension is installed that asks VS Code to store your key and add the models as a Custom Endpoint group named AIsa — beside Copilot's own, which stay. Inline completions keep using Copilot.","cursor":"One click per server: each becomes an Add to Cursor link on the last step. Cursor opens, shows you the exact entry, and writes it into its own MCP settings when you confirm. Models stay as they are — Cursor picks its own.","claude-desktop":"Claude Desktop's config file only takes MCP servers over stdio, so each AIsa server is written in as a small mcp-remote bridge carrying your key (plus the free aisa-docs server). The bridges live and die with the app — no background service, no open ports. Models cannot be changed: Claude Desktop runs Anthropic's own. Restart the app and the servers appear under its tools menu.","claude-ai":"Nothing is installed. claude.ai takes remote MCP servers as Connectors: on the last step you get one URL per server with a Copy button, and add each under Settings → Connectors → Add custom connector, then press Connect — claude.ai runs the AIsa sign-in itself. Models cannot be changed: claude.ai runs Anthropic's own."}; var HAVE_NOTES = {"claude-code":"Nothing of yours is replaced. Your claude keeps its login, models and settings; the next step lets you add AIsa beside it as a separate claude-aisa command, or switch — your call.","codex":"Nothing of yours is replaced. Your codex keeps its login and config; the next step lets you add AIsa beside it as an aisa profile and a codex-aisa command, or switch — your call.","opencode":"Nothing of yours is replaced. Your default model stays; the next step can add AIsa as an extra aisa/… provider you pick from the model list, or switch — your call.","claude-desktop":"Nothing of yours is replaced. Anything already in claude_desktop_config.json stays; AIsa's entries are added beside it under aisa-* names and removing them is deleting those entries.","claude-ai":"Nothing of yours is touched — the connectors live in your claude.ai account, beside any you already have, and can be removed there in one click.","vscode":"Nothing of yours is replaced. Other MCP servers and model groups in those two files stay; only the aisa-* entries and the AIsa group are ours, and removing them is deleting those entries.","cursor":"Nothing of yours is replaced. Cursor adds each AIsa server beside your existing MCP entries under aisa-* names, and you approve every one inside Cursor first."}; var FILE_MODEL_NOTE = {"claude-desktop":"Claude Desktop runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents on the same AIsa account; Claude Desktop gets the MCP tools.","claude-ai":"claude.ai runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents (Claude Code, Codex, opencode) on the same AIsa account; claude.ai gets the MCP connectors.","cursor":"Cursor picks its models inside the app, so nothing changes here — only the MCP servers are added."}; @@ -3511,7 +3511,7 @@ exports[`T2 page — byte-exact snapshots > start view, installers unavailable var MODEL_FOR = {"claude-code":"claude-sonnet-5","codex":"gpt-5.3-codex","opencode":"claude-sonnet-5","vscode":"claude-sonnet-5","cursor":"claude-sonnet-5","claude-desktop":"claude-sonnet-5"}; var EXAMPLES = {"web-search":["Using AIsa, search the web for this week's biggest AI news and summarize the top 3 results with links.","Using AIsa, research how teams are adopting MCP servers in production and give me a sourced brief."],"twitter-api":["Using AIsa, fetch the latest tweets from @AnthropicAI and summarize the main themes.","Using AIsa, pull @sama's five most recent tweets with their engagement numbers."],"crypto-market-data":["Using AIsa, get Bitcoin's current price and 24h change, then compare it with Ethereum.","Using AIsa's crypto data, list today's trending coins with prices and market caps."],"marketpulse":["Using AIsa, pull AAPL's latest income statement and summarize the revenue and margin trend.","Using AIsa's market data, screen for US stocks with a market cap above $1T and compare their P/E ratios."],"stock-pulse":["Using AIsa, show what X/Twitter is saying about NVDA today, joined with its market data.","Using AIsa, find which tickers are trending on X right now and why."],"prediction-market-data":["Using AIsa, list the most active prediction markets right now with their implied probabilities.","Using AIsa, compare what Polymarket and Kalshi imply about the next Fed rate decision."],"reddit":["Using AIsa, find today's top posts in r/MachineLearning and summarize the discussion.","Using AIsa, search Reddit for real-world Claude Code workflows people recommend."],"youtube-search":["Using AIsa, find the three most relevant YouTube videos about MCP servers and list their channels.","Using AIsa, find beginner YouTube tutorials for Claude Code and pick the best one to start with."],"instagram":["Using AIsa, fetch the Instagram profile and recent posts of @nasa and describe their content strategy.","Using AIsa, compare the recent Instagram engagement of @natgeo and @nasa."],"pinterest":["Using AIsa, search Pinterest for 'mid-century interior' and summarize the visual trends.","Using AIsa, find trending home-office ideas on Pinterest and summarize them with links."],"apollo":["Using AIsa, enrich the company anthropic.com — size, industry, and key people.","Using AIsa, find five AI infrastructure startups in San Francisco with their CEOs."]}; var BACKUP_COPY = {"claude-code":"Installs one small command, claude-aisa, next to your other tools. Your original claude keeps its login, models and settings exactly as they are.
You can use the newly added claude-aisa whenever you want AIsa's models at lower prices. Delete that one file to remove it.","codex":"Adds an aisa profile inside Codex's own config and a codex-aisa command. Your default Codex is untouched.
You can use the newly added codex-aisa (or codex --profile aisa) whenever you want AIsa's models; it applies to that session only.","vscode":"Adds a Custom Endpoint group named AIsa to VS Code's chat models — Claude, GPT, DeepSeek, Kimi, GLM, Qwen — beside Copilot's own. Your Copilot setup is untouched.
A small AIsa extension is installed so VS Code stores your key itself — nothing to paste. Then pick any AIsa model from the chat model picker; inline completions stay on Copilot.","opencode":"Adds AIsa as an extra provider in opencode's config. Your default model is untouched.
You can pick the newly added aisa/… models from opencode's model list whenever you want them."}; - var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No key stored here — run aisa login, then copy it from ~/.aisa/key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; + var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No credential stored here — run aisa login, then aisa balance. Do not copy token files. For a static key use AISA_API_KEY or aisa login --key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; var AGENT_NOTES = {"claude-code":"Servers are added with claude mcp add in user scope — the official mechanism, reversible with claude mcp remove. Models, if you choose to, are set through Claude Code's own settings file.","codex":"Servers are added with codex mcp add, Codex's own command. Models go in an aisa provider inside ~/.codex/config.toml — only keys we wrote are ever touched.","opencode":"Servers are added with opencode mcp add. Models become an extra aisa provider in opencode.json; pick aisa/… from its model list.","vscode":"Nothing is done by hand. The AIsa servers go into VS Code's mcp.json (with your key, or VS Code signs in to them itself), and a small AIsa extension is installed that asks VS Code to store your key and add the models as a Custom Endpoint group named AIsa — beside Copilot's own, which stay. Inline completions keep using Copilot.","cursor":"One click per server: each becomes an Add to Cursor link on the last step. Cursor opens, shows you the exact entry, and writes it into its own MCP settings when you confirm. Models stay as they are — Cursor picks its own.","claude-desktop":"Claude Desktop's config file only takes MCP servers over stdio, so each AIsa server is written in as a small mcp-remote bridge carrying your key (plus the free aisa-docs server). The bridges live and die with the app — no background service, no open ports. Models cannot be changed: Claude Desktop runs Anthropic's own. Restart the app and the servers appear under its tools menu.","claude-ai":"Nothing is installed. claude.ai takes remote MCP servers as Connectors: on the last step you get one URL per server with a Copy button, and add each under Settings → Connectors → Add custom connector, then press Connect — claude.ai runs the AIsa sign-in itself. Models cannot be changed: claude.ai runs Anthropic's own."}; var HAVE_NOTES = {"claude-code":"Nothing of yours is replaced. Your claude keeps its login, models and settings; the next step lets you add AIsa beside it as a separate claude-aisa command, or switch — your call.","codex":"Nothing of yours is replaced. Your codex keeps its login and config; the next step lets you add AIsa beside it as an aisa profile and a codex-aisa command, or switch — your call.","opencode":"Nothing of yours is replaced. Your default model stays; the next step can add AIsa as an extra aisa/… provider you pick from the model list, or switch — your call.","claude-desktop":"Nothing of yours is replaced. Anything already in claude_desktop_config.json stays; AIsa's entries are added beside it under aisa-* names and removing them is deleting those entries.","claude-ai":"Nothing of yours is touched — the connectors live in your claude.ai account, beside any you already have, and can be removed there in one click.","vscode":"Nothing of yours is replaced. Other MCP servers and model groups in those two files stay; only the aisa-* entries and the AIsa group are ours, and removing them is deleting those entries.","cursor":"Nothing of yours is replaced. Cursor adds each AIsa server beside your existing MCP entries under aisa-* names, and you approve every one inside Cursor first."}; var FILE_MODEL_NOTE = {"claude-desktop":"Claude Desktop runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents on the same AIsa account; Claude Desktop gets the MCP tools.","claude-ai":"claude.ai runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents (Claude Code, Codex, opencode) on the same AIsa account; claude.ai gets the MCP connectors.","cursor":"Cursor picks its models inside the app, so nothing changes here — only the MCP servers are added."}; @@ -5004,7 +5004,7 @@ exports[`T2 page — byte-exact snapshots > start view, key already configured 1 var MODEL_FOR = {"claude-code":"claude-sonnet-5","codex":"gpt-5.3-codex","opencode":"claude-sonnet-5","vscode":"claude-sonnet-5","cursor":"claude-sonnet-5","claude-desktop":"claude-sonnet-5"}; var EXAMPLES = {"web-search":["Using AIsa, search the web for this week's biggest AI news and summarize the top 3 results with links.","Using AIsa, research how teams are adopting MCP servers in production and give me a sourced brief."],"twitter-api":["Using AIsa, fetch the latest tweets from @AnthropicAI and summarize the main themes.","Using AIsa, pull @sama's five most recent tweets with their engagement numbers."],"crypto-market-data":["Using AIsa, get Bitcoin's current price and 24h change, then compare it with Ethereum.","Using AIsa's crypto data, list today's trending coins with prices and market caps."],"marketpulse":["Using AIsa, pull AAPL's latest income statement and summarize the revenue and margin trend.","Using AIsa's market data, screen for US stocks with a market cap above $1T and compare their P/E ratios."],"stock-pulse":["Using AIsa, show what X/Twitter is saying about NVDA today, joined with its market data.","Using AIsa, find which tickers are trending on X right now and why."],"prediction-market-data":["Using AIsa, list the most active prediction markets right now with their implied probabilities.","Using AIsa, compare what Polymarket and Kalshi imply about the next Fed rate decision."],"reddit":["Using AIsa, find today's top posts in r/MachineLearning and summarize the discussion.","Using AIsa, search Reddit for real-world Claude Code workflows people recommend."],"youtube-search":["Using AIsa, find the three most relevant YouTube videos about MCP servers and list their channels.","Using AIsa, find beginner YouTube tutorials for Claude Code and pick the best one to start with."],"instagram":["Using AIsa, fetch the Instagram profile and recent posts of @nasa and describe their content strategy.","Using AIsa, compare the recent Instagram engagement of @natgeo and @nasa."],"pinterest":["Using AIsa, search Pinterest for 'mid-century interior' and summarize the visual trends.","Using AIsa, find trending home-office ideas on Pinterest and summarize them with links."],"apollo":["Using AIsa, enrich the company anthropic.com — size, industry, and key people.","Using AIsa, find five AI infrastructure startups in San Francisco with their CEOs."]}; var BACKUP_COPY = {"claude-code":"Installs one small command, claude-aisa, next to your other tools. Your original claude keeps its login, models and settings exactly as they are.
You can use the newly added claude-aisa whenever you want AIsa's models at lower prices. Delete that one file to remove it.","codex":"Adds an aisa profile inside Codex's own config and a codex-aisa command. Your default Codex is untouched.
You can use the newly added codex-aisa (or codex --profile aisa) whenever you want AIsa's models; it applies to that session only.","vscode":"Adds a Custom Endpoint group named AIsa to VS Code's chat models — Claude, GPT, DeepSeek, Kimi, GLM, Qwen — beside Copilot's own. Your Copilot setup is untouched.
A small AIsa extension is installed so VS Code stores your key itself — nothing to paste. Then pick any AIsa model from the chat model picker; inline completions stay on Copilot.","opencode":"Adds AIsa as an extra provider in opencode's config. Your default model is untouched.
You can pick the newly added aisa/… models from opencode's model list whenever you want them."}; - var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No key stored here — run aisa login, then copy it from ~/.aisa/key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; + var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No credential stored here — run aisa login, then aisa balance. Do not copy token files. For a static key use AISA_API_KEY or aisa login --key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; var AGENT_NOTES = {"claude-code":"Servers are added with claude mcp add in user scope — the official mechanism, reversible with claude mcp remove. Models, if you choose to, are set through Claude Code's own settings file.","codex":"Servers are added with codex mcp add, Codex's own command. Models go in an aisa provider inside ~/.codex/config.toml — only keys we wrote are ever touched.","opencode":"Servers are added with opencode mcp add. Models become an extra aisa provider in opencode.json; pick aisa/… from its model list.","vscode":"Nothing is done by hand. The AIsa servers go into VS Code's mcp.json (with your key, or VS Code signs in to them itself), and a small AIsa extension is installed that asks VS Code to store your key and add the models as a Custom Endpoint group named AIsa — beside Copilot's own, which stay. Inline completions keep using Copilot.","cursor":"One click per server: each becomes an Add to Cursor link on the last step. Cursor opens, shows you the exact entry, and writes it into its own MCP settings when you confirm. Models stay as they are — Cursor picks its own.","claude-desktop":"Claude Desktop's config file only takes MCP servers over stdio, so each AIsa server is written in as a small mcp-remote bridge carrying your key (plus the free aisa-docs server). The bridges live and die with the app — no background service, no open ports. Models cannot be changed: Claude Desktop runs Anthropic's own. Restart the app and the servers appear under its tools menu.","claude-ai":"Nothing is installed. claude.ai takes remote MCP servers as Connectors: on the last step you get one URL per server with a Copy button, and add each under Settings → Connectors → Add custom connector, then press Connect — claude.ai runs the AIsa sign-in itself. Models cannot be changed: claude.ai runs Anthropic's own."}; var HAVE_NOTES = {"claude-code":"Nothing of yours is replaced. Your claude keeps its login, models and settings; the next step lets you add AIsa beside it as a separate claude-aisa command, or switch — your call.","codex":"Nothing of yours is replaced. Your codex keeps its login and config; the next step lets you add AIsa beside it as an aisa profile and a codex-aisa command, or switch — your call.","opencode":"Nothing of yours is replaced. Your default model stays; the next step can add AIsa as an extra aisa/… provider you pick from the model list, or switch — your call.","claude-desktop":"Nothing of yours is replaced. Anything already in claude_desktop_config.json stays; AIsa's entries are added beside it under aisa-* names and removing them is deleting those entries.","claude-ai":"Nothing of yours is touched — the connectors live in your claude.ai account, beside any you already have, and can be removed there in one click.","vscode":"Nothing of yours is replaced. Other MCP servers and model groups in those two files stay; only the aisa-* entries and the AIsa group are ours, and removing them is deleting those entries.","cursor":"Nothing of yours is replaced. Cursor adds each AIsa server beside your existing MCP entries under aisa-* names, and you approve every one inside Cursor first."}; var FILE_MODEL_NOTE = {"claude-desktop":"Claude Desktop runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents on the same AIsa account; Claude Desktop gets the MCP tools.","claude-ai":"claude.ai runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents (Claude Code, Codex, opencode) on the same AIsa account; claude.ai gets the MCP connectors.","cursor":"Cursor picks its models inside the app, so nothing changes here — only the MCP servers are added."}; @@ -6497,7 +6497,7 @@ exports[`T2 page — byte-exact snapshots > start view, no key — the sign-in s var MODEL_FOR = {"claude-code":"claude-sonnet-5","codex":"gpt-5.3-codex","opencode":"claude-sonnet-5","vscode":"claude-sonnet-5","cursor":"claude-sonnet-5","claude-desktop":"claude-sonnet-5"}; var EXAMPLES = {"web-search":["Using AIsa, search the web for this week's biggest AI news and summarize the top 3 results with links.","Using AIsa, research how teams are adopting MCP servers in production and give me a sourced brief."],"twitter-api":["Using AIsa, fetch the latest tweets from @AnthropicAI and summarize the main themes.","Using AIsa, pull @sama's five most recent tweets with their engagement numbers."],"crypto-market-data":["Using AIsa, get Bitcoin's current price and 24h change, then compare it with Ethereum.","Using AIsa's crypto data, list today's trending coins with prices and market caps."],"marketpulse":["Using AIsa, pull AAPL's latest income statement and summarize the revenue and margin trend.","Using AIsa's market data, screen for US stocks with a market cap above $1T and compare their P/E ratios."],"stock-pulse":["Using AIsa, show what X/Twitter is saying about NVDA today, joined with its market data.","Using AIsa, find which tickers are trending on X right now and why."],"prediction-market-data":["Using AIsa, list the most active prediction markets right now with their implied probabilities.","Using AIsa, compare what Polymarket and Kalshi imply about the next Fed rate decision."],"reddit":["Using AIsa, find today's top posts in r/MachineLearning and summarize the discussion.","Using AIsa, search Reddit for real-world Claude Code workflows people recommend."],"youtube-search":["Using AIsa, find the three most relevant YouTube videos about MCP servers and list their channels.","Using AIsa, find beginner YouTube tutorials for Claude Code and pick the best one to start with."],"instagram":["Using AIsa, fetch the Instagram profile and recent posts of @nasa and describe their content strategy.","Using AIsa, compare the recent Instagram engagement of @natgeo and @nasa."],"pinterest":["Using AIsa, search Pinterest for 'mid-century interior' and summarize the visual trends.","Using AIsa, find trending home-office ideas on Pinterest and summarize them with links."],"apollo":["Using AIsa, enrich the company anthropic.com — size, industry, and key people.","Using AIsa, find five AI infrastructure startups in San Francisco with their CEOs."]}; var BACKUP_COPY = {"claude-code":"Installs one small command, claude-aisa, next to your other tools. Your original claude keeps its login, models and settings exactly as they are.
You can use the newly added claude-aisa whenever you want AIsa's models at lower prices. Delete that one file to remove it.","codex":"Adds an aisa profile inside Codex's own config and a codex-aisa command. Your default Codex is untouched.
You can use the newly added codex-aisa (or codex --profile aisa) whenever you want AIsa's models; it applies to that session only.","vscode":"Adds a Custom Endpoint group named AIsa to VS Code's chat models — Claude, GPT, DeepSeek, Kimi, GLM, Qwen — beside Copilot's own. Your Copilot setup is untouched.
A small AIsa extension is installed so VS Code stores your key itself — nothing to paste. Then pick any AIsa model from the chat model picker; inline completions stay on Copilot.","opencode":"Adds AIsa as an extra provider in opencode's config. Your default model is untouched.
You can pick the newly added aisa/… models from opencode's model list whenever you want them."}; - var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No key stored here — run aisa login, then copy it from ~/.aisa/key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; + var COPY = {"nothingSelected":"Nothing selected yet — pick at least one server.","planBackup":{"claude-code":"Install the claude-aisa command","codex":"Add the aisa profile and codex-aisa","vscode":"Add AIsa models to VS Code chat","other":"Add AIsa as a backup provider"},"planBackupNote":"your current setup stays untouched","ledeFailed":"Some steps did not complete — the details are in the list; your results page explains how to retry.","ledeAllRan":"Everything ran. Your results, balance and try-it-now prompts are on the last step.","backupIntact":"Your usual setup is untouched.","backupOpencode":"Pick aisa/… from opencode's model list whenever you want AIsa.","backupBin":"Run {bin} whenever you want AIsa's models; delete that one file to remove it.","noKeyStored":"No credential stored here — run aisa login, then aisa balance. Do not copy token files. For a static key use AISA_API_KEY or aisa login --key.","cannotStartApp":"Could not start {name} — open it from your Applications folder.","cannotOpenTerminal":"Could not open a terminal — run {bin} in any terminal."}; var AGENT_NOTES = {"claude-code":"Servers are added with claude mcp add in user scope — the official mechanism, reversible with claude mcp remove. Models, if you choose to, are set through Claude Code's own settings file.","codex":"Servers are added with codex mcp add, Codex's own command. Models go in an aisa provider inside ~/.codex/config.toml — only keys we wrote are ever touched.","opencode":"Servers are added with opencode mcp add. Models become an extra aisa provider in opencode.json; pick aisa/… from its model list.","vscode":"Nothing is done by hand. The AIsa servers go into VS Code's mcp.json (with your key, or VS Code signs in to them itself), and a small AIsa extension is installed that asks VS Code to store your key and add the models as a Custom Endpoint group named AIsa — beside Copilot's own, which stay. Inline completions keep using Copilot.","cursor":"One click per server: each becomes an Add to Cursor link on the last step. Cursor opens, shows you the exact entry, and writes it into its own MCP settings when you confirm. Models stay as they are — Cursor picks its own.","claude-desktop":"Claude Desktop's config file only takes MCP servers over stdio, so each AIsa server is written in as a small mcp-remote bridge carrying your key (plus the free aisa-docs server). The bridges live and die with the app — no background service, no open ports. Models cannot be changed: Claude Desktop runs Anthropic's own. Restart the app and the servers appear under its tools menu.","claude-ai":"Nothing is installed. claude.ai takes remote MCP servers as Connectors: on the last step you get one URL per server with a Copy button, and add each under Settings → Connectors → Add custom connector, then press Connect — claude.ai runs the AIsa sign-in itself. Models cannot be changed: claude.ai runs Anthropic's own."}; var HAVE_NOTES = {"claude-code":"Nothing of yours is replaced. Your claude keeps its login, models and settings; the next step lets you add AIsa beside it as a separate claude-aisa command, or switch — your call.","codex":"Nothing of yours is replaced. Your codex keeps its login and config; the next step lets you add AIsa beside it as an aisa profile and a codex-aisa command, or switch — your call.","opencode":"Nothing of yours is replaced. Your default model stays; the next step can add AIsa as an extra aisa/… provider you pick from the model list, or switch — your call.","claude-desktop":"Nothing of yours is replaced. Anything already in claude_desktop_config.json stays; AIsa's entries are added beside it under aisa-* names and removing them is deleting those entries.","claude-ai":"Nothing of yours is touched — the connectors live in your claude.ai account, beside any you already have, and can be removed there in one click.","vscode":"Nothing of yours is replaced. Other MCP servers and model groups in those two files stay; only the aisa-* entries and the AIsa group are ours, and removing them is deleting those entries.","cursor":"Nothing of yours is replaced. Cursor adds each AIsa server beside your existing MCP entries under aisa-* names, and you approve every one inside Cursor first."}; var FILE_MODEL_NOTE = {"claude-desktop":"Claude Desktop runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents on the same AIsa account; Claude Desktop gets the MCP tools.","claude-ai":"claude.ai runs on Anthropic's own models, and AIsa cannot stand in for them — so nothing changes here. You still get every model above through the coding agents (Claude Code, Codex, opencode) on the same AIsa account; claude.ai gets the MCP connectors.","cursor":"Cursor picks its models inside the app, so nothing changes here — only the MCP servers are added."}; diff --git a/tests/cli-help.cli.test.ts b/tests/cli-help.cli.test.ts index e4515ed..b1e064b 100644 --- a/tests/cli-help.cli.test.ts +++ b/tests/cli-help.cli.test.ts @@ -79,7 +79,13 @@ describe("compiled --help and manifest", () => { expect(text, name).not.toMatch(/Unquoted calls cannot be executed/); if (name !== "root") { expect(text, name).toContain("AISA_API_KEY"); - expect(text, name).toContain("~/.aisa/key"); + expect(text, name).toMatch(/overrides stored credentials/); + expect(text, name).toContain("aisa balance"); + expect(text, name).not.toContain("~/.aisa/key"); + expect(text, name).not.toMatch(/stores a CLI key/); + expect(text, name).not.toMatch(/legacy login/); + expect(text, name).toMatch(/Users and agents must not manually/); + expect(text, name).toMatch(/bundled integrations manage compatibility mirrors/); expect(text, name).toMatch(/Enforced:/); expect(text, name).toMatch(/Exits: 0 success/); } @@ -87,6 +93,9 @@ describe("compiled --help and manifest", () => { } expect(pages.root).toContain("aisa --help or aisa manifest "); + expect(pages.root).toContain("aisa login"); + expect(pages.root).toContain("tools.aisa.one/mcp"); + expect(pages.root).not.toMatch(/start here/i); expect(pages.root).toContain(EXAMPLE_BATCH_JSON); expect(pages.root).toContain(EXAMPLE_PUBLISHED_TOOL); expect(pages.root).toContain("aisa api list"); diff --git a/vscode-extension/README.md b/vscode-extension/README.md index b47e212..130ea75 100644 --- a/vscode-extension/README.md +++ b/vscode-extension/README.md @@ -1,6 +1,8 @@ # AIsa for VS Code Adds AIsa's models (Claude, GPT, DeepSeek, Kimi, GLM, Qwen) to VS Code chat -using the key `aisa login` stored in `~/.aisa/key`. Installed by -`aisa connect`; nothing to paste. Run **AIsa: Set up AIsa models in chat** +using the credential `aisa login` stores. Installed by +`aisa connect`; nothing to paste. The bundled extension may read the CLI +compatibility mirror internally. Users and agents must not copy credential +files. Run **AIsa: Set up AIsa models in chat** from the command palette to re-provision after rotating your key.