@ashlr/hub 3.5.1 → 3.8.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 (124) hide show
  1. package/CHANGELOG.md +165 -0
  2. package/README.md +3 -0
  3. package/dist/build-identity.json +2 -2
  4. package/dist/cli/activation.d.ts +41 -0
  5. package/dist/cli/activation.js +485 -0
  6. package/dist/cli/activation.js.map +1 -0
  7. package/dist/core/daemon/cutoff-checkpoint-scheduler.js +7 -0
  8. package/dist/core/daemon/cutoff-checkpoint-scheduler.js.map +1 -1
  9. package/dist/core/daemon/loop.d.ts +19 -0
  10. package/dist/core/daemon/loop.js +235 -5
  11. package/dist/core/daemon/loop.js.map +1 -1
  12. package/dist/core/daemon/overnight-status.d.ts +152 -0
  13. package/dist/core/daemon/overnight-status.js +275 -0
  14. package/dist/core/daemon/overnight-status.js.map +1 -0
  15. package/dist/core/daemon/post-merge-halt.d.ts +212 -0
  16. package/dist/core/daemon/post-merge-halt.js +503 -0
  17. package/dist/core/daemon/post-merge-halt.js.map +1 -0
  18. package/dist/core/daemon/run-window.d.ts +218 -0
  19. package/dist/core/daemon/run-window.js +420 -0
  20. package/dist/core/daemon/run-window.js.map +1 -0
  21. package/dist/core/fleet/generated-repair-resolution.d.ts +36 -0
  22. package/dist/core/fleet/generated-repair-resolution.js +245 -0
  23. package/dist/core/fleet/generated-repair-resolution.js.map +1 -0
  24. package/dist/core/local-runtime/llama/port.d.ts +17 -0
  25. package/dist/core/local-runtime/llama/port.js +47 -0
  26. package/dist/core/local-runtime/llama/port.js.map +1 -0
  27. package/dist/core/local-runtime/llama/proxy-host.d.ts +54 -0
  28. package/dist/core/local-runtime/llama/proxy-host.js +159 -0
  29. package/dist/core/local-runtime/llama/proxy-host.js.map +1 -0
  30. package/dist/core/local-runtime/llama/proxy-process.d.ts +148 -0
  31. package/dist/core/local-runtime/llama/proxy-process.js +250 -0
  32. package/dist/core/local-runtime/llama/proxy-process.js.map +1 -0
  33. package/dist/core/local-runtime/llama/proxy-record.d.ts +40 -0
  34. package/dist/core/local-runtime/llama/proxy-record.js +133 -0
  35. package/dist/core/local-runtime/llama/proxy-record.js.map +1 -0
  36. package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +118 -0
  37. package/dist/core/local-runtime/llama/proxy-supervisor.js +511 -0
  38. package/dist/core/local-runtime/llama/proxy-supervisor.js.map +1 -0
  39. package/dist/core/policy/local-only.d.ts +142 -2
  40. package/dist/core/policy/local-only.js +204 -15
  41. package/dist/core/policy/local-only.js.map +1 -1
  42. package/dist/core/run/budget.d.ts +22 -8
  43. package/dist/core/run/budget.js +80 -12
  44. package/dist/core/run/budget.js.map +1 -1
  45. package/dist/core/run/sandboxed-engine.js +3 -3
  46. package/dist/core/run/sandboxed-engine.js.map +1 -1
  47. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  48. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +61 -9
  49. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +60 -8
  50. package/dist/core/verse/session-engine.d.ts +42 -1
  51. package/dist/core/verse/session-engine.js +79 -2
  52. package/dist/core/verse/session-engine.js.map +1 -1
  53. package/dist/core/web/public/next/assets/{App-BbVoUCIi.js → App-BsbJFA2j.js} +2 -2
  54. package/dist/core/web/public/next/assets/{App-BbVoUCIi.js.map → App-BsbJFA2j.js.map} +1 -1
  55. package/dist/core/web/public/next/assets/{ApprovalsSection-BW9iVjUa.js → ApprovalsSection-2CCSoBTJ.js} +2 -2
  56. package/dist/core/web/public/next/assets/{ApprovalsSection-BW9iVjUa.js.map → ApprovalsSection-2CCSoBTJ.js.map} +1 -1
  57. package/dist/core/web/public/next/assets/{AutonomySection-Cpk_oEhc.css → AutonomySection-CHjxJt2z.css} +1 -1
  58. package/dist/core/web/public/next/assets/AutonomySection-yeNNUPur.js +2 -0
  59. package/dist/core/web/public/next/assets/AutonomySection-yeNNUPur.js.map +1 -0
  60. package/dist/core/web/public/next/assets/ChatSection-BfnLe5dT.css +1 -0
  61. package/dist/core/web/public/next/assets/ChatSection-DwDDnCZQ.js +80 -0
  62. package/dist/core/web/public/next/assets/ChatSection-DwDDnCZQ.js.map +1 -0
  63. package/dist/core/web/public/next/assets/{ConfirmDialog-CXevY3Au.js → ConfirmDialog-C363ty_c.js} +2 -2
  64. package/dist/core/web/public/next/assets/{ConfirmDialog-CXevY3Au.js.map → ConfirmDialog-C363ty_c.js.map} +1 -1
  65. package/dist/core/web/public/next/assets/{Dialog-Bn0CgEGz.js → Dialog-nK15L1M0.js} +2 -2
  66. package/dist/core/web/public/next/assets/{Dialog-Bn0CgEGz.js.map → Dialog-nK15L1M0.js.map} +1 -1
  67. package/dist/core/web/public/next/assets/{DiffViewer-QKyisN2L.js → DiffViewer-D369eZe8.js} +2 -2
  68. package/dist/core/web/public/next/assets/{DiffViewer-QKyisN2L.js.map → DiffViewer-D369eZe8.js.map} +1 -1
  69. package/dist/core/web/public/next/assets/McpSection-D88QlDpG.css +1 -0
  70. package/dist/core/web/public/next/assets/McpSection-DVgiSYG1.js +2 -0
  71. package/dist/core/web/public/next/assets/McpSection-DVgiSYG1.js.map +1 -0
  72. package/dist/core/web/public/next/assets/Meter-CLcr-4wS.css +1 -0
  73. package/dist/core/web/public/next/assets/Meter-Cmo1pLbk.js +2 -0
  74. package/dist/core/web/public/next/assets/Meter-Cmo1pLbk.js.map +1 -0
  75. package/dist/core/web/public/next/assets/{MutationTokenDialog-DbSHPy3w.js → MutationTokenDialog-B9I4PAcp.js} +2 -2
  76. package/dist/core/web/public/next/assets/{MutationTokenDialog-DbSHPy3w.js.map → MutationTokenDialog-B9I4PAcp.js.map} +1 -1
  77. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-C-PCgCzo.js → ResourcePoolConsoleApp-z6tJj3s9.js} +2 -2
  78. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-C-PCgCzo.js.map → ResourcePoolConsoleApp-z6tJj3s9.js.map} +1 -1
  79. package/dist/core/web/public/next/assets/{RouteErrorBoundary-Dw8ZjmkS.js → RouteErrorBoundary-OSajL45F.js} +2 -2
  80. package/dist/core/web/public/next/assets/{RouteErrorBoundary-Dw8ZjmkS.js.map → RouteErrorBoundary-OSajL45F.js.map} +1 -1
  81. package/dist/core/web/public/next/assets/SettingsSection-B3YH2Npi.js +2 -0
  82. package/dist/core/web/public/next/assets/SettingsSection-B3YH2Npi.js.map +1 -0
  83. package/dist/core/web/public/next/assets/{UniverseConsoleApp-Bk5HipM0.js → UniverseConsoleApp-wEKIzl1M.js} +2 -2
  84. package/dist/core/web/public/next/assets/{UniverseConsoleApp-Bk5HipM0.js.map → UniverseConsoleApp-wEKIzl1M.js.map} +1 -1
  85. package/dist/core/web/public/next/assets/{UniverseView-D8k9q0ce.js → UniverseView-CQVpJqqI.js} +2 -2
  86. package/dist/core/web/public/next/assets/{UniverseView-D8k9q0ce.js.map → UniverseView-CQVpJqqI.js.map} +1 -1
  87. package/dist/core/web/public/next/assets/{UsageSection-B2E06ZH1.js → UsageSection-dToBThXe.js} +2 -2
  88. package/dist/core/web/public/next/assets/{UsageSection-B2E06ZH1.js.map → UsageSection-dToBThXe.js.map} +1 -1
  89. package/dist/core/web/public/next/assets/VerseConsoleApp-CMkCizvL.css +1 -0
  90. package/dist/core/web/public/next/assets/VerseConsoleApp-DHU32JCQ.js +3 -0
  91. package/dist/core/web/public/next/assets/VerseConsoleApp-DHU32JCQ.js.map +1 -0
  92. package/dist/core/web/public/next/assets/{charts-DSUpczxG.js → charts-BopViIha.js} +2 -2
  93. package/dist/core/web/public/next/assets/{charts-DSUpczxG.js.map → charts-BopViIha.js.map} +1 -1
  94. package/dist/core/web/public/next/assets/global-DMWakEhP.js +2 -0
  95. package/dist/core/web/public/next/assets/global-DMWakEhP.js.map +1 -0
  96. package/dist/core/web/public/next/assets/global-z-JfD3ow.css +1 -0
  97. package/dist/core/web/public/next/assets/{icons-BxOX8-XB.js → icons-L06pQH6j.js} +2 -2
  98. package/dist/core/web/public/next/assets/{icons-BxOX8-XB.js.map → icons-L06pQH6j.js.map} +1 -1
  99. package/dist/core/web/public/next/assets/{index-BMRIET7F.js → index-CXgVQHek.js} +3 -3
  100. package/dist/core/web/public/next/assets/{index-BMRIET7F.js.map → index-CXgVQHek.js.map} +1 -1
  101. package/dist/core/web/public/next/assets/{queries-AxnVa02h.js → queries-D3sSlan1.js} +2 -2
  102. package/dist/core/web/public/next/assets/{queries-AxnVa02h.js.map → queries-D3sSlan1.js.map} +1 -1
  103. package/dist/core/web/public/next/assets/{use-guarded-action-BO6c94Wp.js → use-guarded-action-BxfJ9E-n.js} +2 -2
  104. package/dist/core/web/public/next/assets/{use-guarded-action-BO6c94Wp.js.map → use-guarded-action-BxfJ9E-n.js.map} +1 -1
  105. package/dist/core/web/public/next/assets/workspace-model-v0a1gl-C.js +2 -0
  106. package/dist/core/web/public/next/assets/workspace-model-v0a1gl-C.js.map +1 -0
  107. package/dist/core/web/public/next/index.html +1 -1
  108. package/dist/release-dependency-inventory.json +1 -1
  109. package/package.json +1 -1
  110. package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js +0 -2
  111. package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js.map +0 -1
  112. package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js +0 -80
  113. package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js.map +0 -1
  114. package/dist/core/web/public/next/assets/ChatSection-LQiAn6Eu.css +0 -1
  115. package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js +0 -2
  116. package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js.map +0 -1
  117. package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js +0 -3
  118. package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js.map +0 -1
  119. package/dist/core/web/public/next/assets/VerseConsoleApp-D2E3mU9a.css +0 -1
  120. package/dist/core/web/public/next/assets/global-C4jfYHrj.js +0 -2
  121. package/dist/core/web/public/next/assets/global-C4jfYHrj.js.map +0 -1
  122. package/dist/core/web/public/next/assets/global-D463gG1X.css +0 -1
  123. package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js +0 -2
  124. package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js.map +0 -1
