Skip to content

Commit eb3c65f

Browse files
committed
Ship v0.43.1: Perplexity Agent API, trusted project rules, faster first request
- Perplexity: Sonar's Chat Completions endpoint was retired on 2026-09-27. The route now speaks Responses at api.perplexity.ai/v1 and starts on perplexity/sonar. api::perplexity fits each request to the Agent API's narrower schema (message / function_call / function_call_output items only, typed messages, input_* parts, image URLs within 2048 characters, no include / tool_choice / parallel_tool_calls / prompt_cache_key, effort-only reasoning, an output ceiling for anthropic/* models). - Permissions: a project's .nur/permissions.toml applied its allow rules on open, so a cloned repo could approve its own bash and writes even in manual mode. Its deny and ask rules still apply at once; its allow rules wait for /permissions trust or `nur permissions trust`, recorded per directory against a digest of the list, so an edit holds them again. nur names what a project asks to auto-approve at startup (stderr for `nur run`), and /cd reloads the rules for the new directory. - First request: a session's first turn launched `npm prefix -g` (find_bin looking for `py`), and every turn launched the PLUR CLI, before the first model request. find_bin now asks PATH before probing runtimes; PLUR context and the OptMem wake are fetched as a session opens and reused, PLUR refreshed between turns. Release builds here: TUI Enter-to-request ~2.1 s -> ~0.27 s, a warm headless `nur run` ~2.3 s -> ~1.3 s. - The demo film pipeline moved out of the repository; the README shows the site-hosted poster. - NUR_STARTUP_TRACE: writeln! through serde_json's Display wrote a row token by token, so rows from concurrent threads interleaved mid-line (174 of 1600 parsed under contention) and the startup suite failed intermittently. Each row is now one append. - E2E: scenarios 25-27 (Perplexity wire shape, untrusted and trusted project rules). The harness's warm skill index never matched a new scenario home, so every scenario rescanned every skill root; it now carries its paths into each home and refreshes after every run. The startup and regression suites, which hold the index builder's lease to test indexing, start cold on purpose (warm_skills=False).
1 parent 45f02cd commit eb3c65f

44 files changed

Lines changed: 1221 additions & 2508 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎Cargo.lock‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "nur-cli"
3-
version = "0.43.0"
3+
version = "0.43.1"
44
edition = "2021"
55
description = "NurCLI - fully loaded multi-provider coding agent (TUI, inline kitty/sixel vision, tools, sandbox, TypeSafe/Jev typed judgments with local engines, Graphify/PLUR/Ruflo/Executor + sc-research whitehat pack + historical SC vuln library)."
66
license = "GPL-3.0-or-later"

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ The harness supersedes stale duplicate reads, spills large tool results, preserv
1717
</p>
1818

1919
<p align="center">
20-
<a href="https://www.nuroctane.xyz/cli#demo"><img src="docs/assets/nur-demo.webp" alt="NurCLI demo: an approval with its inline diff, live theme previews in 3D, and the 65-provider login vault" width="760"></a>
20+
<a href="https://www.nuroctane.xyz/cli#demo"><img src="https://www.nuroctane.xyz/assets/nur-demo-poster.jpg" alt="NurCLI demo: the gold TUI with its live sidegraph, an inline diff and the fixed calc suite" width="760"></a>
2121
<br>
2222
<sub><a href="https://www.nuroctane.xyz/cli#demo">Watch the full demo</a></sub>
2323
</p>

‎docs/assets/nur-demo.webp‎

-4.88 MB
Binary file not shown.

‎docs/commands.md‎

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,24 @@ nur plugins uninstall <id>
273273

274274
In the TUI, bare **`/plugins`** opens the full marketplace picker (provider-picker UX).
275275

276+
### `nur permissions`
277+
278+
Show the allow/deny/ask rules in force in this directory, or decide whether this
279+
project's own rules may approve tool calls.
280+
281+
```bash
282+
nur permissions # same as `nur permissions show`
283+
nur permissions trust # apply this project's .nur/permissions.toml allow rules
284+
nur permissions untrust # hold them again
285+
```
286+
287+
A project's `.nur/permissions.toml` arrives with the repository, so its `deny`
288+
and `ask` rules always apply but its `allow` rules stay off until you trust them.
289+
Trust covers the list as it is now: if a later commit edits it, nur holds it
290+
again and says so at startup (`nur run` prints the note to stderr).
291+
292+
---
293+
276294
### `nur doctor`
277295

278296
Diagnose install, auth, config, ecosystem, and plugin marketplace readiness.
@@ -521,7 +539,7 @@ Type these inside the `nur` TUI. Aliases are shown in the same row.
521539
| `/todos` | Show the session task list |
522540
| `/init` | Generate a `NUR.md` project guide |
523541
| `/config` | Show config + data paths |
524-
| `/permissions` | Show or reload allow/deny/ask rules |
542+
| `/permissions` | Show or reload allow/deny/ask rules; `trust` / `untrust` this project's allow rules |
525543
| `/hooks` | Show local tool hook status |
526544
| `/feedback` | File a GitHub issue from here |
527545
| `/bug` | Report an issue (GitHub link) |

‎docs/configuration.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,13 @@ tool behavior because tool support depends on the selected model template.
267267

268268
Optional file: **`~/.nur/permissions.toml`** (and/or project **`.nur/permissions.toml`** - both are merged).
269269

270+
A project file comes with the repository, so it can only tighten on its own: its
271+
`deny` and `ask` rules apply at once, while its `allow` rules are held until you
272+
trust that exact list with `/permissions trust` or `nur permissions trust`. An
273+
edit to the list (a `git pull`, say) holds it again, and nur tells you at
274+
startup what the project asks to auto-approve. Trust is recorded per directory
275+
in `~/.nur/trusted-permissions.json`; `/permissions untrust` withdraws it.
276+
270277
```toml
271278
# Patterns: "tool" or "tool:glob" (* = any sequence)
272279
# Order: deny > ask > allow > mode default
@@ -283,7 +290,7 @@ allow = ["bash:git status*", "bash:cargo test*"]
283290
| **ask** | Force an approval prompt (even in auto) |
284291
| **allow** | Skip approval in manual (plan structural blocks still win) |
285292

286-
Reload without restart: `/permissions reload`.
293+
Reload without restart: `/permissions reload`. `/cd` reloads them for the new directory.
287294

288295
---
289296

‎docs/providers.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ capability for this exact Nur route/model, so Nur must treat it as unverified.
6262
| `nebius` - Nebius Token Factory | `NEBIUS_API_KEY`; `https://api.tokenfactory.nebius.com/v1`; CC; `Qwen/Qwen3.5-397B-A17B-fast` | [Nebius Token Factory](https://docs.nebius.ai/foundation-models/) | Verify compatibility features for the selected endpoint/model. | Create a Nebius API key. |
6363
| `sambanova` - SambaNova | `SAMBANOVA_API_KEY`; `https://api.sambanova.ai/v1`; CC; `Meta-Llama-3.3-70B-Instruct` | [SambaNova Cloud API](https://docs.sambanova.ai/cloud/docs/get-started/overview) | Not established publicly for full tools/usage conformance. | Create a SambaNova key. |
6464
| `nvidia` - NVIDIA NIM | `NVIDIA_API_KEY`; `https://integrate.api.nvidia.com/v1`; CC; `meta/llama-3.3-70b-instruct` | [NVIDIA API catalog](https://docs.api.nvidia.com/) | Tool/stream/usage is model-specific. | Create an NVIDIA API key. |
65-
| `perplexity` - Perplexity | `PERPLEXITY_API_KEY`; `https://api.perplexity.ai`; CC; `sonar-pro` | [Perplexity API](https://docs.perplexity.ai/) | Verify tool semantics versus Sonar's own web-grounding behavior. | Create a Perplexity API key. |
65+
| `perplexity` - Perplexity | `PERPLEXITY_API_KEY`; `https://api.perplexity.ai/v1`; R (Agent API); `perplexity/sonar` | [Agent API](https://docs.perplexity.ai/docs/agent-api/quickstart) | Sonar's Chat Completions endpoint was retired on 2026-09-27. The Agent API takes `provider/model` ids (`perplexity/sonar`, `anthropic/...`, `openai/...`, `google/...`, `xai/...`) and a narrower Responses schema; nur fits each request to it (no replayed reasoning, text-only assistant turns, image URLs up to 2048 characters). Perplexity's hosted `web_search` tool is not enabled; nur's own web tools are offered instead. | Create a Perplexity API key. |
6666
| `baseten` - Baseten | `BASETEN_API_KEY`; `https://inference.baseten.co/v1`; CC; `deepseek-ai/DeepSeek-V3-0324` | [Baseten API](https://docs.baseten.co/) | Not established publicly for full OpenAI-tool conformance. | Create a Baseten API key. |
6767
| `friendli` - Friendli | `FRIENDLI_TOKEN`; `https://api.friendli.ai/serverless/v1`; CC; `Qwen/Qwen3-235B-A22B-Instruct-2507` | [Friendli API](https://docs.friendli.ai/) | Live serverless catalog and features can change; verify before use. | Use a Friendli token. |
6868
| `chutes` - Chutes | `CHUTES_API_TOKEN`; `https://llm.chutes.ai/v1`; CC; `deepseek-ai/DeepSeek-V3.2-TEE` | [Chutes API](https://docs.chutes.ai/) | Verify tools/stream/usage for the chosen chute. | Use a Chutes API token; this model requires its `-TEE` suffix. |

‎docs/security.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ NurCLI hardens shell execution by default:
4545
- **SSRF blocks**: web tools reject private-IP targets
4646
- **Atomic IO**: all writes to `~/.nur/` use atomic file operations (write-to-temp, rename)
4747
- **Session bak**: each session save copies the previous file to `*.json.bak` first
48-
- **Optional rules**: `permissions.toml` deny/ask/allow; plan mode still blocks code authoring / VCS. Rules hold for read-only tools too: a call a deny or ask rule names leaves the free parallel batch and takes the gated path
48+
- **Optional rules**: `permissions.toml` deny/ask/allow; plan mode still blocks code authoring / VCS. A project's own `.nur/permissions.toml` cannot loosen anything until you trust it: its deny/ask rules apply at once, its allow rules wait for `/permissions trust` (or `nur permissions trust`), and an edit to that list holds it again. Rules hold for read-only tools too: a call a deny or ask rule names leaves the free parallel batch and takes the gated path
4949
- **What the model reads, it sees**: as in Claude Code and Codex, file contents and tool output reach your provider verbatim, secrets included. nur never redacts tool results, because a rewritten key corrupts the config edits the model makes. To keep a file away from the model, deny it, e.g. `deny = ["read_file:*.env"]` in `~/.nur/permissions.toml`. Rules match a tool's primary argument (the path for file tools, the command for `bash`), so a repo-wide `grep` or a `cat` in `bash` can still surface the file; deny those patterns too if that matters. (nur's own spill files, context store and memory still refuse secret-shaped bodies.)
5050
- **Optional hooks**: `hooks.toml` pre/post tool shell (local only; you control the script)
5151
- **TypeSafe (Jev) guard**: the `typesafe` tool is declared read-only, so it runs without approval, and it refuses secret-shaped content in `state` / `query` / `candidates` before any request is sent. A loopback endpoint needs no key (local engine); a hosted endpoint needs `TYPESAFE_API_KEY`

‎docs/troubleshooting.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ repair or upgrade ecosystem components.
6363
**All green:**
6464

6565
```text
66-
nur doctor · v0.43.0
66+
nur doctor · v0.43.1
6767
6868
binary C:\Users\you\.local\bin\nur.exe
6969
config model=muse-spark-1.3 effort=high max_turns=∞ budget=∞$/∞tok (C:\Users\you\.nur\config.toml)

‎docs/tui.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ The note is appended to your persistent memory file and recalled automatically i
376376
| `/init` | Initialise project instructions (`NUR.md`) |
377377
| `/scan` | Map this codebase → local `.foglamp/scan.json`, then optionally publish to foglamp.dev. `/scan [focus]` centers the map. **Writes need manual/auto** (plan is lifted to auto). Ask only before **upload**, not before the local file. |
378378
| `/config` | Show config + data paths |
379-
| `/permissions` | Show or reload allow/deny/ask rules (`permissions.toml`) |
379+
| `/permissions` | Show or reload allow/deny/ask rules (`permissions.toml`); `trust` / `untrust` this project's allow rules |
380380
| `/hooks` | Local tool hook status (`hooks.toml`) |
381381
| `/doctor` | Inline health check: version · auth · ecosystem · shell · budgets |
382382
| `/help` | Show keys + commands reference |

0 commit comments

Comments
 (0)