@vierratale/ai 0.1.0-beta.15 → 0.1.0-beta.16

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.
package/README.md CHANGED
@@ -4,25 +4,16 @@ Intelligent terminal assistant that runs AI models locally and in the cloud.
4
4
 
5
5
  ## Install
6
6
 
7
- Install requirements and run from source:
8
-
9
- ```bash
10
- git clone <your-repo-url>/vierratale-ai.git
11
- cd vierratale-ai
12
-
13
- ./install.sh --node # installs requirements + links the commands
14
- vierratale # start chatting
15
- ```
16
-
17
- Or run directly from npm:
18
-
19
7
  ```bash
8
+ # From npm
20
9
  npm install -g @vierratale/ai
10
+
11
+ # Or run directly
21
12
  npx @vierratale/ai
22
13
  ```
23
14
 
24
15
  The first launch detects and, if needed, installs and starts the local engine
25
- (**Cortex**), then pulls the model you use.
16
+ (**Cortex** - "secretly" Ollama under the hood), then pulls the model you use.
26
17
 
27
18
  ## Usage
28
19
 
@@ -32,44 +23,32 @@ vierrataleai --provider cortex # Use local models
32
23
  vierrataleai --provider openai # Use cloud models (OpenAI)
33
24
  vierrataleai --provider anthropic # Use cloud models (Claude)
34
25
  vierrataleai --provider gemini # Use cloud models (Gemini)
35
- vierrataleai --model VTL-3.7-Ultra # Use specific model
26
+ vierrataleai --model vierratale-pro # Use specific model
36
27
  ```
37
28
 
38
29
  ## Models
39
30
 
40
31
  Local models run through the **Cortex** engine:
41
32
 
42
- | Model | Tier |
43
- |-------|------|
44
- | VTL-2.5-Mini | minimal |
45
- | VTL-2.7-Flash | fast |
46
- | VTL-2.9-Core | small |
47
- | VTL-3.2-Orbit | small |
48
- | VTL-3.1-Plus | balanced |
49
- | VTL-3.3-Pro | coder |
50
- | VTL-3.5-Reason | reasoning |
51
- | VTL-3.7-Ultra | ultra |
52
- | VTL-4.7-Gusto | balanced |
53
- | VTL-5.4-Tempo | balanced |
54
- | VTL-5.2-Pinnacle | pro |
55
- | VTL-5.9-Sovereign | pro |
33
+ | Model | Backend |
34
+ |-------|---------|
35
+ | vierratale-lite | qwen3:0.6b |
36
+ | vierratale-fast | gemma3:1b |
37
+ | vierratale-small | llama3.2:1b |
38
+ | vierratale-balanced | qwen2.5:1.5b |
39
+ | vierratale-plus | qwen3:1.7b |
40
+ | vierratale-pro | qwen2.5:3b |
56
41
 
57
42
  Cloud models are available when the matching provider + API key is configured:
58
43
 
59
- | Model | Tier |
60
- |-------|------|
61
- | VTL-4.0 | cloud-mini |
62
- | VTL-4.2-Omni | cloud |
63
- | VTL-4.5-Plus | cloud-fast |
64
- | VTL-5.0-Pro | cloud-pro |
65
- | VTL-6.0-Reason | cloud-lite |
66
- | VTL-7.0-Omnij | cloud-plus |
67
- | VTL-8.0-Fabric | cloud-fabric |
68
- | VTL-9.0-Forge | cloud-forge |
69
- | VTL-10.0-Singularity | cloud-singularity |
70
-
71
- > Legacy `vierratale-*` and old `VRTL-*` model names (e.g. `vierratale-fast`,
72
- > `vierratale-cloud`) still work and map to the VTL names.
44
+ | Model | Backend |
45
+ |-------|---------|
46
+ | vierratale-cloud-mini | gpt-4o-mini (OpenAI) |
47
+ | vierratale-cloud | gpt-4o (OpenAI) |
48
+ | vierratale-cloud-fast | claude-3-5-haiku-20241022 (Anthropic) |
49
+ | vierratale-cloud-pro | claude-sonnet-4-20250514 (Anthropic) |
50
+ | vierratale-cloud-lite | gemini-2.0-flash (Gemini) |
51
+ | vierratale-cloud-plus | gemini-1.5-pro (Gemini) |
73
52
 
74
53
  ## Commands
75
54
 
@@ -79,8 +58,6 @@ Cloud models are available when the matching provider + API key is configured:
79
58
  - `/models` - List available models
80
59
  - `/system [text]` - Set a custom system prompt / persona
81
60
  - `/search <query>` - Search the web and summarize with AI
82
- - `/fetch <url>` - Open a link and summarize its content
83
- - `/log [n|path]` - Show the last n log entries (default 30) or the log file path
84
61
  - `/clear` - Clear screen
85
62
  - `/new` - Start a new conversation (clear memory)
86
63
  - `/quit` - Exit
@@ -88,112 +65,14 @@ Cloud models are available when the matching provider + API key is configured:
88
65
  ## Smart Search
89
66
 
90
67
  Asking a question (Who/What/When/Where/Why/How...?) automatically searches the
91
- web and summarizes the results with AI. Bare mentions of specific topics also
92
- trigger a search — e.g. `timun mas from indonesia`, `the legend of roro
93
- jonggrang`. For example:
68
+ web and summarizes the results with AI. For example:
94
69
 
95
70
  ```