@@ -25,6 +25,20 @@
25
25
  * make impossible, so `test/local-only-dispatch-paths.test.ts` enumerates every
26
26
  * known path and asserts it refuses.
27
27
  *
28
+ * TWO AXES, ONE PREDICATE (docs/LOCALITY-VS-SPEND.md)
29
+ * --------------------------------------------------
30
+ * This module answers two different questions and must not confuse them:
31
+ *
32
+ * `EngineLocality` 'local' | 'cloud' — where does the process run?
33
+ * `Meteredness` 'free' | 'metered' | 'unknown' — can this spend money?
34
+ *
35
+ * `decidePermission` reads METEREDNESS and refuses anything that is not provably
36
+ * `'free'`, `'unknown'` included. Locality is still published, unchanged, for the
37
+ * consumers that genuinely mean "on this machine" — local-fleet membership, pool
38
+ * tiering, local-context injection. They are not interchangeable: `ashlrcode` is
39
+ * a local process that this hub hands paid credentials, and reading its locality
40
+ * as permission is exactly how it kept them.
41
+ *
28
42
  * MODE RESOLUTION (config + env, env can only ENABLE)
29
43
  * --------------------------------------------------
30
44
  * persisted : cfg.foundry.localOnly === true (canonical)
@@ -86,6 +100,16 @@ export declare function localOnlyEnabled(cfg?: AshlrConfig, env?: EnvLike): bool
86
100
  * tier 'mid' but locality 'cloud'. Conflating the two is how money gets spent.
