harness-dispatch 0.8.0 → 0.10.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.
- package/CHANGELOG.md +1074 -2
- package/README.md +92 -36
- package/config.default.yaml +19 -3
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/billing.d.ts +24 -0
- package/dist/billing.d.ts.map +1 -1
- package/dist/billing.js +24 -0
- package/dist/billing.js.map +1 -1
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +299 -48
- package/dist/bin.js.map +1 -1
- package/dist/circuit-breaker.d.ts +9 -1
- package/dist/circuit-breaker.d.ts.map +1 -1
- package/dist/circuit-breaker.js +15 -1
- package/dist/circuit-breaker.js.map +1 -1
- package/dist/client-register.d.ts +11 -1
- package/dist/client-register.d.ts.map +1 -1
- package/dist/client-register.js +15 -6
- package/dist/client-register.js.map +1 -1
- package/dist/config/coercions.d.ts +5 -0
- package/dist/config/coercions.d.ts.map +1 -1
- package/dist/config/coercions.js +8 -0
- package/dist/config/coercions.js.map +1 -1
- package/dist/config/protocol.js.map +1 -1
- package/dist/config/validation.d.ts +12 -0
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +133 -7
- package/dist/config/validation.js.map +1 -1
- package/dist/config.d.ts +15 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +199 -152
- package/dist/config.js.map +1 -1
- package/dist/configure-yaml.d.ts +2 -0
- package/dist/configure-yaml.d.ts.map +1 -1
- package/dist/configure-yaml.js +114 -4
- package/dist/configure-yaml.js.map +1 -1
- package/dist/dispatch-log.d.ts.map +1 -1
- package/dist/dispatch-log.js +3 -1
- package/dist/dispatch-log.js.map +1 -1
- package/dist/dispatchers/generic-cli.d.ts.map +1 -1
- package/dist/dispatchers/generic-cli.js +281 -112
- package/dist/dispatchers/generic-cli.js.map +1 -1
- package/dist/dispatchers/openai-compatible.d.ts +0 -5
- package/dist/dispatchers/openai-compatible.d.ts.map +1 -1
- package/dist/dispatchers/openai-compatible.js +150 -83
- package/dist/dispatchers/openai-compatible.js.map +1 -1
- package/dist/dispatchers/shared/harness-login.d.ts +25 -0
- package/dist/dispatchers/shared/harness-login.d.ts.map +1 -0
- package/dist/dispatchers/shared/harness-login.js +73 -0
- package/dist/dispatchers/shared/harness-login.js.map +1 -0
- package/dist/dispatchers/shared/stream-subprocess.d.ts.map +1 -1
- package/dist/dispatchers/shared/stream-subprocess.js +71 -58
- package/dist/dispatchers/shared/stream-subprocess.js.map +1 -1
- package/dist/file-lock.d.ts +29 -1
- package/dist/file-lock.d.ts.map +1 -1
- package/dist/file-lock.js +53 -20
- package/dist/file-lock.js.map +1 -1
- package/dist/harness-presets.d.ts +51 -0
- package/dist/harness-presets.d.ts.map +1 -0
- package/dist/harness-presets.js +154 -0
- package/dist/harness-presets.js.map +1 -0
- package/dist/http/parse.d.ts +8 -1
- package/dist/http/parse.d.ts.map +1 -1
- package/dist/http/parse.js +10 -3
- package/dist/http/parse.js.map +1 -1
- package/dist/http/server.d.ts +2 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +188 -16
- package/dist/http/server.js.map +1 -1
- package/dist/job-runner.js +6 -0
- package/dist/job-runner.js.map +1 -1
- package/dist/jobs/context.d.ts +0 -7
- package/dist/jobs/context.d.ts.map +1 -1
- package/dist/jobs/context.js +95 -7
- package/dist/jobs/context.js.map +1 -1
- package/dist/jobs/lifecycle.d.ts +100 -0
- package/dist/jobs/lifecycle.d.ts.map +1 -0
- package/dist/jobs/lifecycle.js +263 -0
- package/dist/jobs/lifecycle.js.map +1 -0
- package/dist/jobs/read.d.ts +17 -0
- package/dist/jobs/read.d.ts.map +1 -0
- package/dist/jobs/read.js +103 -0
- package/dist/jobs/read.js.map +1 -0
- package/dist/jobs/run.d.ts +45 -0
- package/dist/jobs/run.d.ts.map +1 -0
- package/dist/jobs/run.js +351 -0
- package/dist/jobs/run.js.map +1 -0
- package/dist/jobs/start.d.ts +9 -0
- package/dist/jobs/start.d.ts.map +1 -0
- package/dist/jobs/start.js +126 -0
- package/dist/jobs/start.js.map +1 -0
- package/dist/jobs/store.d.ts.map +1 -1
- package/dist/jobs/store.js +13 -3
- package/dist/jobs/store.js.map +1 -1
- package/dist/jobs/supervisor.d.ts +151 -0
- package/dist/jobs/supervisor.d.ts.map +1 -0
- package/dist/jobs/supervisor.js +679 -0
- package/dist/jobs/supervisor.js.map +1 -0
- package/dist/jobs/types.d.ts +8 -1
- package/dist/jobs/types.d.ts.map +1 -1
- package/dist/jobs.d.ts +15 -218
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +14 -1317
- package/dist/jobs.js.map +1 -1
- package/dist/leaderboard.d.ts.map +1 -1
- package/dist/leaderboard.js +44 -28
- package/dist/leaderboard.js.map +1 -1
- package/dist/mcp/config-hot-reload.d.ts +14 -3
- package/dist/mcp/config-hot-reload.d.ts.map +1 -1
- package/dist/mcp/config-hot-reload.js +27 -6
- package/dist/mcp/config-hot-reload.js.map +1 -1
- package/dist/mcp/dispatcher-factory.d.ts.map +1 -1
- package/dist/mcp/dispatcher-factory.js +15 -4
- package/dist/mcp/dispatcher-factory.js.map +1 -1
- package/dist/mcp/resources.d.ts.map +1 -1
- package/dist/mcp/resources.js +3 -2
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/tool-schemas.d.ts +1 -1
- package/dist/mcp/tool-schemas.d.ts.map +1 -1
- package/dist/mcp/tool-schemas.js +6 -3
- package/dist/mcp/tool-schemas.js.map +1 -1
- package/dist/mcp/tools.d.ts +20 -6
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +92 -14
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp-clients.d.ts +9 -0
- package/dist/mcp-clients.d.ts.map +1 -1
- package/dist/mcp-clients.js +4 -0
- package/dist/mcp-clients.js.map +1 -1
- package/dist/observability/spans.d.ts.map +1 -1
- package/dist/observability/spans.js +10 -2
- package/dist/observability/spans.js.map +1 -1
- package/dist/quota.d.ts.map +1 -1
- package/dist/quota.js +16 -2
- package/dist/quota.js.map +1 -1
- package/dist/redaction.d.ts +90 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +221 -0
- package/dist/redaction.js.map +1 -0
- package/dist/route-policy.d.ts +2 -1
- package/dist/route-policy.d.ts.map +1 -1
- package/dist/route-policy.js +54 -0
- package/dist/route-policy.js.map +1 -1
- package/dist/router.d.ts +12 -23
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +86 -223
- package/dist/router.js.map +1 -1
- package/dist/safety.d.ts.map +1 -1
- package/dist/safety.js +7 -1
- package/dist/safety.js.map +1 -1
- package/dist/state-dir.d.ts +10 -0
- package/dist/state-dir.d.ts.map +1 -1
- package/dist/state-dir.js +27 -1
- package/dist/state-dir.js.map +1 -1
- package/dist/status.d.ts +14 -3
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +36 -3
- package/dist/status.js.map +1 -1
- package/dist/types.d.ts +24 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/workspace-lock.d.ts +20 -0
- package/dist/workspace-lock.d.ts.map +1 -1
- package/dist/workspace-lock.js +63 -0
- package/dist/workspace-lock.js.map +1 -1
- package/dist/workspace-resolve.d.ts +0 -9
- package/dist/workspace-resolve.d.ts.map +1 -1
- package/dist/workspace-resolve.js +115 -183
- package/dist/workspace-resolve.js.map +1 -1
- package/dist/workspaces.d.ts +15 -0
- package/dist/workspaces.d.ts.map +1 -1
- package/dist/workspaces.js +330 -90
- package/dist/workspaces.js.map +1 -1
- package/package.json +5 -4
|
@@ -68,6 +68,9 @@ export const FAIL_OPEN_ENUMS = {
|
|
|
68
68
|
*/
|
|
69
69
|
export const KNOWN_TOP_LEVEL_KEYS = new Set([
|
|
70
70
|
"version",
|
|
71
|
+
// Opt back into auto-detection when a config defines its own routes, or
|
|
72
|
+
// opt out when it does not. See loadConfig for the three cases.
|
|
73
|
+
"detect",
|
|
71
74
|
"clis",
|
|
72
75
|
"endpoints",
|
|
73
76
|
"services",
|
|
@@ -133,6 +136,43 @@ const NUMERIC_ROUTE_KEYS = new Set([
|
|
|
133
136
|
"max_input_tokens",
|
|
134
137
|
"timeout_ms",
|
|
135
138
|
]);
|
|
139
|
+
/**
|
|
140
|
+
* The smallest value each numeric route key can carry and still mean anything.
|
|
141
|
+
*
|
|
142
|
+
* Every one of these is positive-only, and being in range is not a style
|
|
143
|
+
* preference — the router multiplies three of them together
|
|
144
|
+
* (`quality * cli_capability * capability * quota * weight`) and orders by
|
|
145
|
+
* `tier` ASCENDING. A negative pair therefore does not degrade a route, it
|
|
146
|
+
* PROMOTES it: an acceptance pass measured `tier: -5, weight: -100,
|
|
147
|
+
* cli_capability: -3` scoring 299.8 against a normal route's 0.88, from a
|
|
148
|
+
* tier that sorts ahead of every real one — a route that wins every routing
|
|
149
|
+
* decision, silently, with no warning anywhere.
|
|
150
|
+
*
|
|
151
|
+
* `tier` starts at 1 because tier 1 is the frontier band and lower sorts
|
|
152
|
+
* first; 0 and below are ahead of a band that already means "best". The rest
|
|
153
|
+
* are exclusive of 0 (a zero weight or capability multiplies the score to
|
|
154
|
+
* nothing, and a zero timeout is not a timeout).
|
|
155
|
+
*
|
|
156
|
+
* No upper bounds. `cli_capability: 1.1` ships in this repo's own default
|
|
157
|
+
* config as deliberate tuning, so a cap would reject a documented value; the
|
|
158
|
+
* defect being fixed is sign, not magnitude.
|
|
159
|
+
*/
|
|
160
|
+
const NUMERIC_ROUTE_MINIMUMS = {
|
|
161
|
+
tier: { min: 1, exclusive: false },
|
|
162
|
+
weight: { min: 0, exclusive: true },
|
|
163
|
+
cli_capability: { min: 0, exclusive: true },
|
|
164
|
+
max_output_tokens: { min: 0, exclusive: true },
|
|
165
|
+
max_input_tokens: { min: 0, exclusive: true },
|
|
166
|
+
timeout_ms: { min: 0, exclusive: true },
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Of those, the ones the router actually multiplies into a score.
|
|
170
|
+
*
|
|
171
|
+
* Only these three get the "PROMOTES the route" explanation. Giving that
|
|
172
|
+
* reason for `timeout_ms` or a token cap told the operator something untrue
|
|
173
|
+
* about their own config: routing multiplies neither.
|
|
174
|
+
*/
|
|
175
|
+
const ROUTING_SCORED_KEYS = new Set(["tier", "weight", "cli_capability"]);
|
|
136
176
|
/** Recognised keys whose value must be a boolean. */
|
|
137
177
|
const BOOLEAN_ROUTE_KEYS = new Set([
|
|
138
178
|
"enabled",
|
|
@@ -140,11 +180,35 @@ const BOOLEAN_ROUTE_KEYS = new Set([
|
|
|
140
180
|
"allow_paid_usage",
|
|
141
181
|
"stdin",
|
|
142
182
|
]);
|
|
143
|
-
/**
|
|
183
|
+
/**
|
|
184
|
+
* Is this a value that reads as a USABLE number?
|
|
185
|
+
*
|
|
186
|
+
* Finite on both branches, and the string branch is the one that was wrong:
|
|
187
|
+
* `Number("1e999")` is `Infinity`, and `!Number.isNaN(Infinity)` is true, so a
|
|
188
|
+
* YAML `weight: 1e999` (which parses as a string, not a number) sailed through
|
|
189
|
+
* as "reads as a number", then sailed through the range check too — `Infinity`
|
|
190
|
+
* is not below any minimum. An acceptance pass measured it loading as
|
|
191
|
+
* `weight = Infinity` with NO warning of any kind.
|
|
192
|
+
*
|
|
193
|
+
* `Number.isFinite` on both branches closes that: `.inf`, `-.inf`, `.nan` and
|
|
194
|
+
* `1e999` are all unusable, whichever way YAML happened to type them.
|
|
195
|
+
*/
|
|
144
196
|
function readsAsNumber(v) {
|
|
145
197
|
if (typeof v === "number")
|
|
146
198
|
return Number.isFinite(v);
|
|
147
|
-
return typeof v === "string" && v !== "" &&
|
|
199
|
+
return typeof v === "string" && v !== "" && Number.isFinite(Number(v));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* How to name the offending value back to the operator.
|
|
203
|
+
*
|
|
204
|
+
* `JSON.stringify` has no representation for the non-finite numbers and emits
|
|
205
|
+
* `null`, so a warning about YAML's `-.inf` read "tier is null" — naming a
|
|
206
|
+
* value that appears nowhere in the file the reader is being asked to fix.
|
|
207
|
+
*/
|
|
208
|
+
function describeValue(v) {
|
|
209
|
+
if (typeof v === "number" && !Number.isFinite(v))
|
|
210
|
+
return String(v);
|
|
211
|
+
return JSON.stringify(v);
|
|
148
212
|
}
|
|
149
213
|
/**
|
|
150
214
|
* A RECOGNISED key carrying the wrong TYPE of value.
|
|
@@ -162,22 +226,70 @@ function readsAsNumber(v) {
|
|
|
162
226
|
*
|
|
163
227
|
* Reports rather than rejects, like every other warning here: the config still
|
|
164
228
|
* loads, and `doctor` exits non-zero so the signal is not merely decorative.
|
|
229
|
+
*
|
|
230
|
+
* The one thing it does beyond reporting is DELETE an out-of-range numeric
|
|
231
|
+
* value from the entry, so the built-in default applies. That is not a second
|
|
232
|
+
* behaviour bolted on: a non-numeric `tier: metered` already ends up at the
|
|
233
|
+
* default, because `num()` cannot read it. `tier: -5` is different only in
|
|
234
|
+
* that the coercion CAN read it, which is exactly why it is dangerous — it
|
|
235
|
+
* reaches routing and wins. Deleting the key makes the two unusable cases
|
|
236
|
+
* behave the same way, which is what an operator reading either warning
|
|
237
|
+
* ("IGNORED, and the built-in default applies instead") is being told.
|
|
238
|
+
*
|
|
239
|
+
* Every caller warns before it parses the same object, so the deletion is
|
|
240
|
+
* visible to the parse that follows.
|
|
165
241
|
*/
|
|
166
242
|
export function warnMistypedRouteValues(entry, label, warnings) {
|
|
167
243
|
for (const [key, value] of Object.entries(entry)) {
|
|
168
244
|
if (value === null || value === undefined)
|
|
169
245
|
continue;
|
|
170
246
|
if (NUMERIC_ROUTE_KEYS.has(key) && !readsAsNumber(value)) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
247
|
+
// Per field, for the same reason the range branch varies its text: the
|
|
248
|
+
// routing sentence was emitted for all six keys, and routing does not
|
|
249
|
+
// read `timeout_ms` or the token caps. The very next acceptance pass
|
|
250
|
+
// found this branch still saying it after the other was fixed — the
|
|
251
|
+
// same defect one branch over, in one function.
|
|
252
|
+
warnings.push(`${label}: ${key} is ${describeValue(value)}, which is not a number — ` +
|
|
253
|
+
`IGNORED, and the built-in default applies instead. ` +
|
|
254
|
+
(ROUTING_SCORED_KEYS.has(key)
|
|
255
|
+
? `Routing reads this field, so the route is not behaving the way this ` +
|
|
256
|
+
`line says it does.`
|
|
257
|
+
: `The route runs with the built-in ${key}, not the one written here.`));
|
|
258
|
+
// This branch WARNED without neutralising, and for a plain unreadable
|
|
259
|
+
// value that was harmless — `num()` returns the default anyway, so the
|
|
260
|
+
// warning was true by accident. `.inf` and `.nan` are `typeof "number"`,
|
|
261
|
+
// so `num()` hands them straight back: the route loaded at
|
|
262
|
+
// `tier=-Infinity, weight=Infinity` — ahead of every tier and above
|
|
263
|
+
// every score — underneath a warning reading "IGNORED, and the built-in
|
|
264
|
+
// default applies instead". The message asserted the opposite of what
|
|
265
|
+
// happened, which is worse than the silence it replaced.
|
|
266
|
+
delete entry[key];
|
|
267
|
+
}
|
|
268
|
+
else if (NUMERIC_ROUTE_KEYS.has(key)) {
|
|
269
|
+
const bound = NUMERIC_ROUTE_MINIMUMS[key];
|
|
270
|
+
const n = Number(value);
|
|
271
|
+
if (bound !== undefined && (bound.exclusive ? n <= bound.min : n < bound.min)) {
|
|
272
|
+
// The consequence differs by field, and stating the routing one for
|
|
273
|
+
// all six was simply false: routing does not multiply `timeout_ms` or
|
|
274
|
+
// the token caps. A warning that explains the wrong mechanism teaches
|
|
275
|
+
// the reader something untrue about their own config.
|
|
276
|
+
const consequence = ROUTING_SCORED_KEYS.has(key)
|
|
277
|
+
? `Routing multiplies these fields and orders tiers ascending, so a ` +
|
|
278
|
+
`negative one PROMOTES the route over every other rather than demoting it.`
|
|
279
|
+
: `A value at or below ${bound.min} here does not mean "no limit"; it ` +
|
|
280
|
+
`describes a route that can never do any work.`;
|
|
281
|
+
warnings.push(`${label}: ${key} is ${describeValue(value)}, which is below the minimum ` +
|
|
282
|
+
`of ${bound.min}${bound.exclusive ? " (exclusive)" : ""} — IGNORED, and the ` +
|
|
283
|
+
`built-in default applies instead. ${consequence}`);
|
|
284
|
+
delete entry[key];
|
|
285
|
+
}
|
|
174
286
|
}
|
|
175
287
|
if (BOOLEAN_ROUTE_KEYS.has(key) && typeof value !== "boolean") {
|
|
176
288
|
// A quoted "true"/"false" is accepted by bool() and is not a mistake
|
|
177
289
|
// worth reporting; anything else selects the default silently.
|
|
178
290
|
if (value === "true" || value === "false")
|
|
179
291
|
continue;
|
|
180
|
-
warnings.push(`${label}: ${key} is ${
|
|
292
|
+
warnings.push(`${label}: ${key} is ${describeValue(value)}, which is not true or false — ` +
|
|
181
293
|
`IGNORED, and the built-in default applies instead.`);
|
|
182
294
|
}
|
|
183
295
|
}
|
|
@@ -221,8 +333,22 @@ export function warnDuplicateRouteNames(names, block, warnings) {
|
|
|
221
333
|
*
|
|
222
334
|
* Verified read-nowhere in src/ at the time of writing; if one is implemented
|
|
223
335
|
* later, delete it from here and the warning goes away.
|
|
336
|
+
*
|
|
337
|
+
* `policy` and `workspace_policy` were added after an acceptance pass found
|
|
338
|
+
* them allow-listed at top level and read nowhere — top-level isolation
|
|
339
|
+
* controls that do nothing, the same shape as `default_safety_profile` above.
|
|
340
|
+
* Both names ARE real per-route keys (see KNOWN_ROUTE_KEYS), which is what
|
|
341
|
+
* makes the top-level spelling plausible enough to write by mistake: it looks
|
|
342
|
+
* like a global default for the per-route setting, and there is no such thing.
|
|
343
|
+
* Re-verified read-nowhere at top level on 2026-08-31 — `raw?.policy` in
|
|
344
|
+
* jobs.ts reads a JOB MANIFEST, not this config file.
|
|
224
345
|
*/
|
|
225
|
-
const ACCEPTED_BUT_UNIMPLEMENTED = new Set([
|
|
346
|
+
const ACCEPTED_BUT_UNIMPLEMENTED = new Set([
|
|
347
|
+
"protocols",
|
|
348
|
+
"default_safety_profile",
|
|
349
|
+
"policy",
|
|
350
|
+
"workspace_policy",
|
|
351
|
+
]);
|
|
226
352
|
export function warnUnknownTopLevelKeys(raw, warnings) {
|
|
227
353
|
for (const key of Object.keys(raw)) {
|
|
228
354
|
if (ACCEPTED_BUT_UNIMPLEMENTED.has(key)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/config/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -14,9 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
/** Injection seam for tests. Set via loadConfig({ whichFn }) if needed. */
|
|
16
16
|
export type WhichFn = (cmd: string) => Promise<string | null>;
|
|
17
|
-
import type {
|
|
18
|
-
/** Named, selectable protocols — every harness in CLI_DEFAULTS that defines one, keyed by its harness name (see protocolFrom()'s string/`extends:` handling). */
|
|
19
|
-
export declare const PROTOCOL_PRESETS: Record<string, CliProtocolConfig>;
|
|
17
|
+
import type { RouterConfig } from "./types.js";
|
|
20
18
|
/**
|
|
21
19
|
* Commands auto-detect probes on PATH, exported so `doctor` can name them.
|
|
22
20
|
*
|
|
@@ -49,8 +47,10 @@ export interface LoadConfigOptions {
|
|
|
49
47
|
*/
|
|
50
48
|
/**
|
|
51
49
|
* The config file a process should load: an explicit `--config`, else
|
|
52
|
-
* `HARNESS_DISPATCH_CONFIG`, else `./config.yaml` if it exists, else
|
|
53
|
-
* (
|
|
50
|
+
* `HARNESS_DISPATCH_CONFIG`, else `./config.yaml` if it exists, else the
|
|
51
|
+
* state directory's `config.yaml` (where `configure` writes) if it exists,
|
|
52
|
+
* else nothing (auto-detect). The current directory stays ahead of the user
|
|
53
|
+
* file so a per-project config still wins when one is present.
|
|
54
54
|
*
|
|
55
55
|
* ONE function because there used to be two, and they disagreed. job-runner.ts
|
|
56
56
|
* read the environment variable and bin.ts did not, while job-runner's own
|
|
@@ -67,6 +67,16 @@ export interface LoadConfigOptions {
|
|
|
67
67
|
* it meant it.
|
|
68
68
|
*/
|
|
69
69
|
export declare function resolveConfigPath(explicit?: string): string | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Load config, and register its secrets for output redaction.
|
|
72
|
+
*
|
|
73
|
+
* A thin wrapper on purpose. `loadConfigInner` has two return paths (legacy
|
|
74
|
+
* `services:` and the modern `clis:`/`endpoints:` shape) and gained a third
|
|
75
|
+
* once before; registering inside it would be two or three sites to keep in
|
|
76
|
+
* step. Registering here means every caller — the CLI, the MCP server, the
|
|
77
|
+
* hot reloader, the detached job runner — gets it by loading config at all,
|
|
78
|
+
* with nothing to remember. See src/redaction.ts for why that matters.
|
|
79
|
+
*/
|
|
70
80
|
export declare function loadConfig(path?: string, opts?: LoadConfigOptions): Promise<RouterConfig>;
|
|
71
81
|
export interface ConfigWatcher {
|
|
72
82
|
stop(): void;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA6BH,2EAA2E;AAC3E,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AA+B9D,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,YAAY,CAAC;AA0BxE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKvD,CAAC;AAipBF,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOvE;AAyCD;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAUvB;AA4OD,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,EACnC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GACpD,aAAa,CAkCf"}
|