96
71
  > Who is Cristiano Ronaldo?
97
- > timun mas from indonesia
98
- ```
99
-
100
- triggers a live web search and answers from the results. If no web results come
101
- back, the AI answers from its own knowledge instead of going quiet. Use
102
- `/search <query>` to force a search explicitly.
103
-
104
- Story requests about any subject work the same way — no matter how they're
105
- phrased (`a story about X`, `the legend of X`, `tell me about X`, `narrate the
106
- tale of X`, `write X into a txt file`). The subject is pulled out of the
107
- sentence, searched first, and the reply is saved to a `<subject>.txt` file.
108
- A generic `tell me a story` (no subject) is told directly from the model — and
109
- is also saved to a `.txt` file.
110
-
111
- Greetings (`hi`, `hello`, `hey`, `good morning`, ...) are answered instantly
112
- with a short fixed reply — they never reach the model.
113
-
114
- ## Writing Files
115
-
116
- Ask the AI to create code, configs, scripts, web pages, or a whole project. When it
117
- responds, it lists each file with a `FILE: <path>` header followed by a code
118
- fence (and `FOLDER: <path>` for empty folders) — just running in the chat writes
119
- them to your disk in the current working directory. Any file type is supported,
120
- including JSON config files and HTML pages. Nested folders are created automatically, existing
121
- files are skipped unless you confirm to overwrite, and nothing is ever written
122
- outside the working directory.
123
-
124
- If the AI ever answers with the code but forgets the `FILE:` header (or writes an
125
- HTML page without a fence), the assistant rescues it: any `FILE: <path>` line in
126
- the reply is honored even without a fence, otherwise the request is used to
127
- infer a filename and the code block is saved anyway. Filename inference covers
128
- many formats, not just web pages:
129
-
130
- | Request contains… | Saved as |
131
- |--------------------|----------|
132
- | `html` / `webpage` / `website` / `page` | `index.html` |
133
- | `css` | `style.css` |
134
- | `python` / `py` | `script.py` |
135
- | `flask` / `django` / `fastapi` / `streamlit` / `app` | `app.py` |
136
- | `javascript` / `js` / `script` | `script.js` |
137
- | `typescript` / `ts` | `script.ts` |
138
- | `bash` / `zsh` / `shell` | `script.sh` |
139
- | `json` / `yaml` / `yml` / `csv` / `sql` | `output.json` / `.yml` / `.csv` / `.sql` |
140
-
141
- When the request has no hint at all, the fence language in the reply picks the
142
- name (```python → `script.py`, ```css → `style.css`, …). Saving also kicks in
143
- whenever the reply itself contains a `FILE:`/`FOLDER:` line, or when a reply is
144
- basically just one substantial code block, even if the request phrasing wasn't
145
- matched.
146
-
147
- For file requests, a short format instruction is silently attached to your
148
- message so the model emits complete `FILE:` blocks with closed fences. And if
149
- the model ever answers a file request *without any code* (free-style prose,
150
- interrupted before a fence), nothing is saved and you get a notice telling you
151
- to ask again — a `.py` file full of chatter is never created.
152
-
153
- Example of what the AI emits:
154
-
155
- ```
156
- FILE: config.json
157
- ```json
158
- {
159
- "name": "my-app",
160
- "port": 3000
161
- }
162
72
  ```
