codeep 2.14.0 → 2.15.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 (61) hide show
  1. package/README.md +35 -24
  2. package/dist/acp/commands.js +22 -1
  3. package/dist/acp/server.js +13 -2
  4. package/dist/config/index.d.ts +10 -0
  5. package/dist/config/index.js +2 -2
  6. package/dist/config/providers.js +15 -10
  7. package/dist/renderer/App.d.ts +0 -30
  8. package/dist/renderer/App.js +149 -659
  9. package/dist/renderer/agentExecution.d.ts +1 -0
  10. package/dist/renderer/agentExecution.js +3 -2
  11. package/dist/renderer/commands/helpers.d.ts +63 -0
  12. package/dist/renderer/commands/helpers.js +108 -0
  13. package/dist/renderer/commands/registry.js +5 -0
  14. package/dist/renderer/commands.d.ts +4 -0
  15. package/dist/renderer/commands.js +179 -63
  16. package/dist/renderer/components/ActionFormatting.d.ts +17 -0
  17. package/dist/renderer/components/ActionFormatting.js +67 -0
  18. package/dist/renderer/components/Autocomplete.d.ts +33 -0
  19. package/dist/renderer/components/Autocomplete.js +40 -0
  20. package/dist/renderer/components/Intro.d.ts +9 -0
  21. package/dist/renderer/components/Intro.js +5 -15
  22. package/dist/renderer/components/MessageFormatter.d.ts +96 -0
  23. package/dist/renderer/components/MessageFormatter.js +375 -0
  24. package/dist/renderer/components/Permission.d.ts +4 -0
  25. package/dist/renderer/components/Permission.js +1 -1
  26. package/dist/renderer/components/Status.d.ts +4 -0
  27. package/dist/renderer/components/Status.js +2 -3
  28. package/dist/renderer/components/WelcomeFormatter.d.ts +19 -0
  29. package/dist/renderer/components/WelcomeFormatter.js +79 -0
  30. package/dist/renderer/components/uiConstants.d.ts +8 -0
  31. package/dist/renderer/components/uiConstants.js +24 -0
  32. package/dist/renderer/inputParsing.d.ts +22 -0
  33. package/dist/renderer/inputParsing.js +28 -0
  34. package/dist/renderer/layout.d.ts +215 -0
  35. package/dist/renderer/layout.js +326 -0
  36. package/dist/renderer/main.d.ts +2 -1
  37. package/dist/renderer/main.js +45 -10
  38. package/dist/renderer/ollamaHint.d.ts +12 -0
  39. package/dist/renderer/ollamaHint.js +29 -0
  40. package/dist/utils/agentChat.js +23 -1
  41. package/dist/utils/codeepCloud.d.ts +54 -0
  42. package/dist/utils/codeepCloud.js +95 -0
  43. package/dist/utils/export.d.ts +12 -0
  44. package/dist/utils/export.js +3 -3
  45. package/dist/utils/hooks.d.ts +26 -0
  46. package/dist/utils/hooks.js +69 -1
  47. package/dist/utils/keychain.js +45 -29
  48. package/dist/utils/logger.d.ts +12 -0
  49. package/dist/utils/logger.js +1 -1
  50. package/dist/utils/mcpConfig.d.ts +26 -0
  51. package/dist/utils/mcpConfig.js +109 -4
  52. package/dist/utils/skillBundles.d.ts +14 -0
  53. package/dist/utils/skillBundles.js +3 -3
  54. package/dist/utils/skillBundlesCloud.d.ts +7 -0
  55. package/dist/utils/skillBundlesCloud.js +1 -1
  56. package/dist/utils/tokenTracker.js +12 -2
  57. package/dist/utils/toolParsing.d.ts +11 -0
  58. package/dist/utils/toolParsing.js +6 -0
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/package.json +2 -2
package/README.md CHANGED
@@ -23,27 +23,14 @@
23
23
  <a href="https://github.com/VladoIvankovic/Codeep"><img src="https://img.shields.io/github/stars/VladoIvankovic/Codeep?style=social" alt="GitHub stars"></a>
