@datalabrotterdam/nova-ai-cli 1.1.0 → 1.2.0-alpha.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/CHANGELOG.md +70 -0
- package/README.md +160 -101
- package/dist/chunk-NHGIUEIR.js +754 -0
- package/dist/chunk-SKAW2KXC.js +10 -0
- package/dist/headless-OFJFVJ3O.js +543 -0
- package/dist/index.js +155 -17
- package/dist/tui-NJWDD5X7.js +4810 -0
- package/dist/webui-L4GGMXJ3.js +9 -0
- package/package.json +32 -32
- package/dist/acp/agent.d.ts +0 -13
- package/dist/acp/agent.js +0 -242
- package/dist/acp/auth-server.d.ts +0 -10
- package/dist/acp/auth-server.js +0 -67
- package/dist/acp/credentials.d.ts +0 -11
- package/dist/acp/credentials.js +0 -30
- package/dist/acp/index.d.ts +0 -2
- package/dist/acp/index.js +0 -21
- package/dist/acp/mcp.d.ts +0 -11
- package/dist/acp/mcp.js +0 -90
- package/dist/acp/sessions.d.ts +0 -20
- package/dist/acp/sessions.js +0 -91
- package/dist/acp/tools/index.d.ts +0 -6
- package/dist/acp/tools/index.js +0 -5
- package/dist/acp/tools/marker.d.ts +0 -17
- package/dist/acp/tools/marker.js +0 -43
- package/dist/acp/tools/permission.d.ts +0 -2
- package/dist/acp/tools/permission.js +0 -20
- package/dist/acp/tools/read-file.d.ts +0 -2
- package/dist/acp/tools/read-file.js +0 -20
- package/dist/acp/tools/registry.d.ts +0 -4
- package/dist/acp/tools/registry.js +0 -10
- package/dist/acp/tools/reporting.d.ts +0 -3
- package/dist/acp/tools/reporting.js +0 -26
- package/dist/acp/tools/run-command.d.ts +0 -2
- package/dist/acp/tools/run-command.js +0 -29
- package/dist/acp/tools/system-prompt.d.ts +0 -2
- package/dist/acp/tools/system-prompt.js +0 -23
- package/dist/acp/tools/types.d.ts +0 -18
- package/dist/acp/tools/types.js +0 -1
- package/dist/acp/tools/write-file.d.ts +0 -2
- package/dist/acp/tools/write-file.js +0 -20
- package/dist/index.d.ts +0 -2
- package/dist/tui/index.d.ts +0 -7
- package/dist/tui/index.js +0 -11
- package/dist/webui/index.d.ts +0 -6
- package/dist/webui/index.js +0 -9
- package/src/acp/web/dist/assets/index-CSccI7lJ.css +0 -1
- package/src/acp/web/dist/assets/index-D2Z0sfLR.js +0 -1
- package/src/acp/web/dist/favicon.svg +0 -46
- package/src/acp/web/dist/index.html +0 -32
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# [@datalabrotterdam/nova-ai-cli-v1.2.0-alpha.2](https://github.com/Datalab-Rotterdam/nova-ai-cli/compare/@datalabrotterdam/nova-ai-cli@1.2.0-alpha.1...@datalabrotterdam/nova-ai-cli@1.2.0-alpha.2) (2026-10-03)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* release the agent separately as @datalabrotterdam/nova-ai-agent ([32ecfc0](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/32ecfc0faa99bd5bb80cb2eaf2363abc050978f0))
|
|
7
|
+
|
|
8
|
+
# [1.2.0-alpha.1](https://github.com/Datalab-Rotterdam/nova-ai-cli/compare/v1.1.0...v1.2.0-alpha.1) (2026-10-03)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **acp:** bounded, cancellable client terminals in the workspace ([81f7099](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/81f70996d9dfc8d78e12282def1582ea859f2784))
|
|
14
|
+
* **acp:** isolate background prompt jobs from live session history ([8328a8b](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/8328a8bfa1f22871ef36ec38247987e6effcd044))
|
|
15
|
+
* **acp:** replay loaded sessions faithfully; page session/list ([d576171](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/d5761710890f7b2f5d1b340cdce7faafcd2e3561))
|
|
16
|
+
* **env:** no shells or Docker probes when a session starts ([dc3a449](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/dc3a4495f394c1a16e48e282efd76b765af09999))
|
|
17
|
+
* **mcp:** connect servers in parallel with timeouts and diagnostics ([db4c62c](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/db4c62cd9c8ec0f197ea1ae1ce76adcf9d397ed5))
|
|
18
|
+
* **models:** offer and default to chat models only ([5d3ade2](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/5d3ade2727110ca7555bfdfa5b174c9e75b151f9))
|
|
19
|
+
* **security:** harden sessions, setup auth, credentials, processes and file access ([7f02a1d](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/7f02a1d203128555c4d00e5ab4dc4786329b6225))
|
|
20
|
+
* **tui:** keep printed lines inside the terminal width ([dd5cd0a](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/dd5cd0a40592af392eca797399ce56c0e672110e))
|
|
21
|
+
* **tui:** redraw cleanly after the terminal width changes ([f0b2ec6](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/f0b2ec6d01b0bd8ebcf087330c8bfd82072aa08d))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* **acp:** agentInfo and env_var authentication in initialize ([b736e11](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/b736e115542b8fef083f9fc75514586327d3ac49))
|
|
27
|
+
* **acp:** namespace Nova extensions under _nova/ ([bf56cb9](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/bf56cb9e093dc90fc43b44008f1ddd86446a8cd0))
|
|
28
|
+
* **acp:** serialized turns, cancel, shutdown and proper error codes ([6688470](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/66884701af129ff2c1e9ad78b9e572d7ec64cc4b))
|
|
29
|
+
* **acp:** the agent owns permissions; clients only answer its questions ([7db651d](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/7db651d8d4883da2c170a831aeaa2952dc4444ac))
|
|
30
|
+
* **acp:** usage, session info, commands and model options as updates ([21d0816](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/21d08160c558ca9431deff8f8ead25e89a93d21c))
|
|
31
|
+
* added alpha stage on TUI ([3415411](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/3415411986ef4aefc2aa94dbb66fc73710fb6a5d))
|
|
32
|
+
* **cli:** proper entry point, -p/--print, login/logout, help and version ([73c8f94](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/73c8f9472099fa7c3cedccdd3c6a315d809e6a00))
|
|
33
|
+
* **core:** allow multiple tool calls per round ([f6a2171](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/f6a217145efac0722fddc49995808a7ad7bb2508))
|
|
34
|
+
* **core:** compact proactively at 80% of the model context window ([96afcbb](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/96afcbb7b68f4686a9b769bb80a73b00eebfe4a4))
|
|
35
|
+
* **core:** native tool calling with learned per-model text fallback ([6d71193](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/6d7119395b39a45026d676813ad3596382e2611a))
|
|
36
|
+
* **core:** share the ~/.nova-ai project layout with the VS Code extension ([aa75dde](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/aa75dde65218fdbd16b9f329bd849cc9ec608a28))
|
|
37
|
+
* **core:** validate tool args centrally before dispatch ([0a88e3e](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/0a88e3efb0d7c32611979e408b95e659873ec1e5))
|
|
38
|
+
* expand ACP runtime and terminal workflows ([bfbae15](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/bfbae157c301fbc1b7e88f5e267d25c8da126008))
|
|
39
|
+
* **mcp:** surface tool schemas, respect readOnlyHint, hint cwd args ([2b22be3](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/2b22be327b052788936e4badb010844f7ca3d057))
|
|
40
|
+
* **memory:** shared MEMORY.md index + typed notes, compatible with VS Code ([474c916](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/474c91694f4da58400426f39c290ac6888f4aa19))
|
|
41
|
+
* **modes:** plan mode can read, ask and keep the task list ([e253eaa](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/e253eaa66fd02478d61f34e734a27883068bf357))
|
|
42
|
+
* **policy:** agent-side permission policy with trust-gated rule sources ([234cd3a](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/234cd3adf06423c973c52497e5e31f6868d6b19a))
|
|
43
|
+
* **policy:** rule subjects for the extension's tool names ([5c188b6](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/5c188b610ff6e4ba8a715cc2ee10960736493b86))
|
|
44
|
+
* **tools:** add JSON schema validator for tool args ([24764ef](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/24764ef5100c14404f1923f89cc87c3d64de510d))
|
|
45
|
+
* **tools:** declare args schemas on every built-in tool ([79f6283](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/79f62833144f1a6aba9aaa65a2a19f18eb8793ca))
|
|
46
|
+
* **tools:** whitespace-tolerant edit_file with self-correction hints ([a350e14](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/a350e140e92c8469249d4c6297aad8f8161a217f))
|
|
47
|
+
* **tui:** Ink TUI with inline scrollback replaces pi-tui ([0725bae](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/0725bae27790829fd756afbdb5dd20574a1e0f00))
|
|
48
|
+
* **tui:** Shift+Enter inserts a new line where the terminal can report it ([b9c0b70](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/b9c0b7041057e2bdeb1675bbfa33a12fc3a664b9))
|
|
49
|
+
|
|
50
|
+
# [1.1.0](https://github.com/Datalab-Rotterdam/nova-ai-cli/compare/v1.0.1...v1.1.0) (2026-06-23)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
### Features
|
|
54
|
+
|
|
55
|
+
* **acp-web:** theme support, favicon, font, and dep bumps ([0576402](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/0576402b6888a2cf6bc93123d733c4163358c63f))
|
|
56
|
+
* **acp:** add MCP server support (stdio/http/sse) ([ba98b0c](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/ba98b0c0b2e2461e8553331cafa1985e7673ee43))
|
|
57
|
+
|
|
58
|
+
## [1.0.1](https://github.com/Datalab-Rotterdam/nova-ai-cli/compare/v1.0.0...v1.0.1) (2026-06-22)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
### Bug Fixes
|
|
62
|
+
|
|
63
|
+
* correct npm scope to [@datalabrotterdam](https://github.com/datalabrotterdam) ([6ab6bf8](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/6ab6bf88506cc1d4b778c1a30b123cd532a0a8de))
|
|
64
|
+
|
|
65
|
+
# 1.0.0 (2026-06-22)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
### Features
|
|
69
|
+
|
|
70
|
+
* add ACP agent, tool calling, and alpha release channel ([15d19a7](https://github.com/Datalab-Rotterdam/nova-ai-cli/commit/15d19a7998b4651ba9ad279fc2607006ea14ed49))
|
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
<img src="
|
|
3
|
+
<img src="https://raw.githubusercontent.com/Datalab-Rotterdam/nova-ai-cli/main/assets/logo.png" width="96" height="96" alt="Nova logo" />
|
|
4
4
|
|
|
5
5
|
# @datalabrotterdam/nova-ai-cli
|
|
6
6
|
|
|
7
|
-
**
|
|
7
|
+
**Agentic coding with DataLab Rotterdam's Nova AI: in your terminal, in scripts, and in your editor over the Agent Client Protocol**
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@datalabrotterdam/nova-ai-cli)
|
|
10
10
|
[](https://www.npmjs.com/package/@datalabrotterdam/nova-ai-cli)
|
|
@@ -12,136 +12,195 @@
|
|
|
12
12
|
[](https://agentclientprotocol.com)
|
|
13
13
|
[](https://github.com/Datalab-Rotterdam/nova-ai-cli/issues)
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
[npm](https://www.npmjs.com/package/@datalabrotterdam/nova-ai-cli) · [Issues](https://github.com/Datalab-Rotterdam/nova-ai-cli/issues) · [ACP docs](https://agentclientprotocol.com)
|
|
15
|
+
[npm](https://www.npmjs.com/package/@datalabrotterdam/nova-ai-cli) · [Issues](https://github.com/Datalab-Rotterdam/nova-ai-cli/issues) · [ACP reference](https://github.com/Datalab-Rotterdam/nova-ai-cli/blob/main/docs/ACP.md) · [Settings and memory](https://github.com/Datalab-Rotterdam/nova-ai-cli/blob/main/docs/NOVA_HOME.md)
|
|
18
16
|
|
|
19
17
|
</div>
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
`nova-ai` is a coding agent in the spirit of `claude` and `codex`, backed by
|
|
20
|
+
[Nova AI](https://platform.nova.datalabrotterdam.nl). It reads and edits your
|
|
21
|
+
code, runs commands with your permission, asks when a decision is yours, and
|
|
22
|
+
keeps a task list for longer work. One agent, three front ends:
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
- **Terminal UI**: `nova-ai`
|
|
25
|
+
- **Headless**: `nova-ai -p "…"` for scripts, CI and machines without a GUI
|
|
26
|
+
- **ACP agent**: `nova-ai --acp` for Zed, JetBrains, VS Code and any other
|
|
27
|
+
[Agent Client Protocol](https://agentclientprotocol.com) client
|
|
24
28
|
|
|
25
|
-
|
|
29
|
+
The terminal UI and headless mode talk to the agent over the same protocol an
|
|
30
|
+
editor uses, so all three behave the same: same tools, permissions, sessions,
|
|
31
|
+
memory, MCP servers and settings.
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
## Install
|
|
28
34
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
npx @datalabrotterdam/nova-ai-cli # interactive chat (WIP, stub)
|
|
32
|
-
npx @datalabrotterdam/nova-ai-cli --acp # speak ACP over stdio (editors/IDEs) — fully working
|
|
33
|
-
npx @datalabrotterdam/nova-ai-cli --web # standalone browser UI (WIP, stub)
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Or install globally / as a project dependency:
|
|
35
|
+
Requires Node.js 22.19 or newer and a Nova AI API key
|
|
36
|
+
([get one](https://platform.nova.datalabrotterdam.nl/dashboard/api-keys)).
|
|
37
37
|
|
|
38
38
|
```sh
|
|
39
39
|
npm install -g @datalabrotterdam/nova-ai-cli
|
|
40
|
+
nova-ai login # opens a local page to enter the key; --no-browser asks in the terminal
|
|
41
|
+
nova-ai # start the terminal UI in your project
|
|
40
42
|
```
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
---
|
|
44
|
+
Or without installing: `npx @datalabrotterdam/nova-ai-cli login`, then
|
|
45
|
+
`npx @datalabrotterdam/nova-ai-cli`.
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
```
|
|
48
|
+
nova-ai [options] Interactive terminal UI
|
|
49
|
+
nova-ai -p [options] [prompt] Run one request headless (see nova-ai -p --help)
|
|
50
|
+
nova-ai --acp Agent Client Protocol over stdio (for editors)
|
|
51
|
+
nova-ai login [--no-browser] Connect your Nova AI account
|
|
52
|
+
nova-ai logout Remove the stored API key
|
|
53
|
+
|
|
54
|
+
Interactive options:
|
|
55
|
+
--resume <session-id> Continue a saved session
|
|
56
|
+
-c, --continue Continue the most recent session in this folder
|
|
57
|
+
--model <id> Use this model
|
|
58
|
+
```
|
|
47
59
|
|
|
48
|
-
|
|
60
|
+
## Terminal UI
|
|
61
|
+
|
|
62
|
+
The UI renders inline below your shell prompt. Finished messages go to the
|
|
63
|
+
terminal's own scrollback (scroll, search and copy as usual); only the
|
|
64
|
+
streaming answer, running tools, the prompt and the status rows are redrawn.
|
|
65
|
+
|
|
66
|
+
- **Modes** (Shift+Tab): `agent` does the work; `plan` reads the code, asks
|
|
67
|
+
questions and builds a task list but changes nothing; `ask` only answers.
|
|
68
|
+
- **Permissions**: before an edit or command you choose once, for this
|
|
69
|
+
session, always (saved as an exact rule) or deny. Ctrl+K switches between
|
|
70
|
+
asking, accepting edits, and bypass (never remembered).
|
|
71
|
+
- **Questions and tasks**: the agent can ask 1–4 multiple-choice questions
|
|
72
|
+
(with descriptions, a recommended option and your own answer) and shows a
|
|
73
|
+
live checklist for multi-step work.
|
|
74
|
+
- **Prompt**: history, `@file` mentions, `/command` completion, large pastes
|
|
75
|
+
as compact markers, Alt+V to paste an image (for models that accept
|
|
76
|
+
images). Messages typed while Nova works are queued; ↑ edits them.
|
|
77
|
+
`/steer <text>` reaches the running turn at the next tool boundary.
|
|
78
|
+
|
|
79
|
+
| Key | Action |
|
|
80
|
+
|---|---|
|
|
81
|
+
| Enter / Shift+Enter | Send / new line (Shift+Enter where the terminal supports the kitty keyboard protocol: VS Code, kitty, WezTerm, Ghostty, foot, Alacritty, recent iTerm2; Alt+Enter, Ctrl+J or a trailing `\` work everywhere) |
|
|
82
|
+
| Esc | Cancel the running turn |
|
|
83
|
+
| Ctrl+C twice | Exit; prints `nova-ai --resume <id>` |
|
|
84
|
+
| Shift+Tab | Cycle agent / ask / plan |
|
|
85
|
+
| Ctrl+R / Ctrl+P / Ctrl+K | Sessions / models / permission mode |
|
|
86
|
+
| Ctrl+O / Ctrl+T / Ctrl+B | Verbose tool output / tool inspector / background jobs |
|
|
87
|
+
| Alt+V | Paste a clipboard image |
|
|
88
|
+
|
|
89
|
+
Slash commands: `/help`, `/model`, `/mode`, `/permission`, `/session`,
|
|
90
|
+
`/resume`, `/clear`, `/compact`, `/rewind [n]`, `/queue`, `/steer`, `/usage`,
|
|
91
|
+
`/tools`, `/mcp`, `/skills`, `/shell` and `/agent` (background jobs), `/trust`
|
|
92
|
+
and `/exit`. Details:
|
|
93
|
+
[`src/tui/README.md`](https://github.com/Datalab-Rotterdam/nova-ai-cli/blob/main/packages/cli/src/tui/README.md).
|
|
94
|
+
|
|
95
|
+
## Headless
|
|
49
96
|
|
|
50
97
|
```sh
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
npx @datalabrotterdam/nova-ai-cli --acp
|
|
98
|
+
nova-ai -p "review the changed files"
|
|
99
|
+
git diff | nova-ai -p --output-format json "summarize this diff"
|
|
100
|
+
nova-ai -p --json --permission-mode accept-edits "fix the failing test"
|
|
101
|
+
nova-ai -p -c "and now add a changelog entry"
|
|
56
102
|
```
|
|
57
103
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
104
|
+
| Option | |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `--output-format text\|json\|stream-json` | `text` prints the answer; `json` one object at the end (text, tools, permissions); `stream-json` (or `--json`) JSON Lines while it runs: `session.started`, `message.delta`, `tool.started`/`tool.updated`/`tool.finished`, `permission`, `queue.changed`, `background.update`, `result`, `error` |
|
|
107
|
+
| `--permission-mode` | `read-only` (default): anything that needs approval is refused, since nobody can approve it. `accept-edits`: file edits are accepted, commands still refused. `bypass-all`: everything is accepted. Deny rules always win. |
|
|
108
|
+
| `--resume <id>`, `-c` | Continue a session |
|
|
109
|
+
| `--model`, `--cwd` | Model and workspace |
|
|
110
|
+
| `--trust-workspace` | Trust the workspace (remembered): start the MCP servers and apply the allow rules it declares |
|
|
111
|
+
| `--no-mcp` | Ignore workspace MCP configuration |
|
|
61
112
|
|
|
62
|
-
|
|
113
|
+
Exit codes: `0` success, `1` configuration or runtime error, `2` cancelled,
|
|
114
|
+
`3` tool-turn safety limit, `130` interrupted.
|
|
63
115
|
|
|
64
|
-
##
|
|
116
|
+
## Editors (ACP)
|
|
65
117
|
|
|
66
|
-
|
|
118
|
+
Configure `nova-ai --acp` as a custom agent. For Zed:
|
|
67
119
|
|
|
68
120
|
```json
|
|
69
121
|
{
|
|
70
|
-
"
|
|
71
|
-
|
|
122
|
+
"agent_servers": {
|
|
123
|
+
"Nova AI": { "command": "npx", "args": ["-y", "@datalabrotterdam/nova-ai-cli", "--acp"] }
|
|
124
|
+
}
|
|
72
125
|
}
|
|
73
126
|
```
|
|
74
127
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
128
|
+
The agent supports session load/list/resume/fork/close/delete, modes, a
|
|
129
|
+
permission-mode and model selector, permission requests with once / session /
|
|
130
|
+
always options, client file system and terminals, form questions, plans, usage
|
|
131
|
+
and title updates, MCP servers (stdio, HTTP, SSE), image prompts, and three
|
|
132
|
+
login methods (browser, `NOVA_API_KEY`, or `nova-ai login` in a terminal).
|
|
133
|
+
Nova-specific features (prompt queue, rewind, compaction, context usage,
|
|
134
|
+
background jobs) are `_nova/…` extension methods. The agent is also published
|
|
135
|
+
on its own as
|
|
136
|
+
[`@datalabrotterdam/nova-ai-agent`](https://www.npmjs.com/package/@datalabrotterdam/nova-ai-agent)
|
|
137
|
+
(command `nova-ai-agent`), without the terminal UI, for integrations that only
|
|
138
|
+
need ACP. Everything is documented in
|
|
139
|
+
[docs/ACP.md](https://github.com/Datalab-Rotterdam/nova-ai-cli/blob/main/docs/ACP.md).
|
|
140
|
+
|
|
141
|
+
## Security model
|
|
142
|
+
|
|
143
|
+
- **The agent enforces permissions**, not the client. Every front end and
|
|
144
|
+
every editor gets the same policy; a client can only answer the questions
|
|
145
|
+
it is asked. Anything other than an explicit "allow" counts as "deny".
|
|
146
|
+
- **Deny rules win**, also in bypass mode and for read-only tools.
|
|
147
|
+
- **A repository can't approve itself.** Allow rules in a workspace's
|
|
148
|
+
`.nova-ai/settings*.json`, and MCP servers it declares (`.mcp.json`), only
|
|
149
|
+
take effect after you trust that workspace (asked once at startup, `/trust`,
|
|
150
|
+
or `--trust-workspace`). The trust decision is stored in `~/.nova-ai`, never
|
|
151
|
+
in the repository. A repository can't set the permission mode either.
|
|
152
|
+
- **"Always allow" saves an exact rule** for that command or path in your
|
|
153
|
+
private `~/.nova-ai/projects/<key>/settings.json`, outside the repository.
|
|
154
|
+
Compound commands (`a && b`, pipes) are checked part by part; substitutions
|
|
155
|
+
and nested shells need an exact rule.
|
|
156
|
+
- **File access stays in the workspace** (symlinks resolved); commands run in
|
|
157
|
+
their own process group with a timeout, and the whole tree is stopped on
|
|
158
|
+
cancel.
|
|
159
|
+
- **Credentials** are stored in `~/.nova-ai/credentials.json` with mode 0600.
|
|
160
|
+
The browser login page only accepts a one-time token from the same origin.
|
|
161
|
+
|
|
162
|
+
## Settings, memory and sessions
|
|
163
|
+
|
|
164
|
+
Everything lives in `~/.nova-ai` (or `$NOVA_AI_HOME`), shared with the Nova
|
|
165
|
+
VS Code extension: settings, per-project trust, sessions and memory.
|
|
166
|
+
|
|
167
|
+
- **Rules**: `{"permissions": {"allow": ["run_command(npm test)", "edit_file(src/*)"], "deny": ["read_file(.env)"]}}`
|
|
168
|
+
in `~/.nova-ai/settings.json`, the private project file, or the workspace's
|
|
169
|
+
`.nova-ai/settings.json` (team, committed) and `.nova-ai/settings.local.json`
|
|
170
|
+
(personal). Claude-style aliases such as `Bash(npm run *)` and `Edit(src/**)`
|
|
171
|
+
work too.
|
|
172
|
+
- **Instructions**: `NOVA.md` and `AGENTS.md` in the workspace.
|
|
173
|
+
- **Memory**: a `MEMORY.md` index plus notes, globally and per project,
|
|
174
|
+
through the `memory_read` and `memory_write` tools (writes need approval).
|
|
175
|
+
- **Skills**: `SKILL.md` files under `.agents/skills`, `.claude/skills` or
|
|
176
|
+
`.codex/skills`, in the workspace or your home folder.
|
|
177
|
+
- **MCP servers**: `.mcp.json` or `mcpServers` in `.nova-ai/settings.json`.
|
|
178
|
+
|
|
179
|
+
The complete layout and rule syntax: [docs/NOVA_HOME.md](https://github.com/Datalab-Rotterdam/nova-ai-cli/blob/main/docs/NOVA_HOME.md).
|
|
180
|
+
|
|
181
|
+
## Models
|
|
182
|
+
|
|
183
|
+
The model list shows the chat models of your account. On login Nova picks the
|
|
184
|
+
first one with native tool calling; `/model` or Ctrl+P changes it (and
|
|
185
|
+
remembers the choice), `--model` or `NOVA_MODEL` sets it for one run. Nova uses the gateway's function calling and falls back
|
|
186
|
+
to a text protocol for models that don't support it. When the context window
|
|
187
|
+
fills up, older messages are summarized automatically (`/compact` does it by
|
|
188
|
+
hand).
|
|
189
|
+
|
|
190
|
+
| Environment | |
|
|
89
191
|
|---|---|
|
|
90
|
-
| `NOVA_API_KEY` |
|
|
91
|
-
| `
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
## What it implements
|
|
98
|
-
|
|
99
|
-
| ACP method | Behavior |
|
|
100
|
-
|---|---|
|
|
101
|
-
| `initialize` | Returns protocol version + the `nova-api-key` agent auth method |
|
|
102
|
-
| `session/new` | Allocates a session id with in-memory history |
|
|
103
|
-
| `session/load` | Restores a previously-persisted session and replays its turns as `*_message_chunk` notifications |
|
|
104
|
-
| `session/list` | Lists stored sessions, optionally filtered by `cwd` |
|
|
105
|
-
| `authenticate` | Runs the local browser auth flow (`src/acp/auth-server.ts`) and resolves once a valid key is stored |
|
|
106
|
-
| `session/prompt` | Streams a `chat.completions.stream()` call, forwarding `agent_message_chunk` updates as text arrives; drives the tool-calling loop below |
|
|
107
|
-
| `session/cancel` | Aborts the in-flight Nova AI request via `AbortController` |
|
|
108
|
-
|
|
109
|
-
Only `text` and `resource_link` content blocks are read from prompts today — images/audio/embeddings supported by `nova-sdk` aren't wired up yet.
|
|
110
|
-
|
|
111
|
-
Sessions are persisted to disk (`src/acp/sessions.ts`) so `session/load` can rehydrate history, and a title is auto-derived from the conversation.
|
|
112
|
-
|
|
113
|
-
### Tool calling
|
|
114
|
-
|
|
115
|
-
While streaming a response, the agent watches for a fenced tool-call marker in the model's output (`src/acp/tools/marker.ts`). When one appears, it stops streaming text and instead:
|
|
116
|
-
|
|
117
|
-
1. Reports the pending call via `session/update` (`tool_call` with status `pending`).
|
|
118
|
-
2. Requests permission from the client for any **mutating** tool (`allow_once` / `reject_once`), via `session/request_permission`.
|
|
119
|
-
3. Executes the tool and reports the result/error via a `tool_call_update`.
|
|
120
|
-
4. Feeds the tool result back into the conversation and loops (up to 10 rounds per prompt) until the model produces a plain answer.
|
|
121
|
-
|
|
122
|
-
Built-in tools (`src/acp/tools/registry.ts`):
|
|
123
|
-
|
|
124
|
-
| Tool | Mutating | Behavior |
|
|
125
|
-
|---|---|---|
|
|
126
|
-
| `read_file` | No | Reads a file's contents, gated by client `fs.readTextFile` capability |
|
|
127
|
-
| `write_file` | Yes | Writes/overwrites a file, gated by client `fs.writeTextFile` capability — requires permission |
|
|
128
|
-
| `run_command` | Yes | Runs a shell command in the session's `cwd` — requires permission |
|
|
129
|
-
|
|
130
|
-
Tools are filtered per-session by the client's advertised `clientCapabilities`, so a client without filesystem support never sees `read_file`/`write_file` offered.
|
|
131
|
-
|
|
132
|
-
---
|
|
192
|
+
| `NOVA_API_KEY`, `NOVA_MODEL` | Use this key / model instead of the stored ones |
|
|
193
|
+
| `NOVA_BASE_URL` | Another Nova (OpenAI-compatible) gateway |
|
|
194
|
+
| `NOVA_AI_HOME` | Settings folder (default `~/.nova-ai`) |
|
|
195
|
+
| `NOVA_TOOL_PROTOCOL` | Force `native` or `text` tool calling |
|
|
196
|
+
| `NOVA_NES_MODEL` | Separate model for next-edit suggestions (ACP) |
|
|
197
|
+
| `NOVA_KITTY_KEYBOARD` | `1`/`0`: force the kitty keyboard protocol on or off |
|
|
133
198
|
|
|
134
199
|
## Development
|
|
135
200
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
npm run build # builds the Svelte setup page, then tsc -> dist/
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Releases are automated via `semantic-release` on push to `main` (see `.github/workflows/ci.yml`); commit messages drive version bumps.
|
|
143
|
-
|
|
144
|
-
---
|
|
201
|
+
This package lives in the [nova-ai-cli repository](https://github.com/Datalab-Rotterdam/nova-ai-cli)
|
|
202
|
+
next to the agent package it depends on; see the repository README for
|
|
203
|
+
building and testing.
|
|
145
204
|
|
|
146
205
|
## License
|
|
147
206
|
|