163
73
 
164
- FILE: index.html
165
- ```html
166
- <!doctype html>
167
- <html><body>Hello</body></html>
168
- ```
169
-
170
- FILE: src/hello.js
171
- ```js
172
- console.log('Hello VierrataleAI');
173
- ```
174
-
175
- ## Chat UI
176
-
177
- The chat runs in a clean, minimal full-screen interface: your turns are labelled
178
- `You` and the assistant's `AI`, with plain wrapped text in between. Code blocks
179
- are the exception — they render inside a green bordered box with their language
180
- tag (`╭─ html ─╮`), so files stand out at a glance. The latest reply stays pinned
181
- to the bottom of the terminal while it streams in (no screen flashing), and
182
- internal search/fetch context stays hidden.
183
-
184
- ## Automatic Logging
185
-
186
- Everything that happens in a session is written automatically to a per-day log
187
- file in `~/.config/vierrataleai/logs/` (e.g. `vierrataleai-20260101.log`):
188
- app/session start, every user message, every AI reply, every file write or
189
- skip, and any errors — with a timestamp. The logs are plain text and safe to
190
- grep. To inspect them from inside the chat:
191
-
192
- ```
193
- /log # show the last 30 entries
194
- /log 100 # show the last 100 entries
195
- /log path # print the log file path
196
- ```
74
+ triggers a live web search and answers from the results. Use `/search <query>`
75
+ to force a search explicitly.
197
76
 
198
77
  ## Conversation Memory
199
78
 
@@ -1,78 +1,3 @@
1
1
  #!/usr/bin/env node
2
- // VierrataleAI launcher + installer.
3
- //
4
- // Running without flags starts the assistant and auto-detects dependencies:
5
- // if the AI engine (ollama) or the model is missing, they are installed first.
6
- // Running with --install (or --setup / install) additionally creates a global
7
- // "vierrataleai" / "vierratale" command, then starts the assistant.
8
- //
9
- // Installation progress is always the fake animated bar — real engine/model
10
- // output is deliberately hidden so first-run feels quick and clean.
11
2
  import { run } from '../src/cli.js';
