airlok 0.7.0 → 0.8.1

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 CHANGED
@@ -2,6 +2,30 @@
2
2
 
3
3
  All notable changes to airlok. The format follows Keep a Changelog; versions follow SemVer.
4
4
 
5
+ ## [0.8.1] - 2026-09-12
6
+
7
+ ### Added
8
+
9
+ - `/model` with no id opens a picker: the models airlok knows here, with arrows, type to filter, Enter to take one and Esc to leave everything alone. The list is the model in use, any named in `[models."<id>"]`, the ones used earlier in the run, and the ones saved sessions used on this provider. `/provider` with no name picks the same way, and `/model <id>` still switches directly.
10
+ - Tab completes a slash command's argument, not only its name. Commands say what their arguments could be, and `/model` and `/provider` are the first two.
11
+
12
+ ### Changed
13
+
14
+ - Switching to a model id airlok has not seen says so, names the nearest ids it knows, and asks whether to use the typed one anyway. An exact match is still taken as given, and the typed id is always offered first, so pressing Enter never quietly selects a near match. Before this, an unknown id was accepted and the provider rejected it a turn later.
15
+ - A provider that refuses a request is reported as one sentence naming the likely cause and what to change, for a missing model or deployment, a rejected key, rate limiting, and a request longer than the model's context. The raw body moved to the debug log, where `-v` shows it, and the session stays open as before.
16
+
17
+ ## [0.8.0] - 2026-09-12
18
+
19
+ ### Changed
20
+
21
+ - A server from the project's own `.mcp.json` no longer starts until this checkout has been asked about it. On first sight of one, or of a definition that changed since the last answer, airlok lists the servers and the commands they would run and asks once; the answer is recorded per repository in `.airlok/`, which is gitignored. Until then the server is pending and nothing is started. This is a behaviour change: a project file that used to start servers on the first turn now waits for an answer. Servers from the user file, the local file, or a `[[mcp]]` block are unaffected.
22
+ - `airlok mcp list` shows a pending server and what it would run, and listing never approves anything. `airlok mcp call` refuses a server this repository has not approved.
23
+
24
+ ### Added
25
+
26
+ - `airlok mcp reset-project-choices` forgets the answer, so the next run asks again.
27
+ - `airlok mcp add-json <name> '<json>'` writes a server from an entry pasted as JSON, which is how one is usually shared.
28
+
5
29
  ## [0.7.0] - 2026-09-12
6
30
 
7
31
  ### Changed
package/README.md CHANGED
@@ -52,13 +52,17 @@ While a turn runs, a status line below the output shows a spinner, what airlok i
52
52
  |---|---|
53
53
  | Enter | send the line |
54
54
  | Alt+Enter | start a new line in the same message. Shift+Enter does the same in terminals that send Esc then Enter for it; most send a plain Enter |
55
- | Tab | take the first `/` command or `@` path on offer; Tab again cycles through the rest |
55
+ | Tab | take the first `/` command, `@` path, or command argument on offer; Tab again cycles through the rest |
56
56
  | Right arrow | take the rest of the `/` command shown after the cursor |
57
57
  | Esc or Ctrl-C | during a turn, cancel it |
58
58
  | Ctrl-C | at the prompt, clear the line; on an empty line it does nothing |
59
59
  | Ctrl-D | save and quit |
60
60
  | Ctrl-R | search this run's history; Up and Down step through it |
61
61
 
62
+ The models airlok offers are the one in use, any named in `[models."<id>"]`, the ones used earlier in this run, and the ones saved sessions here used on this provider. Tab completes from that list after `/model `, and from the two provider names after `/provider `. Switching to an id from that list is taken as given; anything else is read back with the nearest known ids and a question, since a model id that only fails on the next turn is a poor way to learn it was a typo.
63
+
64
+ A provider that refuses a request is reported as a sentence naming the likely cause: a model or deployment that does not exist, a key the provider rejected, rate limiting, or a request longer than the model's context. The raw body goes to the debug log, so `-v` still has it, and the session stays open either way.
65
+
62
66
  A cancelled turn keeps the text streamed so far in the history, marked as interrupted; tool calls that had not run are dropped, and you get the prompt back. Keys typed while a turn runs are kept and start the next prompt.
63
67
 
64
68
  | Input | What it does |
@@ -71,11 +75,11 @@ A cancelled turn keeps the text streamed so far in the history, marked as interr
71
75
  | Command | What it does |
