airlok 0.8.2 → 0.9.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 +33 -1
- package/README.md +12 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,11 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to airlok. The format follows Keep a Changelog; versions follow SemVer.
|
|
4
4
|
|
|
5
|
+
## [0.9.1] - 2026-09-13
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- `[provider] api`, settable per model as `[models."<id>"] api`, choosing which OpenAI HTTP API to speak. `"chat"` is the default and is unchanged. On `"responses"` the conversation is sent as input items, a tool call and its result are top-level items joined by `call_id`, the system prompt is sent as `instructions`, and the reasoning effort is an object rather than a string, which is what lets a deployment keep tools and a reasoning effort at the same time.
|
|
10
|
+
- `airlok doctor --offline`, and `/doctor --offline` in a session, which skips the provider request, the one check that leaves the machine, and reports it as skipped rather than dropping the line.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- A reasoning effort rejected by the provider now says when the value came from `/effort` and how to put it back, instead of suggesting an edit to a config that already says the right thing. `/effort` also warns when raising the effort on a model whose config pins it to `none`, which is where a deployment starts refusing tools.
|
|
15
|
+
- The argument hint no longer offers the first candidate before anything is typed, so `/goal` no longer reads as an offer to complete to `/goal clear`.
|
|
16
|
+
|
|
17
|
+
## [0.9.0] - 2026-09-13
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- `/status`: version, provider, model and effort, session id and turn count, cwd and git branch, the configuration files in effect, the MCP servers with whether each is connected, and redaction counts by class. Names, counts and sources only; no value from the key or the redaction map can reach it.
|
|
22
|
+
- `/context`: where the context window is going, as a bar per part for the system prompt, context block, history, tool results and tool schemas, with how near compaction is. The parts are counted the way the request estimator counts them and the total is their sum, so the breakdown always adds up.
|
|
23
|
+
- `/doctor`, and `airlok doctor` as a subcommand that exits non-zero on failure so it works in CI. Seven checks: the config files, whether the key resolves, a minimal live request, every MCP server, git, the terminal, and write access to the session and trust directories.
|
|
24
|
+
- `/diff`: what airlok changed on disk this session, diffed from what was there before its first write, using the same renderer and paging as a write confirmation. `/diff <path>` narrows to one file. Sessions now record the files `write_file` and `edit_file` touched, with the original content kept under a one megabyte budget; past it a file is reported as changed rather than shown with a misleading diff.
|
|
25
|
+
- `/copy`: the last reply to the clipboard through pbcopy, wl-copy, xclip or xsel. `/copy <n>` takes the Nth from the end and `/copy code` the last fenced block. With no clipboard program it says which ones it tried.
|
|
26
|
+
- `/permissions`: view and change what airlok asks about for the session, including both bash lists, and `/permissions save` to write them into the project config after showing a diff. Removing a deny entry says what it did rather than quietly emptying the list.
|
|
27
|
+
- `/init`: propose an AIRLOK.md built from the repository, as a diff to approve. Build and test commands come from the marker files that are actually present, and an existing CLAUDE.md or AGENTS.md is carried over.
|
|
28
|
+
- `/btw <question>`: a side question answered with the project and conversation as context but no tools. Neither the question nor the answer joins the history; one note is kept, as an assistant message so it is not counted as a turn.
|
|
29
|
+
- `/goal <statement>`: what the session is working toward. It goes into the system prompt every turn with an instruction to say when it is met, shows in the footer, and survives `--resume`. `/goal` shows it and `/goal clear` removes it.
|
|
30
|
+
- Tab completes the arguments of the new commands, as it does for `/model` and `/provider`.
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- The renderer wraps to the terminal's current width rather than the width it had when the run started. It re-measures each turn and on SIGWINCH, so a window resized mid-session takes effect on the next block instead of leaving the terminal to wrap over-long lines mid-line.
|
|
35
|
+
- The status line is sized to the terminal the same way, instead of keeping the width it was built with.
|
|
36
|
+
|
|
5
37
|
## [0.8.2] - 2026-09-12
|
|
6
38
|
|
|
7
39
|
### Added
|
|
8
40
|
|
|
9
|
-
- `/effort` shows the reasoning effort in force for the model in use and where it came from: the per-model config, this session, or the provider's own default. `/effort <value>` sets it for the rest of the session, using the same picker and the same did-you-mean question as `/model`, offering what the provider accepts (`none`, `minimal`, `low`, `medium`, `high`). The value is recorded in the session, so `--resume` keeps it, and on resume the session's value wins over the config file for the model
|
|
41
|
+
- `/effort` shows the reasoning effort in force for the model in use and where it came from: the per-model config, this session, or the provider's own default. `/effort <value>` sets it for the rest of the session, using the same picker and the same did-you-mean question as `/model`, offering what the provider accepts (`none`, `minimal`, `low`, `medium`, `high`). The value is recorded in the session, so `--resume` keeps it, and on resume the session's value wins over the config file for the model the session last used. Only the openai provider sends a reasoning effort, so on anthropic the command says so rather than offering a list.
|
|
10
42
|
- Tab completes `/effort` arguments, alongside `/model` and `/provider`.
|
|
11
43
|
|
|
12
44
|
### Changed
|
package/README.md
CHANGED
|
@@ -87,6 +87,15 @@ A cancelled turn keeps the text streamed so far in the history, marked as interr
|
|
|
87
87
|
| `/compact` | summarise older turns to free context |
|
|
88
88
|
| `/config` | the effective configuration |
|
|
89
89
|
| `/redactions` | what was redacted before leaving this machine (kind and length only) |
|
|
90
|
+
| `/status` | version, provider, model and effort, session and turn count, cwd and branch, config files in effect, MCP servers, redaction counts. Names and counts only, never a value |
|
|
91
|
+
| `/context` | where the context window is going, part by part, and how near compaction is |
|
|
92
|
+
| `/btw <question>` | a side question: same model, no tools, and neither it nor the answer joins the task's history |
|
|
93
|
+
| `/permissions [<name> <value>]` | what airlok asks about, and change one for the session; `/permissions save` writes them to the project config after showing a diff |
|
|
94
|
+
| `/init` | propose an AIRLOK.md for this repository, as a diff to approve |
|
|
95
|
+
| `/copy [<n>\|code]` | copy the last reply to the clipboard; a number takes the Nth from the end, `code` the last fenced block |
|
|
96
|
+
| `/diff [<path>]` | what airlok changed on disk this session, diffed from before its first write |
|
|
97
|
+
| `/doctor` | check the config, key, provider, MCP servers, git, terminal and storage; `airlok doctor` does the same and exits non-zero on failure. `--offline` skips the provider request, the one check that leaves the machine |
|
|
98
|
+
| `/goal [<statement>\|clear]` | what the session is working toward, kept in the system prompt every turn and shown in the footer |
|
|
90
99
|
| `/clear` | start a new session; the current one stays saved |
|
|
91
100
|
| `/exit` | save and quit; `/quit` works too |
|
|
92
101
|
|
|
@@ -245,6 +254,7 @@ model = "claude-sonnet-4-6" # per provider: anthropic "claude-sonnet-4-6", ope
|
|
|
245
254
|
# base_url = "https://api.openai.com/v1" # openai only; Azure: "https://<resource>.openai.azure.com/openai/v1"
|
|
246
255
|
# api_key_env = "ANTHROPIC_API_KEY" # env var holding the key
|
|
247
256
|
# api_key_cmd = "..." # shell command whose stdout is the key
|
|
257
|
+
# api = "chat" # openai only: "chat" (the default) or "responses"
|
|
248
258
|
context_window = 200000 # input tokens the model accepts; used to decide when to compact
|
|
249
259
|
|
|
250
260
|
[agent]
|
|
@@ -268,6 +278,7 @@ show_secrets_in_output = false # show secrets from files in full in the termin
|
|
|
268
278
|
|
|
269
279
|
[models."gpt-6-astra"] # settings for one model id (the deployment name on Azure); none by default
|
|
270
280
|
reasoning_effort = "none" # openai only, sent as reasoning_effort; not validated
|
|
281
|
+
api = "responses" # openai only, overrides [provider] api for this model
|
|
271
282
|
```
|
|
272
283
|
|
|
273
284
|
For openai, `base_url` falls back to the `OPENAI_BASE_URL` environment variable when the config does not set it.
|
|
@@ -290,7 +301,7 @@ base_url = "https://<resource>.openai.azure.com/openai/v1"
|
|
|
290
301
|
api_key_cmd = "az cognitiveservices account keys list -n <resource> -g <resource-group> --query key1 -o tsv"
|
|
291
302
|
```
|
|
292
303
|
|
|
293
|
-
Azure's `gpt-6-astra` accepts tools on Chat Completions only with reasoning off, so it needs `[models."gpt-6-astra"]` with `reasoning_effort = "none"`.
|
|
304
|
+
Azure's `gpt-6-astra` accepts tools on Chat Completions only with reasoning off, so on that API it needs `[models."gpt-6-astra"]` with `reasoning_effort = "none"`. Giving the model `api = "responses"` instead keeps both the tools and the reasoning effort, which is what makes `/effort` worth using there. With neither, airlok shows the provider's error and names the setting behind it. The entry applies however the model is chosen, `/model gpt-6-astra` included.
|
|
294
305
|
|
|
295
306
|
With this in the user config, plain `airlok "..."` works. The key is sent in Azure's `api-key` header, chosen from the host. No shell wrapper or exported variable is needed.
|
|
296
307
|
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"hasInstallScript": true,
|
|
20
20
|
"license": "MIT OR Apache-2.0",
|
|
21
21
|
"name": "airlok",
|
|
22
|
-
"version": "0.
|
|
22
|
+
"version": "0.9.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.
|
|
51
|
+
"version": "0.9.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.
|
|
3
|
+
"https://github.com/airlok-dev/airlok/releases/download/v0.9.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.
|
|
63
|
+
"version": "0.9.1",
|
|
64
64
|
"volta": {
|
|
65
65
|
"node": "18.14.1",
|
|
66
66
|
"npm": "9.5.0"
|