12
- import { Engine } from '../src/engine.js';
13
- import { Config } from '../src/config.js';
14
- import { Branding } from '../src/ui/branding.js';
15
-
16
- const C = Branding.colors;
17
-
18
- const INSTALL_STEPS = [
19
- 'Checking the AI engine',
20
- 'Installing dependencies',
21
- 'Downloading the model',
22
- 'Linking the vierrataleai command',
23
- 'Optimizing for this device',
24
- ];
25
-
26
- const READY_STEPS = ['Checking engine', 'Installing dependencies', 'Downloading model', 'Optimizing'];
27
-
28
- function delay(ms) {
29
- return new Promise((r) => setTimeout(r, ms));
30
- }
31
-
32
- async function fakeProgress(steps, work) {
33
- const frames = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];
34
- let i = 0;
35
- const tty = process.stdout.isTTY;
36
- const timer = setInterval(() => {
37
- if (!tty) return;
38
- i++;
39
- const stage = steps[Math.floor((i / 10) % steps.length)];
40
- const pct = String(8 + ((i * 7) % 85)).padStart(3, ' ');
41
- const bar = frames[i % frames.length];
42
- const fillLen = 1 + (i % 20);
43
- const fill = '█'.repeat(fillLen) + '░'.repeat(Math.max(0, 20 - fillLen));
44
- process.stdout.write(`\r ${C.accent}${bar}${C.reset} ${C.bold}${pct}%${C.reset} ${C.dim}${stage}${C.reset} [${C.accent}${fill}${C.reset}]`);
45
- }, 110);
46
- try {
47
- return await work;
48
- } finally {
49
- clearInterval(timer);
50
- if (tty) process.stdout.write('\r\x1b[2K');
51
- process.stdout.write(` ${C.success}✔${C.reset} ${C.bold}${C.dim}100%${C.reset} ${C.dim}Ready${C.reset}\n`);
52
- }
53
- }
54
-
55
- async function main() {
56
- const args = process.argv.slice(2);
57
- const doInstall = args.includes('--install') || args.includes('--setup') || args.includes('install');
58
- const quick = args.includes('--version') || args.includes('-v') || args.includes('--help') || args.includes('-h');
59
-
60
- Config.load();
61
-
62
- if (doInstall) {
63
- console.log(`\n ${C.bold}${C.primary}${Branding.APP_NAME} ${Branding.VERSION}${C.reset} ${C.dim}— installer${C.reset}\n`);
64
- await fakeProgress(INSTALL_STEPS, Engine.ensure());
65
- console.log();
66
- } else if (!quick) {
67
- // Auto-detect: install anything that's missing (engine, model) before starting.
68
- await fakeProgress(READY_STEPS, Engine.ensure());
69
- console.log();
70
- }
71
-
72
- return run();
73
- }
74
-
75
- main().catch((err) => {
76
- console.error(err);
77
- process.exit(1);
78
- });
3
+ run();
package/build.sh ADDED
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ # Build VierrataleAI Node.js version for packaging
3
+ set -e
4
+
5
+ cd "$(dirname "$0")"
6
+
7
+ echo "Installing dependencies..."
8
+ npm install
9
+
10
+ echo "Testing..."
11
+ node bin/vierrataleai.js --version
12
+
13
+ echo "Packaging..."
14
+ npm pack
15
+
16
+ echo "Build complete!"
17
+ echo "To publish: npm publish --tag beta"
package/package.json CHANGED
@@ -1,31 +1,25 @@
1
1
  {
2
2
  "name": "@vierratale/ai",
3
- "version": "0.1.0-beta.15",
3
+ "version": "0.1.0-beta.16",
4
4
  "description": "VierrataleAI - Intelligent terminal assistant",
5
5
  "type": "module",
6
- "license": "MIT",
7
- "engines": {
8
- "node": ">=18"
9
- },
10
6
  "bin": {
11
- "vierrataleai": "./bin/vierrataleai.js",
12
- "vierratale": "./bin/vierrataleai.js"
7
+ "vierrataleai": "./bin/vierrataleai.js"
8
+ },
9
+ "main": "./src/index.js",
10
+ "exports": {
11
+ ".": "./src/index.js"
13
12
  },
14
13
  "scripts": {
14
+ "start": "node bin/vierrataleai.js",
15
+ "test": "node --test test/",
15
16
  "postinstall": "node scripts/postinstall.js"
16
17
  },
17
- "files": [
18
- "bin",
19
- "src",
20
- "scripts",
21
- "LICENSE",
22
- "README.md"
23
- ],
24
- "keywords": [
25
- "ai",
26
- "chatbot",
27
- "terminal",
28
- "assistant",
29
- "llm"
30
- ]
31
- }
18
+ "keywords": ["ai", "chatbot", "terminal", "assistant", "llm"],
19
+ "author": "Vierratale",
20
+ "license": "MIT",
21
+ "engines": {
22
+ "node": ">=18.0.0"
23
+ },
24
+ "dependencies": {}
25
+ }
@@ -25,9 +25,9 @@ try {
25
25
  execSync('curl -fsSL https://ollama.com/install.sh | sh', { stdio: 'inherit' });
26
26
  } else {
27
27
  console.log(
28
- '\n[vierrataleai] The local engine was not detected.\n' +
28
+ '\n[vierrataleai] The local engine (ollama) was not detected.\n' +
29
29
  ' - Run the CLI: it will attempt to install and start the engine automatically.\n' +
30
- ' - Or run ./install.sh (in the project repo) to set up the engine.\n'
30
+ ' - Or install it yourself: curl -fsSL https://ollama.com/install.sh | sh\n'
31
31
  );
32
32
  }