24
24
  </p>
25
25
 
26
- ## Upgrading from 1.x to 2.0
26
+ ## Upgrading
27
27
 
28
- Most users **do not need to do anything** — `npm install -g codeep@latest`
29
- picks up the new version and everything carries over (config, saved
30
- profiles, project memory, MCP servers, skill bundles).
31
-
32
- Two breaking changes only affect a small audience:
33
-
34
- 1. **MCP `clientInfo` version bumped from `1.4.0` → `2.0.0`.** If you
35
- maintain a custom MCP server that allowlists Codeep by version
36
- string, update your check.
37
- 2. **`McpServer` protocol shape** in ACP now has `command?`, `args?`,
38
- `url?`, `headers?` (transport-agnostic for stdio + Streamable HTTP).
39
- The old required-`command` shape is still accepted — parser handles
40
- both — but new clients should emit the optional shape.
41
-
42
- See [CHANGELOG.md](CHANGELOG.md#200--2026-05-18) for the full list of
43
- additions (full MCP support, OpenRouter provider with authoritative
44
- per-call cost, Claude-Code-compatible skill bundles + web marketplace,
45
- custom slash commands, lifecycle hooks, checkpoints, `/cost`,
46
- `/compact`, and more).
28
+ Running `npm install -g codeep@latest` picks up the new version — config,
29
+ saved profiles, project memory, MCP servers, and skill bundles all carry
30
+ over. Breaking changes (if any) are listed at the top of each release in
31
+ [CHANGELOG.md](CHANGELOG.md); the last breaking change was
32
+ [2.0.0](CHANGELOG.md#200--2026-05-18) (MCP `clientInfo` version bump,
33
+ transport-agnostic `McpServer` shape).
47
34
 
48
35
  ## Features
49
36
 
@@ -77,6 +64,7 @@ When started in a project directory, Codeep automatically:
77
64
  - **AI session titles** - Sessions auto-title themselves with an LLM one-liner ("OAuth2 migration for auth module") instead of a truncated first message. This makes one small background API call per session; turn it off with the `autoSessionTitle` setting (`/settings`) if you prefer zero unsolicited calls
78
65
  - **Search current session** - Find text in the open conversation with `/search`
79
66
  - **Cross-session recall** - `/recall <query>` searches across **all** saved sessions, ranked by relevance + recency. Add `--resume` to load the top match, or `--summarize` for an LLM recap of what you accomplished across matches
67
+ - **Cross-device resume (`/cloud`)** - Sessions you run on one device (CLI, Mac app, VS Code) sync to `codeep.dev`. `/cloud` lists them and pulls the selected one back locally, so you can start a session on your desktop and continue on your laptop. Run `codeep account` once to link your devices; scoped to the current project when one is open.
80
68
  - **Export** - Save to Markdown, JSON, or plain text
81
69
  - `/cost` - Per-session token usage and estimated cost (per provider/model)
82
70
  - `/compact [keepN]` - AI-summarize older messages to free up context (keeps last N, default 4)
@@ -358,10 +346,11 @@ You write safe, reversible DB migrations…
358
346
  **Guaranteed review:** enable **Agent Auto-Review** in `/settings` (`agentAutoReview`) and after any run that changes files, Codeep automatically delegates to the `reviewer` and appends its findings — a review stage that always happens. Off by default.
359
347
 
360
348
  ### Project Rules
361
- Define project-specific instructions that the AI always follows. Create a rules file in your project root:
349
+ Define project-specific instructions that the AI always follows. Create a rules file in your project root (first non-empty file wins):
362
350
 
363
351
  - **`.codeep/rules.md`** - Primary location (inside `.codeep/` folder)
364
352
  - **`CODEEP.md`** - Alternative location (project root, similar to `CLAUDE.md` or `.cursorrules`)
353
+ - **`AGENTS.md`** - Cross-tool standard (works with Claude Code, Cursor, Kilo Code — no duplication needed)
365
354
 
366
355
  The rules file content is automatically included in every system prompt — both chat and agent mode. Use it to define:
367
356
 
@@ -469,11 +458,12 @@ Full spec coverage in 2.0.0 — stdio and Streamable HTTP transports,
469
458
  tools / resources / prompts / sampling, capability negotiation with
470
459
  `roots`, auto-restart on crash, mid-run catalog refresh.
471
460
 
472
- **Three ways to wire MCP servers** (all merge; project > global > ACP wins last):
461
+ **Four ways to wire MCP servers** (all merge; project > `.mcp.json` > global > ACP wins last):
473
462
 
474
463
  1. **Project config** — `.codeep/mcp_servers.json` (committed with the repo)
475
- 2. **Global config** — `~/.codeep/mcp_servers.json` (per machine)
476
- 3. **ACP client config** — Zed / Claude Desktop pass `mcpServers` on `session/new`
464
+ 2. **`.mcp.json`** — cross-tool standard at the workspace root (works with Claude Code, Cursor, Kilo Code — point everyone at the same file)
465
+ 3. **Global config** — `~/.codeep/mcp_servers.json` (per machine)
466
+ 4. **ACP client config** — Zed / Claude Desktop pass `mcpServers` on `session/new`
477
467
 
478
468
  Two transports per entry, mutually exclusive:
479
469
 
@@ -573,6 +563,26 @@ cloned repo's hooks are **not** run until you approve the workspace. Run
573
563
  own projects just need a one-time `/hooks trust`. Global `~/.codeep/hooks/` are
574
564
  never run for the same reason.
575
565
 
566
+ #### Windows notes
567
+
568
+ Lifecycle hooks are POSIX shell (`.sh`) scripts:
569
+
570
+ - **macOS / Linux** — run directly (via the script's shebang). No setup.
571
+ - **Windows** — a `.sh` needs a POSIX `sh`. Install [Git for Windows](https://git-scm.com/download/win)
572
+ (it ships `sh.exe`) and Codeep runs `.sh` hooks through it automatically — no
573
+ PATH tweaking needed if Git is installed to its default location. **Without a
574
+ POSIX shell**, `/hooks` and the welcome banner report an explicit
575
+ *"cannot run on this system"* state and hooks are skipped — they never block a
576
+ tool call or commit, and the rest of Codeep is unaffected. (`.ps1`/`.cmd` hooks
577
+ are not executed; keep hook logic in `.sh`.)
578
+
579
+ Everything else is **Node-native and shell-independent on Windows**: project
580
+ rules (`AGENTS.md` / `CODEEP.md` / `.codeep/rules.md`), custom slash commands
581
+ (`.codeep/commands/*.md`), and skill bundles (`.codeep/skills/`) are Markdown;
582
+ MCP config (`.mcp.json` / `.codeep/mcp_servers.json`) is JSON. MCP servers spawn
583
+ via their configured `command` — `npx` resolves through `npx.cmd`, and a custom
584
+ `command` like `python` just needs to be on your PATH.
585
+
576
586
  ### Skill Bundles (new in 2.0)
577
587
  Beyond the built-in skills and custom slash commands, Codeep now supports
578
588
  **structured skill bundles** — directory-based capability packs the agent
@@ -1024,6 +1034,7 @@ After installation, `codeep` is available globally in your terminal. Simply run
1024
1034
  |---------|-------------|
1025
1035
  | `/sessions` | List and load saved sessions |
1026
1036
  | `/sessions delete <name>` | Delete a specific session |
1037
+ | `/cloud` | List and resume sessions synced from other devices |
1027
1038
  | `/rename <name>` | Rename current session |
1028
1039
  | `/search <term>` | Search through chat history |
1029
1040
  | `/export` | Export chat to MD/JSON/TXT format |
@@ -1023,8 +1023,29 @@ Anything else the agent should know — edge cases, gotchas, things to double-ch
1023
1023
  }
1024
1024
  case 'mcp': {
1025
1025
  const sub = args[0]?.toLowerCase();
1026
- const { addProjectMcpServer, removeProjectMcpServer, loadMcpServerConfig } = await import('../utils/mcpConfig.js');
1026
+ const { addProjectMcpServer, removeProjectMcpServer, loadMcpServerConfig, loadMcpServerConfigSplit, isWorkspaceMcpTrusted, trustWorkspaceMcp, untrustWorkspaceMcp } = await import('../utils/mcpConfig.js');
1027
1027
  const { registerSessionServers } = await import('../utils/mcpRegistry.js');
1028
+ if (sub === 'trust') {
1029
+ if (isWorkspaceMcpTrusted(session.workspaceRoot)) {
1030
+ return { handled: true, response: '_Workspace MCP servers are already trusted here._' };
1031
+ }
1032
+ trustWorkspaceMcp(session.workspaceRoot);
1033
+ const { workspace } = loadMcpServerConfigSplit(session.workspaceRoot);
1034
+ if (workspace.length === 0) {
1035
+ return { handled: true, response: '_Workspace trusted — no workspace MCP servers defined yet._' };
1036
+ }
1037
+ onChunk(`_Workspace trusted. Spawning ${workspace.length} MCP server(s)…_\n\n`);
1038
+ const merged = loadMcpServerConfig(session.workspaceRoot);
1039
+ const { registered, errors } = await registerSessionServers(session.sessionId, merged, { workspaceRoot: session.workspaceRoot });
1040
+ const lines = [`Trusted workspace MCP servers (${registered.length} tool(s) available).`];
1041
+ for (const e of errors)
1042
+ lines.push(`- \`${e.server}\` failed: ${e.error}`);
1043
+ return { handled: true, response: lines.join('\n') };
1044
+ }
1045
+ if (sub === 'untrust') {
1046
+ untrustWorkspaceMcp(session.workspaceRoot);
1047
+ return { handled: true, response: '_Workspace MCP trust revoked — workspace servers won\'t spawn for new sessions._' };
1048
+ }
1028
1049
  if (sub === 'add') {
1029
1050
  // /mcp add <name> <command> [args...]
1030
1051
  const name = args[1];
@@ -8,7 +8,7 @@ import { StdioTransport } from './transport.js';
8
8
  import { runAgentSession } from './session.js';
9
9
  import { loadCustomCommands } from '../utils/customCommands.js';
10
10
  import { registerSessionServers, disposeAllSessions as disposeAllMcpSessions } from '../utils/mcpRegistry.js';
11
- import { loadMcpServerConfig, mergeMcpServers } from '../utils/mcpConfig.js';
11
+ import { loadMcpServerConfigSplit, isWorkspaceMcpTrusted, mergeMcpServers } from '../utils/mcpConfig.js';
12
12
  import { handleMcpSamplingRequest } from '../utils/mcpSamplingBridge.js';
13
13
  import { executeCommandAsync } from '../utils/shell.js';
14
14
  import { initWorkspace, loadWorkspace, handleCommand } from './commands.js';
@@ -539,7 +539,18 @@ export function startAcpServer() {
539
539
  * in-flight registration so tool calls don't race the startup.
540
540
  */
541
541
  function spawnMcpServersForSession(acpSessionId, cwd, acpServers, label) {
542
- const fromConfig = loadMcpServerConfig(cwd);
542
+ // Workspace-sourced servers (.codeep/mcp_servers.json, .mcp.json) travel
543
+ // with the repo, so they spawn only for workspaces the user has trusted
544
+ // (same gate the TUI prompts for at startup). ACP-provided servers are
545
+ // the editor's own config and global ~/.codeep entries are the user's —
546
+ // both spawn unconditionally.
547
+ const { global: globalServers, workspace: workspaceServers } = loadMcpServerConfigSplit(cwd);
548
+ const workspaceTrusted = isWorkspaceMcpTrusted(cwd);
549
+ if (workspaceServers.length > 0 && !workspaceTrusted) {
550
+ process.stderr.write(`[codeep-acp] MCP (${label}): skipped ${workspaceServers.length} workspace server(s) — untrusted workspace. ` +
551
+ `Run /mcp trust (or \`codeep\` in the repo once) to enable.\n`);
552
+ }
553
+ const fromConfig = workspaceTrusted ? [...globalServers, ...workspaceServers] : globalServers;
543
554
  const merged = mergeMcpServers(fromConfig, acpServers);
544
555
  if (merged.length === 0)
545
556
  return;
@@ -140,6 +140,16 @@ export interface ConfigSchema {
140
140
  }
141
141
  export type { AgentMode };
142
142
  export type { LanguageCode };
143
+ /**
144
+ * Get sessions directory - local .codeep/sessions/ if in project, otherwise global
145
+ */
146
+ export declare function getSessionsDir(projectPath?: string): string;
147
+ /**
148
+ * Check if directory is a project
149
+ * Looks for common project indicators: package.json, pyproject.toml, Cargo.toml, go.mod, composer.json, etc.
150
+ * Also checks if user has manually initialized this folder as a project (.codeep/project.json)
151
+ */
152
+ export declare function isProjectDirectory(path: string): boolean;
143
153
  /**
144
154
  * Check if directory has standard project markers (not manually initialized)
145
155
  */
@@ -9,7 +9,7 @@ import { createSecureStorage } from '../utils/keychain.js';
9
9
  /**
10
10
  * Get sessions directory - local .codeep/sessions/ if in project, otherwise global
11
11
  */
12
- function getSessionsDir(projectPath) {
12
+ export function getSessionsDir(projectPath) {
13
13
  if (projectPath && isProjectDirectory(projectPath)) {
14
14
  const localDir = join(projectPath, '.codeep', 'sessions');
15
15
  if (!existsSync(localDir)) {
@@ -36,7 +36,7 @@ function getLocalConfigPath(projectPath) {
36
36
  * Looks for common project indicators: package.json, pyproject.toml, Cargo.toml, go.mod, composer.json, etc.
37
37
  * Also checks if user has manually initialized this folder as a project (.codeep/project.json)
38
38
  */
39
- function isProjectDirectory(path) {
39
+ export function isProjectDirectory(path) {
40
40
  // Check if user has manually initialized this as a project
41
41
  const manualProjectMarker = join(path, '.codeep', 'project.json');
42
42
  if (existsSync(manualProjectMarker)) {
@@ -276,8 +276,9 @@ export const PROVIDERS = {
276
276
  openai: { baseUrl: 'https://api.x.ai/v1', authHeader: 'Bearer', supportsNativeTools: true },
277
277
  },
278
278
  models: [
279
+ { id: 'grok-4.5', name: 'Grok 4.5', description: 'Flagship reasoning model — highest quality, 500K context' },
279
280
  { id: 'grok-build-0.1', name: 'Grok Build 0.1', description: 'Agentic coding model — fast, 256K context' },
280
- { id: 'grok-4.3', name: 'Grok 4.3', description: 'Flagship — highest quality, 1M context' },
281
+ { id: 'grok-4.3', name: 'Grok 4.3', description: 'Previous flagship, 1M context' },
281
282
  { id: 'grok-code-fast-1', name: 'Grok Code Fast 1', description: 'Low-cost speed-first coder (alias of Build 0.1)' },
282
283
  { id: 'grok-4-fast-reasoning', name: 'Grok 4 Fast (reasoning)', description: 'Cheap reasoning model, very large context' },
283
284
  ],
@@ -302,7 +303,7 @@ export const PROVIDERS = {
302
303
  models: [
303
304
  { id: 'qwen3-coder-plus', name: 'Qwen3-Coder Plus', description: 'Flagship coding model — best quality' },
304
305
  { id: 'qwen3-coder-next', name: 'Qwen3-Coder Next', description: 'Balanced quality/speed/cost' },
305
- { id: 'qwen3-max', name: 'Qwen3-Max', description: 'Flagship general model (code + reasoning)' },
306
+ { id: 'qwen3.7-max', name: 'Qwen3.7-Max', description: 'Flagship general model (code + reasoning)' },
306
307
  ],
307
308
  defaultModel: 'qwen3-coder-plus',
308
309
  defaultProtocol: 'openai',
@@ -323,7 +324,7 @@ export const PROVIDERS = {
323
324
  { id: 'qwen3-coder-plus', name: 'Qwen3-Coder Plus', description: 'Flagship coding model (256K, up to 1M)' },
324
325
  { id: 'qwen3-coder-next', name: 'Qwen3-Coder Next', description: 'Balanced quality/speed/cost' },
325
326
  { id: 'qwen3-coder-flash', name: 'Qwen3-Coder Flash', description: 'Fast/cheap coder' },
326
- { id: 'qwen3-max', name: 'Qwen3-Max', description: 'Flagship general model' },
327
+ { id: 'qwen3.7-max', name: 'Qwen3.7-Max', description: 'Flagship general model' },
327
328
  ],
328
329
  defaultModel: 'qwen3-coder-plus',
329
330
  defaultProtocol: 'openai',
@@ -343,7 +344,7 @@ export const PROVIDERS = {
343
344
  models: [
344
345
  { id: 'qwen3-coder-plus', name: 'Qwen3-Coder Plus', description: 'Flagship coding model — best quality' },
345
346
  { id: 'qwen3-coder-next', name: 'Qwen3-Coder Next', description: 'Balanced quality/speed/cost' },
346
- { id: 'qwen3-max', name: 'Qwen3-Max', description: 'Flagship general model' },
347
+ { id: 'qwen3.7-max', name: 'Qwen3.7-Max', description: 'Flagship general model' },
347
348
  ],
348
349
  defaultModel: 'qwen3-coder-plus',
349
350
  defaultProtocol: 'openai',
@@ -364,7 +365,7 @@ export const PROVIDERS = {
364
365
  { id: 'qwen3-coder-plus', name: 'Qwen3-Coder Plus', description: 'Flagship coding model' },
365
366
  { id: 'qwen3-coder-next', name: 'Qwen3-Coder Next', description: 'Balanced quality/speed/cost' },
366
367
  { id: 'qwen3-coder-flash', name: 'Qwen3-Coder Flash', description: 'Fast/cheap coder' },
367
- { id: 'qwen3-max', name: 'Qwen3-Max', description: 'Flagship general model' },
368
+ { id: 'qwen3.7-max', name: 'Qwen3.7-Max', description: 'Flagship general model' },
368
369
  ],
369
370
  defaultModel: 'qwen3-coder-plus',
370
371
  defaultProtocol: 'openai',
@@ -404,11 +405,14 @@ export const PROVIDERS = {
404
405
  },
405
406
  },
406
407
  models: [
407
- { id: 'gpt-5.5', name: 'GPT-5.5', description: 'Latest GPT model — best for coding' },
408
- { id: 'gpt-5.4', name: 'GPT-5.4', description: 'Previous generation GPT' },
408
+ { id: 'gpt-5.6-sol', name: 'GPT-5.6 Sol', description: 'Most capable GPT — best for coding & agentic work' },
409
+ { id: 'gpt-5.6-terra', name: 'GPT-5.6 Terra', description: 'Balanced — GPT-5.5 quality at about half the price' },
410
+ { id: 'gpt-5.6-luna', name: 'GPT-5.6 Luna', description: 'Fast and cheap — high-volume workloads' },
411
+ { id: 'gpt-5.5', name: 'GPT-5.5', description: 'Previous flagship GPT' },
412
+ { id: 'gpt-5.4', name: 'GPT-5.4', description: 'Older generation GPT' },
409
413
  { id: 'gpt-5.4-mini', name: 'GPT-5.4 Mini', description: 'Faster and cheaper GPT-5.4' },
410
414
  ],
411
- defaultModel: 'gpt-5.5',
415
+ defaultModel: 'gpt-5.6-sol',
412
416
  defaultProtocol: 'openai',
413
417
  useMaxCompletionTokens: true,
414
418
  requiresDefaultTemperature: true,
@@ -452,6 +456,7 @@ export const PROVIDERS = {
452
456
  models: [
453
457
  { id: 'gemini-3.1-pro-preview', name: 'Gemini 3.1 Pro', description: 'Most capable Gemini model' },
454
458
  { id: 'gemini-3.5-flash', name: 'Gemini 3.5 Flash', description: 'Pro-level intelligence at Flash speed' },
459
+ { id: 'gemini-3.1-flash-lite', name: 'Gemini 3.1 Flash-Lite', description: 'Low-latency, low-cost workhorse (1M context)' },
455
460
  ],
456
461
  defaultModel: 'gemini-3.1-pro-preview',
457
462
  defaultProtocol: 'openai',
@@ -479,7 +484,7 @@ export const PROVIDERS = {
479
484
  { id: 'anthropic/claude-fable-5', name: 'Claude Fable 5', description: 'Anthropic — most capable' },
480
485
  { id: 'anthropic/claude-opus-4', name: 'Claude Opus 4', description: 'Anthropic — Opus tier' },
481
486
  { id: 'anthropic/claude-sonnet-5', name: 'Claude Sonnet 5', description: 'Anthropic — balanced' },
482
- { id: 'openai/gpt-5.5', name: 'GPT-5.5', description: 'OpenAI — flagship' },
487
+ { id: 'openai/gpt-5.6-sol', name: 'GPT-5.6 Sol', description: 'OpenAI — flagship' },
483
488
  { id: 'openai/gpt-5.4-mini', name: 'GPT-5.4 Mini', description: 'OpenAI — fast/cheap' },
484
489
  { id: 'google/gemini-3.1-pro', name: 'Gemini 3.1 Pro', description: 'Google — multimodal' },
485
490
  { id: 'meta-llama/llama-3.1-405b-instruct', name: 'Llama 3.1 405B', description: 'Meta — open weights, largest' },
@@ -487,7 +492,7 @@ export const PROVIDERS = {
487
492
  { id: 'deepseek/deepseek-v4', name: 'DeepSeek V4', description: 'DeepSeek via OpenRouter' },
488
493
  { id: 'mistralai/mistral-large', name: 'Mistral Large', description: 'Mistral — flagship' },
489
494
  { id: 'qwen/qwen-2.5-coder-32b-instruct', name: 'Qwen 2.5 Coder 32B', description: 'Alibaba — coding-tuned' },
490
- { id: 'x-ai/grok-2', name: 'Grok 2', description: 'xAI via OpenRouter' },
495
+ { id: 'x-ai/grok-4.5', name: 'Grok 4.5', description: 'xAI — flagship reasoning' },
491
496
  ],
492
497
  defaultModel: 'anthropic/claude-opus-4',
493
498
  defaultProtocol: 'openai',
@@ -413,15 +413,6 @@ export declare class App {
413
413
  /**
414
414
  * Get color for action type
415
415
  */
416
- private getActionColor;
417
- /**
418
- * Format action target for display
419
- */
420
- private formatActionTarget;
421
- /**
422
- * Get action label for display
423
- */
424
- private getActionLabel;
425
416
  /**
426
417
  * Render status bar
427
418
  */
@@ -430,23 +421,6 @@ export declare class App {
430
421
  * Get visible messages (including streaming)
431
422
  */
432
423
  private getVisibleMessages;
433
- /**
434
- * Format message into lines with syntax highlighting for code blocks
435
- */
436
- private formatWelcomeMessage;
437
- private formatMessage;
438
- /**
439
- * Apply inline markdown formatting (bold, italic, inline code) to a line
440
- */
441
- private applyInlineMarkdown;
442
- /**
443
- * Format plain text lines with markdown support
444
- */
445
- private formatTextLines;
446
- /**
447
- * Format code block with syntax highlighting (no border)
448
- */
449
- private formatCodeBlock;
450
424
  /**
451
425
  * Render inline search screen
452
426
  */
@@ -471,8 +445,4 @@ export declare class App {
471
445
  * Get decrypted logo for intro animation
472
446
  */
473
447
  private getDecryptedLogo;
474
- /**
475
- * Word wrap
476
- */
477
- private wordWrap;
478
448
  }