72
76
  |---|---|
73
77
  | `/help` | list the commands |
74
- | `/model [<id>]` | show the model, or use `<id>` for the rest of the session; not validated, the provider rejects a bad id on the next turn |
78
+ | `/model [<id>]` | with no id, pick from the models airlok knows here: arrows, type to filter, Enter, Esc. With an id, switch to it; an id airlok has not seen is questioned rather than taken |
75
79
  | `/mcp` | list the MCP servers and their tools; `/mcp <name>` enables a disabled one for this session |
76
80
  | `/plan` | turn plan mode on or off |
77
81
  | `/go` | carry out the plan from plan mode, back in normal mode |
78
- | `/provider [<name>]` | show the provider, or switch to `anthropic` or `openai` if a key is available for it; says which key is missing otherwise |
82
+ | `/provider [<name>]` | with no name, pick between `anthropic` and `openai`; with one, switch if a key is available for it, and say which key is missing otherwise |
79
83
  | `/cost` | tokens used so far, and whether they are estimates |
80
84
  | `/compact` | summarise older turns to free context |
81
85
  | `/config` | the effective configuration |
@@ -142,6 +146,8 @@ Three files are read, each winning over the one above it. A server named in more
142
146
  | project | `./.mcp.json` | the project's servers, meant to be committed |
143
147
  | local | `./.airlok/mcp.json` | your own overrides, gitignored |
144
148
 
149
+ A `.mcp.json` arrives with a clone, so a project-scoped server starts only once this checkout has been asked about it. On first sight of one, or of a definition that changed since the last answer, airlok lists the servers and the commands they would run and asks once. The answer is recorded in `.airlok/`, per repository and gitignored. Until then the server shows as pending in `airlok mcp list` and nothing is started, and listing never counts as approving. `airlok mcp reset-project-choices` forgets the answer so the next run asks again. Servers from your own user file, your local file, or a `[[mcp]]` block are not gated: you wrote those.
150
+
145
151
  `${VAR}` and `${VAR:-default}` expand from the environment in `command`, `args`, `env`, `url`, and `headers`. A variable that is unset or empty with no default is an error naming it, rather than an empty string that fails later in a way nobody can read. For a secret, prefer `env_cmd` and `header_cmd`, which take the value from a command's stdout: nothing is written in the file, and nothing has to sit in your environment where every other process can read it.
146
152
 
147
153
  Managing them:
@@ -150,6 +156,8 @@ Managing them:
150
156
  |---|---|
151
157
  | `airlok mcp list` | every server, its scope, whether it answers, and its tools |
152
158
  | `airlok mcp add <name> --scope user -- npx -y server-filesystem .` | write a stdio server; `--url` with `--transport http` for an http one |
159
+ | `airlok mcp add-json <name> '<json>'` | write a server from an entry pasted as JSON |
160
+ | `airlok mcp reset-project-choices` | forget whether this repository's own `.mcp.json` servers may start |
153
161
  | `airlok mcp get <name>` | the resolved entry and which file it came from |
154
162
  | `airlok mcp remove <name> [--scope ...]` | take it out again |
155
163
  | `airlok mcp import <path>` | merge another tool's `mcpServers` file into a scope |
@@ -19,7 +19,7 @@
19
19
  "hasInstallScript": true,
20
20
  "license": "MIT OR Apache-2.0",
21
21
  "name": "airlok",
22
- "version": "0.7.0"
22
+ "version": "0.8.1"
23
23
  },
24
24
  "node_modules/detect-libc": {
25
25
  "engines": {
@@ -48,5 +48,5 @@
48
48
  }
49
49
  },
50
50
  "requires": true,
51
- "version": "0.7.0"
51
+ "version": "0.8.1"
52
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "artifactDownloadUrls": [
3
- "https://github.com/airlok-dev/airlok/releases/download/v0.7.0"
3
+ "https://github.com/airlok-dev/airlok/releases/download/v0.8.1"
4
4
  ],
5
5
  "bin": {
6
6
  "airlok": "run-airlok.js"
@@ -60,7 +60,7 @@
60
60
  "zipExt": ".tar.xz"
61
61
  }
62
62
  },
63
- "version": "0.7.0",
63
+ "version": "0.8.1",
64
64
  "volta": {
65
65
  "node": "18.14.1",
66
66
  "npm": "9.5.0"