33
33
  } catch {
package/src/catalog.js CHANGED
@@ -1,59 +1,16 @@
1
- // Model catalog. Display names use the opaque VTL branding:
2
- // VTL-<number>.<name>, e.g. VTL-2.7-Flash, VTL-4.0.
3
- // The real engine tags are mapped to display names here and kept internal.
4
1
  const MODELS = {
5
- 'qwen3:0.6b': 'VTL-2.5-Mini',
6
- 'gemma3:1b': 'VTL-2.7-Flash',
7
- 'llama3.2:1b': 'VTL-2.9-Core',
8
- 'llama3.2:3b': 'VTL-3.2-Orbit',
9
- 'qwen2.5:1.5b': 'VTL-3.1-Plus',
10
- 'qwen2.5-coder:1.5b': 'VTL-3.3-Pro',
11
- 'qwen3:1.7b': 'VTL-3.5-Reason',
12
- 'qwen2.5:3b': 'VTL-3.7-Ultra',
13
- 'gemma3:4b': 'VTL-4.7-Gusto',
14
- 'phi4-mini': 'VTL-5.4-Tempo',
15
- 'glm4:9b': 'VTL-5.2-Pinnacle',
16
- 'qwen3:4b': 'VTL-5.9-Sovereign',
17
- 'gpt-4o-mini': 'VTL-4.0',
18
- 'gpt-4o': 'VTL-4.2-Omni',
19
- 'claude-3-5-haiku-20241022': 'VTL-4.5-Plus',
20
- 'claude-sonnet-4-20250514': 'VTL-5.0-Pro',
21
- 'gemini-2.0-flash': 'VTL-6.0-Reason',
22
- 'gemini-1.5-pro': 'VTL-7.0-Omnij',
23
- 'kimi-k2.6:cloud': 'VTL-8.0-Fabric',
24
- 'kimi-k2.7-code:cloud': 'VTL-9.0-Forge',
25
- 'kimi-k3': 'VTL-10.0-Singularity',
26
- };
27
-
28
- // Legacy display names (older `VRTL-*` and `vierratale-<word>`), accepted
29
- // everywhere for backwards compatibility (existing config files may contain
30
- // them). All map onto the current VTL display names.
31
- const LEGACY_DISPLAY = {
32
- 'VRTL-1.lite': 'VTL-2.5-Mini',
33
- 'VRTL-2.fast': 'VTL-2.7-Flash',
34
- 'VRTL-3.small': 'VTL-2.9-Core',
35
- 'VRTL-4.balanced': 'VTL-3.1-Plus',
36
- 'VRTL-4.coder': 'VTL-3.3-Pro',
37
- 'VRTL-5.plus': 'VTL-3.5-Reason',
38
- 'VRTL-6.pro': 'VTL-3.7-Ultra',
39
- 'VRTL-7.cloud-mini': 'VTL-4.0',
40
- 'VRTL-8.cloud': 'VTL-4.2-Omni',
41
- 'VRTL-9.cloud-fast': 'VTL-4.5-Plus',
42
- 'VRTL-10.cloud-pro': 'VTL-5.0-Pro',
43
- 'VRTL-11.cloud-lite': 'VTL-6.0-Reason',
44
- 'VRTL-12.cloud-plus': 'VTL-7.0-Omnij',
45
- 'vierratale-lite': 'VTL-2.5-Mini',
46
- 'vierratale-fast': 'VTL-2.7-Flash',
47
- 'vierratale-small': 'VTL-2.9-Core',
48
- 'vierratale-balanced': 'VTL-3.1-Plus',
49
- 'vierratale-plus': 'VTL-3.5-Reason',
50
- 'vierratale-pro': 'VTL-3.7-Ultra',
51
- 'vierratale-cloud-mini': 'VTL-4.0',
52
- 'vierratale-cloud': 'VTL-4.2-Omni',
53
- 'vierratale-cloud-fast': 'VTL-4.5-Plus',
54
- 'vierratale-cloud-pro': 'VTL-5.0-Pro',
55
- 'vierratale-cloud-lite': 'VTL-6.0-Reason',
56
- 'vierratale-cloud-plus': 'VTL-7.0-Omnij',
2
+ 'qwen3:0.6b': 'vierratale-lite',
3
+ 'gemma3:1b': 'vierratale-fast',
4
+ 'llama3.2:1b': 'vierratale-small',
5
+ 'qwen2.5:1.5b': 'vierratale-balanced',
6
+ 'qwen3:1.7b': 'vierratale-plus',
7
+ 'qwen2.5:3b': 'vierratale-pro',
8
+ 'gpt-4o-mini': 'vierratale-cloud-mini',
9
+ 'gpt-4o': 'vierratale-cloud',
10
+ 'claude-3-5-haiku-20241022': 'vierratale-cloud-fast',
11
+ 'claude-sonnet-4-20250514': 'vierratale-cloud-pro',
12
+ 'gemini-2.0-flash': 'vierratale-cloud-lite',
13
+ 'gemini-1.5-pro': 'vierratale-cloud-plus',
57
14
  };
58
15
 
59
16
  const REVERSE = Object.fromEntries(
@@ -61,64 +18,26 @@ const REVERSE = Object.fromEntries(
61
18
  );
62
19
 
63
20
  const LOCAL_MODELS = [
64
- 'VTL-2.5-Mini',
65
- 'VTL-2.7-Flash',
66
- 'VTL-2.9-Core',
67
- 'VTL-3.2-Orbit',
68
- 'VTL-3.1-Plus',
69
- 'VTL-3.3-Pro',
70
- 'VTL-3.5-Reason',
71
- 'VTL-3.7-Ultra',
72
- 'VTL-4.7-Gusto',
73
- 'VTL-5.4-Tempo',
74
- 'VTL-5.2-Pinnacle',
75
- 'VTL-5.9-Sovereign',
21
+ 'vierratale-lite',
22
+ 'vierratale-fast',
23
+ 'vierratale-small',
24
+ 'vierratale-balanced',
25
+ 'vierratale-plus',
26
+ 'vierratale-pro',
76
27
  ];
77
28
 
78
29
  const CLOUD_MODELS = [
79
- 'VTL-4.0',
80
- 'VTL-4.2-Omni',
81
- 'VTL-4.5-Plus',
82
- 'VTL-5.0-Pro',
83
- 'VTL-6.0-Reason',
84
- 'VTL-7.0-Omnij',
85
- 'VTL-8.0-Fabric',
86
- 'VTL-9.0-Forge',
87
- 'VTL-10.0-Singularity',
30
+ 'vierratale-cloud-mini',
31
+ 'vierratale-cloud',
32
+ 'vierratale-cloud-fast',
33
+ 'vierratale-cloud-pro',
34
+ 'vierratale-cloud-lite',
35
+ 'vierratale-cloud-plus',
88
36
  ];
89
37
 
90
- const TIERS = {
91
- 'VTL-2.5-Mini': 'minimal',
92
- 'VTL-2.7-Flash': 'fast',
93
- 'VTL-2.9-Core': 'small',
94
- 'VTL-3.2-Orbit': 'small',
95
- 'VTL-3.1-Plus': 'balanced',
96
- 'VTL-3.3-Pro': 'coder',
97
- 'VTL-3.5-Reason': 'reasoning',
98
- 'VTL-3.7-Ultra': 'ultra',
99
- 'VTL-4.7-Gusto': 'balanced',
100
- 'VTL-5.4-Tempo': 'balanced',
101
- 'VTL-5.2-Pinnacle': 'pro',
102
- 'VTL-5.9-Sovereign': 'pro',
103
- 'VTL-4.0': 'cloud-mini',
104
- 'VTL-4.2-Omni': 'cloud',
105
- 'VTL-4.5-Plus': 'cloud-fast',
106
- 'VTL-5.0-Pro': 'cloud-pro',
107
- 'VTL-6.0-Reason': 'cloud-lite',
108
- 'VTL-7.0-Omnij': 'cloud-plus',
109
- 'VTL-8.0-Fabric': 'cloud-fabric',
110
- 'VTL-9.0-Forge': 'cloud-forge',
111
- 'VTL-10.0-Singularity': 'cloud-singularity',
112
- };
113
-
114
38
  export const Catalog = {
115
- // Map any known name (new or legacy) to the current VTL display name.
116
- normalize(displayName) {
117
- return LEGACY_DISPLAY[displayName] || displayName;
118
- },
119
-
120
39
  getRealModel(displayName) {
121
- return REVERSE[this.normalize(displayName)] || displayName;
40
+ return REVERSE[displayName] || displayName;
122
41
  },
123
42
 
124
43
  getDisplayName(realModel) {
@@ -138,23 +57,23 @@ export const Catalog = {
138
57
  },
139
58
 
140
59
  getDefaultModel() {
141
- return 'VTL-2.7-Flash';
60
+ return 'vierratale-fast';
142
61
  },
143
62
 
144
63
  getDefaultCloudModel() {
145
- return 'VTL-4.0';
64
+ return 'vierratale-cloud-mini';
146
65
  },
147
66
 
148
67
  isLocalModel(displayName) {
149
- return LOCAL_MODELS.includes(this.normalize(displayName));
68
+ return LOCAL_MODELS.includes(displayName);
150
69
  },
151
70
 
152
71
  isCloudModel(displayName) {
153
- return CLOUD_MODELS.includes(this.normalize(displayName));
72
+ return CLOUD_MODELS.includes(displayName);
154
73
  },
155
74
 
156
75
  getVendorForCloudModel(displayName) {
157
- const real = REVERSE[this.normalize(displayName)];
76
+ const real = REVERSE[displayName];
158
77
  if (real && real.startsWith('claude-')) return 'anthropic';
159
78
  if (real && real.startsWith('gemini-')) return 'gemini';
160
79
  if (real && real.startsWith('gpt-')) return 'openai';
@@ -162,17 +81,30 @@ export const Catalog = {
162
81
  },
163
82
 
164
83
  getModelInfo(displayName) {
165
- const name = this.normalize(displayName);
166
- const real = REVERSE[name];
84
+ const real = REVERSE[displayName];
167
85
  if (!real) return null;
168
- const isLocal = LOCAL_MODELS.includes(name);
169
- const isCloud = CLOUD_MODELS.includes(name);
86
+ const isLocal = LOCAL_MODELS.includes(displayName);
87
+ const isCloud = CLOUD_MODELS.includes(displayName);
88
+ const tiers = {
89
+ 'vierratale-lite': 'minimal',
90
+ 'vierratale-fast': 'fast',
91
+ 'vierratale-small': 'small',
92
+ 'vierratale-balanced': 'balanced',
93
+ 'vierratale-plus': 'plus',
94
+ 'vierratale-pro': 'professional',
95
+ 'vierratale-cloud-mini': 'cloud-mini',
96
+ 'vierratale-cloud': 'cloud',
97
+ 'vierratale-cloud-fast': 'cloud-fast',
98
+ 'vierratale-cloud-pro': 'cloud-pro',
99
+ 'vierratale-cloud-lite': 'cloud-lite',
100
+ 'vierratale-cloud-plus': 'cloud-plus',
101
+ };
170
102
  return {
171
103
  displayName,
172
104
  realModel: real,
173
105
  isLocal,
174
106
  isCloud,
175
- tier: TIERS[name] || 'unknown',
107
+ tier: tiers[displayName] || 'unknown',
176
108
  };
177
109
  },
178
110
  };