llm-relay 0.84.0 → 0.85.0

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.
Files changed (44) hide show
  1. package/README.md +9 -2
  2. package/dist/availability.d.ts +1 -1
  3. package/dist/backend.d.ts +1 -1
  4. package/dist/circuit-breaker.d.ts +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/config-types.d.ts +10 -10
  7. package/dist/config.d.ts +1 -1
  8. package/dist/dashboard/.vite/manifest.json +2 -2
  9. package/dist/dashboard/assets/index-C-I6hPeY.js +403 -0
  10. package/dist/dashboard/assets/index-CrSNlLMD.css +1 -0
  11. package/dist/dashboard/index.html +2 -2
  12. package/dist/dashboard-auth.d.ts +2 -0
  13. package/dist/dashboard-auth.js +5 -0
  14. package/dist/dashboard-auth.js.map +1 -1
  15. package/dist/dashboard-routes.d.ts +2 -1
  16. package/dist/dashboard-routes.js +12 -4
  17. package/dist/dashboard-routes.js.map +1 -1
  18. package/dist/dashboard-static.js +34 -4
  19. package/dist/dashboard-static.js.map +1 -1
  20. package/dist/dispatch-lane-stats.d.ts +1 -1
  21. package/dist/dispatch.d.ts +3 -3
  22. package/dist/hedge-trigger.d.ts +1 -1
  23. package/dist/lane-cadence.d.ts +1 -1
  24. package/dist/lane-manifest.d.ts +1 -1
  25. package/dist/lane-probe.d.ts +2 -2
  26. package/dist/latency-demotion.d.ts +1 -1
  27. package/dist/mcp/lane-runner.d.ts +1 -1
  28. package/dist/mcp/protocol.d.ts +1 -1
  29. package/dist/mcp/readonly-boundary.d.ts +1 -1
  30. package/dist/mcp/server.d.ts +4 -4
  31. package/dist/process-safety-net.d.ts +1 -1
  32. package/dist/responses-request.d.ts +1 -1
  33. package/dist/routes/admin.js +1 -1
  34. package/dist/routes/admin.js.map +1 -1
  35. package/dist/stream-commit.d.ts +1 -1
  36. package/dist/stream-pipeline.d.ts +1 -1
  37. package/dist/tool-dialects.d.ts +1 -1
  38. package/docs/README.md +43 -0
  39. package/package.json +1 -1
  40. package/scripts/install-skill.mjs +1 -0
  41. package/skills/llm-relay/SKILL.md +4 -0
  42. package/skills/llm-relay/references/lane-field-notes.md +202 -0
  43. package/dist/dashboard/assets/index-B2UQHoym.js +0 -74
  44. package/dist/dashboard/assets/index-DFEP3XPr.css +0 -1
package/README.md CHANGED
@@ -65,10 +65,17 @@ at login.
65
65
  ## Learn more
66
66
 
67
67
  - [docs/reference.md](docs/reference.md) — full reference: config, routing, pools, offload,
68
- repair, CLI, endpoints, and every caveat.
68
+ repair, CLI, endpoints, and every caveat. It opens with a table of contents.
69
+ - [docs/architecture.md](docs/architecture.md) — a map of the code, for a person who wants to
70
+ change it.
71
+ - [CONTRIBUTING.md](CONTRIBUTING.md) — how to set up, how to prove a change, and how to report a
72
+ problem without leaking a credential.
69
73
  - [docs/subagent-routing.md](docs/subagent-routing.md) — offload design and wire evidence.
70
74
  - [docs/pool-failover.md](docs/pool-failover.md) — how failover and health tracking behave.
71
75
  - [docs/capability-sources.md](docs/capability-sources.md) — where capability scores come from.
72
76
  - [docs/project-goals.md](docs/project-goals.md) — what this project is and is not.
73
77
 