87
101
  */
88
102
  export type EngineLocality = 'local' | 'cloud';
103
+ /**
104
+ * Provider ids served from this machine. Everything else is treated as cloud.
105
+ *
106
+ * Exported so the parity suite can iterate the authority's OWN enumeration
107
+ * rather than restating it — a test carrying its own copy of this list would be
108
+ * the duplication this module exists to prevent. Consumers ask
109
+ * `providerLocality` / `providerMeteredness`; nothing outside this file should
110
+ * read the set to make a decision.
111
+ */
112
+ export declare const LOCAL_PROVIDER_IDS: ReadonlySet<string>;
89
113
  /** The engine that is permitted in every mode: in-process, no model call. */
90
114
  export declare const ALWAYS_PERMITTED_ENGINE: EngineId;
91
115
  /**
@@ -100,6 +124,105 @@ export declare function isLoopbackEndpoint(baseUrl: string | undefined): boolean
100
124
  export declare function engineLocality(engine: string, cfg?: AshlrConfig, env?: EnvLike): EngineLocality;
101
125
  /** Classify a provider id from `providers.ts` / the plugin provider registry. */
102
126
  export declare function providerLocality(providerId: string): EngineLocality;
127
+ /**
128
+ * Can this subject bill you?
129
+ *
130
+ * SEPARATE FROM `EngineLocality` ON PURPOSE (docs/LOCALITY-VS-SPEND.md). Those
131
+ * two questions —
132
+ *
133
+ * locality: where does the inference run? (processes and endpoints)
134
+ * meteredness: can this spend money? (credentials and billing)
135
+ *
136
+ * — coincide for every subject except CLI agents, which is why one answer served
137
+ * both for as long as it did. For `ashlrcode` they do not: it is a local PROCESS
138
+ * that this hub hands `CLAUDE_CODE_OAUTH_TOKEN` / `ANTHROPIC_AUTH_TOKEN` and the
139
+ * config dirs where subscription auth lives (`run/sandboxed-engine.ts:782` and
140
+ * its env builder), after which the hub controls nothing. Local, and spendable.
141
+ *
142
+ * Reclassifying it as `'cloud'` would fix spend and break locality: local-fleet
143
+ * membership, pool tiering and local-context injection all legitimately want
144
+ * "runs on this machine". So this is a SECOND axis, never a rename of the first.
145
+ *
146
+ * `'unknown'` is a real answer, not a placeholder. A policy whose purpose is
147
+ * preventing spend cannot treat "I cannot tell" as "safe" — that is precisely
148
+ * how the `ashlrcode` gap survived. `decidePermission` refuses anything that is
149
+ * not provably `'free'`, `'unknown'` included.
150
+ */
151
+ export type Meteredness = 'free' | 'metered' | 'unknown';
152
+ /**
153
+ * Meteredness of every cli-agent the hub ships, stated EXPLICITLY.
154
+ *
155
+ * A cli-agent is the one engine kind whose spend the hub cannot read off an
156
+ * endpoint: the binary chooses its own backend after the spawn. So each one is
157
+ * classified by hand here, and `test/local-only-consumer-parity.test.ts` fails
158
+ * if a new cli-agent reaches the registry without an entry.
159
+ *
160
+ * claude / codex / hermes / opencode — reach a vendor over the network. Metered.
161
+ *
162
+ * ashlrcode — METERED. `docs/ECOSYSTEM-MAP.md:151`: consumes `@anthropic-ai/sdk`
163
+ * + OpenAI (routing xAI/DeepSeek/Groq/Ollama) — cloud inference BY DEFAULT —
164
+ * and the hub hands every cli-agent spawn working subscription credentials.
165
+ * There is no flag the hub passes and `ac` honours, and no probe the hub can
166
+ * read, so "pointed at Ollama" is not a claim this process can verify.
167
+ * Owner decision (docs/LOCALITY-VS-SPEND.md, Option A). Option B — classify
168
+ * it `'free'` only when an ashlrcode-side local mode is CONFIRMED — stays the
169
+ * target, and must not ship before its enforcement exists.
170
+ *
171
+ * aw — UNKNOWN, not metered. `docs/ECOSYSTEM-MAP.md:155` describes a
172
+ * fully-local agent fleet where "no data leaves the machine unless cloud
173
+ * fallback is opted into". That opt-in lives in aw's own `.env` and agent
174
+ * configs, which this hub neither reads nor controls — so the honest answer
175
+ * is that we do not know, and `'unknown'` says exactly that. It is refused
176
+ * under local-only and priced as spend, identically to `'metered'`; the
177
+ * distinction is truthfulness in the refusal, not a difference in effect.
178
+ * Calling it `'metered'` would assert a fact about a third-party config we
179
+ * have not read, which is the same mistake in the opposite direction.
180
+ */
181
+ export declare const CLI_AGENT_METEREDNESS: Readonly<Record<string, Meteredness>>;
182
+ /**
183
+ * Meteredness of a raw endpoint. A loopback URL genuinely cannot bill anyone.
184
+ *
185
+ * An absent or unparseable URL is `'unknown'` rather than `'metered'`: we are
186
+ * not asserting it costs money, we are saying we cannot tell. Both are refused.
187
+ */
188
+ export declare function endpointMeteredness(baseUrl: string | undefined): Meteredness;
189
+ /**
190
+ * Meteredness of a provider id. The free set is the same roster as
191
+ * `LOCAL_PROVIDER_IDS` — for a PROVIDER the two axes really do coincide, because
192
+ * a provider id names a serving runtime rather than an agent that picks its own
193
+ * backend. Everything else in the provider id space is a billed vendor.
194
+ */
195
+ export declare function providerMeteredness(providerId: string): Meteredness;
196
+ /**
197
+ * Meteredness of an engine id.
198
+ *
199
+ * builtin — in-process, no model call. Free.
200
+ * cli-agent — `CLI_AGENT_METEREDNESS`; an agent registered through
201
+ * `cfg.foundry.engines` that nobody classified is 'unknown'.
202
+ * api-model — the resolved base URL decides, exactly as locality does:
203
+ * a self-hosted endpoint behind an API key is still free if
204
+ * it answers on loopback. No resolvable URL ⇒ 'unknown'.
205
+ * absent from registry — 'unknown', except `llama-server`, which older builds
206
+ * synthesise inline in `run/engines.ts`.
207
+ */
208
+ export declare function engineMeteredness(engine: string, cfg?: AshlrConfig, env?: EnvLike): Meteredness;
209
+ /**
210
+ * Meteredness of an id that may come from EITHER id space.
211
+ *
212
+ * `run/budget.ts` documents a provider id but `run/sandboxed-engine.ts` calls it
213
+ * with an engine id (`:1825`, `:2161`, `:3061`). Rather than leave that mismatch
214
+ * load-bearing, this resolver names the ambiguity and settles it by ASKING WHICH
215
+ * SPACE THE ID IS IN, in this order:
216
+ *
217
+ * 1. a free provider id (`ollama`, `lmstudio`, …) → free;
218
+ * 2. an id the engine registry resolves → `engineMeteredness` is authoritative,
219
+ * so `'local-coder'` (loopback, absent from the provider roster) is free and
220
+ * `'aw'` keeps its honest `'unknown'` instead of being flattened to metered;
221
+ * 3. anything else → the provider id space, where "not in the free set" means a
222
+ * billed vendor, so `'anthropic'` is metered rather than being mistaken for
223
+ * an unclassified engine.
224
+ */
225
+ export declare function subjectMeteredness(id: string, cfg?: AshlrConfig, env?: EnvLike): Meteredness;
103
226
  /**
104
227
  * Resolve the engine id behind an executable name.
105
228
  *
@@ -119,7 +242,13 @@ export interface LocalOnlySubject {
119
242
  kind: LocalOnlySubjectKind;
120
243
  /** Engine id, provider id, or base URL — whatever the operator would recognise. */
