@kontextmind/kxm 0.7.162 → 0.7.164
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +13 -0
- package/docs/contributing/harness-routing-internals.md +28 -27
- package/docs/reference/harness-routing.md +17 -15
- package/package.json +1 -1
- package/plugins/kxm/.claude-plugin/plugin.json +1 -1
- package/plugins/kxm/dist/mcp-server.js +1 -1
- package/plugins/kxm/package.json +1 -1
- package/plugins/kxm/src/mcp-server.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -156,6 +156,19 @@ All notable user-facing changes are documented here. The project follows [Semant
|
|
|
156
156
|
|
|
157
157
|
### Changed
|
|
158
158
|
|
|
159
|
+
- **The checked-in price catalog and model inventory match the live OpenRouter and Nous feeds.**
|
|
160
|
+
`.kxm/prices.yaml` is dated 2026-09-28. It adds `xai/grok-4.7` (alias
|
|
161
|
+
`x-ai/grok-4.7`) at $1.60 input and $4.80 output per 1M tokens, with cache
|
|
162
|
+
read $0.40. `openrouter/z-ai/glm-5.3-flash` moves from $0.09 / $0.30 to
|
|
163
|
+
$0.15 / $0.50 (cache read $0.03); the anchored `zai-coding-cn/glm-5.3-flash`
|
|
164
|
+
row moves with it. `qwen-token-plan/deepseek-v4.1-flash` (alias
|
|
165
|
+
`deepseek/deepseek-v4.1-flash`) moves from $0.15 / $0.60 to $0.014 / $0.40
|
|
166
|
+
(cache read $0.004) because the routing docs still name that selector.
|
|
167
|
+
`xai/grok-4.6` stays: its base rate still matches the live catalog, and code
|
|
168
|
+
and tests still name it. `.kxm/models/inventory.yaml` was refreshed with
|
|
169
|
+
`kxm models inventory-refresh`. Pi, Grok, and agy were not installed for that
|
|
170
|
+
fetch, so models that exist only in those CLIs remain the 2026-09-16 rows.
|
|
171
|
+
|
|
159
172
|
- **Windows pull-request unit lanes finish inside the job limit.** The light
|
|
160
173
|
lane on `windows-latest` was cancelled at 20 minutes on #361, #362, and
|
|
161
174
|
#363 after it stopped reporting tests. `package-install.test.ts` (171s on
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# Harness routing internals
|
|
2
2
|
|
|
3
|
-
This page records how the KXM repository applies [harness routing](../reference/harness-routing.md) to its own work: the routes this checkout admits, its writer roster, its price catalog, and the developer roster policy that `just assign` and the dev helper enforce. It is maintainer material. The
|
|
3
|
+
This page records how the KXM repository applies [harness routing](../reference/harness-routing.md) to its own work: the routes this checkout admits, its writer roster, its price catalog, and the developer roster policy that `just assign` and the dev helper enforce. It is maintainer material. The route and roster transcripts below were regenerated on 2026-09-28 from this checkout, where `node scripts/kxm.mjs` is the same program as `kxm`. Readiness notes that name a capture machine are from 2026-09-23 and were not re-probed. The transcripts change whenever an admission changes.
|
|
4
4
|
|
|
5
5
|
> [!IMPORTANT]
|
|
6
6
|
> The files are the authority, not this page: `.kxm/routes.yaml`, `.kxm/roles/*.yaml`, `.kxm/models/*.yaml`, and `.kxm/prices.yaml`. Product routing decisions are recorded under Tracking → Decided in `plans/implementation-plan.md`.
|
|
7
7
|
|
|
8
8
|
## Current ids (2026-09-27)
|
|
9
9
|
|
|
10
|
-
The
|
|
10
|
+
The files use one id shape per kind. A route id is `<harness>-<model-slug>[-<provider>]`, with `.` written as `-`. An agent id equals its role. A workflow id is `default`, `land`, or `<role>-only`. An agent step id equals that role.
|
|
11
11
|
|
|
12
12
|
This checkout's routes are `grok-grok-4-7`, `pi-qwen3-coder-plus-openrouter`, `agy-gemini-3-8-flash-high`, `agy-gemini-3-8-flash-medium`, `claude-fable`, `codex-gpt-5-6-sol`, `pi-qwen3-8-flash-openrouter`, and `pi-glm-5-3-flash-openrouter`. Agents are `planner`, `writer`, `reviewer-arch`, and `reviewer-cli`. `opus-claude` was removed because `opus` is not an admitted selector. `qwen-token-plan/*` and `zai-coding-cn/*` left the admitted list because those harnesses are not allowlisted; their `prices.yaml` rows stay. Old ids resolve as aliases. Every roster entry names an effort. `reviewer-arch` dispatches `claude-fable`. #343's architecture critic ran on opus because the justfile recipe review-arch hardcoded that model; the role file on that commit listed only `fable-claude`. The helper now refuses `opus`.
|
|
13
13
|
|
|
@@ -18,26 +18,22 @@ This checkout's routes are `grok-grok-4-7`, `pi-qwen3-coder-plus-openrouter`, `a
|
|
|
18
18
|
```text
|
|
19
19
|
schema: kxm.role.v2
|
|
20
20
|
id: writer
|
|
21
|
-
|
|
21
|
+
purpose: writer
|
|
22
|
+
permission: edit
|
|
23
|
+
description: Primary implementation agent.
|
|
22
24
|
skills: []
|
|
23
25
|
roster:
|
|
24
|
-
-
|
|
26
|
+
- route: grok-grok-4-7
|
|
25
27
|
effort: medium
|
|
26
|
-
|
|
27
|
-
- model: openrouter/qwen/qwen3-coder-plus
|
|
28
|
+
- route: pi-qwen3-coder-plus-openrouter
|
|
28
29
|
effort: medium
|
|
29
|
-
|
|
30
|
-
- model: zai-coding-cn/glm-5.3-flash
|
|
30
|
+
- route: agy-gemini-3-8-flash-high
|
|
31
31
|
effort: medium
|
|
32
|
-
|
|
33
|
-
- model: qwen-token-plan/qwen3.8-flash
|
|
32
|
+
- route: agy-gemini-3-8-flash-medium
|
|
34
33
|
effort: medium
|
|
35
|
-
enabled: true
|
|
36
|
-
- model: google/gemini-3.8-flash-high
|
|
37
|
-
enabled: true
|
|
38
34
|
```
|
|
39
35
|
|
|
40
|
-
The
|
|
36
|
+
The writer role lists route ids, in order: `grok-grok-4-7`, then `pi-qwen3-coder-plus-openrouter`, then `agy-gemini-3-8-flash-high` and `agy-gemini-3-8-flash-medium`. `grok-grok-4-7` is harness `grok`, model `grok-4.7`, vendor `xai`. An agent file does not declare `harness:`.
|
|
41
37
|
|
|
42
38
|
`node scripts/kxm.mjs routes list`:
|
|
43
39
|
|
|
@@ -49,12 +45,17 @@ admitted openai/gpt-5.6-sol
|
|
|
49
45
|
admitted openrouter/qwen/qwen3-coder-plus
|
|
50
46
|
admitted openrouter/qwen/qwen3.8-flash
|
|
51
47
|
admitted openrouter/z-ai/glm-5.3-flash
|
|
52
|
-
admitted
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
48
|
+
admitted xai/grok-4.7
|
|
49
|
+
planner claude-fable
|
|
50
|
+
planner pi-qwen3-8-flash-openrouter
|
|
51
|
+
reviewer-arch claude-fable
|
|
52
|
+
reviewer-arch pi-glm-5-3-flash-openrouter
|
|
53
|
+
reviewer-cli codex-gpt-5-6-sol
|
|
54
|
+
reviewer-cli pi-qwen3-8-flash-openrouter
|
|
55
|
+
writer grok-grok-4-7
|
|
56
|
+
writer pi-qwen3-coder-plus-openrouter
|
|
57
|
+
writer agy-gemini-3-8-flash-high
|
|
58
|
+
writer agy-gemini-3-8-flash-medium
|
|
58
59
|
```
|
|
59
60
|
|
|
60
61
|
`routes admit --model openrouter/qwen/qwen3-coder-plus --dry-run` exits 2 with `select a model from the refreshed inventory` even though that selector is already admitted, because the inventory never carries `openrouter/…` selectors. Selectors like these are admitted by a Git-reviewed edit of `.kxm/routes.yaml`.
|
|
@@ -63,7 +64,7 @@ On the capture machine, `kxm harness list` showed `claude` detected but logged o
|
|
|
63
64
|
|
|
64
65
|
### Price catalog and inventory
|
|
65
66
|
|
|
66
|
-
`.kxm/prices.yaml` is dated `2026-09-
|
|
67
|
+
`.kxm/prices.yaml` is dated `2026-09-28`. A run on that date can record a list estimate. Any other day records `providerMetadata.priceCatalogStale: true` and no list estimate. The list prices below come from `.kxm/models/inventory.yaml`. OpenRouter and Nous were fetched at `2026-09-28T14:02:09.052Z`. `pi`, `grok`, and `agy` were not installed for that refresh, so models that exist only in those CLIs are still the 2026-09-16 rows. Prices are USD per 1M tokens. The checkout has no routing records yet, so none of the examples has recorded latency; for latency, run a bounded side-by-side experiment and compare p50 and p95 in `kxm routing report`.
|
|
67
68
|
|
|
68
69
|
## The developer roster
|
|
69
70
|
|
|
@@ -108,15 +109,15 @@ The product brake, the dev helper and the roster policy now agree on the vendor
|
|
|
108
109
|
|
|
109
110
|
These extend the generic examples on the reference page with this checkout's admissions, developer policy routes, readiness on the capture machine, and inventory prices.
|
|
110
111
|
|
|
111
|
-
### Grok 4.
|
|
112
|
+
### Grok 4.7
|
|
112
113
|
|
|
113
114
|
| | Native `grok` | Pi + OpenRouter |
|
|
114
115
|
|---|---|---|
|
|
115
|
-
| Selector | `xai/grok-4.
|
|
116
|
+
| Selector | `xai/grok-4.7`: admitted, and first in the writer roster | `openrouter/x-ai/grok-4.7`: not admitted |
|
|
116
117
|
| Developer roster | `grok-grok-4-7`, the writer route with `edit` | Refused: `native vendor cannot use Pi` |
|
|
117
|
-
| Readiness | `grok`
|
|
118
|
-
| Billing | grok.com subscription (OAuth) | $
|
|
119
|
-
| Context |
|
|
118
|
+
| Readiness | `grok` showed auth `yes` on the 2026-09-23 capture machine | `pi auth check --provider openrouter` returned `not_ready` on that capture |
|
|
119
|
+
| Billing | grok.com subscription (OAuth) | $1.60 input, $4.80 output, $0.40 cached input |
|
|
120
|
+
| Context | 500,000 (`x-ai/grok-4.7` in the refreshed inventory) | 500,000 |
|
|
120
121
|
|
|
121
122
|
Pi's own `xai` provider reported `ready` (OAuth) on the capture machine. When the grok quota runs out, the next writer in the lineup is `pi-qwen3-coder-plus-openrouter`, a different vendor.
|
|
122
123
|
|
|
@@ -147,7 +148,7 @@ In the inventory, `openai/gpt-5.6-sol` has sources `openrouter+nous` and carries
|
|
|
147
148
|
|
|
148
149
|
| | Native `agy` | `antigravity` Pi provider | Pi + OpenRouter |
|
|
149
150
|
|---|---|---|---|
|
|
150
|
-
| Selector | `google/gemini-3.8-flash-high`: admitted, last
|
|
151
|
+
| Selector | `google/gemini-3.8-flash-high` and `google/gemini-3.8-flash-medium`: admitted, the last two writer routes | `antigravity/gemini-3.8-flash`: not admitted | `openrouter/google/gemini-3.8-flash`: not admitted |
|
|
151
152
|
| Billing | Google subscription | Google subscription | $0.75 input, $3.75 output, $0.075 cached input |
|
|
152
153
|
| Context | `agy` does not print it; the vendored catalog lists 1,048,576 | 1,048,576 | 1,048,576 |
|
|
153
154
|
|
|
@@ -131,11 +131,11 @@ This is the same vendor through Pi and OpenRouter, which the brake refuses:
|
|
|
131
131
|
|
|
132
132
|
```yaml
|
|
133
133
|
harness: pi
|
|
134
|
-
model: openrouter/x-ai/grok-4.
|
|
134
|
+
model: openrouter/x-ai/grok-4.7
|
|
135
135
|
vendor: xai
|
|
136
136
|
```
|
|
137
137
|
|
|
138
|
-
The selector is `openrouter/x-ai/grok-4.
|
|
138
|
+
The selector is `openrouter/x-ai/grok-4.7` and the harness is `pi`. The Pi brake refuses it before Pi starts, because the vendor segment `x-ai` is xAI, which has a native harness. A vendor with no native harness runs in the same shape: with `model: openrouter/qwen/qwen3-coder-plus`, Pi is spawned with `--model openrouter/qwen/qwen3-coder-plus`, its read-only flags (section 3) and `-p --mode json`. Write `model` exactly as the provider names it. For OpenRouter that is the vendor slug, so `x-ai`, not `xai`.
|
|
139
139
|
|
|
140
140
|
The harness and the selector have to agree. Pi refuses `provider: xai` and `openrouter/x-ai/…`. `grok` refuses `provider: openrouter`. [What the brake refuses](#what-the-brake-refuses) has the exact messages.
|
|
141
141
|
|
|
@@ -156,7 +156,9 @@ roster:
|
|
|
156
156
|
- route: pi-qwen3-coder-plus-openrouter
|
|
157
157
|
effort: medium
|
|
158
158
|
- route: agy-gemini-3-8-flash-high
|
|
159
|
+
effort: medium
|
|
159
160
|
- route: agy-gemini-3-8-flash-medium
|
|
161
|
+
effort: medium
|
|
160
162
|
```
|
|
161
163
|
|
|
162
164
|
`grok-grok-4-7` resolves to `.kxm/models/grok-grok-4-7.yaml`: harness `grok`, model `grok-4.7`, vendor `xai`, status `admitted`, permission `edit`. `pi-qwen3-coder-plus-openrouter` is harness `pi`, model `openrouter/qwen/qwen3-coder-plus`, vendor `alibaba`. `agy-gemini-3-8-flash-high` is harness `agy`, model `gemini-3.8-flash-high`, vendor `google`. `kxm role list` prints the first route id as the primary, for example `(grok-grok-4-7)`. The previous ids (`grok-native`, `qwen-openrouter-pi`, `gemini-agy`) are aliases.
|
|
@@ -171,8 +173,8 @@ Role files are what `kxm role` and the Runtime membership check use.
|
|
|
171
173
|
|
|
172
174
|
```text
|
|
173
175
|
admitted openrouter/qwen/qwen3-coder-plus
|
|
174
|
-
admitted xai/grok-4.
|
|
175
|
-
disabled openrouter/x-ai/grok-4.
|
|
176
|
+
admitted xai/grok-4.7
|
|
177
|
+
disabled openrouter/x-ai/grok-4.7
|
|
176
178
|
```
|
|
177
179
|
|
|
178
180
|
The first segment of an id is the provider, and the rest is the model id. A route id does not name a harness. The first segment tells you which harness can run it. For an aggregator, the next segment names the vendor, and the Pi brake reads that too:
|
|
@@ -205,11 +207,11 @@ select a model from the refreshed inventory
|
|
|
205
207
|
It exits with code 2. A bare OpenRouter slug is accepted, but it is not a dispatchable selector:
|
|
206
208
|
|
|
207
209
|
```bash
|
|
208
|
-
kxm routes admit --model x-ai/grok-4.
|
|
210
|
+
kxm routes admit --model x-ai/grok-4.7 --dry-run
|
|
209
211
|
```
|
|
210
212
|
|
|
211
213
|
```text
|
|
212
|
-
would admit x-ai/grok-4.
|
|
214
|
+
would admit x-ai/grok-4.7
|
|
213
215
|
```
|
|
214
216
|
|
|
215
217
|
If that id were admitted, an agent would need `provider: x-ai`. Pi has no provider called `x-ai`, so the Pi auth probe would fail closed. When a route needs a provider prefix that the inventory does not carry, admit it by a Git-reviewed edit of `.kxm/routes.yaml`, after the admission decision is reviewed.
|
|
@@ -218,13 +220,13 @@ If that id were admitted, an agent would need `provider: x-ai`. Pi has no provid
|
|
|
218
220
|
|
|
219
221
|
The same model shows up under different ids depending on the file:
|
|
220
222
|
|
|
221
|
-
| Where | Id for Grok 4.
|
|
223
|
+
| Where | Id for Grok 4.7 | What that id means |
|
|
222
224
|
|---|---|---|
|
|
223
|
-
| `.kxm/routes.yaml`, agent selector | `xai/grok-4.
|
|
224
|
-
| `.kxm/routes.yaml`, agent selector | `openrouter/x-ai/grok-4.
|
|
225
|
-
| `.kxm/models/inventory.yaml`, source `pi` | `xai/grok-4.6` | Pi's own `xai` provider. The brake refuses it. |
|
|
226
|
-
| `.kxm/models/inventory.yaml`, source `openrouter` | `x-ai/grok-4.
|
|
227
|
-
| `.kxm/prices.yaml` | `id: xai/grok-4.
|
|
225
|
+
| `.kxm/routes.yaml`, agent selector | `xai/grok-4.7` | Provider `xai`. Needs `harness: grok`. |
|
|
226
|
+
| `.kxm/routes.yaml`, agent selector | `openrouter/x-ai/grok-4.7` | OpenRouter through Pi. The brake refuses it. |
|
|
227
|
+
| `.kxm/models/inventory.yaml`, source `pi` | `xai/grok-4.6` | Pi's own `xai` provider from the last `pi --list-models` capture. The brake refuses it. This refresh did not re-run Pi, and that capture has no `xai/grok-4.7` row. |
|
|
228
|
+
| `.kxm/models/inventory.yaml`, source `openrouter` | `x-ai/grok-4.7` | The OpenRouter catalog slug. The inventory stores OpenRouter ids without an `openrouter/` prefix. |
|
|
229
|
+
| `.kxm/prices.yaml` | `id: xai/grok-4.7`, `provider: xai`, alias `x-ai/grok-4.7` | A list price that applies only to provider `xai`, because price lookup filters by provider. `xai/grok-4.6` remains a separate row. |
|
|
228
230
|
|
|
229
231
|
An inventory id can also mean something else in `.kxm/routes.yaml`. For example, the inventory can list `openai/gpt-5.6-sol` from the OpenRouter feed with OpenRouter prices, while in `.kxm/routes.yaml` the same string means provider `openai` through native `codex`.
|
|
230
232
|
|
|
@@ -341,12 +343,12 @@ The live one-shot producer runs every harness read-only, with a 120-second proce
|
|
|
341
343
|
|
|
342
344
|
The Runtime does not run a step live when it has `write` access to a repository; it hands the run off with `step_unsupported`. Only Pi runs as a long-lived worker.
|
|
343
345
|
|
|
344
|
-
### Grok 4.
|
|
346
|
+
### Grok 4.7
|
|
345
347
|
|
|
346
348
|
| | Native `grok` | Pi + OpenRouter |
|
|
347
349
|
|---|---|---|
|
|
348
|
-
| Model file | `harness: grok`, `model: grok-4.
|
|
349
|
-
| Selector | `xai/grok-4.
|
|
350
|
+
| Model file | `harness: grok`, `model: grok-4.7`, `vendor: xai` | `harness: pi`, `model: openrouter/x-ai/grok-4.7`, `vendor: xai` |
|
|
351
|
+
| Selector | `xai/grok-4.7` | `openrouter/x-ai/grok-4.7` |
|
|
350
352
|
| Billing | grok.com subscription (OAuth) | OpenRouter credit |
|
|
351
353
|
| Recorded `costBasis` | `unknown` | None: the brake refuses it before dispatch |
|
|
352
354
|
| Mode | One-shot `grok --single`. Not a worker. | Refused as a one-shot and as a worker model |
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "kxm",
|
|
4
4
|
"displayName": "KXM",
|
|
5
|
-
"version": "0.7.
|
|
5
|
+
"version": "0.7.164",
|
|
6
6
|
"description": "Headless multi-agent orchestration, durable workflows, and a live operator dashboard for Pi and Claude Code",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "KontextMind",
|
|
@@ -17313,7 +17313,7 @@ function sessionTokenFixHint(policy) {
|
|
|
17313
17313
|
}
|
|
17314
17314
|
|
|
17315
17315
|
// plugins/kxm/src/mcp-server.ts
|
|
17316
|
-
var VERSION = "0.7.
|
|
17316
|
+
var VERSION = "0.7.164";
|
|
17317
17317
|
var CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
|
|
17318
17318
|
var inbox = /* @__PURE__ */ new Map();
|
|
17319
17319
|
var notifiedInbox = /* @__PURE__ */ new Set();
|
package/plugins/kxm/package.json
CHANGED
|
@@ -11,7 +11,7 @@ import { deliverInboxNotification } from "./inbox.ts";
|
|
|
11
11
|
import type { HubEvent, MessageRecord } from "./protocol.ts";
|
|
12
12
|
import { sessionTokenFixHint } from "./session-token-hint.ts";
|
|
13
13
|
|
|
14
|
-
const VERSION = "0.7.
|
|
14
|
+
const VERSION = "0.7.164";
|
|
15
15
|
const CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
|
|
16
16
|
const inbox = new Map<string, MessageRecord>();
|
|
17
17
|
const notifiedInbox = new Set<string>();
|