74
- `llm-relay help` lists the main commands. [CLAUDE.md](CLAUDE.md) maps the source for contributors.
78
+ `llm-relay help` lists the main commands. To contribute, start at
79
+ [CONTRIBUTING.md](CONTRIBUTING.md) and [docs/architecture.md](docs/architecture.md).
80
+ [CLAUDE.md](CLAUDE.md) holds the same source map in full detail, written for an AI coding
81
+ assistant.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Availability ladders — spec §5.1-5.3 of docs/quota-metering-spec-2026-08-16.md.
2
+ * Availability ladders — spec §5.1-5.3 of docs/history/quota-metering-spec-2026-08-16.md.
3
3
  *
4
4
  * `remaining` and `resetsAt` are resolved per (scope, axis, period) through fixed rungs, and
5
5
  * staleness is handled HERE, at read time, as a pure function of the caller's clock — never by a
package/dist/backend.d.ts CHANGED
@@ -29,7 +29,7 @@ export declare class DialectUnparseableError extends Error {
29
29
  * fine. It is a config decision, so it is carried as a LOCAL failure — the walk must not fail over
30
30
  * (re-asking N models to produce the same refused action) and the deployment must not be charged,
31
31
  * the same rule under which a hard cap "never registers on the breaker — it is config, not
32
- * health". See docs/dialect-rescue-destructive-refusal-2026-08-24.md.
32
+ * health". See docs/history/dialect-rescue-destructive-refusal-2026-08-24.md.
33
33
  */
34
34
  export declare class DialectDestructiveError extends Error {
35
35
  readonly dialect: string;
@@ -186,7 +186,7 @@ export declare const UNMEASURED_STABILITY = 50;
186
186
  * ladder: a `Retry-After`, a 429 escalation and a 402 all still win where they applied before.
187
187
  *
188
188
  * Pure, so it is pinned directly rather than through the breaker's state machine.
189
- * Evidence: `docs/latency-demotion-regression-2026-08-30.md` §3.
189
+ * Evidence: `docs/history/latency-demotion-regression-2026-08-30.md` §3.
190
190
  */
191
191
  export declare function failureCooldown(elapsedMs: number): {
192
192
  ms: number;
package/dist/cli.d.ts CHANGED
@@ -403,7 +403,7 @@ export declare function renderCommand(invoke: {
403
403
  * ⚠ `--probe` spawns lane commands as an explicit operator action — same precedent as
404
404
  * `pools --probe` sending real completions. The request path reads the cached manifest and never
405
405
  * spawns anything; outside it the only OTHER spawn site is the relay's background lane cadence
406
- * (owner decision 2026-08-29, docs/quota-reprobe-design-2026-08-29.md). Without `--probe` this
406
+ * (owner decision 2026-08-29, docs/history/quota-reprobe-design-2026-08-29.md). Without `--probe` this
407
407
  * just prints the cache.
408
408
  */
409
409
  export declare function runLanes(): Promise<void>;
@@ -98,7 +98,7 @@ export type ThoughtSignatureMode = "none" | "sentinel";
98
98
  * `thinking: {type:"disabled"}` — DeepSeek's thinking mode requires the prior turn's
99
99
  * `reasoning_content` to be replayed on a multi-turn conversation (HTTP 400 otherwise), and
100
100
  * this relay deliberately holds no store to round-trip it (see
101
- * docs/deepseek-responses-truncation-2026-09-09.md), so the default must not think.
101
+ * docs/history/deepseek-responses-truncation-2026-09-09.md), so the default must not think.
102
102
  */
103
103
  export type ReasoningMode = "none" | "deepseek";
104
104
  /**
@@ -126,7 +126,7 @@ export interface ProviderCompatConfig {
126
126
  *
127
127
  * OpenCode Zen's contributor SKUs — Muse Spark 1.3 included — answer HTTP 500 on
128
128
  * `/chat/completions` and on Zen's Anthropic-shaped `/messages`, and 200 only on `/responses`
129
- * (measured 2026-09-04, `docs/muse-spark-1.3-opencode-zen-2026-09-04.md` rows 3 and 6-8). A third
129
+ * (measured 2026-09-04, `docs/history/muse-spark-1.3-opencode-zen-2026-09-04.md` rows 3 and 6-8). A third
130
130
  * `Kind` value for this would touch roughly 55 `kind === "openai"` sites across 19 files (same
131
131
  * doc, §3 route B); this narrower option forks only the request/response builders `src/backend.ts`
132
132
  * selects on, leaving discovery, catalog and key-check paths unchanged. Declaring it on an
@@ -329,7 +329,7 @@ export interface Routing {
329
329
  latency?: LatencyDemotionConfig;
330
330
  /**
331
331
  * Hedged attempts (owner proposal + decisions 2026-08-30,
332
- * docs/hedged-attempts-design-2026-08-30.md §7). **Default ON**, and confined to deployments
332
+ * docs/history/hedged-attempts-design-2026-08-30.md §7). **Default ON**, and confined to deployments
333
333
  * `assessCost()` calls FREE.
334
334
  *
335
335
  * ⚠ This is the FIRST behaviour here that does not merely reorder — it DUPLICATES a request onto
@@ -366,7 +366,7 @@ export interface Routing {
366
366
  pacing?: PacingConfig;
367
367
  /**
368
368
  * Post-commit CRAWL abort (backlog item 18, built 2026-09-09 after
369
- * `docs/post-commit-stall-measurement-2026-09-09.md` measured that both Claude Code and Codex
369
+ * `docs/history/post-commit-stall-measurement-2026-09-09.md` measured that both Claude Code and Codex
370
370
  * retry a stream that goes bad after content has already arrived — Claude Code once, downgraded
371
371
  * to non-streaming; Codex up to five times, staying streaming). A silent stall after commit is
372
372
  * already caught by `withStallWatchdog` at `stallTimeoutMs`; this catches the case nothing else
@@ -381,7 +381,7 @@ export interface Routing {
381
381
  crawl?: CrawlWatchdogConfig;
382
382
  /**
383
383
  * Background lane re-probing (owner decision 2026-08-29,
384
- * docs/quota-reprobe-design-2026-08-29.md): keeping lane metadata fresh is the relay's own
384
+ * docs/history/quota-reprobe-design-2026-08-29.md): keeping lane metadata fresh is the relay's own
385
385
  * job, the way the ping loop already does for HTTP. **Default ON** — catalog probes are
386
386
  * metadata commands that spend no quota, and quota probes fire only for buckets carrying an
387
387
  * ACTIVE recorded death (an alive lane is re-tested by real use for free). Boolean shorthand
@@ -391,7 +391,7 @@ export interface Routing {
391
391
  laneProbe?: LaneProbeSettings;
392
392
  /**
393
393
  * The automatic dispatch lane WALK (owner request 2026-09-06,
394
- * docs/dispatch-lane-walk-design-2026-09-06.md). **Default ON.**
394
+ * docs/history/dispatch-lane-walk-design-2026-09-06.md). **Default ON.**
395
395
  *
396
396
  * Before it, `dispatch` ran ONE lane and reported a failure when that lane was slow; the calling
397
397
  * agent then picked the next lane by hand, which is the friction the owner reported. With it,
@@ -495,7 +495,7 @@ export interface LatencyDemotionConfig {
495
495
  /**
496
496
  * `routing.hedge` — start the NEXT candidate beside a slow in-flight attempt, instead of after it
497
497
  * (owner proposal 2026-08-30; the four decisions are in
498
- * `docs/hedged-attempts-design-2026-08-30.md` §7).
498
+ * `docs/history/hedged-attempts-design-2026-08-30.md` §7).
499
499
  *
500
500
  * **Default ON, free deployments only.** That is owner decision D1, taken against the
501
501
  * recommendation of off-by-default. `assessCost()` treats an UNKNOWN price as paid, so the rule is
@@ -876,7 +876,7 @@ export interface DispatchWalkSettings {
876
876
  * answer-mode call. Default 600000 (10 minutes).
877
877
  *
878
878
  * ⚠ Two floors because the two modes are two different populations
879
- * (`docs/dispatch-giveup-diagnosis-2026-09-10.md` §3): an answer-mode call is one HTTP round trip
879
+ * (`docs/history/dispatch-giveup-diagnosis-2026-09-10.md` §3): an answer-mode call is one HTTP round trip
880
880
  * that answers in seconds, while an agent-mode lane runs a whole tool loop for minutes. One floor
881
881
  * fitted to both stopped every real agent task on `free-pool` at 90 s, because a burst of short
882
882
  * answer-mode calls had set the lane's p80 to 39.5 s. Like `attemptMs` it is an operator budget,
@@ -977,7 +977,7 @@ export interface McpSettings {
977
977
  /**
978
978
  * Default `routing.mcp.blockingWaitMs` — 25 minutes.
979
979
  *
980
- * Measured and documented 2026-09-17 (`docs/mcp-host-timeouts-2026-09-17.md`): Claude Code's
980
+ * Measured and documented 2026-09-17 (`docs/history/mcp-host-timeouts-2026-09-17.md`): Claude Code's
981
981
  * wall-clock tool limit (`MCP_TOOL_TIMEOUT`) defaults to about 28 hours, and a 240 s call succeeded
982
982
  * headless with and without progress. Its stdio idle timeout is 30 minutes, and the documentation
983
983
  * says a progress notification resets it. The default stays under 30 minutes so the call survives
@@ -993,7 +993,7 @@ export declare const DEFAULT_MCP_BLOCKING_WAIT_MS = 1500000;
993
993
  * somewhere between 45 s and 100 s, and Codex's code-mode `exec` tool yields its script at 31.0 s
994
994
  * with empty output ("Script running with cell ID N / Wall time 31.0 seconds"). The 2026-09-10
995
995
  * transcript sweep counted 29 of 266 first Codex dispatch calls that lost their job id that way
996
- * while this default was 40 s (`docs/dispatch-giveup-diagnosis-2026-09-10.md` §8). 25 s sits under
996
+ * while this default was 40 s (`docs/history/dispatch-giveup-diagnosis-2026-09-10.md` §8). 25 s sits under
997
997
  * both. The tool description names the config key rather than this figure, so an operator override
998
998
  * never leaves the text stale.
999
999
  */
package/dist/config.d.ts CHANGED
@@ -48,7 +48,7 @@ export declare function resolveThoughtSignatureMode(p: {
48
48
  * labelled provider fact in `src/` only while config can override it. DeepSeek's own API states its
49
49
  * thinking/reasoning vocabulary (thinking ON by default; `thinking: {type:"disabled"}` /
50
50
  * `reasoning_effort: low|high|max`; first-party evidence in
51
- * docs/deepseek-responses-truncation-2026-09-09.md), so `api.deepseek.com` defaults to `"deepseek"`
51
+ * docs/history/deepseek-responses-truncation-2026-09-09.md), so `api.deepseek.com` defaults to `"deepseek"`
52
52
  * and every other host to `"none"`. An explicit `compat.reasoning` wins in BOTH directions —
53
53
  * `"none"` on deepseek, `"deepseek"` on anything else.
54
54
  */
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "index.html": {
3
- "file": "assets/index-B2UQHoym.js",
3
+ "file": "assets/index-C-I6hPeY.js",
4
4
  "name": "index",
5
5
  "src": "index.html",
6
6
  "isEntry": true,
7
7
  "css": [
8
- "assets/index-DFEP3XPr.css"
8
+ "assets/index-CrSNlLMD.css"
9
9
  ]
10
10
  }
11
11
  }