harness-dispatch 0.4.0 → 0.6.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 +152 -0
- package/README.md +232 -87
- package/config.default.yaml +416 -397
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +2 -2
- package/dist/auth.js.map +1 -1
- package/dist/billing.d.ts +35 -4
- package/dist/billing.d.ts.map +1 -1
- package/dist/billing.js +48 -17
- package/dist/billing.js.map +1 -1
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +147 -91
- package/dist/bin.js.map +1 -1
- package/dist/breaker-store.d.ts +60 -9
- package/dist/breaker-store.d.ts.map +1 -1
- package/dist/breaker-store.js +246 -50
- package/dist/breaker-store.js.map +1 -1
- package/dist/circuit-breaker.d.ts +35 -0
- package/dist/circuit-breaker.d.ts.map +1 -1
- package/dist/circuit-breaker.js +68 -11
- package/dist/circuit-breaker.js.map +1 -1
- package/dist/config/coercions.d.ts +31 -0
- package/dist/config/coercions.d.ts.map +1 -0
- package/dist/config/coercions.js +169 -0
- package/dist/config/coercions.js.map +1 -0
- package/dist/config/env-interpolation.d.ts +36 -0
- package/dist/config/env-interpolation.d.ts.map +1 -0
- package/dist/config/env-interpolation.js +73 -0
- package/dist/config/env-interpolation.js.map +1 -0
- package/dist/config/protocol.d.ts +51 -0
- package/dist/config/protocol.d.ts.map +1 -0
- package/dist/config/protocol.js +300 -0
- package/dist/config/protocol.js.map +1 -0
- package/dist/config/route-fields.d.ts +72 -0
- package/dist/config/route-fields.d.ts.map +1 -0
- package/dist/config/route-fields.js +128 -0
- package/dist/config/route-fields.js.map +1 -0
- package/dist/config/validation.d.ts +72 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +189 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/config.d.ts +19 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +214 -635
- package/dist/config.js.map +1 -1
- package/dist/configure-yaml.d.ts +23 -0
- package/dist/configure-yaml.d.ts.map +1 -0
- package/dist/configure-yaml.js +193 -0
- package/dist/configure-yaml.js.map +1 -0
- package/dist/dispatch-log.d.ts.map +1 -1
- package/dist/dispatch-log.js +2 -3
- package/dist/dispatch-log.js.map +1 -1
- package/dist/dispatchers/base.d.ts +3 -0
- package/dist/dispatchers/base.d.ts.map +1 -1
- package/dist/dispatchers/base.js.map +1 -1
- package/dist/dispatchers/generic-cli.d.ts +15 -1
- package/dist/dispatchers/generic-cli.d.ts.map +1 -1
- package/dist/dispatchers/generic-cli.js +69 -5
- package/dist/dispatchers/generic-cli.js.map +1 -1
- package/dist/dispatchers/openai-compatible.d.ts.map +1 -1
- package/dist/dispatchers/openai-compatible.js +70 -2
- package/dist/dispatchers/openai-compatible.js.map +1 -1
- package/dist/dispatchers/shared/kill-tree.d.ts +17 -4
- package/dist/dispatchers/shared/kill-tree.d.ts.map +1 -1
- package/dist/dispatchers/shared/kill-tree.js +28 -4
- package/dist/dispatchers/shared/kill-tree.js.map +1 -1
- package/dist/dispatchers/shared/rate-limit-headers.d.ts +17 -0
- package/dist/dispatchers/shared/rate-limit-headers.d.ts.map +1 -1
- package/dist/dispatchers/shared/rate-limit-headers.js +27 -0
- package/dist/dispatchers/shared/rate-limit-headers.js.map +1 -1
- package/dist/dispatchers/shared/stream-subprocess.d.ts +11 -0
- package/dist/dispatchers/shared/stream-subprocess.d.ts.map +1 -1
- package/dist/dispatchers/shared/stream-subprocess.js +62 -35
- package/dist/dispatchers/shared/stream-subprocess.js.map +1 -1
- package/dist/dispatchers/shared/subprocess.d.ts.map +1 -1
- package/dist/dispatchers/shared/subprocess.js +3 -0
- package/dist/dispatchers/shared/subprocess.js.map +1 -1
- package/dist/dispatchers/shared/which-available.d.ts.map +1 -1
- package/dist/dispatchers/shared/which-available.js +16 -2
- package/dist/dispatchers/shared/which-available.js.map +1 -1
- package/dist/file-lock.d.ts +17 -0
- package/dist/file-lock.d.ts.map +1 -0
- package/dist/file-lock.js +143 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/http/parse.d.ts +64 -0
- package/dist/http/parse.d.ts.map +1 -0
- package/dist/http/parse.js +230 -0
- package/dist/http/parse.js.map +1 -0
- package/dist/http/server.d.ts +2 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +249 -286
- package/dist/http/server.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/job-runner.js +23 -5
- package/dist/job-runner.js.map +1 -1
- package/dist/jobs/context.d.ts +17 -0
- package/dist/jobs/context.d.ts.map +1 -0
- package/dist/jobs/context.js +84 -0
- package/dist/jobs/context.js.map +1 -0
- package/dist/jobs/store.d.ts +80 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +279 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/jobs/types.d.ts +135 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +11 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/jobs.d.ts +165 -85
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +824 -208
- package/dist/jobs.js.map +1 -1
- package/dist/leaderboard.d.ts +24 -1
- package/dist/leaderboard.d.ts.map +1 -1
- package/dist/leaderboard.js +94 -2
- package/dist/leaderboard.js.map +1 -1
- package/dist/mcp/config-hot-reload.d.ts.map +1 -1
- package/dist/mcp/config-hot-reload.js +1 -1
- package/dist/mcp/config-hot-reload.js.map +1 -1
- package/dist/mcp/dispatcher-factory.d.ts +16 -1
- package/dist/mcp/dispatcher-factory.d.ts.map +1 -1
- package/dist/mcp/dispatcher-factory.js +41 -3
- package/dist/mcp/dispatcher-factory.js.map +1 -1
- package/dist/mcp/tool-schemas.d.ts +194 -0
- package/dist/mcp/tool-schemas.d.ts.map +1 -0
- package/dist/mcp/tool-schemas.js +311 -0
- package/dist/mcp/tool-schemas.js.map +1 -0
- package/dist/mcp/tools.d.ts +26 -51
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +122 -151
- package/dist/mcp/tools.js.map +1 -1
- package/dist/observability/index.d.ts +16 -3
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +23 -7
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/spans.d.ts.map +1 -1
- package/dist/observability/spans.js +4 -1
- package/dist/observability/spans.js.map +1 -1
- package/dist/quota.d.ts +106 -22
- package/dist/quota.d.ts.map +1 -1
- package/dist/quota.js +198 -58
- package/dist/quota.js.map +1 -1
- package/dist/route-policy.d.ts.map +1 -1
- package/dist/route-policy.js +13 -3
- package/dist/route-policy.js.map +1 -1
- package/dist/router.d.ts +29 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +102 -40
- package/dist/router.js.map +1 -1
- package/dist/safety.d.ts.map +1 -1
- package/dist/safety.js +11 -2
- package/dist/safety.js.map +1 -1
- package/dist/state-dir.d.ts +17 -0
- package/dist/state-dir.d.ts.map +1 -0
- package/dist/state-dir.js +21 -0
- package/dist/state-dir.js.map +1 -0
- package/dist/status.d.ts +49 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +67 -4
- package/dist/status.js.map +1 -1
- package/dist/types.d.ts +74 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/working-dir.d.ts +13 -0
- package/dist/working-dir.d.ts.map +1 -1
- package/dist/working-dir.js +27 -0
- package/dist/working-dir.js.map +1 -1
- package/dist/workspace-lock.d.ts +40 -0
- package/dist/workspace-lock.d.ts.map +1 -0
- package/dist/workspace-lock.js +258 -0
- package/dist/workspace-lock.js.map +1 -0
- package/dist/workspace-resolve.d.ts +98 -0
- package/dist/workspace-resolve.d.ts.map +1 -0
- package/dist/workspace-resolve.js +382 -0
- package/dist/workspace-resolve.js.map +1 -0
- package/dist/workspaces.d.ts +16 -0
- package/dist/workspaces.d.ts.map +1 -1
- package/dist/workspaces.js +166 -22
- package/dist/workspaces.js.map +1 -1
- package/package.json +99 -96
- package/dist/dashboard/live.d.ts +0 -49
- package/dist/dashboard/live.d.ts.map +0 -1
- package/dist/dashboard/live.js +0 -149
- package/dist/dashboard/live.js.map +0 -1
package/dist/quota.d.ts
CHANGED
|
@@ -1,12 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Quota management for harness-dispatch.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* SCOPE, stated up front because the previous version of this comment
|
|
5
|
+
* overpromised: real quota numbers are available for `openai_compatible`
|
|
6
|
+
* ENDPOINT routes only. CLI routes — claude_code_cli, codex_cli, cursor_cli,
|
|
7
|
+
* antigravity_cli, i.e. the routes this product exists to arbitrate between —
|
|
8
|
+
* always report score 1.0 and source "unknown".
|
|
9
|
+
*
|
|
10
|
+
* Two layers were described here. Measured 2026-08-17, neither reaches a CLI
|
|
11
|
+
* route:
|
|
12
|
+
* 1. Reactive — state is updated from `rateLimitHeaders`, which only
|
|
13
|
+
* OpenAICompatibleDispatcher ever sets. A CLI route's
|
|
14
|
+
* `rateLimited: true` passes the early-return guard in recordResult()
|
|
15
|
+
* and then updates nothing.
|
|
16
|
+
* 2. Proactive — `checkQuota()` is a stub returning source "unknown" in
|
|
17
|
+
* BOTH dispatcher implementations, and maybeRefresh() discards
|
|
18
|
+
* "unknown". There are only two dispatchers, so this layer is currently
|
|
19
|
+
* unreachable in its entirety.
|
|
20
|
+
*
|
|
21
|
+
* Feeding 51 consecutive rate-limited CLI results through recordResult()
|
|
22
|
+
* leaves getQuotaScore at 1.0.
|
|
23
|
+
*
|
|
24
|
+
* This is a real gap but NOT an unhandled one: exhaustion of a CLI route is
|
|
25
|
+
* caught by the circuit breaker, which does trip on the CLI rate-limit
|
|
26
|
+
* signal. What is missing is GRADUATED preference — the router cannot lean
|
|
27
|
+
* toward the less-depleted of two working subscriptions, only avoid a route
|
|
28
|
+
* that has already failed. Binary, not proportional.
|
|
29
|
+
*
|
|
30
|
+
* Left as-is deliberately rather than papered over: the breaker already
|
|
31
|
+
* covers the safety-relevant case, and inventing a synthetic score from the
|
|
32
|
+
* one bit CLIs actually give us would make `usage` look informative while
|
|
33
|
+
* telling the reader nothing. Documented instead so the output can be read
|
|
34
|
+
* correctly.
|
|
10
35
|
*/
|
|
11
36
|
import type { DispatchResult, QuotaInfo } from "./types.js";
|
|
12
37
|
import type { Dispatcher } from "./dispatchers/base.js";
|
|
@@ -23,6 +48,14 @@ export interface QuotaStateJSON {
|
|
|
23
48
|
localCallCount: number;
|
|
24
49
|
localSuccessCount: number;
|
|
25
50
|
localFailureCount: number;
|
|
51
|
+
/** Calls the route declined because it was rate limited — busy, not broken. */
|
|
52
|
+
localRateLimitedCount: number;
|
|
53
|
+
/**
|
|
54
|
+
* Tokens reported by the harness, summed. Deliberately not money: see
|
|
55
|
+
* QuotaCache.localInputTokens for why a price cannot be stated honestly.
|
|
56
|
+
*/
|
|
57
|
+
localInputTokens: number;
|
|
58
|
+
localOutputTokens: number;
|
|
26
59
|
}
|
|
27
60
|
/** Mutable quota snapshot for one service, updated reactively. */
|
|
28
61
|
export declare class QuotaState {
|
|
@@ -36,7 +69,7 @@ export declare class QuotaState {
|
|
|
36
69
|
constructor(service: string);
|
|
37
70
|
get score(): number;
|
|
38
71
|
updateFromQuotaInfo(info: QuotaInfo): void;
|
|
39
|
-
toJSON(): Omit<QuotaStateJSON, "localCallCount" | "localSuccessCount" | "localFailureCount">;
|
|
72
|
+
toJSON(): Omit<QuotaStateJSON, "localCallCount" | "localSuccessCount" | "localFailureCount" | "localRateLimitedCount" | "localInputTokens" | "localOutputTokens">;
|
|
40
73
|
}
|
|
41
74
|
export interface QuotaCacheOptions {
|
|
42
75
|
ttlMs?: number;
|
|
@@ -55,29 +88,61 @@ export declare class QuotaCache {
|
|
|
55
88
|
private localCounts;
|
|
56
89
|
private localSuccessCounts;
|
|
57
90
|
private localFailureCounts;
|
|
91
|
+
private localRateLimitedCounts;
|
|
92
|
+
/**
|
|
93
|
+
* Tokens actually reported by dispatchers, summed per route.
|
|
94
|
+
*
|
|
95
|
+
* The honest answer to "what has this cost me". Real spend in money is NOT
|
|
96
|
+
* derivable here: subscription CLIs have no per-call price at all, and
|
|
97
|
+
* putting a price on tokens would mean hardcoding a per-model rate card
|
|
98
|
+
* that goes stale silently — the exact kind of confident-but-wrong number
|
|
99
|
+
* this tool's billing policy refuses to invent. Tokens are measured, so
|
|
100
|
+
* tokens are what gets reported.
|
|
101
|
+
*/
|
|
102
|
+
private localInputTokens;
|
|
103
|
+
private localOutputTokens;
|
|
104
|
+
/**
|
|
105
|
+
* Increments made since the last successful persist.
|
|
106
|
+
*
|
|
107
|
+
* The counters above are this process's ABSOLUTE view, used for local
|
|
108
|
+
* reporting. They cannot be written to a shared file directly: every
|
|
109
|
+
* dispatch runs in its own detached runner that booted from the same
|
|
110
|
+
* baseline, so a wave of them all write "baseline + 1" and all but one
|
|
111
|
+
* increment is lost. Measured at the shipped default of
|
|
112
|
+
* max_concurrent_runs: 4 — 8 dispatches were recorded as 2.
|
|
113
|
+
*
|
|
114
|
+
* Persisting the DELTA under a lock is what makes the count additive across
|
|
115
|
+
* processes. Cleared only after a write succeeds, so a failed write is
|
|
116
|
+
* retried on the next call rather than dropped.
|
|
117
|
+
*/
|
|
118
|
+
private pendingDelta;
|
|
58
119
|
private persistCounter;
|
|
59
120
|
constructor(dispatchers: Record<string, Dispatcher>, opts?: QuotaCacheOptions);
|
|
60
121
|
getQuotaScore(service: string): Promise<number>;
|
|
122
|
+
private bumpDelta;
|
|
61
123
|
recordResult(service: string, result: DispatchResult): void;
|
|
62
124
|
getQuotaInfo(service: string): Promise<QuotaInfo | null>;
|
|
63
|
-
fullStatus(): Promise<Record<string, QuotaStateJSON>>;
|
|
64
|
-
private maybeRefresh;
|
|
65
|
-
private loadLocalCounts;
|
|
66
125
|
/**
|
|
67
|
-
*
|
|
126
|
+
* Re-read the persisted counts before reporting them.
|
|
68
127
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
128
|
+
* Dispatches run in DETACHED child processes. Each child records its result
|
|
129
|
+
* and persists it, but the server's own QuotaCache loaded its counts at boot
|
|
130
|
+
* and never looked again — so `usage` inside the process that started the
|
|
131
|
+
* work reported calls=0 while the disk held calls=3. The numbers only ever
|
|
132
|
+
* appeared to a LATER process, which is the opposite of useful: the
|
|
133
|
+
* walkthrough tells a user to run `usage` when spend looks unexpected, and
|
|
134
|
+
* on the primary surface it answered zero.
|
|
135
|
+
*
|
|
136
|
+
* Max rather than adopt-disk: this process writes through on every
|
|
137
|
+
* recordResult, so disk is normally current, but the persist path is a
|
|
138
|
+
* documented read-modify-write race (counters are informational and never
|
|
139
|
+
* consulted by routing). Taking the larger value means a lost write shows a
|
|
140
|
+
* stale count rather than losing one this process definitely made.
|
|
79
141
|
*/
|
|
80
|
-
private
|
|
142
|
+
private refreshLocalCounts;
|
|
143
|
+
fullStatus(): Promise<Record<string, QuotaStateJSON>>;
|
|
144
|
+
private maybeRefresh;
|
|
145
|
+
private loadLocalCounts;
|
|
81
146
|
private nextTempStateFile;
|
|
82
147
|
private writeStatePayloadAtomicSync;
|
|
83
148
|
/**
|
|
@@ -86,6 +151,25 @@ export declare class QuotaCache {
|
|
|
86
151
|
* cross-process caveat). Synchronous so a CLI invocation that exits
|
|
87
152
|
* immediately after a route can't leave a temp file behind.
|
|
88
153
|
*/
|
|
154
|
+
/**
|
|
155
|
+
* Persist this process's increments, additively and under a lock.
|
|
156
|
+
*
|
|
157
|
+
* buildStatePayload() writes this process's ABSOLUTE counts over whatever it
|
|
158
|
+
* read. With a detached runner per dispatch that is lossy by construction:
|
|
159
|
+
* every runner boots from the same baseline, so a concurrent wave all write
|
|
160
|
+
* "baseline + 1" and all but one increment disappears. Measured at the
|
|
161
|
+
* shipped default of max_concurrent_runs: 4 — 8 successful dispatches were
|
|
162
|
+
* recorded as 2, deterministically.
|
|
163
|
+
*
|
|
164
|
+
* The earlier Math.max merge on read could not fix this: it recovers a value
|
|
165
|
+
* that was written, and these were never written at all.
|
|
166
|
+
*
|
|
167
|
+
* So the delta is applied to whatever is on disk INSIDE the lock. The lock
|
|
168
|
+
* alone would not have been enough either — serialised writers each holding
|
|
169
|
+
* an absolute value simply take turns writing the same number.
|
|
170
|
+
*/
|
|
89
171
|
saveLocalCountsSync(): void;
|
|
172
|
+
/** Current on-disk state, or {} if unreadable. */
|
|
173
|
+
private readStateFile;
|
|
90
174
|
}
|
|
91
175
|
//# sourceMappingURL=quota.d.ts.map
|
package/dist/quota.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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"}
|
package/dist/quota.js
CHANGED
|
@@ -1,16 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Quota management for harness-dispatch.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* SCOPE, stated up front because the previous version of this comment
|
|
5
|
+
* overpromised: real quota numbers are available for `openai_compatible`
|
|
6
|
+
* ENDPOINT routes only. CLI routes — claude_code_cli, codex_cli, cursor_cli,
|
|
7
|
+
* antigravity_cli, i.e. the routes this product exists to arbitrate between —
|
|
8
|
+
* always report score 1.0 and source "unknown".
|
|
9
|
+
*
|
|
10
|
+
* Two layers were described here. Measured 2026-08-17, neither reaches a CLI
|
|
11
|
+
* route:
|
|
12
|
+
* 1. Reactive — state is updated from `rateLimitHeaders`, which only
|
|
13
|
+
* OpenAICompatibleDispatcher ever sets. A CLI route's
|
|
14
|
+
* `rateLimited: true` passes the early-return guard in recordResult()
|
|
15
|
+
* and then updates nothing.
|
|
16
|
+
* 2. Proactive — `checkQuota()` is a stub returning source "unknown" in
|
|
17
|
+
* BOTH dispatcher implementations, and maybeRefresh() discards
|
|
18
|
+
* "unknown". There are only two dispatchers, so this layer is currently
|
|
19
|
+
* unreachable in its entirety.
|
|
20
|
+
*
|
|
21
|
+
* Feeding 51 consecutive rate-limited CLI results through recordResult()
|
|
22
|
+
* leaves getQuotaScore at 1.0.
|
|
23
|
+
*
|
|
24
|
+
* This is a real gap but NOT an unhandled one: exhaustion of a CLI route is
|
|
25
|
+
* caught by the circuit breaker, which does trip on the CLI rate-limit
|
|
26
|
+
* signal. What is missing is GRADUATED preference — the router cannot lean
|
|
27
|
+
* toward the less-depleted of two working subscriptions, only avoid a route
|
|
28
|
+
* that has already failed. Binary, not proportional.
|
|
29
|
+
*
|
|
30
|
+
* Left as-is deliberately rather than papered over: the breaker already
|
|
31
|
+
* covers the safety-relevant case, and inventing a synthetic score from the
|
|
32
|
+
* one bit CLIs actually give us would make `usage` look informative while
|
|
33
|
+
* telling the reader nothing. Documented instead so the output can be read
|
|
34
|
+
* correctly.
|
|
10
35
|
*/
|
|
36
|
+
import { withFileLock } from "./file-lock.js";
|
|
11
37
|
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
12
|
-
import { homedir } from "node:os";
|
|
13
38
|
import path from "node:path";
|
|
39
|
+
import { stateRoot } from "./state-dir.js";
|
|
14
40
|
import { parseLimit, parseRemaining, } from "./dispatchers/shared/rate-limit-headers.js";
|
|
15
41
|
export const DEFAULT_QUOTA_TTL_MS = 300_000; // 5 minutes
|
|
16
42
|
export const PROACTIVE_CHECK_TIMEOUT_MS = 15_000;
|
|
@@ -24,7 +50,7 @@ export const PROACTIVE_CHECK_TIMEOUT_MS = 15_000;
|
|
|
24
50
|
* root, in dev) since nothing points it elsewhere by default.
|
|
25
51
|
*/
|
|
26
52
|
function defaultStateFile() {
|
|
27
|
-
const dir =
|
|
53
|
+
const dir = stateRoot();
|
|
28
54
|
return path.join(dir, "quota_state.json");
|
|
29
55
|
}
|
|
30
56
|
function monotonicSec() {
|
|
@@ -84,6 +110,34 @@ export class QuotaCache {
|
|
|
84
110
|
localCounts;
|
|
85
111
|
localSuccessCounts;
|
|
86
112
|
localFailureCounts;
|
|
113
|
+
localRateLimitedCounts;
|
|
114
|
+
/**
|
|
115
|
+
* Tokens actually reported by dispatchers, summed per route.
|
|
116
|
+
*
|
|
117
|
+
* The honest answer to "what has this cost me". Real spend in money is NOT
|
|
118
|
+
* derivable here: subscription CLIs have no per-call price at all, and
|
|
119
|
+
* putting a price on tokens would mean hardcoding a per-model rate card
|
|
120
|
+
* that goes stale silently — the exact kind of confident-but-wrong number
|
|
121
|
+
* this tool's billing policy refuses to invent. Tokens are measured, so
|
|
122
|
+
* tokens are what gets reported.
|
|
123
|
+
*/
|
|
124
|
+
localInputTokens;
|
|
125
|
+
localOutputTokens;
|
|
126
|
+
/**
|
|
127
|
+
* Increments made since the last successful persist.
|
|
128
|
+
*
|
|
129
|
+
* The counters above are this process's ABSOLUTE view, used for local
|
|
130
|
+
* reporting. They cannot be written to a shared file directly: every
|
|
131
|
+
* dispatch runs in its own detached runner that booted from the same
|
|
132
|
+
* baseline, so a wave of them all write "baseline + 1" and all but one
|
|
133
|
+
* increment is lost. Measured at the shipped default of
|
|
134
|
+
* max_concurrent_runs: 4 — 8 dispatches were recorded as 2.
|
|
135
|
+
*
|
|
136
|
+
* Persisting the DELTA under a lock is what makes the count additive across
|
|
137
|
+
* processes. Cleared only after a write succeeds, so a failed write is
|
|
138
|
+
* retried on the next call rather than dropped.
|
|
139
|
+
*/
|
|
140
|
+
pendingDelta = {};
|
|
87
141
|
persistCounter = 0;
|
|
88
142
|
constructor(dispatchers, opts = {}) {
|
|
89
143
|
this.dispatchers = dispatchers;
|
|
@@ -96,6 +150,9 @@ export class QuotaCache {
|
|
|
96
150
|
this.localCounts = loaded.calls;
|
|
97
151
|
this.localSuccessCounts = loaded.success;
|
|
98
152
|
this.localFailureCounts = loaded.failure;
|
|
153
|
+
this.localRateLimitedCounts = loaded.rateLimited;
|
|
154
|
+
this.localInputTokens = loaded.inputTokens;
|
|
155
|
+
this.localOutputTokens = loaded.outputTokens;
|
|
99
156
|
}
|
|
100
157
|
// ------------------------------------------------------------------
|
|
101
158
|
// Public API — called by Router
|
|
@@ -105,13 +162,42 @@ export class QuotaCache {
|
|
|
105
162
|
const state = this.states[service];
|
|
106
163
|
return state ? state.score : 1.0;
|
|
107
164
|
}
|
|
165
|
+
bumpDelta(service, field) {
|
|
166
|
+
const d = (this.pendingDelta[service] ??= { calls: 0, success: 0, failure: 0, rateLimited: 0, inputTokens: 0, outputTokens: 0 });
|
|
167
|
+
d[field] += 1;
|
|
168
|
+
}
|
|
108
169
|
recordResult(service, result) {
|
|
109
170
|
this.localCounts[service] = (this.localCounts[service] ?? 0) + 1;
|
|
171
|
+
this.bumpDelta(service, "calls");
|
|
110
172
|
if (result.success) {
|
|
111
173
|
this.localSuccessCounts[service] = (this.localSuccessCounts[service] ?? 0) + 1;
|
|
174
|
+
this.bumpDelta(service, "success");
|
|
175
|
+
}
|
|
176
|
+
else if (result.rateLimited) {
|
|
177
|
+
// Rate limiting is UNAVAILABILITY, not failure, and the difference is
|
|
178
|
+
// not cosmetic: `usage` is what an orchestrating agent is told to check
|
|
179
|
+
// before delegating, and these counts persist across restarts. Filing a
|
|
180
|
+
// busy route under `failed` leaves a permanent record that it is
|
|
181
|
+
// unreliable, so the agent routes away from a route that was never
|
|
182
|
+
// broken — a tool quietly destroying its own reputation. The circuit
|
|
183
|
+
// breaker already handles the routing consequence of a rate limit
|
|
184
|
+
// properly and separately; this is only about what the numbers say.
|
|
185
|
+
this.localRateLimitedCounts[service] = (this.localRateLimitedCounts[service] ?? 0) + 1;
|
|
186
|
+
this.bumpDelta(service, "rateLimited");
|
|
112
187
|
}
|
|
113
188
|
else {
|
|
114
189
|
this.localFailureCounts[service] = (this.localFailureCounts[service] ?? 0) + 1;
|
|
190
|
+
this.bumpDelta(service, "failure");
|
|
191
|
+
}
|
|
192
|
+
if (result.tokensUsed) {
|
|
193
|
+
const { input, output } = result.tokensUsed;
|
|
194
|
+
this.localInputTokens[service] = (this.localInputTokens[service] ?? 0) + input;
|
|
195
|
+
this.localOutputTokens[service] = (this.localOutputTokens[service] ?? 0) + output;
|
|
196
|
+
const d = (this.pendingDelta[service] ??= {
|
|
197
|
+
calls: 0, success: 0, failure: 0, rateLimited: 0, inputTokens: 0, outputTokens: 0,
|
|
198
|
+
});
|
|
199
|
+
d.inputTokens += input;
|
|
200
|
+
d.outputTokens += output;
|
|
115
201
|
}
|
|
116
202
|
// CLI commands often exit immediately after a route. Use the synchronous
|
|
117
203
|
// atomic path so local-count persistence cannot leave a temp file behind.
|
|
@@ -155,7 +241,40 @@ export class QuotaCache {
|
|
|
155
241
|
info.resetAt = state.resetAt;
|
|
156
242
|
return info;
|
|
157
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Re-read the persisted counts before reporting them.
|
|
246
|
+
*
|
|
247
|
+
* Dispatches run in DETACHED child processes. Each child records its result
|
|
248
|
+
* and persists it, but the server's own QuotaCache loaded its counts at boot
|
|
249
|
+
* and never looked again — so `usage` inside the process that started the
|
|
250
|
+
* work reported calls=0 while the disk held calls=3. The numbers only ever
|
|
251
|
+
* appeared to a LATER process, which is the opposite of useful: the
|
|
252
|
+
* walkthrough tells a user to run `usage` when spend looks unexpected, and
|
|
253
|
+
* on the primary surface it answered zero.
|
|
254
|
+
*
|
|
255
|
+
* Max rather than adopt-disk: this process writes through on every
|
|
256
|
+
* recordResult, so disk is normally current, but the persist path is a
|
|
257
|
+
* documented read-modify-write race (counters are informational and never
|
|
258
|
+
* consulted by routing). Taking the larger value means a lost write shows a
|
|
259
|
+
* stale count rather than losing one this process definitely made.
|
|
260
|
+
*/
|
|
261
|
+
refreshLocalCounts() {
|
|
262
|
+
const disk = this.loadLocalCounts();
|
|
263
|
+
for (const [service, count] of Object.entries(disk.calls)) {
|
|
264
|
+
this.localCounts[service] = Math.max(this.localCounts[service] ?? 0, count);
|
|
265
|
+
}
|
|
266
|
+
for (const [service, count] of Object.entries(disk.success)) {
|
|
267
|
+
this.localSuccessCounts[service] = Math.max(this.localSuccessCounts[service] ?? 0, count);
|
|
268
|
+
}
|
|
269
|
+
for (const [service, count] of Object.entries(disk.failure)) {
|
|
270
|
+
this.localFailureCounts[service] = Math.max(this.localFailureCounts[service] ?? 0, count);
|
|
271
|
+
}
|
|
272
|
+
for (const [service, count] of Object.entries(disk.rateLimited)) {
|
|
273
|
+
this.localRateLimitedCounts[service] = Math.max(this.localRateLimitedCounts[service] ?? 0, count);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
158
276
|
async fullStatus() {
|
|
277
|
+
this.refreshLocalCounts();
|
|
159
278
|
const out = {};
|
|
160
279
|
for (const service of Object.keys(this.dispatchers)) {
|
|
161
280
|
await this.maybeRefresh(service);
|
|
@@ -165,6 +284,9 @@ export class QuotaCache {
|
|
|
165
284
|
localCallCount: this.localCounts[service] ?? 0,
|
|
166
285
|
localSuccessCount: this.localSuccessCounts[service] ?? 0,
|
|
167
286
|
localFailureCount: this.localFailureCounts[service] ?? 0,
|
|
287
|
+
localRateLimitedCount: this.localRateLimitedCounts[service] ?? 0,
|
|
288
|
+
localInputTokens: this.localInputTokens[service] ?? 0,
|
|
289
|
+
localOutputTokens: this.localOutputTokens[service] ?? 0,
|
|
168
290
|
};
|
|
169
291
|
}
|
|
170
292
|
return out;
|
|
@@ -205,8 +327,9 @@ export class QuotaCache {
|
|
|
205
327
|
// Local count persistence
|
|
206
328
|
// ------------------------------------------------------------------
|
|
207
329
|
loadLocalCounts() {
|
|
330
|
+
const empty = { calls: {}, success: {}, failure: {}, rateLimited: {}, inputTokens: {}, outputTokens: {} };
|
|
208
331
|
if (!existsSync(this.stateFile)) {
|
|
209
|
-
return
|
|
332
|
+
return empty;
|
|
210
333
|
}
|
|
211
334
|
try {
|
|
212
335
|
const raw = readFileSync(this.stateFile, "utf-8");
|
|
@@ -214,6 +337,9 @@ export class QuotaCache {
|
|
|
214
337
|
const calls = {};
|
|
215
338
|
const success = {};
|
|
216
339
|
const failure = {};
|
|
340
|
+
const rateLimited = {};
|
|
341
|
+
const inputTokens = {};
|
|
342
|
+
const outputTokens = {};
|
|
217
343
|
for (const [k, v] of Object.entries(data)) {
|
|
218
344
|
if (!v)
|
|
219
345
|
continue;
|
|
@@ -223,57 +349,18 @@ export class QuotaCache {
|
|
|
223
349
|
success[k] = v.local_success;
|
|
224
350
|
if (typeof v.local_failure === "number")
|
|
225
351
|
failure[k] = v.local_failure;
|
|
352
|
+
if (typeof v.local_rate_limited === "number")
|
|
353
|
+
rateLimited[k] = v.local_rate_limited;
|
|
354
|
+
if (typeof v.local_input_tokens === "number")
|
|
355
|
+
inputTokens[k] = v.local_input_tokens;
|
|
356
|
+
if (typeof v.local_output_tokens === "number")
|
|
357
|
+
outputTokens[k] = v.local_output_tokens;
|
|
226
358
|
}
|
|
227
|
-
return { calls, success, failure };
|
|
228
|
-
}
|
|
229
|
-
catch {
|
|
230
|
-
return { calls: {}, success: {}, failure: {} };
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Build the on-disk payload, merging new counts over any existing state.
|
|
235
|
-
*
|
|
236
|
-
* Known limitation: this read-modify-write is not atomic across processes.
|
|
237
|
-
* Two `harness-dispatch` CLI invocations racing on the same stateFile can
|
|
238
|
-
* both read the same baseline and each write back only their own count,
|
|
239
|
-
* silently losing the other's increment. Left as-is deliberately —
|
|
240
|
-
* localCallCount/localSuccessCount/localFailureCount are purely
|
|
241
|
-
* informational (surfaced in `status`/`doctor`/`usage` output and the live
|
|
242
|
-
* dashboard; see status.ts, dashboard/live.ts), never consulted by
|
|
243
|
-
* QuotaState.score or any routing/billing decision — so an occasional
|
|
244
|
-
* undercount here doesn't affect what the router actually does, only what
|
|
245
|
-
* it reports. Not worth cross-process file locking for a display counter.
|
|
246
|
-
*/
|
|
247
|
-
buildStatePayload() {
|
|
248
|
-
let existing = {};
|
|
249
|
-
try {
|
|
250
|
-
if (existsSync(this.stateFile)) {
|
|
251
|
-
const raw = readFileSync(this.stateFile, "utf-8");
|
|
252
|
-
const parsed = JSON.parse(raw);
|
|
253
|
-
if (parsed && typeof parsed === "object") {
|
|
254
|
-
existing = parsed;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
359
|
+
return { calls, success, failure, rateLimited, inputTokens, outputTokens };
|
|
257
360
|
}
|
|
258
361
|
catch {
|
|
259
|
-
|
|
260
|
-
}
|
|
261
|
-
for (const [service, count] of Object.entries(this.localCounts)) {
|
|
262
|
-
const bucket = existing[service] ?? {};
|
|
263
|
-
bucket["local_calls"] = count;
|
|
264
|
-
existing[service] = bucket;
|
|
265
|
-
}
|
|
266
|
-
for (const [service, count] of Object.entries(this.localSuccessCounts)) {
|
|
267
|
-
const bucket = existing[service] ?? {};
|
|
268
|
-
bucket["local_success"] = count;
|
|
269
|
-
existing[service] = bucket;
|
|
270
|
-
}
|
|
271
|
-
for (const [service, count] of Object.entries(this.localFailureCounts)) {
|
|
272
|
-
const bucket = existing[service] ?? {};
|
|
273
|
-
bucket["local_failure"] = count;
|
|
274
|
-
existing[service] = bucket;
|
|
362
|
+
return empty;
|
|
275
363
|
}
|
|
276
|
-
return JSON.stringify(existing, null, 2);
|
|
277
364
|
}
|
|
278
365
|
nextTempStateFile() {
|
|
279
366
|
this.persistCounter += 1;
|
|
@@ -302,12 +389,65 @@ export class QuotaCache {
|
|
|
302
389
|
* cross-process caveat). Synchronous so a CLI invocation that exits
|
|
303
390
|
* immediately after a route can't leave a temp file behind.
|
|
304
391
|
*/
|
|
392
|
+
/**
|
|
393
|
+
* Persist this process's increments, additively and under a lock.
|
|
394
|
+
*
|
|
395
|
+
* buildStatePayload() writes this process's ABSOLUTE counts over whatever it
|
|
396
|
+
* read. With a detached runner per dispatch that is lossy by construction:
|
|
397
|
+
* every runner boots from the same baseline, so a concurrent wave all write
|
|
398
|
+
* "baseline + 1" and all but one increment disappears. Measured at the
|
|
399
|
+
* shipped default of max_concurrent_runs: 4 — 8 successful dispatches were
|
|
400
|
+
* recorded as 2, deterministically.
|
|
401
|
+
*
|
|
402
|
+
* The earlier Math.max merge on read could not fix this: it recovers a value
|
|
403
|
+
* that was written, and these were never written at all.
|
|
404
|
+
*
|
|
405
|
+
* So the delta is applied to whatever is on disk INSIDE the lock. The lock
|
|
406
|
+
* alone would not have been enough either — serialised writers each holding
|
|
407
|
+
* an absolute value simply take turns writing the same number.
|
|
408
|
+
*/
|
|
305
409
|
saveLocalCountsSync() {
|
|
410
|
+
const pending = this.pendingDelta;
|
|
411
|
+
if (Object.keys(pending).length === 0)
|
|
412
|
+
return;
|
|
413
|
+
try {
|
|
414
|
+
withFileLock(this.stateFile, () => {
|
|
415
|
+
const existing = this.readStateFile();
|
|
416
|
+
for (const [service, delta] of Object.entries(pending)) {
|
|
417
|
+
const bucket = existing[service] ?? {};
|
|
418
|
+
const add = (key, by) => {
|
|
419
|
+
if (by === 0)
|
|
420
|
+
return;
|
|
421
|
+
bucket[key] = (typeof bucket[key] === "number" ? bucket[key] : 0) + by;
|
|
422
|
+
};
|
|
423
|
+
add("local_calls", delta.calls);
|
|
424
|
+
add("local_success", delta.success);
|
|
425
|
+
add("local_failure", delta.failure);
|
|
426
|
+
add("local_rate_limited", delta.rateLimited);
|
|
427
|
+
add("local_input_tokens", delta.inputTokens);
|
|
428
|
+
add("local_output_tokens", delta.outputTokens);
|
|
429
|
+
existing[service] = bucket;
|
|
430
|
+
}
|
|
431
|
+
this.writeStatePayloadAtomicSync(JSON.stringify(existing, null, 2));
|
|
432
|
+
});
|
|
433
|
+
// Only cleared once the write succeeded, so a failure is retried rather
|
|
434
|
+
// than silently dropped.
|
|
435
|
+
this.pendingDelta = {};
|
|
436
|
+
}
|
|
437
|
+
catch {
|
|
438
|
+
// Ignore — counters are informational and must never fail a dispatch.
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/** Current on-disk state, or {} if unreadable. */
|
|
442
|
+
readStateFile() {
|
|
306
443
|
try {
|
|
307
|
-
|
|
444
|
+
if (!existsSync(this.stateFile))
|
|
445
|
+
return {};
|
|
446
|
+
const parsed = JSON.parse(readFileSync(this.stateFile, "utf-8"));
|
|
447
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
308
448
|
}
|
|
309
449
|
catch {
|
|
310
|
-
|
|
450
|
+
return {};
|
|
311
451
|
}
|
|
312
452
|
}
|
|
313
453
|
}
|
package/dist/quota.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-policy.d.ts","sourceRoot":"","sources":["../src/route-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACT,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,aAAa,EAClB,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sBAAsB,CAAC,EAAE,aAAa,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;CACtB,GACL,iBAAiB,
|
|
1
|
+
{"version":3,"file":"route-policy.d.ts","sourceRoot":"","sources":["../src/route-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACT,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,aAAa,EAClB,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sBAAsB,CAAC,EAAE,aAAa,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;CACtB,GACL,iBAAiB,CA8DnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAI1E"}
|
package/dist/route-policy.js
CHANGED
|
@@ -25,9 +25,19 @@ export function evaluateRoutePolicy(route, svc, opts = {}) {
|
|
|
25
25
|
`to '${route}' in config.yaml to enable it`);
|
|
26
26
|
}
|
|
27
27
|
if (billingIsBlocked(billing)) {
|
|
28
|
-
return skip(route, "paid_blocked",
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
return skip(route, "paid_blocked",
|
|
29
|
+
// Two different fixes, and recommending only the permissive one is a
|
|
30
|
+
// steer in the wrong direction. If the route genuinely CANNOT cost money
|
|
31
|
+
// (a local runtime, a subscription CLI), the correct change is
|
|
32
|
+
// `paid_usage_possible: false` — saying so truthfully. `allow_paid_usage:
|
|
33
|
+
// true` means "yes, bill me", and offering it as the sole remedy invites
|
|
34
|
+
// switching off the safety net to fix a mislabelled route.
|
|
35
|
+
"route can incur paid usage and paid usage is not allowed — this is a config-level " +
|
|
36
|
+
`block, not an availability problem. If '${route}' really can bill you, add ` +
|
|
37
|
+
`\`allow_paid_usage: true\` to it in config.yaml (or run ` +
|
|
38
|
+
`\`harness-dispatch configure --allow-paid\`). If it cannot — a local runtime, or a ` +
|
|
39
|
+
`route already covered by a subscription — the correct fix is ` +
|
|
40
|
+
`\`paid_usage_possible: false\` instead.`);
|
|
31
41
|
}
|
|
32
42
|
if (!safetyProfileCompatible(svc, opts.requestedSafetyProfile)) {
|
|
33
43
|
return skip(route, "safety_incompatible", `effective safety ${effectiveSafetyProfile(svc, opts.requestedSafetyProfile)} exceeds requested safety`);
|
package/dist/route-policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-policy.js","sourceRoot":"","sources":["../src/route-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErF,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAc9E,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,GAAkB,EAClB,OAKI,EAAE;IAEN,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,4CAA4C,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,6CAA6C,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACrF,IAAI,WAAW,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC;IAE5C,IACE,gBAAgB,CAAC,OAAO,CAAC;QACzB,CAAC,sBAAsB,CAAC,OAAO,CAAC;QAChC,CAAC,OAAO,CAAC,cAAc,EACvB,CAAC;QACD,OAAO,IAAI,CACT,KAAK,EACL,iBAAiB,EACjB,mFAAmF;YACjF,uFAAuF;YACvF,OAAO,KAAK,+BAA+B,CAC9C,CAAC;IACJ,CAAC;IACD,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CACT,KAAK,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"route-policy.js","sourceRoot":"","sources":["../src/route-policy.ts"],"names":[],"mappings":"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"}
|