@flowdesk/core 0.1.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/dist/agent-profiles.d.ts +38 -0
- package/dist/agent-profiles.d.ts.map +1 -0
- package/dist/agent-profiles.js +138 -0
- package/dist/agent-profiles.js.map +1 -0
- package/dist/audit.d.ts +11 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +65 -0
- package/dist/audit.js.map +1 -0
- package/dist/bootstrap-foundation.d.ts +83 -0
- package/dist/bootstrap-foundation.d.ts.map +1 -0
- package/dist/bootstrap-foundation.js +773 -0
- package/dist/bootstrap-foundation.js.map +1 -0
- package/dist/chat-routing.d.ts +15 -0
- package/dist/chat-routing.d.ts.map +1 -0
- package/dist/chat-routing.js +172 -0
- package/dist/chat-routing.js.map +1 -0
- package/dist/command-manifest.d.ts +39 -0
- package/dist/command-manifest.d.ts.map +1 -0
- package/dist/command-manifest.js +240 -0
- package/dist/command-manifest.js.map +1 -0
- package/dist/config-policy.d.ts +31 -0
- package/dist/config-policy.d.ts.map +1 -0
- package/dist/config-policy.js +341 -0
- package/dist/config-policy.js.map +1 -0
- package/dist/fake-runtime.d.ts +68 -0
- package/dist/fake-runtime.d.ts.map +1 -0
- package/dist/fake-runtime.js +285 -0
- package/dist/fake-runtime.js.map +1 -0
- package/dist/guard-boundary.d.ts +53 -0
- package/dist/guard-boundary.d.ts.map +1 -0
- package/dist/guard-boundary.js +220 -0
- package/dist/guard-boundary.js.map +1 -0
- package/dist/guarded-dry-run.d.ts +46 -0
- package/dist/guarded-dry-run.d.ts.map +1 -0
- package/dist/guarded-dry-run.js +111 -0
- package/dist/guarded-dry-run.js.map +1 -0
- package/dist/hook-harness.d.ts +8 -0
- package/dist/hook-harness.d.ts.map +1 -0
- package/dist/hook-harness.js +130 -0
- package/dist/hook-harness.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/lane-observability.d.ts +22 -0
- package/dist/lane-observability.d.ts.map +1 -0
- package/dist/lane-observability.js +138 -0
- package/dist/lane-observability.js.map +1 -0
- package/dist/plan.d.ts +37 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +137 -0
- package/dist/plan.js.map +1 -0
- package/dist/production-enablement.d.ts +57 -0
- package/dist/production-enablement.d.ts.map +1 -0
- package/dist/production-enablement.js +259 -0
- package/dist/production-enablement.js.map +1 -0
- package/dist/provider-failures.d.ts +19 -0
- package/dist/provider-failures.d.ts.map +1 -0
- package/dist/provider-failures.js +116 -0
- package/dist/provider-failures.js.map +1 -0
- package/dist/provider-usage-collector.d.ts +60 -0
- package/dist/provider-usage-collector.d.ts.map +1 -0
- package/dist/provider-usage-collector.js +502 -0
- package/dist/provider-usage-collector.js.map +1 -0
- package/dist/redaction.d.ts +5 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +11 -0
- package/dist/redaction.js.map +1 -0
- package/dist/release1-contracts.d.ts +1203 -0
- package/dist/release1-contracts.d.ts.map +1 -0
- package/dist/release1-contracts.js +256 -0
- package/dist/release1-contracts.js.map +1 -0
- package/dist/retry.d.ts +21 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +107 -0
- package/dist/retry.js.map +1 -0
- package/dist/reviewer-lane-conformance.d.ts +35 -0
- package/dist/reviewer-lane-conformance.d.ts.map +1 -0
- package/dist/reviewer-lane-conformance.js +124 -0
- package/dist/reviewer-lane-conformance.js.map +1 -0
- package/dist/schema-artifacts.d.ts +19 -0
- package/dist/schema-artifacts.d.ts.map +1 -0
- package/dist/schema-artifacts.js +182 -0
- package/dist/schema-artifacts.js.map +1 -0
- package/dist/schema-registry.d.ts +32 -0
- package/dist/schema-registry.d.ts.map +1 -0
- package/dist/schema-registry.js +163 -0
- package/dist/schema-registry.js.map +1 -0
- package/dist/session-evidence.d.ts +71 -0
- package/dist/session-evidence.d.ts.map +1 -0
- package/dist/session-evidence.js +336 -0
- package/dist/session-evidence.js.map +1 -0
- package/dist/state-paths.d.ts +20 -0
- package/dist/state-paths.d.ts.map +1 -0
- package/dist/state-paths.js +72 -0
- package/dist/state-paths.js.map +1 -0
- package/dist/state-store.d.ts +75 -0
- package/dist/state-store.d.ts.map +1 -0
- package/dist/state-store.js +567 -0
- package/dist/state-store.js.map +1 -0
- package/dist/status.d.ts +37 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +304 -0
- package/dist/status.js.map +1 -0
- package/dist/tool-contract-fixtures.d.ts +134 -0
- package/dist/tool-contract-fixtures.d.ts.map +1 -0
- package/dist/tool-contract-fixtures.js +389 -0
- package/dist/tool-contract-fixtures.js.map +1 -0
- package/dist/top-tier-reviewer-lane-probe.d.ts +10 -0
- package/dist/top-tier-reviewer-lane-probe.d.ts.map +1 -0
- package/dist/top-tier-reviewer-lane-probe.js +76 -0
- package/dist/top-tier-reviewer-lane-probe.js.map +1 -0
- package/dist/usage-health.d.ts +44 -0
- package/dist/usage-health.d.ts.map +1 -0
- package/dist/usage-health.js +105 -0
- package/dist/usage-health.js.map +1 -0
- package/dist/validators.d.ts +142 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +1690 -0
- package/dist/validators.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import { homedir, userInfo } from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
const CLAUDE_OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
|
|
6
|
+
const CLAUDE_OAUTH_USAGE_URL = "https://api.anthropic.com/api/oauth/usage";
|
|
7
|
+
const CLAUDE_OAUTH_REFRESH_URL = "https://platform.claude.com/v1/oauth/token";
|
|
8
|
+
const CODEX_DEFAULT_CHATGPT_BASE_URL = "https://chatgpt.com/backend-api";
|
|
9
|
+
const CODEX_KEYRING_SERVICE = "Codex Auth";
|
|
10
|
+
const GEMINI_TOKEN_ENDPOINT = "https://oauth2.googleapis.com/token";
|
|
11
|
+
const GEMINI_CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com/v1internal";
|
|
12
|
+
const defaultFilesystem = {
|
|
13
|
+
exists: (filePath) => fs.existsSync(filePath),
|
|
14
|
+
readFile: (filePath) => fs.readFileSync(filePath, "utf-8")
|
|
15
|
+
};
|
|
16
|
+
export async function collectManagedDispatchBetaUsageEvidenceV1(target, acquisition, options = {}) {
|
|
17
|
+
const observedAtMs = options.now?.() ?? Date.now();
|
|
18
|
+
const observedAt = target.observedAt ?? new Date(observedAtMs).toISOString();
|
|
19
|
+
const ttlMinutes = target.freshnessTtlMinutes ?? 5;
|
|
20
|
+
const collection = acquisition?.enabled === true && (acquisition.providers === undefined || acquisition.providers.includes(target.providerFamily))
|
|
21
|
+
? await collectProvider(target.providerFamily, acquisition, options, observedAtMs)
|
|
22
|
+
: refusedCollection(target.providerFamily, target.modelFamily, "provider usage acquisition is disabled");
|
|
23
|
+
const bucket = collection.bucket;
|
|
24
|
+
const resetAt = bucket?.resetAt;
|
|
25
|
+
const usageOk = bucket !== undefined && bucket.remaining !== null && bucket.remaining > 0 && resetAt !== undefined && bucket.uncertainty === "available";
|
|
26
|
+
const usageSnapshot = usageOk
|
|
27
|
+
? {
|
|
28
|
+
schema_version: "flowdesk.usage_snapshot.v1",
|
|
29
|
+
snapshot_id: target.usageSnapshotId,
|
|
30
|
+
provider_family: target.providerFamily,
|
|
31
|
+
model_family: target.modelFamily,
|
|
32
|
+
freshness: "fresh",
|
|
33
|
+
freshness_ttl: ttlMinutes,
|
|
34
|
+
reset_time: resetAt,
|
|
35
|
+
reset_bucket: bucket.resetBucket,
|
|
36
|
+
dispatchability: "dispatchable",
|
|
37
|
+
uncertainty_flags: [],
|
|
38
|
+
source_ref: target.sourceRef
|
|
39
|
+
}
|
|
40
|
+
: unknownUsageSnapshot(target, collection, ttlMinutes);
|
|
41
|
+
const providerHealthSnapshot = {
|
|
42
|
+
schema_version: "flowdesk.provider_health_snapshot.v1",
|
|
43
|
+
snapshot_id: `health-${target.usageSnapshotId}`,
|
|
44
|
+
provider_family: target.providerFamily,
|
|
45
|
+
model_family: target.modelFamily,
|
|
46
|
+
observed_at: observedAt,
|
|
47
|
+
freshness: usageOk ? "fresh" : "unknown",
|
|
48
|
+
freshness_ttl: usageOk ? ttlMinutes : 0,
|
|
49
|
+
source_surface: "usage_collector",
|
|
50
|
+
availability_state: usageOk ? "healthy" : collection.availabilityState,
|
|
51
|
+
failure_class: usageOk ? "none" : collection.failureClass,
|
|
52
|
+
telemetry_ref: `telemetry-${target.usageSnapshotId}`,
|
|
53
|
+
dispatchability: usageOk ? "dispatchable" : "non_dispatchable",
|
|
54
|
+
source_ref: target.sourceRef,
|
|
55
|
+
safe_remediation: usageOk ? "Usage collector acquired fresh auth-bound usage evidence." : "Refresh provider auth and usage evidence before managed dispatch."
|
|
56
|
+
};
|
|
57
|
+
if (!usageOk || collection.authProfileRef === undefined || collection.authEvidenceRef === undefined || collection.credentialScopeRef === undefined || collection.accountBoundaryRef === undefined || collection.quotaEvidenceRef === undefined) {
|
|
58
|
+
return { ok: false, source_kind: "provider_native", usageSnapshot, providerHealthSnapshot, redacted_reason: collection.redactedReason ?? "usage evidence is unavailable" };
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
ok: true,
|
|
62
|
+
source_kind: "provider_native",
|
|
63
|
+
usageSnapshot,
|
|
64
|
+
providerHealthSnapshot,
|
|
65
|
+
usageAuthorityEvidence: {
|
|
66
|
+
schema_version: "flowdesk.managed_dispatch_beta.usage_authority_evidence.v1",
|
|
67
|
+
authority_ref: target.authorityRef,
|
|
68
|
+
usage_snapshot_ref: usageSnapshot.snapshot_id,
|
|
69
|
+
provider_family: target.providerFamily,
|
|
70
|
+
provider_qualified_model_id: target.providerQualifiedModelId,
|
|
71
|
+
model_family: target.modelFamily,
|
|
72
|
+
source_kind: "provider_native",
|
|
73
|
+
source_version_ref: `collector-${target.providerFamily}-v1`,
|
|
74
|
+
auth_profile_ref: collection.authProfileRef,
|
|
75
|
+
auth_evidence_ref: collection.authEvidenceRef,
|
|
76
|
+
credential_scope_ref: collection.credentialScopeRef,
|
|
77
|
+
account_boundary_ref: collection.accountBoundaryRef,
|
|
78
|
+
quota_evidence_ref: collection.quotaEvidenceRef,
|
|
79
|
+
usage_acquired: true,
|
|
80
|
+
reset_time: usageSnapshot.reset_time,
|
|
81
|
+
reset_bucket: usageSnapshot.reset_bucket,
|
|
82
|
+
source_ref: usageSnapshot.source_ref,
|
|
83
|
+
conformance_ref: target.conformanceRef,
|
|
84
|
+
redacted_evidence_refs: [...target.redactedEvidenceRefs],
|
|
85
|
+
trusted: true,
|
|
86
|
+
observed_at: observedAt,
|
|
87
|
+
expires_at: new Date(Date.parse(observedAt) + ttlMinutes * 60_000).toISOString()
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async function collectProvider(providerFamily, acquisition, options, observedAt) {
|
|
92
|
+
if (providerFamily === "claude")
|
|
93
|
+
return collectClaudeUsage(acquisition, options, observedAt);
|
|
94
|
+
if (providerFamily === "openai")
|
|
95
|
+
return collectCodexUsage(acquisition, options, observedAt);
|
|
96
|
+
return collectGeminiUsage(acquisition, options, observedAt);
|
|
97
|
+
}
|
|
98
|
+
async function collectClaudeUsage(acquisition, options, observedAt) {
|
|
99
|
+
const defaults = () => [bucket("claude-5h", "%", null, undefined, "unknown"), bucket("claude-weekly", "%", null, undefined, "unknown")];
|
|
100
|
+
if (acquisition.claudeOAuthUsage === false)
|
|
101
|
+
return refusedCollection("claude", "claude", "claude oauth usage is disabled");
|
|
102
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
103
|
+
if (!fetcher)
|
|
104
|
+
return refusedCollection("claude", "claude", "fetch is unavailable");
|
|
105
|
+
const homeDir = normalizeHomeDir(acquisition.homeDir, options.env);
|
|
106
|
+
const filesystem = options.filesystem ?? defaultFilesystem;
|
|
107
|
+
const creds = await readClaudeOAuthCredentials(homeDir, filesystem, options);
|
|
108
|
+
if (!creds?.accessToken)
|
|
109
|
+
return refusedCollection("claude", "claude", "claude auth evidence is missing");
|
|
110
|
+
const accessToken = await resolveClaudeAccessToken(creds, fetcher, observedAt);
|
|
111
|
+
if (!accessToken)
|
|
112
|
+
return refusedCollection("claude", "claude", "claude auth refresh failed");
|
|
113
|
+
try {
|
|
114
|
+
const response = await fetcher(CLAUDE_OAUTH_USAGE_URL, {
|
|
115
|
+
method: "GET",
|
|
116
|
+
headers: { Authorization: `Bearer ${accessToken}`, "anthropic-beta": "oauth-2025-04-20", "Content-Type": "application/json" }
|
|
117
|
+
});
|
|
118
|
+
if (!response.ok)
|
|
119
|
+
return refusedCollection("claude", "claude", "claude usage endpoint refused");
|
|
120
|
+
const payload = JSON.parse(await response.text());
|
|
121
|
+
const buckets = claudeOAuthBuckets(payload, observedAt, defaults());
|
|
122
|
+
return availableCollection("claude", "claude", "claude-oauth", "claude-oauth", firstDispatchableBucket(buckets) ?? buckets[0] ?? defaults()[0]);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return refusedCollection("claude", "claude", "claude usage collection failed");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function collectCodexUsage(acquisition, options, observedAt) {
|
|
129
|
+
if (acquisition.codexLiveUsage === false)
|
|
130
|
+
return refusedCollection("openai", "gpt", "codex live usage is disabled");
|
|
131
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
132
|
+
if (!fetcher)
|
|
133
|
+
return refusedCollection("openai", "gpt", "fetch is unavailable");
|
|
134
|
+
const homeDir = normalizeHomeDir(acquisition.homeDir, options.env);
|
|
135
|
+
const filesystem = options.filesystem ?? defaultFilesystem;
|
|
136
|
+
const configDirs = codexConfigDirs(homeDir, options.env);
|
|
137
|
+
const credentials = readCodexCredentials(configDirs, filesystem, options);
|
|
138
|
+
if (!credentials)
|
|
139
|
+
return refusedCollection("openai", "gpt", "codex auth evidence is missing");
|
|
140
|
+
const tokens = isRecord(credentials.auth.tokens) ? credentials.auth.tokens : undefined;
|
|
141
|
+
const accessToken = tokens ? stringField(tokens, "access_token") : "";
|
|
142
|
+
if (!accessToken)
|
|
143
|
+
return refusedCollection("openai", "gpt", "codex access token is missing");
|
|
144
|
+
const accountId = tokens ? firstNonEmpty(stringField(tokens, "account_id"), stringField(credentials.auth, "account_id")) : stringField(credentials.auth, "account_id");
|
|
145
|
+
try {
|
|
146
|
+
const response = await fetcher(codexUsageUrl(resolveCodexBaseUrl(credentials.configDir, filesystem)), {
|
|
147
|
+
method: "GET",
|
|
148
|
+
headers: { Authorization: `Bearer ${accessToken}`, Accept: "application/json", ...(accountId ? { "ChatGPT-Account-Id": accountId } : {}), "User-Agent": "codex-cli" }
|
|
149
|
+
});
|
|
150
|
+
if (!response.ok)
|
|
151
|
+
return refusedCollection("openai", "gpt", "codex usage endpoint refused");
|
|
152
|
+
const bucketValue = codexLiveBucket(JSON.parse(await response.text()), observedAt);
|
|
153
|
+
return availableCollection("openai", "gpt", "codex-live", firstNonEmpty(accountId, "codex-account"), bucketValue);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return refusedCollection("openai", "gpt", "codex usage collection failed");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function collectGeminiUsage(acquisition, options, observedAt) {
|
|
160
|
+
if (acquisition.geminiQuota === false)
|
|
161
|
+
return refusedCollection("gemini", "gemini", "gemini quota is disabled");
|
|
162
|
+
const fetcher = options.fetch ?? globalThis.fetch;
|
|
163
|
+
if (!fetcher)
|
|
164
|
+
return refusedCollection("gemini", "gemini", "fetch is unavailable");
|
|
165
|
+
const homeDir = normalizeHomeDir(acquisition.homeDir, options.env);
|
|
166
|
+
const filesystem = options.filesystem ?? defaultFilesystem;
|
|
167
|
+
const credsPath = geminiCredentialPaths(homeDir, options.env).find((candidate) => filesystem.exists(candidate));
|
|
168
|
+
if (!credsPath)
|
|
169
|
+
return refusedCollection("gemini", "gemini", "gemini auth evidence is missing");
|
|
170
|
+
try {
|
|
171
|
+
const creds = JSON.parse(filesystem.readFile(credsPath));
|
|
172
|
+
const refreshToken = isRecord(creds) ? stringField(creds, "refresh_token") : "";
|
|
173
|
+
if (!refreshToken)
|
|
174
|
+
return refusedCollection("gemini", "gemini", "gemini refresh token is missing");
|
|
175
|
+
const env = options.env ?? {};
|
|
176
|
+
const clientId = firstNonEmpty(acquisition.geminiOAuthClientId, env.FLOWDESK_GEMINI_OAUTH_CLIENT_ID);
|
|
177
|
+
const clientSecret = firstNonEmpty(acquisition.geminiOAuthClientSecret, env.FLOWDESK_GEMINI_OAUTH_CLIENT_SECRET);
|
|
178
|
+
if (!clientId || !clientSecret)
|
|
179
|
+
return refusedCollection("gemini", "gemini", "gemini oauth client evidence is missing");
|
|
180
|
+
const accessToken = await refreshGeminiAccessToken(refreshToken, clientId, clientSecret, fetcher);
|
|
181
|
+
let projectId = firstNonEmpty(env.GOOGLE_CLOUD_PROJECT, env.GOOGLE_CLOUD_PROJECT_ID, acquisition.geminiProjectId);
|
|
182
|
+
const details = await codeAssistPost("loadCodeAssist", { cloudaicompanionProject: projectId, metadata: { ideType: "IDE_UNSPECIFIED", platform: "PLATFORM_UNSPECIFIED", pluginType: "GEMINI", duetProject: projectId } }, accessToken, fetcher);
|
|
183
|
+
projectId = firstNonEmpty(projectId, stringField(details, "cloudaicompanionProject"));
|
|
184
|
+
if (!projectId)
|
|
185
|
+
return refusedCollection("gemini", "gemini", "gemini project boundary is missing");
|
|
186
|
+
const quota = await codeAssistPost("retrieveUserQuota", { project: projectId }, accessToken, fetcher);
|
|
187
|
+
const bucketValue = geminiQuotaBucket(quota, observedAt);
|
|
188
|
+
return availableCollection("gemini", "gemini", "gemini-code-assist", projectId, bucketValue);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return refusedCollection("gemini", "gemini", "gemini usage collection failed");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function availableCollection(providerFamily, modelFamily, authProfile, accountBoundary, providerBucket) {
|
|
195
|
+
if (providerBucket.remaining === null || providerBucket.remaining <= 0 || providerBucket.uncertainty !== "available") {
|
|
196
|
+
return { providerFamily, modelFamily, bucket: providerBucket, failureClass: "rate_limited", availabilityState: "unavailable", redactedReason: "usage is not available" };
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
providerFamily,
|
|
200
|
+
modelFamily,
|
|
201
|
+
authProfileRef: safeRef("auth-profile", providerFamily, authProfile),
|
|
202
|
+
authEvidenceRef: safeRef("auth-evidence", providerFamily, authProfile),
|
|
203
|
+
credentialScopeRef: safeRef("principal-scope", providerFamily, authProfile),
|
|
204
|
+
accountBoundaryRef: safeRef("account-boundary", providerFamily, accountBoundary),
|
|
205
|
+
quotaEvidenceRef: safeRef("quota-evidence", providerFamily, providerBucket.resetBucket, String(providerBucket.remaining), providerBucket.resetAt ?? "unknown"),
|
|
206
|
+
bucket: providerBucket,
|
|
207
|
+
failureClass: "none",
|
|
208
|
+
availabilityState: "healthy"
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function refusedCollection(providerFamily, modelFamily, redactedReason) {
|
|
212
|
+
return { providerFamily, modelFamily, failureClass: "auth_missing", availabilityState: "unavailable", redactedReason };
|
|
213
|
+
}
|
|
214
|
+
function unknownUsageSnapshot(target, collection, ttlMinutes) {
|
|
215
|
+
const uncertainty = collection.bucket?.uncertainty === "stale" ? "stale" : collection.bucket?.uncertainty === "provider_refused" ? "refused" : "unknown";
|
|
216
|
+
return {
|
|
217
|
+
schema_version: "flowdesk.usage_snapshot.v1",
|
|
218
|
+
snapshot_id: target.usageSnapshotId,
|
|
219
|
+
provider_family: target.providerFamily,
|
|
220
|
+
model_family: target.modelFamily,
|
|
221
|
+
freshness: uncertainty === "stale" ? "stale" : "unknown",
|
|
222
|
+
freshness_ttl: uncertainty === "stale" ? ttlMinutes : 0,
|
|
223
|
+
reset_time: collection.bucket?.resetAt ?? "unknown",
|
|
224
|
+
reset_bucket: collection.bucket?.resetBucket ?? "unknown",
|
|
225
|
+
dispatchability: "non_dispatchable",
|
|
226
|
+
uncertainty_flags: [uncertainty],
|
|
227
|
+
source_ref: target.sourceRef
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function claudeOAuthBuckets(payload, observedAt, defaults) {
|
|
231
|
+
const record = isRecord(payload) ? payload : {};
|
|
232
|
+
return [
|
|
233
|
+
claudeUsageBucket("claude-5h", defaults[0], record.five_hour, observedAt),
|
|
234
|
+
claudeUsageBucket("claude-weekly", defaults[1], record.seven_day, observedAt)
|
|
235
|
+
];
|
|
236
|
+
}
|
|
237
|
+
function claudeUsageBucket(resetBucket, defaultBucket, value, observedAt) {
|
|
238
|
+
const rawBucket = isRecord(value) ? value : undefined;
|
|
239
|
+
if (!rawBucket || !defaultBucket)
|
|
240
|
+
return defaultBucket ?? bucket(resetBucket, "%", null, undefined, "unknown");
|
|
241
|
+
const calculated = calculateRemainingUsagePercent({ utilizationPercent: numberField(rawBucket, "utilization"), resetAt: stringField(rawBucket, "resets_at"), observedAt, expiredResetBehavior: "reset_to_full" });
|
|
242
|
+
return bucket(resetBucket, "%", calculated.remaining, calculated.reset_at, calculated.uncertainty);
|
|
243
|
+
}
|
|
244
|
+
function codexLiveBucket(payload, observedAt) {
|
|
245
|
+
const record = isRecord(payload) ? payload : {};
|
|
246
|
+
const rateLimitPayload = isRecord(record.rate_limit_status) ? record.rate_limit_status : record;
|
|
247
|
+
const details = firstRecord(rateLimitPayload.rate_limit, record.rate_limit);
|
|
248
|
+
const primary = firstRecord(details?.primary_window, details?.primary, details);
|
|
249
|
+
return codexRateLimitBucket("openai-gpt-5h", primary, observedAt);
|
|
250
|
+
}
|
|
251
|
+
function codexRateLimitBucket(resetBucket, rateLimit, observedAt) {
|
|
252
|
+
if (!rateLimit)
|
|
253
|
+
return bucket(resetBucket, "%", null, undefined, "unknown");
|
|
254
|
+
const reportedRemainingPercent = numberField(rateLimit, "remaining_percent") ?? numberField(rateLimit, "remainingPercent");
|
|
255
|
+
const usedPercent = numberField(rateLimit, "used_percent") ?? numberField(rateLimit, "usedPercent");
|
|
256
|
+
const resetUnix = numberField(rateLimit, "reset_at") ?? numberField(rateLimit, "resets_at") ?? numberField(rateLimit, "resetsAt");
|
|
257
|
+
const resetAfterSeconds = numberField(rateLimit, "reset_after_seconds") ?? numberField(rateLimit, "resetAfterSeconds");
|
|
258
|
+
const calculated = calculateRemainingUsagePercent({ remainingPercent: reportedRemainingPercent, usedPercent, resetAtUnixSeconds: resetUnix, resetAfterSeconds, observedAt, expiredResetBehavior: "stale" });
|
|
259
|
+
return bucket(resetBucket, "%", calculated.remaining, calculated.reset_at, calculated.uncertainty);
|
|
260
|
+
}
|
|
261
|
+
function geminiQuotaBucket(quota, observedAt) {
|
|
262
|
+
const quotaBuckets = Array.isArray(quota.buckets) ? quota.buckets.filter(isRecord) : [];
|
|
263
|
+
let selected;
|
|
264
|
+
for (const quotaBucket of quotaBuckets) {
|
|
265
|
+
const modelId = stringField(quotaBucket, "modelId").toLowerCase();
|
|
266
|
+
const resetBucket = modelId.includes("flash-lite") || modelId.includes("flash_lite") ? "gemini-flash-lite-daily" : modelId.includes("flash") ? "gemini-flash-daily" : modelId.includes("pro") ? "gemini-pro-daily" : "";
|
|
267
|
+
if (!resetBucket)
|
|
268
|
+
continue;
|
|
269
|
+
const remainingPercent = calculateRemainingUsagePercent({ remainingFraction: numberField(quotaBucket, "remainingFraction"), remainingAmount: stringField(quotaBucket, "remainingAmount"), resetAt: stringField(quotaBucket, "resetTime"), observedAt, expiredResetBehavior: "stale" });
|
|
270
|
+
const candidate = bucket(resetBucket, "%", remainingPercent.remaining, remainingPercent.reset_at, remainingPercent.uncertainty);
|
|
271
|
+
if (selected === undefined || selected.remaining === null || (candidate.remaining !== null && candidate.remaining < selected.remaining))
|
|
272
|
+
selected = candidate;
|
|
273
|
+
}
|
|
274
|
+
return selected ?? bucket("gemini-unknown-daily", "%", null, undefined, "unknown");
|
|
275
|
+
}
|
|
276
|
+
function firstDispatchableBucket(buckets) {
|
|
277
|
+
return buckets.find((candidate) => candidate.remaining !== null && candidate.remaining > 0 && candidate.resetAt !== undefined && candidate.uncertainty === "available");
|
|
278
|
+
}
|
|
279
|
+
async function readClaudeOAuthCredentials(homeDir, filesystem, options) {
|
|
280
|
+
const keychainCreds = readClaudeKeychainCredentials(options);
|
|
281
|
+
if (keychainCreds)
|
|
282
|
+
return keychainCreds;
|
|
283
|
+
const credentialsPath = claudeConfigDirs(homeDir, options.env).map((configDir) => path.join(configDir, ".credentials.json")).find((candidate) => filesystem.exists(candidate));
|
|
284
|
+
if (!credentialsPath)
|
|
285
|
+
return null;
|
|
286
|
+
try {
|
|
287
|
+
return normalizeClaudeCredentials(JSON.parse(filesystem.readFile(credentialsPath)));
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function readClaudeKeychainCredentials(options) {
|
|
294
|
+
const credentialCommand = options.execFile;
|
|
295
|
+
if (!credentialCommand)
|
|
296
|
+
return null;
|
|
297
|
+
const service = claudeKeychainServiceName(options.env);
|
|
298
|
+
const candidateAccounts = [];
|
|
299
|
+
try {
|
|
300
|
+
const username = userInfo().username?.trim();
|
|
301
|
+
if (username)
|
|
302
|
+
candidateAccounts.push(username);
|
|
303
|
+
}
|
|
304
|
+
catch { }
|
|
305
|
+
candidateAccounts.push(undefined);
|
|
306
|
+
for (const account of candidateAccounts) {
|
|
307
|
+
try {
|
|
308
|
+
const args = account ? ["find-generic-password", "-s", service, "-a", account, "-w"] : ["find-generic-password", "-s", service, "-w"];
|
|
309
|
+
const creds = normalizeClaudeCredentials(JSON.parse(credentialCommand("/usr/bin/security", args)));
|
|
310
|
+
if (creds)
|
|
311
|
+
return creds;
|
|
312
|
+
}
|
|
313
|
+
catch { }
|
|
314
|
+
}
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
function normalizeClaudeCredentials(value) {
|
|
318
|
+
if (!isRecord(value))
|
|
319
|
+
return null;
|
|
320
|
+
const nested = isRecord(value.claudeAiOauth) ? value.claudeAiOauth : value;
|
|
321
|
+
const accessToken = firstNonEmpty(stringField(nested, "accessToken"), stringField(nested, "access_token"));
|
|
322
|
+
if (!accessToken)
|
|
323
|
+
return null;
|
|
324
|
+
const refreshToken = firstNonEmpty(stringField(nested, "refreshToken"), stringField(nested, "refresh_token"));
|
|
325
|
+
const expiresAt = numberField(nested, "expiresAt") ?? numberField(nested, "expires_at");
|
|
326
|
+
return { accessToken, ...(refreshToken ? { refreshToken } : {}), ...(expiresAt === undefined ? {} : { expiresAt }) };
|
|
327
|
+
}
|
|
328
|
+
async function resolveClaudeAccessToken(creds, fetcher, observedAt) {
|
|
329
|
+
const expiresAt = creds.expiresAt === undefined || creds.expiresAt > 10_000_000_000 ? creds.expiresAt : creds.expiresAt * 1000;
|
|
330
|
+
if (expiresAt === undefined || expiresAt > observedAt + 60_000)
|
|
331
|
+
return creds.accessToken;
|
|
332
|
+
if (!creds.refreshToken)
|
|
333
|
+
return null;
|
|
334
|
+
const form = new URLSearchParams({ grant_type: "refresh_token", refresh_token: creds.refreshToken, client_id: CLAUDE_OAUTH_CLIENT_ID });
|
|
335
|
+
const response = await fetcher(CLAUDE_OAUTH_REFRESH_URL, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: form.toString() });
|
|
336
|
+
if (!response.ok)
|
|
337
|
+
return null;
|
|
338
|
+
const parsed = JSON.parse(await response.text());
|
|
339
|
+
return isRecord(parsed) ? firstNonEmpty(stringField(parsed, "access_token"), stringField(parsed, "accessToken")) || null : null;
|
|
340
|
+
}
|
|
341
|
+
function readCodexCredentials(configDirs, filesystem, options) {
|
|
342
|
+
for (const configDir of configDirs) {
|
|
343
|
+
const authPath = path.join(configDir, "auth.json");
|
|
344
|
+
if (!filesystem.exists(authPath))
|
|
345
|
+
continue;
|
|
346
|
+
try {
|
|
347
|
+
const auth = JSON.parse(filesystem.readFile(authPath));
|
|
348
|
+
if (isRecord(auth))
|
|
349
|
+
return { auth, configDir };
|
|
350
|
+
}
|
|
351
|
+
catch { }
|
|
352
|
+
}
|
|
353
|
+
const credentialCommand = options.execFile;
|
|
354
|
+
const configDir = configDirs[0];
|
|
355
|
+
if (!configDir || !credentialCommand)
|
|
356
|
+
return null;
|
|
357
|
+
try {
|
|
358
|
+
const auth = JSON.parse(credentialCommand("/usr/bin/security", ["find-generic-password", "-s", CODEX_KEYRING_SERVICE, "-a", codexKeyringAccount(configDir), "-w"]));
|
|
359
|
+
if (isRecord(auth))
|
|
360
|
+
return { auth, configDir };
|
|
361
|
+
}
|
|
362
|
+
catch { }
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
function resolveCodexBaseUrl(configDir, filesystem) {
|
|
366
|
+
const configPath = path.join(configDir, "config.toml");
|
|
367
|
+
if (!filesystem.exists(configPath))
|
|
368
|
+
return CODEX_DEFAULT_CHATGPT_BASE_URL;
|
|
369
|
+
const match = filesystem.readFile(configPath).match(/^\s*chatgpt_base_url\s*=\s*["']([^"']+)["']/m);
|
|
370
|
+
if (!match?.[1])
|
|
371
|
+
return CODEX_DEFAULT_CHATGPT_BASE_URL;
|
|
372
|
+
const base = match[1].replace(/\/+$/, "");
|
|
373
|
+
return base.endsWith("/backend-api") ? base : `${base}/backend-api`;
|
|
374
|
+
}
|
|
375
|
+
function codexUsageUrl(baseUrl) {
|
|
376
|
+
return baseUrl.includes("/backend-api") ? `${baseUrl}/wham/usage` : `${baseUrl}/api/codex/usage`;
|
|
377
|
+
}
|
|
378
|
+
async function refreshGeminiAccessToken(refreshToken, clientId, clientSecret, fetcher) {
|
|
379
|
+
const form = new URLSearchParams({ client_id: clientId, client_secret: clientSecret, refresh_token: refreshToken, grant_type: "refresh_token" });
|
|
380
|
+
const response = await fetcher(GEMINI_TOKEN_ENDPOINT, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: form.toString() });
|
|
381
|
+
if (!response.ok)
|
|
382
|
+
throw new Error(`Gemini token refresh failed: ${response.status}`);
|
|
383
|
+
const parsed = JSON.parse(await response.text());
|
|
384
|
+
const accessToken = isRecord(parsed) ? stringField(parsed, "access_token") : "";
|
|
385
|
+
if (!accessToken)
|
|
386
|
+
throw new Error("Gemini token refresh returned no access token");
|
|
387
|
+
return accessToken;
|
|
388
|
+
}
|
|
389
|
+
async function codeAssistPost(method, body, accessToken, fetcher) {
|
|
390
|
+
const response = await fetcher(`${GEMINI_CODE_ASSIST_ENDPOINT}:${method}`, { method: "POST", headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" }, body: JSON.stringify(body) });
|
|
391
|
+
if (!response.ok)
|
|
392
|
+
throw new Error(`Gemini ${method} failed: ${response.status}`);
|
|
393
|
+
const parsed = JSON.parse(await response.text());
|
|
394
|
+
return isRecord(parsed) ? parsed : {};
|
|
395
|
+
}
|
|
396
|
+
function calculateRemainingUsagePercent(input) {
|
|
397
|
+
const observedAt = input.observedAt ?? Date.now();
|
|
398
|
+
const resetAt = resolveResetAt(input, observedAt);
|
|
399
|
+
const expiredBehavior = input.expiredResetBehavior ?? "stale";
|
|
400
|
+
if (resetAt && Date.parse(resetAt) <= observedAt)
|
|
401
|
+
return expiredBehavior === "reset_to_full" ? availableResult(100, 0, resetAt) : { remaining: null, used: null, reset_at: resetAt, uncertainty: "stale" };
|
|
402
|
+
const directRemaining = firstFinite(input.remainingPercent, percentFromFraction(input.remainingFraction), percentFromRemainingAmount(input.remainingAmount));
|
|
403
|
+
if (directRemaining !== null) {
|
|
404
|
+
const remaining = clampPercent(directRemaining);
|
|
405
|
+
return availableResult(remaining, 100 - remaining, resetAt);
|
|
406
|
+
}
|
|
407
|
+
const used = firstFinite(input.usedPercent, input.utilizationPercent);
|
|
408
|
+
if (used !== null) {
|
|
409
|
+
const usedPercent = clampPercent(used);
|
|
410
|
+
return availableResult(100 - usedPercent, usedPercent, resetAt);
|
|
411
|
+
}
|
|
412
|
+
return { remaining: null, used: null, ...(resetAt ? { reset_at: resetAt } : {}), uncertainty: "unknown" };
|
|
413
|
+
}
|
|
414
|
+
function availableResult(remaining, used, resetAt) {
|
|
415
|
+
return { remaining, used, ...(resetAt ? { reset_at: resetAt } : {}), uncertainty: remaining > 0 ? "available" : "insufficient" };
|
|
416
|
+
}
|
|
417
|
+
function resolveResetAt(input, observedAt) {
|
|
418
|
+
if (typeof input.resetAt === "string" && input.resetAt.trim() !== "") {
|
|
419
|
+
const parsed = Date.parse(input.resetAt);
|
|
420
|
+
return Number.isFinite(parsed) ? new Date(parsed).toISOString() : undefined;
|
|
421
|
+
}
|
|
422
|
+
if (typeof input.resetAtUnixSeconds === "number" && Number.isFinite(input.resetAtUnixSeconds) && input.resetAtUnixSeconds > 0)
|
|
423
|
+
return new Date(input.resetAtUnixSeconds * 1000).toISOString();
|
|
424
|
+
if (typeof input.resetAfterSeconds === "number" && Number.isFinite(input.resetAfterSeconds) && input.resetAfterSeconds > 0)
|
|
425
|
+
return new Date(observedAt + input.resetAfterSeconds * 1000).toISOString();
|
|
426
|
+
return undefined;
|
|
427
|
+
}
|
|
428
|
+
function bucket(resetBucket, unit, remaining, resetAt, uncertainty) {
|
|
429
|
+
void unit;
|
|
430
|
+
return { resetBucket, remaining, ...(resetAt ? { resetAt } : {}), uncertainty };
|
|
431
|
+
}
|
|
432
|
+
function claudeConfigDirs(homeDir, env) {
|
|
433
|
+
return uniqueNonEmpty([env?.CLAUDE_CONFIG_DIR, path.join(homeDir, ".claude")]);
|
|
434
|
+
}
|
|
435
|
+
function codexConfigDirs(homeDir, env) {
|
|
436
|
+
return uniqueNonEmpty([env?.CODEX_HOME, path.join(homeDir, ".codex")]);
|
|
437
|
+
}
|
|
438
|
+
function geminiCredentialPaths(homeDir, env) {
|
|
439
|
+
const geminiHome = env?.GEMINI_CLI_HOME;
|
|
440
|
+
return uniqueNonEmpty([geminiHome ? path.join(geminiHome, ".gemini", "oauth_creds.json") : undefined, geminiHome ? path.join(geminiHome, "oauth_creds.json") : undefined, path.join(homeDir, ".gemini", "oauth_creds.json")]);
|
|
441
|
+
}
|
|
442
|
+
function claudeKeychainServiceName(env) {
|
|
443
|
+
const configDir = env?.CLAUDE_CONFIG_DIR;
|
|
444
|
+
const defaultService = configDir ? `Claude Code-credentials-${createHash("sha256").update(configDir).digest("hex").slice(0, 8)}` : "Claude Code-credentials";
|
|
445
|
+
return firstNonEmpty(env?.CLAUDE_CODE_KEYCHAIN_SERVICE, env?.CLAUDE_KEYCHAIN_SERVICE) || defaultService;
|
|
446
|
+
}
|
|
447
|
+
function normalizeHomeDir(configuredHome, env) {
|
|
448
|
+
return firstNonEmpty(configuredHome, env?.HOME, env?.USERPROFILE) || homedir();
|
|
449
|
+
}
|
|
450
|
+
function codexKeyringAccount(configDir) {
|
|
451
|
+
return `cli|${createHash("sha256").update(configDir).digest("hex").slice(0, 16)}`;
|
|
452
|
+
}
|
|
453
|
+
function safeRef(prefix, ...parts) {
|
|
454
|
+
return `${prefix}-${createHash("sha256").update(parts.join("\u001f")).digest("hex").slice(0, 16)}`;
|
|
455
|
+
}
|
|
456
|
+
function percentFromFraction(value) {
|
|
457
|
+
return typeof value === "number" && Number.isFinite(value) ? value * 100 : null;
|
|
458
|
+
}
|
|
459
|
+
function percentFromRemainingAmount(raw) {
|
|
460
|
+
const value = raw?.trim().toLowerCase();
|
|
461
|
+
if (!value)
|
|
462
|
+
return null;
|
|
463
|
+
if (value.endsWith("%")) {
|
|
464
|
+
const parsed = Number.parseFloat(value.slice(0, -1));
|
|
465
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
466
|
+
}
|
|
467
|
+
if (value.includes("/")) {
|
|
468
|
+
const [left, right] = value.split("/", 2).map((part) => Number.parseFloat(part.trim()));
|
|
469
|
+
return Number.isFinite(left) && Number.isFinite(right) && right > 0 ? (left / right) * 100 : null;
|
|
470
|
+
}
|
|
471
|
+
const parsed = Number.parseFloat(value);
|
|
472
|
+
if (!Number.isFinite(parsed))
|
|
473
|
+
return null;
|
|
474
|
+
return parsed > 1 ? parsed : parsed * 100;
|
|
475
|
+
}
|
|
476
|
+
function firstFinite(...values) {
|
|
477
|
+
return values.find((value) => typeof value === "number" && Number.isFinite(value)) ?? null;
|
|
478
|
+
}
|
|
479
|
+
function clampPercent(value) {
|
|
480
|
+
return Math.min(100, Math.max(0, value));
|
|
481
|
+
}
|
|
482
|
+
function firstNonEmpty(...values) {
|
|
483
|
+
return values.find((value) => typeof value === "string" && value.trim() !== "")?.trim() ?? "";
|
|
484
|
+
}
|
|
485
|
+
function stringField(record, field) {
|
|
486
|
+
const value = record?.[field];
|
|
487
|
+
return typeof value === "string" ? value.trim() : "";
|
|
488
|
+
}
|
|
489
|
+
function numberField(record, field) {
|
|
490
|
+
const value = record?.[field];
|
|
491
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
492
|
+
}
|
|
493
|
+
function isRecord(value) {
|
|
494
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
495
|
+
}
|
|
496
|
+
function firstRecord(...values) {
|
|
497
|
+
return values.find(isRecord);
|
|
498
|
+
}
|
|
499
|
+
function uniqueNonEmpty(values) {
|
|
500
|
+
return [...new Set(values.filter((value) => typeof value === "string" && value.trim() !== "").map((value) => value.trim()))];
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=provider-usage-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-usage-collector.js","sourceRoot":"","sources":["../src/provider-usage-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ValidationResult } from "./validators.js";
|
|
2
|
+
export declare const FLOWDESK_REDACTION_VERSION_V1: "redaction-v1";
|
|
3
|
+
export declare function validateRedactedPersistedPayload(value: unknown, label?: string): ValidationResult;
|
|
4
|
+
export declare function assertRedactedPersistedPayload(value: unknown, label?: string): void;
|
|
5
|
+
//# sourceMappingURL=redaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExF,eAAO,MAAM,6BAA6B,EAAG,cAAuB,CAAC;AAErE,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAsB,GAAG,gBAAgB,CAE9G;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAsB,GAAG,IAAI,CAGhG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { validateNoForbiddenRawPayloads } from "./validators.js";
|
|
2
|
+
export const FLOWDESK_REDACTION_VERSION_V1 = "redaction-v1";
|
|
3
|
+
export function validateRedactedPersistedPayload(value, label = "persisted payload") {
|
|
4
|
+
return validateNoForbiddenRawPayloads(value, label);
|
|
5
|
+
}
|
|
6
|
+
export function assertRedactedPersistedPayload(value, label = "persisted payload") {
|
|
7
|
+
const result = validateRedactedPersistedPayload(value, label);
|
|
8
|
+
if (!result.ok)
|
|
9
|
+
throw new Error(result.errors.join("; "));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAyB,MAAM,iBAAiB,CAAC;AAExF,MAAM,CAAC,MAAM,6BAA6B,GAAG,cAAuB,CAAC;AAErE,MAAM,UAAU,gCAAgC,CAAC,KAAc,EAAE,KAAK,GAAG,mBAAmB;IAC1F,OAAO,8BAA8B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAAc,EAAE,KAAK,GAAG,mBAAmB;IACxF,MAAM,MAAM,GAAG,gCAAgC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|