@matterailab/orbcode 0.2.1 โ 0.2.2
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 +54 -10
- package/dist/api/models.js +19 -3
- package/dist/ui/App.js +16 -5
- package/dist/ui/components/ModelPicker.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
# OrbCode CLI
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@matterailab/orbcode)
|
|
4
|
+
[](https://www.npmjs.com/package/@matterailab/orbcode)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](https://nodejs.org)
|
|
7
|
+
[](https://github.com/MatterAIOrg/OrbCode)
|
|
8
|
+
[](https://github.com/MatterAIOrg/OrbCode/issues)
|
|
9
|
+
[](https://docs.matterai.so/orbcode-cli/overview)
|
|
10
|
+
|
|
3
11
|
Agentic coding in your terminal โ powered by **Axon models by MatterAI**.
|
|
4
12
|
|
|
13
|
+
> ๐ **Full documentation: <https://docs.matterai.so/orbcode-cli/overview>**
|
|
14
|
+
|
|
5
15
|
OrbCode CLI is a standalone terminal port of the Orbital extension: the same Axon
|
|
6
16
|
models, the same native tool schemas, the same MatterAI auth backend โ rebuilt from
|
|
7
17
|
scratch as an interactive TUI with streaming chat, live thinking display, tool
|
|
@@ -13,6 +23,7 @@ activity rows, edit/command approvals, and todo tracking.
|
|
|
13
23
|
|
|
14
24
|
## Table of contents
|
|
15
25
|
|
|
26
|
+
- [Quick start](#quick-start)
|
|
16
27
|
- [Install](#install)
|
|
17
28
|
- [Updating / relinking](#updating--relinking)
|
|
18
29
|
- [Usage](#usage)
|
|
@@ -31,11 +42,30 @@ activity rows, edit/command approvals, and todo tracking.
|
|
|
31
42
|
- [Development](#development)
|
|
32
43
|
- [Tests](#tests)
|
|
33
44
|
- [Troubleshooting](#troubleshooting)
|
|
45
|
+
- [Documentation](#documentation)
|
|
34
46
|
- [Contributing](#contributing)
|
|
35
47
|
- [License](#license)
|
|
36
48
|
|
|
37
49
|
---
|
|
38
50
|
|
|
51
|
+
## Quick start
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npm install -g @matterailab/orbcode # install the CLI (needs Node.js >= 20)
|
|
55
|
+
orbcode login # sign in once via your browser
|
|
56
|
+
cd your-project && orbcode # start coding
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
That's it โ you're in an interactive agent session. Ask it to read, edit, run
|
|
60
|
+
commands, or fix bugs. New here? Skim the [docs](https://docs.matterai.so/orbcode-cli/overview)
|
|
61
|
+
or jump to [Usage](#usage).
|
|
62
|
+
|
|
63
|
+
Prefer not to install globally? Run it on the fly:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npx @matterailab/orbcode
|
|
67
|
+
```
|
|
68
|
+
|
|
39
69
|
## Install
|
|
40
70
|
|
|
41
71
|
Requires **Node.js >= 20**.
|
|
@@ -143,18 +173,20 @@ Sign out with `/logout` (removes the saved token).
|
|
|
143
173
|
|
|
144
174
|
## Models
|
|
145
175
|
|
|
146
|
-
The
|
|
147
|
-
(`/model <id>` still selects directly). Additional models can be
|
|
148
|
-
`customModels` in settings.json. The choice persists across
|
|
176
|
+
The built-in Axon models are listed below; `/model` opens a scroll-and-select
|
|
177
|
+
picker (`/model <id>` still selects directly). Additional models can be
|
|
178
|
+
declared via `customModels` in settings.json. The choice persists across
|
|
179
|
+
sessions.
|
|
149
180
|
|
|
150
|
-
| id
|
|
151
|
-
|
|
|
152
|
-
| `axon-eido-3-code-pro`
|
|
153
|
-
| `axon-
|
|
154
|
-
| `axon-code-2-5-
|
|
181
|
+
| id | context | max output | pricing |
|
|
182
|
+
| ------------------------- | ------- | ---------- | ---------------------- |
|
|
183
|
+
| `axon-eido-3-code-pro` | 400k | 64k | $3/M in ยท $9/M out |
|
|
184
|
+
| `axon-eido-3-code-mini` | 400k | 64k | $1.5/M in ยท $4.5/M out |
|
|
185
|
+
| `axon-code-2-5-pro` | 400k | 64k | $2/M in ยท $6/M out |
|
|
186
|
+
| `axon-code-2-5-mini` | 400k | 64k | free |
|
|
155
187
|
|
|
156
|
-
`axon-
|
|
157
|
-
image input. Cost comes from the API's usage chunks (`is_byok`-aware) and is
|
|
188
|
+
`axon-eido-3-code-mini` is the default. All four support native JSON tool calls
|
|
189
|
+
and image input. Cost comes from the API's usage chunks (`is_byok`-aware) and is
|
|
158
190
|
shown in the status bar.
|
|
159
191
|
|
|
160
192
|
### Other providers (Anthropic, OpenAI-compatible)
|
|
@@ -199,6 +231,11 @@ MatterAI login.
|
|
|
199
231
|
- `provider: "openai-compatible"` โ any OpenAI-compatible endpoint; requires
|
|
200
232
|
`baseUrl`. Key from `apiKey` on the entry.
|
|
201
233
|
|
|
234
|
+
> **Note:** Third-party models are **not** shown in the TUI's `/model` picker.
|
|
235
|
+
> They're still available headlessly via `orbcode -p "..." --model <id>` (or
|
|
236
|
+
> `MATTERAI_MODEL=<id>`); in an interactive session, `/model claude-opus-4-8`
|
|
237
|
+
> prints the exact command to run.
|
|
238
|
+
|
|
202
239
|
Anything without a `provider` (or `provider: "matterai"`) keeps using the
|
|
203
240
|
MatterAI gateway untouched.
|
|
204
241
|
|
|
@@ -601,6 +638,13 @@ node test-device-auth.mjs # device-auth polling flow against a local mock
|
|
|
601
638
|
iTerm) keep working. A normal global install (`npm install -g @matterailab/orbcode`) is
|
|
602
639
|
unaffected because it lives outside protected folders.
|
|
603
640
|
|
|
641
|
+
## Documentation
|
|
642
|
+
|
|
643
|
+
The README covers the essentials. For the complete, kept-up-to-date reference
|
|
644
|
+
(guides, configuration, hooks cookbook, troubleshooting), visit the docs site:
|
|
645
|
+
|
|
646
|
+
**๐ <https://docs.matterai.so/orbcode-cli/overview>**
|
|
647
|
+
|
|
604
648
|
## Contributing
|
|
605
649
|
|
|
606
650
|
Contributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for how to
|
package/dist/api/models.js
CHANGED
|
@@ -87,8 +87,14 @@ export const ANTHROPIC_MODELS = {
|
|
|
87
87
|
provider: "anthropic",
|
|
88
88
|
},
|
|
89
89
|
};
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Axon's own models (MatterAI gateway). These are the only models shown in
|
|
92
|
+
* the TUI's `/model` picker and are the supported defaults. Third-party
|
|
93
|
+
* providers (Anthropic, OpenAI-compatible) are registered under
|
|
94
|
+
* `AXON_MODELS` for `-p --model` runs but are intentionally hidden from the
|
|
95
|
+
* interactive picker for now.
|
|
96
|
+
*/
|
|
97
|
+
export const BUILTIN_AXON_MODELS = {
|
|
92
98
|
"axon-code-2-5-mini": {
|
|
93
99
|
id: "axon-code-2-5-mini",
|
|
94
100
|
name: "Axon Code 2.5 Mini (free)",
|
|
@@ -134,7 +140,17 @@ export const AXON_MODELS = {
|
|
|
134
140
|
free: false,
|
|
135
141
|
},
|
|
136
142
|
};
|
|
137
|
-
|
|
143
|
+
/**
|
|
144
|
+
* Full model registry, including third-party providers. The TUI picker uses
|
|
145
|
+
* `BUILTIN_AXON_MODELS`; non-interactive `-p --model` runs resolve through
|
|
146
|
+
* this map, so a custom 3P entry (e.g. `claude-opus-4-8` from settings.json)
|
|
147
|
+
* still works headlessly.
|
|
148
|
+
*/
|
|
149
|
+
export const AXON_MODELS = {
|
|
150
|
+
...BUILTIN_AXON_MODELS,
|
|
151
|
+
...ANTHROPIC_MODELS,
|
|
152
|
+
};
|
|
153
|
+
export const DEFAULT_MODEL_ID = "axon-eido-3-code-mini";
|
|
138
154
|
/** Add user-defined models (from settings.json) to the registry. */
|
|
139
155
|
export function registerCustomModels(models) {
|
|
140
156
|
for (const model of models) {
|
package/dist/ui/App.js
CHANGED
|
@@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
|
3
3
|
import { Box, Static, Text, useApp, useInput } from "ink";
|
|
4
4
|
import open from "open";
|
|
5
5
|
import { COLORS, VERSION } from "../branding.js";
|
|
6
|
-
import {
|
|
6
|
+
import { BUILTIN_AXON_MODELS, getModel, isValidAxonModel } from "../api/models.js";
|
|
7
7
|
import { LoginView } from "./LoginView.js";
|
|
8
8
|
import { APP_URL, fetchBalance, fetchProfile, fetchTaskTitle } from "../auth/auth.js";
|
|
9
9
|
import { getAuthToken, getPendingProjectHooks, loadSettings, saveSettings, trustProjectHooks, } from "../config/settings.js";
|
|
@@ -444,15 +444,26 @@ export function App({ initialView, initialPrompt, initialSession, updateCheck, }
|
|
|
444
444
|
});
|
|
445
445
|
break;
|
|
446
446
|
case "/model": {
|
|
447
|
-
|
|
448
|
-
|
|
447
|
+
// The interactive picker is restricted to Axon's own models for now.
|
|
448
|
+
// Third-party providers (Anthropic, OpenAI-compatible) are still
|
|
449
|
+
// usable headlessly via `orbcode -p "..." --model <id>` โ see
|
|
450
|
+
// the README "Other providers" section.
|
|
451
|
+
const pickerIds = Object.keys(BUILTIN_AXON_MODELS);
|
|
452
|
+
if (arg && pickerIds.includes(arg)) {
|
|
449
453
|
switchModel(arg);
|
|
450
454
|
}
|
|
455
|
+
else if (arg && isValidAxonModel(arg)) {
|
|
456
|
+
// Recognized id, but it's a third-party model: not selectable in the TUI.
|
|
457
|
+
pushRow({
|
|
458
|
+
kind: "info",
|
|
459
|
+
text: `Model "${arg}" is only available in non-interactive mode. Run: orbcode -p "..." --model ${arg}`,
|
|
460
|
+
});
|
|
461
|
+
}
|
|
451
462
|
else if (arg) {
|
|
452
463
|
// Allow short suffixes like "pro" or "mini" to resolve to the
|
|
453
464
|
// latest matching registered id, so /model pro keeps working
|
|
454
465
|
// as new model generations are added.
|
|
455
|
-
const matches =
|
|
466
|
+
const matches = pickerIds
|
|
456
467
|
.filter((id) => id.endsWith(`-${arg}`))
|
|
457
468
|
.sort()
|
|
458
469
|
.reverse();
|
|
@@ -460,7 +471,7 @@ export function App({ initialView, initialPrompt, initialSession, updateCheck, }
|
|
|
460
471
|
switchModel(matches[0]);
|
|
461
472
|
}
|
|
462
473
|
else {
|
|
463
|
-
pushRow({ kind: "error", text: `Unknown model "${arg}". Available: ${
|
|
474
|
+
pushRow({ kind: "error", text: `Unknown model "${arg}". Available: ${pickerIds.join(", ")}` });
|
|
464
475
|
}
|
|
465
476
|
}
|
|
466
477
|
else {
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import { Box, Text, useInput } from "ink";
|
|
4
4
|
import { COLORS } from "../../branding.js";
|
|
5
|
-
import {
|
|
5
|
+
import { BUILTIN_AXON_MODELS } from "../../api/models.js";
|
|
6
6
|
const VISIBLE_ROWS = 6;
|
|
7
7
|
function formatPrice(model) {
|
|
8
8
|
if (model.free)
|
|
@@ -11,7 +11,7 @@ function formatPrice(model) {
|
|
|
11
11
|
return `${perMillion(model.inputPrice)} in / ${perMillion(model.outputPrice)} out per 1M tokens`;
|
|
12
12
|
}
|
|
13
13
|
export function ModelPicker({ currentId, onSelect, onCancel }) {
|
|
14
|
-
const models = Object.values(
|
|
14
|
+
const models = Object.values(BUILTIN_AXON_MODELS);
|
|
15
15
|
const [selected, setSelected] = useState(() => {
|
|
16
16
|
const index = models.findIndex((m) => m.id === currentId);
|
|
17
17
|
return index === -1 ? 0 : index;
|