121
244
  id: string;
245
+ /**
246
+ * Where the inference runs. Carried for diagnostics and for the consumers
247
+ * that legitimately ask "on this machine?" — NOT what the permission turns on.
248
+ */
122
249
  locality: EngineLocality;
250
+ /** Whether this subject can spend. THIS is what `decidePermission` reads. */
251
+ meteredness: Meteredness;
123
252
  }
124
253
  export interface LocalOnlyVerdict {
125
254
  /** False means: do not dispatch. Refuse, loudly, naming `reason`. */
@@ -149,7 +278,12 @@ export declare function endpointPermitted(baseUrl: string, cfg?: AshlrConfig, en
149
278
  * engine id. A binary that maps to no known engine is permitted — it is not a
150
279
  * hub-managed agent, and refusing every unrecognised executable would break
151
280
  * phantom wrapping and local tooling. Every engine the hub can actually route
152
- * to IS in the registry, so a cloud seat always resolves.
281
+ * to IS in the registry, so a spendable seat always resolves.
282
+ *
283
+ * THIS IS THE SITE THE METEREDNESS SPLIT WAS FOR. `ac` resolves to `ashlrcode`,
284
+ * which was classified local and therefore permitted — and then handed
285
+ * `CLAUDE_CODE_OAUTH_TOKEN` by the very next call. It now resolves to `metered`
286
+ * and is refused, with no change needed at `run/engines.ts:455` itself.
153
287
  */
154
288
  export declare function binPermitted(bin: string, cfg?: AshlrConfig, env?: EnvLike): LocalOnlyVerdict;
155
289
  /**
@@ -169,7 +303,13 @@ export declare class LocalOnlyRefusal extends Error {
169
303
  export declare function isLocalOnlyRefusal(err: unknown): err is LocalOnlyRefusal;
170
304
  /** Throw `LocalOnlyRefusal` when `verdict` refuses; otherwise return. */
171
305
  export declare function assertPermitted(verdict: LocalOnlyVerdict): void;
172
- /** Keep only engines permitted under the current mode. */
306
+ /**
307
+ * Keep only engines permitted under the current mode.
308
+ *
309
+ * Delegates to `enginePermitted` rather than re-deriving the answer: a filter
310
+ * that reached for `engineLocality` would hand the routers a set the dispatcher
311
+ * then refuses, which is the "mysteriously worse result" this module forbids.
312
+ */
173
313
  export declare function filterPermittedEngines<T extends string>(engines: readonly T[], cfg?: AshlrConfig, env?: EnvLike): T[];
174
314
  /**
175
315
  * Engines from `candidates` that sit at `tier` AND are permitted right now.
@@ -25,6 +25,20 @@
25
25
  * make impossible, so `test/local-only-dispatch-paths.test.ts` enumerates every
26
26
  * known path and asserts it refuses.
27
27
  *
28
+ * TWO AXES, ONE PREDICATE (docs/LOCALITY-VS-SPEND.md)
29
+ * --------------------------------------------------
30
+ * This module answers two different questions and must not confuse them:
31
+ *
32
+ * `EngineLocality` 'local' | 'cloud' — where does the process run?
33
+ * `Meteredness` 'free' | 'metered' | 'unknown' — can this spend money?
34
+ *
35
+ * `decidePermission` reads METEREDNESS and refuses anything that is not provably
36
+ * `'free'`, `'unknown'` included. Locality is still published, unchanged, for the
37
+ * consumers that genuinely mean "on this machine" — local-fleet membership, pool
38
+ * tiering, local-context injection. They are not interchangeable: `ashlrcode` is
39
+ * a local process that this hub hands paid credentials, and reading its locality
40
+ * as permission is exactly how it kept them.
41
+ *
28
42
  * MODE RESOLUTION (config + env, env can only ENABLE)
29
43
  * --------------------------------------------------
30
44
  * persisted : cfg.foundry.localOnly === true (canonical)
@@ -182,8 +196,16 @@ export function localOnlyEnabled(cfg, env = process.env) {
182
196
  * opencode) reaches a vendor over the network and is classified 'cloud'.
183
197
  */
184
198
  const LOCAL_CLI_AGENTS = new Set(['ashlrcode', 'aw']);
185
- /** Provider ids served from this machine. Everything else is treated as cloud. */
186
- const LOCAL_PROVIDER_IDS = new Set([
199
+ /**
200
+ * Provider ids served from this machine. Everything else is treated as cloud.
201
+ *
202
+ * Exported so the parity suite can iterate the authority's OWN enumeration
203
+ * rather than restating it — a test carrying its own copy of this list would be
204
+ * the duplication this module exists to prevent. Consumers ask
205
+ * `providerLocality` / `providerMeteredness`; nothing outside this file should
206
+ * read the set to make a decision.
207
+ */
208
+ export const LOCAL_PROVIDER_IDS = new Set([
187
209
  'ollama',
188
210
  'lmstudio',
189
211
  'llama-server',
@@ -267,6 +289,129 @@ export function engineLocality(engine, cfg, env = process.env) {
267
289
  export function providerLocality(providerId) {
268
290
  return LOCAL_PROVIDER_IDS.has(providerId.trim().toLowerCase()) ? 'local' : 'cloud';
269
291
  }
292
+ /**
293
+ * Meteredness of every cli-agent the hub ships, stated EXPLICITLY.
294
+ *
295
+ * A cli-agent is the one engine kind whose spend the hub cannot read off an
296
+ * endpoint: the binary chooses its own backend after the spawn. So each one is
297
+ * classified by hand here, and `test/local-only-consumer-parity.test.ts` fails
298
+ * if a new cli-agent reaches the registry without an entry.
299
+ *
300
+ * claude / codex / hermes / opencode — reach a vendor over the network. Metered.
301
+ *
302
+ * ashlrcode — METERED. `docs/ECOSYSTEM-MAP.md:151`: consumes `@anthropic-ai/sdk`
303
+ * + OpenAI (routing xAI/DeepSeek/Groq/Ollama) — cloud inference BY DEFAULT —
304
+ * and the hub hands every cli-agent spawn working subscription credentials.
305
+ * There is no flag the hub passes and `ac` honours, and no probe the hub can
306
+ * read, so "pointed at Ollama" is not a claim this process can verify.
307
+ * Owner decision (docs/LOCALITY-VS-SPEND.md, Option A). Option B — classify
308
+ * it `'free'` only when an ashlrcode-side local mode is CONFIRMED — stays the
309
+ * target, and must not ship before its enforcement exists.
310
+ *
311
+ * aw — UNKNOWN, not metered. `docs/ECOSYSTEM-MAP.md:155` describes a
312
+ * fully-local agent fleet where "no data leaves the machine unless cloud
313
+ * fallback is opted into". That opt-in lives in aw's own `.env` and agent
314
+ * configs, which this hub neither reads nor controls — so the honest answer
315
+ * is that we do not know, and `'unknown'` says exactly that. It is refused
316
+ * under local-only and priced as spend, identically to `'metered'`; the
317
+ * distinction is truthfulness in the refusal, not a difference in effect.
318
+ * Calling it `'metered'` would assert a fact about a third-party config we
319
+ * have not read, which is the same mistake in the opposite direction.
320
+ */
321
+ export const CLI_AGENT_METEREDNESS = Object.freeze({
322
+ claude: 'metered',
323
+ codex: 'metered',
324
+ hermes: 'metered',
325
+ opencode: 'metered',
326
+ ashlrcode: 'metered',
327
+ aw: 'unknown',
328
+ });
329
+ /**
330
+ * Meteredness of a raw endpoint. A loopback URL genuinely cannot bill anyone.
331
+ *
332
+ * An absent or unparseable URL is `'unknown'` rather than `'metered'`: we are
333
+ * not asserting it costs money, we are saying we cannot tell. Both are refused.
334
+ */
335
+ export function endpointMeteredness(baseUrl) {
336
+ if (typeof baseUrl !== 'string' || baseUrl.trim().length === 0)
337
+ return 'unknown';
338
+ try {
339
+ new URL(baseUrl.trim());
340
+ }
341
+ catch {
342
+ return 'unknown';
343
+ }
344
+ return isLoopbackEndpoint(baseUrl) ? 'free' : 'metered';
345
+ }
346
+ /**
347
+ * Meteredness of a provider id. The free set is the same roster as
348
+ * `LOCAL_PROVIDER_IDS` — for a PROVIDER the two axes really do coincide, because
349
+ * a provider id names a serving runtime rather than an agent that picks its own
350
+ * backend. Everything else in the provider id space is a billed vendor.
351
+ */
352
+ export function providerMeteredness(providerId) {
353
+ return LOCAL_PROVIDER_IDS.has(providerId.trim().toLowerCase()) ? 'free' : 'metered';
354
+ }
355
+ /**
356
+ * Meteredness of an engine id.
357
+ *
358
+ * builtin — in-process, no model call. Free.
359
+ * cli-agent — `CLI_AGENT_METEREDNESS`; an agent registered through
360
+ * `cfg.foundry.engines` that nobody classified is 'unknown'.
361
+ * api-model — the resolved base URL decides, exactly as locality does:
362
+ * a self-hosted endpoint behind an API key is still free if
363
+ * it answers on loopback. No resolvable URL ⇒ 'unknown'.
364
+ * absent from registry — 'unknown', except `llama-server`, which older builds
365
+ * synthesise inline in `run/engines.ts`.
366
+ */
367
+ export function engineMeteredness(engine, cfg, env = process.env) {
368
+ const id = engine.trim().toLowerCase();
369
+ if (id === ALWAYS_PERMITTED_ENGINE)
370
+ return 'free';
371
+ const spec = resolveEngineSpec(engine, cfg);
372
+ if (!spec) {
373
+ if (id === 'llama-server')
374
+ return endpointMeteredness(llamaServerBaseUrl(cfg, env));
375
+ return 'unknown';
376
+ }
377
+ if (spec.kind === 'builtin')
378
+ return 'free';
379
+ if (spec.kind === 'cli-agent')
380
+ return CLI_AGENT_METEREDNESS[id] ?? 'unknown';
381
+ const api = spec.api;
382
+ const fromEnv = api?.baseUrlEnv ? env[api.baseUrlEnv]?.trim() : undefined;
383
+ const baseUrl = (fromEnv && fromEnv.length > 0 ? fromEnv : undefined) ?? api?.defaultBaseUrl;
384
+ return endpointMeteredness(baseUrl);
385
+ }
386
+ /**
387
+ * Meteredness of an id that may come from EITHER id space.
388
+ *
389
+ * `run/budget.ts` documents a provider id but `run/sandboxed-engine.ts` calls it
390
+ * with an engine id (`:1825`, `:2161`, `:3061`). Rather than leave that mismatch
391
+ * load-bearing, this resolver names the ambiguity and settles it by ASKING WHICH
392
+ * SPACE THE ID IS IN, in this order:
393
+ *
394
+ * 1. a free provider id (`ollama`, `lmstudio`, …) → free;
395
+ * 2. an id the engine registry resolves → `engineMeteredness` is authoritative,
396
+ * so `'local-coder'` (loopback, absent from the provider roster) is free and
397
+ * `'aw'` keeps its honest `'unknown'` instead of being flattened to metered;
398
+ * 3. anything else → the provider id space, where "not in the free set" means a
399
+ * billed vendor, so `'anthropic'` is metered rather than being mistaken for
400
+ * an unclassified engine.
401
+ */
402
+ export function subjectMeteredness(id, cfg, env = process.env) {
403
+ const key = id.trim().toLowerCase();
404
+ if (key.length === 0)
405
+ return 'unknown';
406
+ if (LOCAL_PROVIDER_IDS.has(key))
407
+ return 'free';
408
+ const isEngineId = key === ALWAYS_PERMITTED_ENGINE ||
409
+ key === 'llama-server' || // may be synthesised inline rather than registered
410
+ resolveEngineSpec(id, cfg) !== undefined;
411
+ if (isEngineId)
412
+ return engineMeteredness(id, cfg, env);
413
+ return providerMeteredness(id);
414
+ }
270
415
  /**
271
416
  * Resolve the engine id behind an executable name.
272
417
  *
@@ -311,7 +456,10 @@ const SUBJECT_NOUN = {
311
456
  */
312
457
  export function decidePermission(subject, cfg, env = process.env) {
313
458
  const mode = resolveLocalOnlyMode(cfg, env);
314
- if (!mode.enabled || subject.locality === 'local') {
459
+ // THE RULE: refuse anything not PROVABLY free. Reading `locality` here is
460
+ // what let `ashlrcode` — a local process holding paid credentials — through,
461
+ // and treating 'unknown' as permitted is the same mistake one step removed.
462
+ if (!mode.enabled || subject.meteredness === 'free') {
315
463
  return { permitted: true, subject, mode, reason: null };
316
464
  }
317
465
  return { permitted: false, subject, mode, reason: refusalReason(subject, mode) };
@@ -323,18 +471,37 @@ export function decidePermission(subject, cfg, env = process.env) {
323
471
  */
324
472
  function refusalReason(subject, mode) {
325
473
  const noun = SUBJECT_NOUN[subject.kind];
326
- return (`local-only: refusing to dispatch to cloud ${noun} '${subject.id}'. ${mode.detail} ` +
327
- `No cloud ${noun} is reachable while local-only is on — ` +
474
+ // 'unknown' gets its own sentence on purpose. Told "refusing to dispatch to
475
+ // cloud engine 'aw'" an operator reads a misclassification and goes to turn
476
+ // the mode off; told the hub cannot verify it is free, they get the truth.
477
+ const head = subject.meteredness === 'unknown'
478
+ ? `local-only: refusing to dispatch to ${noun} '${subject.id}' — the hub cannot verify it is free. ` +
479
+ `It may reach a paid backend after dispatch and nothing here would see it, so it is not provably free and is refused. `
480
+ : `local-only: refusing to dispatch to cloud ${noun} '${subject.id}'. `;
481
+ const tail = subject.meteredness === 'unknown'
482
+ ? ''
483
+ : `No cloud ${noun} is reachable while local-only is on — `;
484
+ return (`${head}${mode.detail} ${tail}` +
328
485
  `run this work on a local engine (builtin, local-coder, llama-server), or turn the mode off with ` +
329
486
  `cfg.foundry.localOnly=false (and unset ${LOCAL_ONLY_ENV_VAR}).`);
330
487
  }
331
488
  /** Is this ENGINE permitted right now? */
332
489
  export function enginePermitted(engine, cfg, env = process.env) {
333
- return decidePermission({ kind: 'engine', id: engine, locality: engineLocality(engine, cfg, env) }, cfg, env);
490
+ return decidePermission({
491
+ kind: 'engine',
492
+ id: engine,
493
+ locality: engineLocality(engine, cfg, env),
494
+ meteredness: engineMeteredness(engine, cfg, env),
495
+ }, cfg, env);
334
496
  }
335
497
  /** Is this PROVIDER permitted right now? */
336
498
  export function providerPermitted(providerId, cfg, env = process.env) {
337
- return decidePermission({ kind: 'provider', id: providerId, locality: providerLocality(providerId) }, cfg, env);
499
+ return decidePermission({
500
+ kind: 'provider',
501
+ id: providerId,
502
+ locality: providerLocality(providerId),
503
+ meteredness: providerMeteredness(providerId),
504
+ }, cfg, env);
338
505
  }
339
506
  /** Is this raw OpenAI-compatible ENDPOINT permitted right now? */
340
507
  export function endpointPermitted(baseUrl, cfg, env = process.env) {
@@ -342,6 +509,7 @@ export function endpointPermitted(baseUrl, cfg, env = process.env) {
342
509
  kind: 'endpoint',
343
510
  id: baseUrl,
344
511
  locality: isLoopbackEndpoint(baseUrl) ? 'local' : 'cloud',
512
+ meteredness: endpointMeteredness(baseUrl),
345
513
  }, cfg, env);
346
514
  }
347
515
  /**
@@ -351,14 +519,22 @@ export function endpointPermitted(baseUrl, cfg, env = process.env) {
351
519
  * engine id. A binary that maps to no known engine is permitted — it is not a
352
520
  * hub-managed agent, and refusing every unrecognised executable would break
353
521
  * phantom wrapping and local tooling. Every engine the hub can actually route
354
- * to IS in the registry, so a cloud seat always resolves.
522
+ * to IS in the registry, so a spendable seat always resolves.
523
+ *
524
+ * THIS IS THE SITE THE METEREDNESS SPLIT WAS FOR. `ac` resolves to `ashlrcode`,
525
+ * which was classified local and therefore permitted — and then handed
526
+ * `CLAUDE_CODE_OAUTH_TOKEN` by the very next call. It now resolves to `metered`
527
+ * and is refused, with no change needed at `run/engines.ts:455` itself.
355
528
  */
356
529
  export function binPermitted(bin, cfg, env = process.env) {
357
530
  const id = engineIdForBin(bin, cfg);
358
531
  if (id === undefined) {
359
532
  return {
360
533
  permitted: true,
361
- subject: { kind: 'engine', id: bin, locality: 'local' },
534
+ // Deliberate: an executable no engine claims is outside the roster this
535
+ // policy governs, so it is 'free' in the only sense that applies — the
536
+ // hub is not handing it a seat, or credentials, or work.
537
+ subject: { kind: 'engine', id: bin, locality: 'local', meteredness: 'free' },
362
538
  mode: resolveLocalOnlyMode(cfg, env),
363
539
  reason: null,
364
540
  };
@@ -371,7 +547,7 @@ export function binPermitted(bin, cfg, env = process.env) {
371
547
  * heuristic here could know.
372
548
  */
373
549
  export function cloudSubjectPermitted(kind, id, cfg, env = process.env) {
374
- return decidePermission({ kind, id, locality: 'cloud' }, cfg, env);
550
+ return decidePermission({ kind, id, locality: 'cloud', meteredness: 'metered' }, cfg, env);
375
551
  }
376
552
  // ---------------------------------------------------------------------------
377
553
  // Refusal
@@ -403,12 +579,18 @@ export function assertPermitted(verdict) {
403
579
  // ---------------------------------------------------------------------------
404
580
  // Routing helpers
405
581
  // ---------------------------------------------------------------------------
406
- /** Keep only engines permitted under the current mode. */
582
+ /**
583
+ * Keep only engines permitted under the current mode.
584
+ *
585
+ * Delegates to `enginePermitted` rather than re-deriving the answer: a filter
586
+ * that reached for `engineLocality` would hand the routers a set the dispatcher
587
+ * then refuses, which is the "mysteriously worse result" this module forbids.
588
+ */
407
589
  export function filterPermittedEngines(engines, cfg, env = process.env) {
408
590
  const mode = resolveLocalOnlyMode(cfg, env);
409
591
  if (!mode.enabled)
410
592
  return [...engines];
411
- return engines.filter((e) => engineLocality(e, cfg, env) === 'local');
593
+ return engines.filter((e) => enginePermitted(e, cfg, env).permitted);
412
594
  }
413
595
  /**
414
596
  * Engines from `candidates` that sit at `tier` AND are permitted right now.
@@ -431,7 +613,8 @@ export function permittedEnginesAtTier(tier, candidates, cfg, env = process.env)
431
613
  * and no endpoint credentials — only the subject id and the mode source.
432
614
  */
433
615
  export function localOnlyReasonTag(verdict) {
434
- return `local-only(${verdict.mode.source}): cloud ${SUBJECT_NOUN[verdict.subject.kind]} '${verdict.subject.id}' refused`;
616
+ const adjective = verdict.subject.meteredness === 'unknown' ? 'unclassified' : 'cloud';
617
+ return `local-only(${verdict.mode.source}): ${adjective} ${SUBJECT_NOUN[verdict.subject.kind]} '${verdict.subject.id}' refused`;
435
618
  }
436
619
  /**
437
620
  * Build the operator snapshot. Read-only: resolves the mode, classifies every
@@ -453,11 +636,17 @@ export function localOnlyPolicySnapshot(cfg, env = process.env) {
453
636
  ids.add('llama-server'); // may be synthesised inline rather than registered
454
637
  const refuses = [];
455
638
  for (const id of [...ids].sort()) {
456
- if (engineLocality(id, cfg, env) !== 'cloud')
639
+ // The list the UI renders MUST be the set the dispatcher refuses, so it is
640
+ // computed from meteredness — the same axis `decidePermission` reads. A
641
+ // panel filtered by locality would omit `ashlrcode` while the dispatcher
642
+ // refused it, and "Nothing can spend money while this is on" would be false
643
+ // in the one place an operator goes to check it.
644
+ const meteredness = engineMeteredness(id, cfg, env);
645
+ if (meteredness === 'free')
457
646
  continue;
458
647
  refuses.push({
459
648
  engine: id,
460
- reason: refusalReason({ kind: 'engine', id, locality: 'cloud' }, asIfEnabled),
649
+ reason: refusalReason({ kind: 'engine', id, locality: engineLocality(id, cfg, env), meteredness }, asIfEnabled),
461
650
  });
462
651
  }
463
652
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"local-only.js","sourceRoot":"","sources":["../../../src/core/policy/local-only.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-only.js","sourceRoot":"","sources":["../../../src/core/policy/local-only.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,12 @@
4
4
  * Pure, deterministic functions — no I/O, no side effects. All functions
5
5
  * return new objects; RunUsage is never mutated in place.
6
6
  */
7
- import type { RunUsage, RunBudget } from '../types.js';
7
+ import type { AshlrConfig, RunUsage, RunBudget } from '../types.js';
8
+ /**
9
+ * Test-only: drop memoised answers so suites that vary env or registry entries
10
+ * stay independent of each other's ordering.
11
+ */
12
+ export declare function __resetBudgetMeterednessCacheForTests(): void;
8
13
  /**
9
14
  * Return a fresh, zeroed RunUsage.
10
15
  */
@@ -48,19 +53,28 @@ export declare const CACHE_READ_MULT = 0.1;
48
53
  /**
49
54
  * Estimated USD cost for a single model call.
50
55
  *
51
- * - Local providers (ollama, lmstudio) → always 0.
52
- * - Cloud providers → looked up from the static price table by matching
53
- * the provider id (case-insensitive prefix match against known keys).
54
- * Falls back to a conservative $3/$15 per-M-token estimate when unknown.
56
+ * - PROVABLY FREE subjects → 0. That is `subjectMeteredness(...) === 'free'`:
57
+ * loopback endpoints and the local serving runtimes, whatever they are called
58
+ * in either id space.
59
+ * - Everything else → looked up from the static price table by matching the id
60
+ * (case-insensitive prefix match against known keys). Falls back to a
61
+ * conservative $3/$15 per-M-token estimate when nothing matches — which is
62
+ * where `'ashlrcode'` lands, ON PURPOSE. A metered subject must never report
63
+ * $0; a wrong number invites scrutiny, a zero ends it.
55
64
  * - M246: optional cache token params (default 0) add tiered cache pricing
56
65
  * on top of the base cost. Existing callers with no cache args are unaffected.
57
66
  *
58
- * @param provider Provider id string (e.g. 'ollama', 'anthropic', 'openai').
67
+ * @param subject Provider id OR engine id — e.g. 'ollama', 'anthropic',
68
+ * 'local-coder', 'ashlrcode'. Both id spaces resolve; see
69
+ * `meterednessOf` for why this parameter used to lie.
59
70
  * @param tokensIn Number of prompt/input tokens (non-cached).
60
71
  * @param tokensOut Number of completion/output tokens.
61
72
  * @param cacheRead M246: Cache-read tokens (0 by default).
62
73
  * @param cacheWrite5m M246: 5-min TTL cache-write tokens (0 by default).
63
74
  * @param cacheWrite1h M246: 1-hour TTL cache-write tokens (0 by default).
64
- * @returns Estimated USD cost as a number (0 for local).
75
+ * @param cfg Optional config, so engines registered through
76
+ * `cfg.foundry.engines` classify correctly. Omitting it
77
+ * can only make a subject LESS provably free, never more.
78
+ * @returns Estimated USD cost as a number (0 only when provably free).
65
79
  */
66
- export declare function estCostUsd(provider: string, tokensIn: number, tokensOut: number, cacheRead?: number, cacheWrite5m?: number, cacheWrite1h?: number): number;
80
+ export declare function estCostUsd(subject: string, tokensIn: number, tokensOut: number, cacheRead?: number, cacheWrite5m?: number, cacheWrite1h?: number, cfg?: AshlrConfig): number;