@kontextmind/kxm 0.7.182 → 0.7.184
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/.kxm/roles/writer.yaml +8 -1
- package/CHANGELOG.md +13 -0
- package/docs/contributing/assignment-runner.md +1 -1
- package/docs/contributing/harness-routing-internals.md +18 -10
- package/docs/reference/cli-reference.md +8 -4
- package/docs/reference/config-reference.md +1 -1
- package/docs/reference/harness-routing.md +8 -2
- package/package.json +10 -10
- package/plugins/kxm/.claude-plugin/plugin.json +1 -1
- package/plugins/kxm/dist/cli.js +98 -8
- package/plugins/kxm/dist/extension.js +21 -5
- package/plugins/kxm/dist/mcp-server.js +1 -1
- package/plugins/kxm/dist/runtime-supervisor.js +1 -1
- package/plugins/kxm/dist/runtime.js +1 -1
- package/plugins/kxm/dist/server.js +1 -1
- package/plugins/kxm/package.json +1 -1
- package/plugins/kxm/src/mcp-server.ts +1 -1
- package/plugins/kxm/src/model-inventory.ts +1 -1
- package/plugins/kxm/src/workforce-names.mjs +1 -1
- package/scripts/harness-run.mjs +3 -0
package/.kxm/roles/writer.yaml
CHANGED
|
@@ -4,12 +4,19 @@ purpose: writer
|
|
|
4
4
|
permission: edit
|
|
5
5
|
description: Primary implementation agent.
|
|
6
6
|
# Rotation priority = order. Effort default: medium for implementation.
|
|
7
|
+
# Argon needs a paid Google AI Pro, Ultra, or Enterprise plan. agy -p exits
|
|
8
|
+
# when a pinned model is unavailable, so Flash medium stays as the safety net.
|
|
9
|
+
# Flash high stays last so that admitted model file remains on a roster.
|
|
7
10
|
roster:
|
|
8
11
|
- route: grok-grok-4-7
|
|
9
12
|
effort: medium
|
|
10
13
|
- route: pi-qwen3-coder-plus-openrouter
|
|
11
14
|
effort: medium
|
|
12
|
-
- route: agy-gemini-
|
|
15
|
+
- route: agy-gemini-4-argon-high
|
|
16
|
+
effort: medium
|
|
17
|
+
- route: agy-gemini-4-argon-medium
|
|
13
18
|
effort: medium
|
|
14
19
|
- route: agy-gemini-3-8-flash-medium
|
|
15
20
|
effort: medium
|
|
21
|
+
- route: agy-gemini-3-8-flash-high
|
|
22
|
+
effort: medium
|
package/CHANGELOG.md
CHANGED
|
@@ -216,6 +216,19 @@ All notable user-facing changes are documented here. The project follows [Semant
|
|
|
216
216
|
|
|
217
217
|
### Changed
|
|
218
218
|
|
|
219
|
+
- **The writer rotation's agy routes are Gemini 4 Argon.** `agy-gemini-4-argon-high`
|
|
220
|
+
(alias `gemini-agy`) and `agy-gemini-4-argon-medium` are writer #3 and #4.
|
|
221
|
+
`agy-gemini-3-8-flash-medium` stays #5 because Argon needs a paid Google AI
|
|
222
|
+
Pro, Ultra, or Enterprise plan and `agy -p` exits when the pinned model is
|
|
223
|
+
missing. `agy-gemini-3-8-flash-high` stays #6 so that admitted model file
|
|
224
|
+
remains on a roster. `.kxm/routes.yaml` admits `google/gemini-4-argon-high`
|
|
225
|
+
and `google/gemini-4-argon-medium`. `.kxm/prices.yaml` is dated 2026-10-17
|
|
226
|
+
and follows the live OpenRouter list, including Argon at $2 / $10 per 1M
|
|
227
|
+
tokens through 2026-11-30 ($4 / $20 after that). `.kxm/models/inventory.yaml`
|
|
228
|
+
was refreshed from OpenRouter and Nous. Pi, Grok, and agy were not installed,
|
|
229
|
+
so CLI-only rows stay, and the new agy Argon and Claude 5.5 rows were added
|
|
230
|
+
by hand.
|
|
231
|
+
|
|
219
232
|
- **`kxm update --kxm` defaults to npm.** Missing or source-less `update.yaml` now
|
|
220
233
|
uses the public `@kontextmind/kxm` package instead of the GitHub release tarball.
|
|
221
234
|
`source: github` still selects the digest-checked tarball. When the working
|
|
@@ -34,7 +34,7 @@ admits each route for specific roles and permissions:
|
|
|
34
34
|
|
|
35
35
|
| Role | Admitted route (harness / model) | Vendor | Permission |
|
|
36
36
|
|---|---|---|---|
|
|
37
|
-
| `writer` | `grok` / `grok-4.7`; relief: `pi` / `openrouter/qwen/qwen3-coder-plus`; `agy` / `gemini-3.8-flash-high` | `xai`; `alibaba`; `google` | `edit` |
|
|
37
|
+
| `writer` | `grok` / `grok-4.7`; relief: `pi` / `openrouter/qwen/qwen3-coder-plus`; `agy` / `gemini-4-argon-high`, then `gemini-4-argon-medium`, then `gemini-3.8-flash-medium`, then `gemini-3.8-flash-high` | `xai`; `alibaba`; `google` | `edit` |
|
|
38
38
|
| `planner` | `claude` / `fable` | `anthropic` | `read-only` |
|
|
39
39
|
| `reviewer-arch` | `claude` / `fable` | `anthropic` | `read-only` |
|
|
40
40
|
| `reviewer-cli` | `codex` / `gpt-5.6-sol` | `openai` | `read-only` |
|
|
@@ -1,6 +1,6 @@
|
|
|
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 route and roster transcripts below were regenerated on 2026-
|
|
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-10-17 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`.
|
|
@@ -9,7 +9,7 @@ This page records how the KXM repository applies [harness routing](../reference/
|
|
|
9
9
|
|
|
10
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
|
-
This checkout's routes are `grok-grok-4-7`, `pi-qwen3-coder-plus-openrouter`, `agy-gemini-3-8-flash-
|
|
12
|
+
This checkout's routes are `grok-grok-4-7`, `pi-qwen3-coder-plus-openrouter`, `agy-gemini-4-argon-high`, `agy-gemini-4-argon-medium`, `agy-gemini-3-8-flash-medium`, `agy-gemini-3-8-flash-high`, `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
|
|
|
14
14
|
## This checkout's routes and roster
|
|
15
15
|
|
|
@@ -27,13 +27,17 @@ roster:
|
|
|
27
27
|
effort: medium
|
|
28
28
|
- route: pi-qwen3-coder-plus-openrouter
|
|
29
29
|
effort: medium
|
|
30
|
-
- route: agy-gemini-
|
|
30
|
+
- route: agy-gemini-4-argon-high
|
|
31
|
+
effort: medium
|
|
32
|
+
- route: agy-gemini-4-argon-medium
|
|
31
33
|
effort: medium
|
|
32
34
|
- route: agy-gemini-3-8-flash-medium
|
|
33
35
|
effort: medium
|
|
36
|
+
- route: agy-gemini-3-8-flash-high
|
|
37
|
+
effort: medium
|
|
34
38
|
```
|
|
35
39
|
|
|
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-
|
|
40
|
+
The writer role lists route ids, in order: `grok-grok-4-7`, then `pi-qwen3-coder-plus-openrouter`, then `agy-gemini-4-argon-high`, `agy-gemini-4-argon-medium`, `agy-gemini-3-8-flash-medium`, and `agy-gemini-3-8-flash-high`. `grok-grok-4-7` is harness `grok`, model `grok-4.7`, vendor `xai`. An agent file does not declare `harness:`. Argon is writer #3 and #4. Flash medium is the safety net because Argon needs a paid Google AI Pro, Ultra, or Enterprise plan and `agy -p` exits when the pinned model is missing. Flash high stays on the roster so that admitted model file is still used. Planner and reviewer primaries stay `claude-fable` and `codex-gpt-5-6-sol`. Argon can serve as a planner or architecture-review fallback; it is not on those rosters.
|
|
37
41
|
|
|
38
42
|
`node scripts/kxm.mjs routes list`:
|
|
39
43
|
|
|
@@ -41,6 +45,8 @@ The writer role lists route ids, in order: `grok-grok-4-7`, then `pi-qwen3-coder
|
|
|
41
45
|
admitted anthropic/fable
|
|
42
46
|
admitted google/gemini-3.8-flash-high
|
|
43
47
|
admitted google/gemini-3.8-flash-medium
|
|
48
|
+
admitted google/gemini-4-argon-high
|
|
49
|
+
admitted google/gemini-4-argon-medium
|
|
44
50
|
admitted openai/gpt-5.6-sol
|
|
45
51
|
admitted openrouter/qwen/qwen3-coder-plus
|
|
46
52
|
admitted openrouter/qwen/qwen3.8-flash
|
|
@@ -54,8 +60,10 @@ reviewer-cli codex-gpt-5-6-sol
|
|
|
54
60
|
reviewer-cli pi-qwen3-8-flash-openrouter
|
|
55
61
|
writer grok-grok-4-7
|
|
56
62
|
writer pi-qwen3-coder-plus-openrouter
|
|
57
|
-
writer agy-gemini-
|
|
63
|
+
writer agy-gemini-4-argon-high
|
|
64
|
+
writer agy-gemini-4-argon-medium
|
|
58
65
|
writer agy-gemini-3-8-flash-medium
|
|
66
|
+
writer agy-gemini-3-8-flash-high
|
|
59
67
|
```
|
|
60
68
|
|
|
61
69
|
`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`.
|
|
@@ -64,7 +72,7 @@ On the capture machine, `kxm harness list` showed `claude` detected but logged o
|
|
|
64
72
|
|
|
65
73
|
### Price catalog and inventory
|
|
66
74
|
|
|
67
|
-
`.kxm/prices.yaml` is dated `2026-
|
|
75
|
+
`.kxm/prices.yaml` is dated `2026-10-17`. 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-10-17T13:45:00.000Z`. `pi`, `grok`, and `agy` were not installed for that refresh, so models that exist only in those CLIs stay, including the previous `agy` rows, and the Gemini 4 Argon and Claude 5.5 `agy` rows were added by hand from `agy models`. 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`.
|
|
68
76
|
|
|
69
77
|
## The developer roster
|
|
70
78
|
|
|
@@ -116,7 +124,7 @@ These extend the generic examples on the reference page with this checkout's adm
|
|
|
116
124
|
| Selector | `xai/grok-4.7`: admitted, and first in the writer roster | `openrouter/x-ai/grok-4.7`: not admitted |
|
|
117
125
|
| Developer roster | `grok-grok-4-7`, the writer route with `edit` | Refused: `native vendor cannot use Pi` |
|
|
118
126
|
| 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) | $
|
|
127
|
+
| Billing | grok.com subscription (OAuth) | $2.00 input, $6.00 output, $0.50 cached input |
|
|
120
128
|
| Context | 500,000 (`x-ai/grok-4.7` in the refreshed inventory) | 500,000 |
|
|
121
129
|
|
|
122
130
|
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.
|
|
@@ -127,7 +135,7 @@ Pi's own `xai` provider reported `ready` (OAuth) on the capture machine. When th
|
|
|
127
135
|
|---|---|---|
|
|
128
136
|
| Selector | `openai/gpt-5.6-sol`: admitted, the CLI critic | `openrouter/openai/gpt-5.6-sol`: not admitted |
|
|
129
137
|
| Developer roster | `codex-gpt-5-6-sol`: `reviewer-cli`, `read-only` | Refused |
|
|
130
|
-
| Billing | ChatGPT subscription | $
|
|
138
|
+
| Billing | ChatGPT subscription | $4.00 input, $20.00 output, $0.40 cached input |
|
|
131
139
|
| Context | Pi's `openai-codex` row, the same ChatGPT backend, lists 272K | 1,050,000 |
|
|
132
140
|
|
|
133
141
|
In the inventory, `openai/gpt-5.6-sol` has sources `openrouter+nous` and carries OpenRouter prices. `pi auth check --provider openai-codex` reported `ready` on the capture machine.
|
|
@@ -148,8 +156,8 @@ In the inventory, `openai/gpt-5.6-sol` has sources `openrouter+nous` and carries
|
|
|
148
156
|
|
|
149
157
|
| | Native `agy` | `antigravity` Pi provider | Pi + OpenRouter |
|
|
150
158
|
|---|---|---|---|
|
|
151
|
-
| Selector | `google/gemini-3.8-flash-
|
|
152
|
-
| Billing | Google subscription | Google subscription | $0.
|
|
159
|
+
| Selector | `google/gemini-3.8-flash-medium` and `google/gemini-3.8-flash-high`: admitted, writer #5 and #6. Writer #3 and #4 are `google/gemini-4-argon-high` and `google/gemini-4-argon-medium` | `antigravity/gemini-3.8-flash`: not admitted | `openrouter/google/gemini-3.8-flash`: not admitted |
|
|
160
|
+
| Billing | Google subscription | Google subscription | $0.825 input, $4.125 output, $0.0825 cached input |
|
|
153
161
|
| Context | `agy` does not print it; the vendored catalog lists 1,048,576 | 1,048,576 | 1,048,576 |
|
|
154
162
|
|
|
155
163
|
The admitted runtime route today is the `agy` selector.
|
|
@@ -1153,6 +1153,8 @@ kxm routes list
|
|
|
1153
1153
|
admitted anthropic/fable
|
|
1154
1154
|
admitted google/gemini-3.8-flash-high
|
|
1155
1155
|
admitted google/gemini-3.8-flash-medium
|
|
1156
|
+
admitted google/gemini-4-argon-high
|
|
1157
|
+
admitted google/gemini-4-argon-medium
|
|
1156
1158
|
admitted openai/gpt-5.6-sol
|
|
1157
1159
|
admitted openrouter/qwen/qwen3-coder-plus
|
|
1158
1160
|
admitted openrouter/qwen/qwen3.8-flash
|
|
@@ -1166,8 +1168,10 @@ reviewer-cli codex-gpt-5-6-sol
|
|
|
1166
1168
|
reviewer-cli pi-qwen3-8-flash-openrouter
|
|
1167
1169
|
writer grok-grok-4-7
|
|
1168
1170
|
writer pi-qwen3-coder-plus-openrouter
|
|
1169
|
-
writer agy-gemini-
|
|
1171
|
+
writer agy-gemini-4-argon-high
|
|
1172
|
+
writer agy-gemini-4-argon-medium
|
|
1170
1173
|
writer agy-gemini-3-8-flash-medium
|
|
1174
|
+
writer agy-gemini-3-8-flash-high
|
|
1171
1175
|
```
|
|
1172
1176
|
|
|
1173
1177
|
```bash
|
|
@@ -1175,7 +1179,7 @@ kxm routes list --json
|
|
|
1175
1179
|
```
|
|
1176
1180
|
|
|
1177
1181
|
```text
|
|
1178
|
-
{"schema":"kxm.cli-result.v1","ok":true,"command":"routes list","policy":{"schema":"kxm.routes.v2","updatedAt":"2026-
|
|
1182
|
+
{"schema":"kxm.cli-result.v1","ok":true,"command":"routes list","policy":{"schema":"kxm.routes.v2","updatedAt":"2026-10-17T00:00:00.000Z","admitted":["anthropic/fable","google/gemini-3.8-flash-high","google/gemini-3.8-flash-medium","google/gemini-4-argon-high","google/gemini-4-argon-medium","openai/gpt-5.6-sol","openrouter/qwen/qwen3-coder-plus","openrouter/qwen/qwen3.8-flash","openrouter/z-ai/glm-5.3-flash","xai/grok-4.7"],"disabled":[]},"membership":["planner claude-fable","planner pi-qwen3-8-flash-openrouter","reviewer-arch claude-fable","reviewer-arch pi-glm-5-3-flash-openrouter","reviewer-cli codex-gpt-5-6-sol","reviewer-cli pi-qwen3-8-flash-openrouter","writer grok-grok-4-7","writer pi-qwen3-coder-plus-openrouter","writer agy-gemini-4-argon-high","writer agy-gemini-4-argon-medium","writer agy-gemini-3-8-flash-medium","writer agy-gemini-3-8-flash-high"]}
|
|
1179
1183
|
```
|
|
1180
1184
|
|
|
1181
1185
|
### `kxm routes count`
|
|
@@ -1380,7 +1384,7 @@ kxm role get writer --json
|
|
|
1380
1384
|
```
|
|
1381
1385
|
|
|
1382
1386
|
```text
|
|
1383
|
-
{"schema":"kxm.cli-result.v1","ok":true,"command":"role get","roleId":"writer","scope":"local","filePath":"/work/kxm/.kxm/roles/writer.yaml","role":{"schema":"kxm.role.v2","id":"writer","purpose":"writer","permission":"edit","description":"Primary implementation agent.","skills":[],"roster":[{"route":"grok-grok-4-7","effort":"medium"},{"route":"pi-qwen3-coder-plus-openrouter","effort":"medium"},{"route":"agy-gemini-3-8-flash-
|
|
1387
|
+
{"schema":"kxm.cli-result.v1","ok":true,"command":"role get","roleId":"writer","scope":"local","filePath":"/work/kxm/.kxm/roles/writer.yaml","role":{"schema":"kxm.role.v2","id":"writer","purpose":"writer","permission":"edit","description":"Primary implementation agent.","skills":[],"roster":[{"route":"grok-grok-4-7","effort":"medium"},{"route":"pi-qwen3-coder-plus-openrouter","effort":"medium"},{"route":"agy-gemini-4-argon-high","effort":"medium"},{"route":"agy-gemini-4-argon-medium","effort":"medium"},{"route":"agy-gemini-3-8-flash-medium","effort":"medium"},{"route":"agy-gemini-3-8-flash-high","effort":"medium"}]}}
|
|
1384
1388
|
```
|
|
1385
1389
|
|
|
1386
1390
|
Captured from this checkout with `node scripts/kxm.mjs role get writer --json`. The path is shortened to `/work/kxm`.
|
|
@@ -1390,7 +1394,7 @@ kxm role modify writer --add-skill kxm --dry-run --json
|
|
|
1390
1394
|
```
|
|
1391
1395
|
|
|
1392
1396
|
```text
|
|
1393
|
-
{"schema":"kxm.cli-result.v1","ok":true,"command":"role modify","roleId":"writer","id":"writer","role":{"schema":"kxm.role.v2","id":"writer","purpose":"writer","permission":"edit","description":"Primary implementation agent.","skills":["kxm"],"roster":[{"route":"grok-grok-4-7","effort":"medium"},{"route":"pi-qwen3-coder-plus-openrouter","effort":"medium"},{"route":"agy-gemini-3-8-flash-
|
|
1397
|
+
{"schema":"kxm.cli-result.v1","ok":true,"command":"role modify","roleId":"writer","id":"writer","role":{"schema":"kxm.role.v2","id":"writer","purpose":"writer","permission":"edit","description":"Primary implementation agent.","skills":["kxm"],"roster":[{"route":"grok-grok-4-7","effort":"medium"},{"route":"pi-qwen3-coder-plus-openrouter","effort":"medium"},{"route":"agy-gemini-4-argon-high","effort":"medium"},{"route":"agy-gemini-4-argon-medium","effort":"medium"},{"route":"agy-gemini-3-8-flash-medium","effort":"medium"},{"route":"agy-gemini-3-8-flash-high","effort":"medium"}]},"filePath":"/work/kxm/.kxm/roles/writer.yaml","scope":"local","dryRun":true,"planned":[{"action":"write","target":"/work/kxm/.kxm/roles/writer.yaml"}]}
|
|
1394
1398
|
```
|
|
1395
1399
|
|
|
1396
1400
|
Add an existing route to a role's roster (Not run):
|
|
@@ -1089,7 +1089,7 @@ routes:
|
|
|
1089
1089
|
permissions: [read-only]
|
|
1090
1090
|
status: admitted
|
|
1091
1091
|
lineup: # routes admitted for each role, preference order
|
|
1092
|
-
writer: [grok-grok-4-7, pi-qwen3-coder-plus-openrouter, agy-gemini-3-8-flash-
|
|
1092
|
+
writer: [grok-grok-4-7, pi-qwen3-coder-plus-openrouter, agy-gemini-4-argon-high, agy-gemini-4-argon-medium, agy-gemini-3-8-flash-medium, agy-gemini-3-8-flash-high]
|
|
1093
1093
|
planner: [claude-fable, pi-qwen3-8-flash-openrouter]
|
|
1094
1094
|
reviewer-arch: [claude-fable, pi-glm-5-3-flash-openrouter]
|
|
1095
1095
|
reviewer-cli: [codex-gpt-5-6-sol, pi-qwen3-8-flash-openrouter]
|
|
@@ -155,13 +155,17 @@ roster:
|
|
|
155
155
|
effort: medium
|
|
156
156
|
- route: pi-qwen3-coder-plus-openrouter
|
|
157
157
|
effort: medium
|
|
158
|
-
- route: agy-gemini-
|
|
158
|
+
- route: agy-gemini-4-argon-high
|
|
159
|
+
effort: medium
|
|
160
|
+
- route: agy-gemini-4-argon-medium
|
|
159
161
|
effort: medium
|
|
160
162
|
- route: agy-gemini-3-8-flash-medium
|
|
161
163
|
effort: medium
|
|
164
|
+
- route: agy-gemini-3-8-flash-high
|
|
165
|
+
effort: medium
|
|
162
166
|
```
|
|
163
167
|
|
|
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-
|
|
168
|
+
`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-4-argon-high` is harness `agy`, model `gemini-4-argon-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. `gemini-agy` resolves to `agy-gemini-4-argon-high`.
|
|
165
169
|
|
|
166
170
|
Dispatch resolves a step from the agent `role`, then `.kxm/roles/<role>.yaml`, then the selected `.kxm/models/<route>.yaml`. That model file carries `harness`, `model`, `vendor`, `status`, and `permissions`. The engine walks the roster in order and uses the first admitted route whose model file is readable. A missing or unreadable model file is a refusal (`roster_model_unreadable` at load, `producer_route_unsupported` at dispatch), not a skip to the next entry. A route file that names a harness the model cannot run on still fails closed with `harness_unhosted_model`.
|
|
167
171
|
|
|
@@ -411,6 +415,8 @@ A larger context window on the OpenRouter route does not make OpenRouter an allo
|
|
|
411
415
|
|
|
412
416
|
**Never OpenRouter for Gemini**, and the brake refuses it. The Runtime can run the `agy` selector today; section 4 explains why it cannot reach `antigravity/…`.
|
|
413
417
|
|
|
418
|
+
The writer rotation's `agy` routes are `agy-gemini-4-argon-high` (alias `gemini-agy`), `agy-gemini-4-argon-medium`, then `agy-gemini-3-8-flash-medium` as the safety net, then `agy-gemini-3-8-flash-high`. Argon is the only Gemini 4 model. `agy` pins it as `gemini-4-argon-high`, `-medium`, or `-low` (base `gemini-4-argon` with `--effort low|medium|high`). `agy -p` exits when a pinned model is not available. It does not fall through on its own, so Flash stays on the roster: Argon requires a paid Google AI Pro, Ultra, or Enterprise plan. The list price is $2 input and $10 output per 1M tokens through 2026-11-30, then $4 and $20. Batch is $1 and $5. Context is 1,048,576. Argon can also stand in as a planner or architecture-review fallback; those primaries stay `claude-fable`.
|
|
419
|
+
|
|
414
420
|
```bash
|
|
415
421
|
pi auth check --provider antigravity --json --no-refresh
|
|
416
422
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kontextmind/kxm",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.184",
|
|
4
4
|
"description": "KXM local-first multi-agent orchestration and operator dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "KontextMind",
|
|
@@ -77,9 +77,9 @@
|
|
|
77
77
|
]
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
|
-
"@anthropic-ai/claude-agent-sdk": "0.3.
|
|
81
|
-
"@earendil-works/pi-tui": "1.0
|
|
82
|
-
"@modelcontextprotocol/sdk": "1.32.
|
|
80
|
+
"@anthropic-ai/claude-agent-sdk": "0.3.296",
|
|
81
|
+
"@earendil-works/pi-tui": "1.1.0",
|
|
82
|
+
"@modelcontextprotocol/sdk": "1.32.1",
|
|
83
83
|
"yaml": "^2.9.0"
|
|
84
84
|
},
|
|
85
85
|
"peerDependencies": {
|
|
@@ -95,17 +95,17 @@
|
|
|
95
95
|
}
|
|
96
96
|
},
|
|
97
97
|
"devDependencies": {
|
|
98
|
-
"@earendil-works/pi-coding-agent": "1.0
|
|
99
|
-
"@modelcontextprotocol/sdk": "1.32.
|
|
100
|
-
"@playwright/test": "1.
|
|
101
|
-
"@types/node": "26.6.
|
|
98
|
+
"@earendil-works/pi-coding-agent": "1.1.0",
|
|
99
|
+
"@modelcontextprotocol/sdk": "1.32.1",
|
|
100
|
+
"@playwright/test": "1.64.0",
|
|
101
|
+
"@types/node": "26.6.5",
|
|
102
102
|
"ajv": "8.20.0",
|
|
103
103
|
"commander": "15.0.0",
|
|
104
104
|
"esbuild": "0.28.2",
|
|
105
105
|
"markdownlint-cli2": "0.23.3",
|
|
106
|
-
"nx": "23.
|
|
106
|
+
"nx": "23.3.0",
|
|
107
107
|
"tsx": "^4.23.13",
|
|
108
|
-
"typebox": "1.3.
|
|
108
|
+
"typebox": "1.3.36",
|
|
109
109
|
"typescript": "7.0.2"
|
|
110
110
|
},
|
|
111
111
|
"files": [
|
|
@@ -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.184",
|
|
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",
|
package/plugins/kxm/dist/cli.js
CHANGED
|
@@ -18615,7 +18615,7 @@ var init_workforce_names = __esm({
|
|
|
18615
18615
|
ROUTE_RENAMES = Object.freeze([
|
|
18616
18616
|
["grok-native", "grok-grok-4-7"],
|
|
18617
18617
|
["qwen-openrouter-pi", "pi-qwen3-coder-plus-openrouter"],
|
|
18618
|
-
["gemini-agy", "agy-gemini-
|
|
18618
|
+
["gemini-agy", "agy-gemini-4-argon-high"],
|
|
18619
18619
|
["fable-claude", "claude-fable"],
|
|
18620
18620
|
["sol-codex", "codex-gpt-5-6-sol"],
|
|
18621
18621
|
["grok-default", "grok-grok-4-6"],
|
|
@@ -28834,7 +28834,7 @@ async function refreshModelInventory(options) {
|
|
|
28834
28834
|
const parts = line.trim().split(/\s+/);
|
|
28835
28835
|
const id = source === "pi" && parts.length >= 2 && parts[0] !== "provider" ? `${parts[0]}/${parts[1]}` : parts[0];
|
|
28836
28836
|
if (id && /^[a-z0-9][a-z0-9._/-]+$/i.test(id) && id !== "Available") {
|
|
28837
|
-
const effortMatch = source === "agy" ? id.match(/-(low|medium|high)$/i) : null;
|
|
28837
|
+
const effortMatch = source === "agy" ? id.match(/-(low|medium|high|max)$/i) : null;
|
|
28838
28838
|
add({ id, ...effortMatch?.[1] ? { thinkingLevels: [effortMatch[1].toLowerCase()] } : {} }, source, "standard");
|
|
28839
28839
|
}
|
|
28840
28840
|
}
|
|
@@ -45242,6 +45242,9 @@ function detectCapabilitiesFromEnvironment(tmuxForwardsHyperlink) {
|
|
|
45242
45242
|
if (term.startsWith("screen")) {
|
|
45243
45243
|
return { images: null, trueColor: hasTrueColorHint, hyperlinks: false };
|
|
45244
45244
|
}
|
|
45245
|
+
if (termProgram === "herdr") {
|
|
45246
|
+
return { images: null, trueColor: hasTrueColorHint, hyperlinks: true };
|
|
45247
|
+
}
|
|
45245
45248
|
if (process.env.KITTY_WINDOW_ID || termProgram === "kitty") {
|
|
45246
45249
|
return { images: "kitty", trueColor: true, hyperlinks: true };
|
|
45247
45250
|
}
|
|
@@ -46397,6 +46400,10 @@ var Box = class {
|
|
|
46397
46400
|
setBgFn(bgFn) {
|
|
46398
46401
|
this.bgFn = bgFn;
|
|
46399
46402
|
}
|
|
46403
|
+
setPaddingX(paddingX) {
|
|
46404
|
+
this.paddingX = paddingX;
|
|
46405
|
+
this.invalidateCache();
|
|
46406
|
+
}
|
|
46400
46407
|
invalidateCache() {
|
|
46401
46408
|
this.cache = void 0;
|
|
46402
46409
|
}
|
|
@@ -46506,11 +46513,11 @@ var TUI_KEYBINDINGS = {
|
|
|
46506
46513
|
description: "Move cursor word right"
|
|
46507
46514
|
},
|
|
46508
46515
|
"tui.editor.cursorLineStart": {
|
|
46509
|
-
defaultKeys: ["home", "ctrl+
|
|
46516
|
+
defaultKeys: ["home", "ctrl+a"],
|
|
46510
46517
|
description: "Move to line start"
|
|
46511
46518
|
},
|
|
46512
46519
|
"tui.editor.cursorLineEnd": {
|
|
46513
|
-
defaultKeys: ["end", "ctrl+
|
|
46520
|
+
defaultKeys: ["end", "ctrl+e"],
|
|
46514
46521
|
description: "Move to line end"
|
|
46515
46522
|
},
|
|
46516
46523
|
"tui.editor.jumpForward": {
|
|
@@ -46615,8 +46622,8 @@ var TUI_KEYBINDINGS = {
|
|
|
46615
46622
|
defaultKeys: "escape",
|
|
46616
46623
|
description: "Close transcript search"
|
|
46617
46624
|
},
|
|
46618
|
-
"tui.altScreen.top": { defaultKeys: "home", description: "Scroll viewport to top" },
|
|
46619
|
-
"tui.altScreen.bottom": { defaultKeys: "end", description: "Scroll viewport to bottom" }
|
|
46625
|
+
"tui.altScreen.top": { defaultKeys: "ctrl+home", description: "Scroll viewport to top" },
|
|
46626
|
+
"tui.altScreen.bottom": { defaultKeys: "ctrl+end", description: "Scroll viewport to bottom" }
|
|
46620
46627
|
};
|
|
46621
46628
|
function normalizeKeys(keys) {
|
|
46622
46629
|
if (keys === void 0)
|
|
@@ -46737,6 +46744,10 @@ var Text = class {
|
|
|
46737
46744
|
this.cachedWidth = void 0;
|
|
46738
46745
|
this.cachedLines = void 0;
|
|
46739
46746
|
}
|
|
46747
|
+
setPaddingX(paddingX) {
|
|
46748
|
+
this.paddingX = paddingX;
|
|
46749
|
+
this.invalidate();
|
|
46750
|
+
}
|
|
46740
46751
|
invalidate() {
|
|
46741
46752
|
this.cachedText = void 0;
|
|
46742
46753
|
this.cachedWidth = void 0;
|
|
@@ -47850,6 +47861,40 @@ function getNativePlatformHelper() {
|
|
|
47850
47861
|
return loadNativePlatformHelper(process.platform);
|
|
47851
47862
|
}
|
|
47852
47863
|
|
|
47864
|
+
// node_modules/@earendil-works/pi-tui/dist/program-status.js
|
|
47865
|
+
var PROGRAM_STATUS_QUERY = "\x1B]7501;?\x1B\\";
|
|
47866
|
+
function isProgramStatusReply(sequence) {
|
|
47867
|
+
return /^\x1b\]7501;\?[^\x07\x1b]*(?:\x07|\x1b\\)$/.test(sequence);
|
|
47868
|
+
}
|
|
47869
|
+
var APP_PATTERN = /^[A-Za-z0-9_.+-]{1,32}$/;
|
|
47870
|
+
var CONTROL_CHARACTERS2 = /[\u0000-\u001f\u007f-\u009f]+/g;
|
|
47871
|
+
var MAX_MESSAGE_BYTES = 2048;
|
|
47872
|
+
function truncateUtf8(text, maxBytes) {
|
|
47873
|
+
if (Buffer.byteLength(text, "utf8") <= maxBytes)
|
|
47874
|
+
return text;
|
|
47875
|
+
let bytes = 0;
|
|
47876
|
+
let end = 0;
|
|
47877
|
+
for (const char of text) {
|
|
47878
|
+
const size = Buffer.byteLength(char, "utf8");
|
|
47879
|
+
if (bytes + size > maxBytes)
|
|
47880
|
+
break;
|
|
47881
|
+
bytes += size;
|
|
47882
|
+
end += char.length;
|
|
47883
|
+
}
|
|
47884
|
+
return text.slice(0, end);
|
|
47885
|
+
}
|
|
47886
|
+
function formatProgramStatus(status) {
|
|
47887
|
+
const pairs = [`state=${status.state}`];
|
|
47888
|
+
if (status.app !== void 0 && APP_PATTERN.test(status.app))
|
|
47889
|
+
pairs.push(`app=${status.app}`);
|
|
47890
|
+
if (status.state === "blocked" && status.kind)
|
|
47891
|
+
pairs.push(`kind=${status.kind}`);
|
|
47892
|
+
const message = truncateUtf8((status.message ?? "").replace(CONTROL_CHARACTERS2, " ").trim(), MAX_MESSAGE_BYTES);
|
|
47893
|
+
if (message)
|
|
47894
|
+
pairs.push(`msg=${Buffer.from(message, "utf8").toString("base64")}`);
|
|
47895
|
+
return `\x1B]7501;${pairs.join(":")}\x1B\\`;
|
|
47896
|
+
}
|
|
47897
|
+
|
|
47853
47898
|
// node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js
|
|
47854
47899
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
47855
47900
|
var ESC = "\x1B";
|
|
@@ -48151,7 +48196,8 @@ var TERMINAL_PROGRESS_CLEAR_SEQUENCE = "\x1B]9;4;0\x07";
|
|
|
48151
48196
|
var NATIVE_SHIFT_ENTER_SEQUENCE = "\x1B[13;2u";
|
|
48152
48197
|
var DESIRED_KITTY_KEYBOARD_PROTOCOL_FLAGS = 7;
|
|
48153
48198
|
var KEYBOARD_PROTOCOL_RESPONSE_FRAGMENT_TIMEOUT_MS = 150;
|
|
48154
|
-
var KITTY_KEYBOARD_PROTOCOL_QUERY = `\x1B[>${DESIRED_KITTY_KEYBOARD_PROTOCOL_FLAGS}u\x1B[?u
|
|
48199
|
+
var KITTY_KEYBOARD_PROTOCOL_QUERY = `\x1B[>${DESIRED_KITTY_KEYBOARD_PROTOCOL_FLAGS}u\x1B[?u`;
|
|
48200
|
+
var DEVICE_ATTRIBUTES_QUERY = "\x1B[c";
|
|
48155
48201
|
function parseKeyboardProtocolNegotiationSequence(sequence) {
|
|
48156
48202
|
const kittyFlags = sequence.match(/^\x1b\[\?(\d+)u$/);
|
|
48157
48203
|
if (kittyFlags) {
|
|
@@ -48207,6 +48253,12 @@ var ProcessTerminal = class {
|
|
|
48207
48253
|
stdinBuffer;
|
|
48208
48254
|
stdinDataHandler;
|
|
48209
48255
|
progressInterval;
|
|
48256
|
+
/** Latest program status, kept across stop() so start() can report it again. */
|
|
48257
|
+
programStatus;
|
|
48258
|
+
/** Whether the terminal confirmed OSC 7501 support since the last start(), or `PI_PROGRAM_STATUS=1`. */
|
|
48259
|
+
programStatusSupported = false;
|
|
48260
|
+
/** The support query was sent and its DA1 sentinel has not arrived yet. */
|
|
48261
|
+
programStatusQueryPending = false;
|
|
48210
48262
|
writeLogPath = (() => {
|
|
48211
48263
|
const env = process.env.PI_TUI_WRITE_LOG || "";
|
|
48212
48264
|
if (!env)
|
|
@@ -48253,6 +48305,14 @@ var ProcessTerminal = class {
|
|
|
48253
48305
|
setupStdinBuffer() {
|
|
48254
48306
|
this.stdinBuffer = new StdinBuffer({ escapeTimeout: resolveEscapeTimeoutMs() });
|
|
48255
48307
|
this.stdinBuffer.on("data", (sequence) => {
|
|
48308
|
+
if (isProgramStatusReply(sequence)) {
|
|
48309
|
+
if (this.programStatusQueryPending) {
|
|
48310
|
+
this.programStatusQueryPending = false;
|
|
48311
|
+
this.programStatusSupported = true;
|
|
48312
|
+
this.writeProgramStatus();
|
|
48313
|
+
}
|
|
48314
|
+
return;
|
|
48315
|
+
}
|
|
48256
48316
|
const negotiation = this.readKeyboardProtocolNegotiationSequence(sequence);
|
|
48257
48317
|
if (negotiation === "pending") {
|
|
48258
48318
|
this.scheduleKeyboardProtocolNegotiationBufferFlush();
|
|
@@ -48284,6 +48344,9 @@ var ProcessTerminal = class {
|
|
|
48284
48344
|
* - 1 = disambiguate escape codes
|
|
48285
48345
|
* - 2 = report event types (press/repeat/release)
|
|
48286
48346
|
* - 4 = report alternate keys (shifted key, base layout key)
|
|
48347
|
+
*
|
|
48348
|
+
* The OSC 7501 program status query shares the DA sentinel: a terminal that supports it replies
|
|
48349
|
+
* before DA. `PI_PROGRAM_STATUS=1` or `0` skips the query.
|
|
48287
48350
|
*/
|
|
48288
48351
|
queryAndEnableKittyProtocol() {
|
|
48289
48352
|
this.setupStdinBuffer();
|
|
@@ -48291,7 +48354,12 @@ var ProcessTerminal = class {
|
|
|
48291
48354
|
this.keyboardProtocolPushed = true;
|
|
48292
48355
|
this.pendingKeyboardProtocolDeviceAttributes += 1;
|
|
48293
48356
|
this.clearKeyboardProtocolNegotiationBuffer();
|
|
48294
|
-
process.
|
|
48357
|
+
const programStatusOverride = process.env.PI_PROGRAM_STATUS;
|
|
48358
|
+
this.programStatusSupported = programStatusOverride === "1";
|
|
48359
|
+
this.programStatusQueryPending = programStatusOverride !== "1" && programStatusOverride !== "0";
|
|
48360
|
+
const programStatusQuery = this.programStatusQueryPending ? PROGRAM_STATUS_QUERY : "";
|
|
48361
|
+
process.stdout.write(`${KITTY_KEYBOARD_PROTOCOL_QUERY}${programStatusQuery}${DEVICE_ATTRIBUTES_QUERY}`);
|
|
48362
|
+
this.writeProgramStatus();
|
|
48295
48363
|
}
|
|
48296
48364
|
handleKeyboardProtocolNegotiationSequence(negotiationSequence) {
|
|
48297
48365
|
this.clearKeyboardProtocolNegotiationBuffer();
|
|
@@ -48299,6 +48367,8 @@ var ProcessTerminal = class {
|
|
|
48299
48367
|
if (this.pendingKeyboardProtocolDeviceAttributes === 0)
|
|
48300
48368
|
return false;
|
|
48301
48369
|
this.pendingKeyboardProtocolDeviceAttributes -= 1;
|
|
48370
|
+
if (this.pendingKeyboardProtocolDeviceAttributes === 0)
|
|
48371
|
+
this.programStatusQueryPending = false;
|
|
48302
48372
|
}
|
|
48303
48373
|
if (negotiationSequence.type === "kitty-flags") {
|
|
48304
48374
|
if (negotiationSequence.flags !== 0) {
|
|
@@ -48440,6 +48510,11 @@ var ProcessTerminal = class {
|
|
|
48440
48510
|
if (this.clearProgressInterval()) {
|
|
48441
48511
|
process.stdout.write(TERMINAL_PROGRESS_CLEAR_SEQUENCE);
|
|
48442
48512
|
}
|
|
48513
|
+
if (this.programStatusSupported && this.programStatus) {
|
|
48514
|
+
process.stdout.write(formatProgramStatus({ state: "clear" }));
|
|
48515
|
+
}
|
|
48516
|
+
this.programStatusSupported = false;
|
|
48517
|
+
this.programStatusQueryPending = false;
|
|
48443
48518
|
process.stdout.write("\x1B[?2004l");
|
|
48444
48519
|
const shouldDisableKittyProtocol = this.keyboardProtocolPushed || this._kittyProtocolActive;
|
|
48445
48520
|
this.clearKeyboardProtocolNegotiationBuffer();
|
|
@@ -48508,6 +48583,16 @@ var ProcessTerminal = class {
|
|
|
48508
48583
|
setTitle(title) {
|
|
48509
48584
|
process.stdout.write(`\x1B]0;${title}\x07`);
|
|
48510
48585
|
}
|
|
48586
|
+
setProgramStatus(status) {
|
|
48587
|
+
this.programStatus = status.state === "clear" ? void 0 : status;
|
|
48588
|
+
if (this.programStatusSupported)
|
|
48589
|
+
process.stdout.write(formatProgramStatus(status));
|
|
48590
|
+
}
|
|
48591
|
+
writeProgramStatus() {
|
|
48592
|
+
if (this.programStatusSupported && this.programStatus) {
|
|
48593
|
+
process.stdout.write(formatProgramStatus(this.programStatus));
|
|
48594
|
+
}
|
|
48595
|
+
}
|
|
48511
48596
|
setProgress(active) {
|
|
48512
48597
|
if (active) {
|
|
48513
48598
|
process.stdout.write(TERMINAL_PROGRESS_ACTIVE_SEQUENCE);
|
|
@@ -49325,6 +49410,11 @@ var TuiAltScreen = class extends TuiBase {
|
|
|
49325
49410
|
return false;
|
|
49326
49411
|
return this.copyTextToClipboard(text);
|
|
49327
49412
|
}
|
|
49413
|
+
/** Drop the text selection and multi-click history, e.g. before the host replaces the transcript. */
|
|
49414
|
+
resetTextSelection() {
|
|
49415
|
+
this.clearTextSelection();
|
|
49416
|
+
this.lastClick = void 0;
|
|
49417
|
+
}
|
|
49328
49418
|
/** The lines of the last rendered frame, one per terminal row, as written to the terminal. */
|
|
49329
49419
|
getScreenLines() {
|
|
49330
49420
|
return [...this.previousScreen];
|
|
@@ -41853,6 +41853,9 @@ function detectCapabilitiesFromEnvironment(tmuxForwardsHyperlink) {
|
|
|
41853
41853
|
if (term.startsWith("screen")) {
|
|
41854
41854
|
return { images: null, trueColor: hasTrueColorHint, hyperlinks: false };
|
|
41855
41855
|
}
|
|
41856
|
+
if (termProgram === "herdr") {
|
|
41857
|
+
return { images: null, trueColor: hasTrueColorHint, hyperlinks: true };
|
|
41858
|
+
}
|
|
41856
41859
|
if (process.env.KITTY_WINDOW_ID || termProgram === "kitty") {
|
|
41857
41860
|
return { images: "kitty", trueColor: true, hyperlinks: true };
|
|
41858
41861
|
}
|
|
@@ -43008,6 +43011,10 @@ var Box = class {
|
|
|
43008
43011
|
setBgFn(bgFn) {
|
|
43009
43012
|
this.bgFn = bgFn;
|
|
43010
43013
|
}
|
|
43014
|
+
setPaddingX(paddingX) {
|
|
43015
|
+
this.paddingX = paddingX;
|
|
43016
|
+
this.invalidateCache();
|
|
43017
|
+
}
|
|
43011
43018
|
invalidateCache() {
|
|
43012
43019
|
this.cache = void 0;
|
|
43013
43020
|
}
|
|
@@ -43117,11 +43124,11 @@ var TUI_KEYBINDINGS = {
|
|
|
43117
43124
|
description: "Move cursor word right"
|
|
43118
43125
|
},
|
|
43119
43126
|
"tui.editor.cursorLineStart": {
|
|
43120
|
-
defaultKeys: ["home", "ctrl+
|
|
43127
|
+
defaultKeys: ["home", "ctrl+a"],
|
|
43121
43128
|
description: "Move to line start"
|
|
43122
43129
|
},
|
|
43123
43130
|
"tui.editor.cursorLineEnd": {
|
|
43124
|
-
defaultKeys: ["end", "ctrl+
|
|
43131
|
+
defaultKeys: ["end", "ctrl+e"],
|
|
43125
43132
|
description: "Move to line end"
|
|
43126
43133
|
},
|
|
43127
43134
|
"tui.editor.jumpForward": {
|
|
@@ -43226,8 +43233,8 @@ var TUI_KEYBINDINGS = {
|
|
|
43226
43233
|
defaultKeys: "escape",
|
|
43227
43234
|
description: "Close transcript search"
|
|
43228
43235
|
},
|
|
43229
|
-
"tui.altScreen.top": { defaultKeys: "home", description: "Scroll viewport to top" },
|
|
43230
|
-
"tui.altScreen.bottom": { defaultKeys: "end", description: "Scroll viewport to bottom" }
|
|
43236
|
+
"tui.altScreen.top": { defaultKeys: "ctrl+home", description: "Scroll viewport to top" },
|
|
43237
|
+
"tui.altScreen.bottom": { defaultKeys: "ctrl+end", description: "Scroll viewport to bottom" }
|
|
43231
43238
|
};
|
|
43232
43239
|
function normalizeKeys(keys) {
|
|
43233
43240
|
if (keys === void 0)
|
|
@@ -43348,6 +43355,10 @@ var Text = class {
|
|
|
43348
43355
|
this.cachedWidth = void 0;
|
|
43349
43356
|
this.cachedLines = void 0;
|
|
43350
43357
|
}
|
|
43358
|
+
setPaddingX(paddingX) {
|
|
43359
|
+
this.paddingX = paddingX;
|
|
43360
|
+
this.invalidate();
|
|
43361
|
+
}
|
|
43351
43362
|
invalidate() {
|
|
43352
43363
|
this.cachedText = void 0;
|
|
43353
43364
|
this.cachedWidth = void 0;
|
|
@@ -44422,7 +44433,7 @@ var cjsRequire = createRequire4(import.meta.url);
|
|
|
44422
44433
|
|
|
44423
44434
|
// node_modules/@earendil-works/pi-tui/dist/terminal.js
|
|
44424
44435
|
var DESIRED_KITTY_KEYBOARD_PROTOCOL_FLAGS = 7;
|
|
44425
|
-
var KITTY_KEYBOARD_PROTOCOL_QUERY = `\x1B[>${DESIRED_KITTY_KEYBOARD_PROTOCOL_FLAGS}u\x1B[?u
|
|
44436
|
+
var KITTY_KEYBOARD_PROTOCOL_QUERY = `\x1B[>${DESIRED_KITTY_KEYBOARD_PROTOCOL_FLAGS}u\x1B[?u`;
|
|
44426
44437
|
|
|
44427
44438
|
// node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js
|
|
44428
44439
|
var segmenter2 = getGraphemeSegmenter();
|
|
@@ -45219,6 +45230,11 @@ var TuiAltScreen = class extends TuiBase {
|
|
|
45219
45230
|
return false;
|
|
45220
45231
|
return this.copyTextToClipboard(text);
|
|
45221
45232
|
}
|
|
45233
|
+
/** Drop the text selection and multi-click history, e.g. before the host replaces the transcript. */
|
|
45234
|
+
resetTextSelection() {
|
|
45235
|
+
this.clearTextSelection();
|
|
45236
|
+
this.lastClick = void 0;
|
|
45237
|
+
}
|
|
45222
45238
|
/** The lines of the last rendered frame, one per terminal row, as written to the terminal. */
|
|
45223
45239
|
getScreenLines() {
|
|
45224
45240
|
return [...this.previousScreen];
|
|
@@ -25462,7 +25462,7 @@ function sessionTokenFixHint(policy) {
|
|
|
25462
25462
|
}
|
|
25463
25463
|
|
|
25464
25464
|
// plugins/kxm/src/mcp-server.ts
|
|
25465
|
-
var VERSION = "0.7.
|
|
25465
|
+
var VERSION = "0.7.184";
|
|
25466
25466
|
var CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
|
|
25467
25467
|
var inbox = /* @__PURE__ */ new Map();
|
|
25468
25468
|
var notifiedInbox = /* @__PURE__ */ new Set();
|
|
@@ -15544,7 +15544,7 @@ var ROLE_IDS = Object.freeze([
|
|
|
15544
15544
|
var ROUTE_RENAMES = Object.freeze([
|
|
15545
15545
|
["grok-native", "grok-grok-4-7"],
|
|
15546
15546
|
["qwen-openrouter-pi", "pi-qwen3-coder-plus-openrouter"],
|
|
15547
|
-
["gemini-agy", "agy-gemini-
|
|
15547
|
+
["gemini-agy", "agy-gemini-4-argon-high"],
|
|
15548
15548
|
["fable-claude", "claude-fable"],
|
|
15549
15549
|
["sol-codex", "codex-gpt-5-6-sol"],
|
|
15550
15550
|
["grok-default", "grok-grok-4-6"],
|
|
@@ -15517,7 +15517,7 @@ var ROLE_IDS = Object.freeze([
|
|
|
15517
15517
|
var ROUTE_RENAMES = Object.freeze([
|
|
15518
15518
|
["grok-native", "grok-grok-4-7"],
|
|
15519
15519
|
["qwen-openrouter-pi", "pi-qwen3-coder-plus-openrouter"],
|
|
15520
|
-
["gemini-agy", "agy-gemini-
|
|
15520
|
+
["gemini-agy", "agy-gemini-4-argon-high"],
|
|
15521
15521
|
["fable-claude", "claude-fable"],
|
|
15522
15522
|
["sol-codex", "codex-gpt-5-6-sol"],
|
|
15523
15523
|
["grok-default", "grok-grok-4-6"],
|
|
@@ -15009,7 +15009,7 @@ var ROLE_IDS = Object.freeze([
|
|
|
15009
15009
|
var ROUTE_RENAMES = Object.freeze([
|
|
15010
15010
|
["grok-native", "grok-grok-4-7"],
|
|
15011
15011
|
["qwen-openrouter-pi", "pi-qwen3-coder-plus-openrouter"],
|
|
15012
|
-
["gemini-agy", "agy-gemini-
|
|
15012
|
+
["gemini-agy", "agy-gemini-4-argon-high"],
|
|
15013
15013
|
["fable-claude", "claude-fable"],
|
|
15014
15014
|
["sol-codex", "codex-gpt-5-6-sol"],
|
|
15015
15015
|
["grok-default", "grok-grok-4-6"],
|
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.184";
|
|
15
15
|
const CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
|
|
16
16
|
const inbox = new Map<string, MessageRecord>();
|
|
17
17
|
const notifiedInbox = new Set<string>();
|
|
@@ -104,7 +104,7 @@ export async function refreshModelInventory(options: { outputRoot: string; env?:
|
|
|
104
104
|
const parts = line.trim().split(/\s+/);
|
|
105
105
|
const id = source === "pi" && parts.length >= 2 && parts[0] !== "provider" ? `${parts[0]}/${parts[1]}` : parts[0];
|
|
106
106
|
if (id && /^[a-z0-9][a-z0-9._/-]+$/i.test(id) && id !== "Available") {
|
|
107
|
-
const effortMatch = source === "agy" ? id.match(/-(low|medium|high)$/i) : null;
|
|
107
|
+
const effortMatch = source === "agy" ? id.match(/-(low|medium|high|max)$/i) : null;
|
|
108
108
|
add({ id, ...(effortMatch?.[1] ? { thinkingLevels: [effortMatch[1].toLowerCase()] } : {}) }, source, "standard");
|
|
109
109
|
}
|
|
110
110
|
}
|
|
@@ -33,7 +33,7 @@ export const ROLE_IDS = Object.freeze([
|
|
|
33
33
|
export const ROUTE_RENAMES = Object.freeze([
|
|
34
34
|
["grok-native", "grok-grok-4-7"],
|
|
35
35
|
["qwen-openrouter-pi", "pi-qwen3-coder-plus-openrouter"],
|
|
36
|
-
["gemini-agy", "agy-gemini-
|
|
36
|
+
["gemini-agy", "agy-gemini-4-argon-high"],
|
|
37
37
|
["fable-claude", "claude-fable"],
|
|
38
38
|
["sol-codex", "codex-gpt-5-6-sol"],
|
|
39
39
|
["grok-default", "grok-grok-4-6"],
|
package/scripts/harness-run.mjs
CHANGED
|
@@ -111,6 +111,9 @@ const REQUEST_KEYS = Object.freeze([
|
|
|
111
111
|
const UNSUPPORTED_LAUNCHER = /\.(cmd|bat|ps1)$/i;
|
|
112
112
|
|
|
113
113
|
const AGY_MODELS = Object.freeze([
|
|
114
|
+
"gemini-4-argon-high",
|
|
115
|
+
"gemini-4-argon-medium",
|
|
116
|
+
"gemini-4-argon-low",
|
|
114
117
|
"gemini-3.8-flash-high",
|
|
115
118
|
"gemini-3.8-flash-medium",
|
|
116
119
|
"gemini-3.8-flash-low",
|