@cortexkit/antigravity-auth-core 2.2.1 → 3.0.1
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/README.md +24 -2
- package/dist/abort-forwarding.d.ts +3 -0
- package/dist/abort-forwarding.d.ts.map +1 -0
- package/dist/abort-forwarding.js +19 -0
- package/dist/abort-forwarding.js.map +1 -0
- package/dist/account-identity.d.ts +52 -0
- package/dist/account-identity.d.ts.map +1 -0
- package/dist/account-identity.js +66 -0
- package/dist/account-identity.js.map +1 -0
- package/dist/account-manager.d.ts +228 -43
- package/dist/account-manager.d.ts.map +1 -1
- package/dist/account-manager.js +942 -903
- package/dist/account-manager.js.map +1 -1
- package/dist/account-migration.d.ts +309 -0
- package/dist/account-migration.d.ts.map +1 -0
- package/dist/account-migration.js +2284 -0
- package/dist/account-migration.js.map +1 -0
- package/dist/account-repository-codecs.d.ts +82 -0
- package/dist/account-repository-codecs.d.ts.map +1 -0
- package/dist/account-repository-codecs.js +609 -0
- package/dist/account-repository-codecs.js.map +1 -0
- package/dist/account-repository-types.d.ts +831 -0
- package/dist/account-repository-types.d.ts.map +1 -0
- package/dist/account-repository-types.js +137 -0
- package/dist/account-repository-types.js.map +1 -0
- package/dist/account-repository.d.ts +442 -0
- package/dist/account-repository.d.ts.map +1 -0
- package/dist/account-repository.js +2253 -0
- package/dist/account-repository.js.map +1 -0
- package/dist/account-selector.d.ts +470 -0
- package/dist/account-selector.d.ts.map +1 -0
- package/dist/account-selector.js +1383 -0
- package/dist/account-selector.js.map +1 -0
- package/dist/account-storage.d.ts.map +1 -1
- package/dist/account-storage.js +5 -0
- package/dist/account-storage.js.map +1 -1
- package/dist/agy-request-metadata.d.ts.map +1 -1
- package/dist/agy-request-metadata.js +8 -21
- package/dist/agy-request-metadata.js.map +1 -1
- package/dist/agy-transport.d.ts.map +1 -1
- package/dist/agy-transport.js +21 -35
- package/dist/agy-transport.js.map +1 -1
- package/dist/antigravity-command-menu.d.ts +171 -0
- package/dist/antigravity-command-menu.d.ts.map +1 -0
- package/dist/antigravity-command-menu.js +523 -0
- package/dist/antigravity-command-menu.js.map +1 -0
- package/dist/atomic-write.d.ts +18 -1
- package/dist/atomic-write.d.ts.map +1 -1
- package/dist/atomic-write.js +15 -3
- package/dist/atomic-write.js.map +1 -1
- package/dist/common-auth-embedded/NOTICE.txt +21 -0
- package/dist/common-auth-embedded/auth-menu/accounts.d.ts +97 -0
- package/dist/common-auth-embedded/auth-menu/accounts.js +387 -0
- package/dist/common-auth-embedded/auth-menu/ansi.d.ts +26 -0
- package/dist/common-auth-embedded/auth-menu/ansi.js +98 -0
- package/dist/common-auth-embedded/auth-menu/confirm.d.ts +7 -0
- package/dist/common-auth-embedded/auth-menu/confirm.js +21 -0
- package/dist/common-auth-embedded/auth-menu/doctor.d.ts +52 -0
- package/dist/common-auth-embedded/auth-menu/doctor.js +81 -0
- package/dist/common-auth-embedded/auth-menu/index.d.ts +17 -0
- package/dist/common-auth-embedded/auth-menu/index.js +12 -0
- package/dist/common-auth-embedded/auth-menu/login.d.ts +55 -0
- package/dist/common-auth-embedded/auth-menu/login.js +83 -0
- package/dist/common-auth-embedded/auth-menu/menu.d.ts +59 -0
- package/dist/common-auth-embedded/auth-menu/menu.js +73 -0
- package/dist/common-auth-embedded/auth-menu/opencode-v1.d.ts +49 -0
- package/dist/common-auth-embedded/auth-menu/opencode-v1.js +47 -0
- package/dist/common-auth-embedded/auth-menu/select.d.ts +21 -0
- package/dist/common-auth-embedded/auth-menu/select.js +159 -0
- package/dist/common-auth-embedded/auth-menu/terminal.d.ts +43 -0
- package/dist/common-auth-embedded/auth-menu/terminal.js +19 -0
- package/dist/common-auth-embedded/claustrum/consumer.d.ts +102 -0
- package/dist/common-auth-embedded/claustrum/consumer.js +298 -0
- package/dist/common-auth-embedded/claustrum/custody.d.ts +175 -0
- package/dist/common-auth-embedded/claustrum/custody.js +354 -0
- package/dist/common-auth-embedded/claustrum/enrollment.d.ts +158 -0
- package/dist/common-auth-embedded/claustrum/enrollment.js +759 -0
- package/dist/common-auth-embedded/claustrum/errors.d.ts +16 -0
- package/dist/common-auth-embedded/claustrum/errors.js +8 -0
- package/dist/common-auth-embedded/claustrum/host-slot.d.ts +39 -0
- package/dist/common-auth-embedded/claustrum/host-slot.js +72 -0
- package/dist/common-auth-embedded/claustrum/index.d.ts +18 -0
- package/dist/common-auth-embedded/claustrum/index.js +22 -0
- package/dist/common-auth-embedded/claustrum/interlock.d.ts +27 -0
- package/dist/common-auth-embedded/claustrum/interlock.js +29 -0
- package/dist/common-auth-embedded/claustrum/roster.d.ts +208 -0
- package/dist/common-auth-embedded/claustrum/roster.js +536 -0
- package/dist/common-auth-embedded/commands/builtins.d.ts +71 -0
- package/dist/common-auth-embedded/commands/builtins.js +534 -0
- package/dist/common-auth-embedded/commands/index.d.ts +10 -0
- package/dist/common-auth-embedded/commands/index.js +5 -0
- package/dist/common-auth-embedded/commands/menu.d.ts +61 -0
- package/dist/common-auth-embedded/commands/menu.js +300 -0
- package/dist/common-auth-embedded/commands/model.d.ts +238 -0
- package/dist/common-auth-embedded/commands/model.js +16 -0
- package/dist/common-auth-embedded/commands/pi.d.ts +23 -0
- package/dist/common-auth-embedded/commands/pi.js +206 -0
- package/dist/common-auth-embedded/commands/seam.d.ts +72 -0
- package/dist/common-auth-embedded/commands/seam.js +301 -0
- package/dist/common-auth-embedded/fs/atomic-write.d.ts +20 -0
- package/dist/common-auth-embedded/fs/atomic-write.js +80 -0
- package/dist/common-auth-embedded/fs/index.d.ts +7 -0
- package/dist/common-auth-embedded/fs/index.js +6 -0
- package/dist/common-auth-embedded/fs/lock-constants.d.ts +14 -0
- package/dist/common-auth-embedded/fs/lock-constants.js +14 -0
- package/dist/common-auth-embedded/fs/refresh-file-lock.d.ts +33 -0
- package/dist/common-auth-embedded/fs/refresh-file-lock.js +501 -0
- package/dist/common-auth-embedded/fs/with-lock.d.ts +33 -0
- package/dist/common-auth-embedded/fs/with-lock.js +48 -0
- package/dist/common-auth-embedded/logger/capture-sink.d.ts +14 -0
- package/dist/common-auth-embedded/logger/capture-sink.js +13 -0
- package/dist/common-auth-embedded/logger/engine.d.ts +100 -0
- package/dist/common-auth-embedded/logger/engine.js +246 -0
- package/dist/common-auth-embedded/logger/index.d.ts +6 -0
- package/dist/common-auth-embedded/logger/index.js +3 -0
- package/dist/common-auth-embedded/logger/redact.d.ts +11 -0
- package/dist/common-auth-embedded/logger/redact.js +83 -0
- package/dist/common-auth-embedded/pi-slot/index.d.ts +3 -0
- package/dist/common-auth-embedded/pi-slot/index.js +2 -0
- package/dist/common-auth-embedded/pi-slot/lock.js +212 -0
- package/dist/common-auth-embedded/pi-slot/slot.d.ts +49 -0
- package/dist/common-auth-embedded/pi-slot/slot.js +383 -0
- package/dist/common-auth-embedded/quota/codec.d.ts +11 -0
- package/dist/common-auth-embedded/quota/codec.js +12 -0
- package/dist/common-auth-embedded/quota/format.d.ts +46 -0
- package/dist/common-auth-embedded/quota/format.js +138 -0
- package/dist/common-auth-embedded/quota/index.d.ts +10 -0
- package/dist/common-auth-embedded/quota/index.js +5 -0
- package/dist/common-auth-embedded/quota/map.d.ts +63 -0
- package/dist/common-auth-embedded/quota/map.js +105 -0
- package/dist/common-auth-embedded/quota/merge.d.ts +48 -0
- package/dist/common-auth-embedded/quota/merge.js +162 -0
- package/dist/common-auth-embedded/quota/projection.d.ts +64 -0
- package/dist/common-auth-embedded/quota/projection.js +134 -0
- package/dist/common-auth-embedded/routing/admission.d.ts +93 -0
- package/dist/common-auth-embedded/routing/admission.js +142 -0
- package/dist/common-auth-embedded/routing/index.d.ts +8 -0
- package/dist/common-auth-embedded/routing/index.js +4 -0
- package/dist/common-auth-embedded/routing/ordered.d.ts +47 -0
- package/dist/common-auth-embedded/routing/ordered.js +58 -0
- package/dist/common-auth-embedded/routing/pins.d.ts +22 -0
- package/dist/common-auth-embedded/routing/pins.js +34 -0
- package/dist/common-auth-embedded/routing/sticky.d.ts +158 -0
- package/dist/common-auth-embedded/routing/sticky.js +339 -0
- package/dist/common-auth-embedded/source-output.json +1090 -0
- package/dist/common-auth-embedded/store/attribution.d.ts +28 -0
- package/dist/common-auth-embedded/store/attribution.js +60 -0
- package/dist/common-auth-embedded/store/errors.d.ts +55 -0
- package/dist/common-auth-embedded/store/errors.js +38 -0
- package/dist/common-auth-embedded/store/hooks.d.ts +12 -0
- package/dist/common-auth-embedded/store/hooks.js +34 -0
- package/dist/common-auth-embedded/store/identity.d.ts +39 -0
- package/dist/common-auth-embedded/store/identity.js +79 -0
- package/dist/common-auth-embedded/store/index.d.ts +21 -0
- package/dist/common-auth-embedded/store/index.js +7 -0
- package/dist/common-auth-embedded/store/mutate.d.ts +189 -0
- package/dist/common-auth-embedded/store/mutate.js +500 -0
- package/dist/common-auth-embedded/store/pool.d.ts +196 -0
- package/dist/common-auth-embedded/store/pool.js +120 -0
- package/dist/common-auth-embedded/store/provider-state.d.ts +131 -0
- package/dist/common-auth-embedded/store/provider-state.js +226 -0
- package/dist/common-auth-embedded/store/publication.d.ts +47 -0
- package/dist/common-auth-embedded/store/publication.js +304 -0
- package/dist/common-auth-embedded/store/pull.d.ts +36 -0
- package/dist/common-auth-embedded/store/pull.js +143 -0
- package/dist/common-auth-embedded/store/refresh-lock.d.ts +63 -0
- package/dist/common-auth-embedded/store/refresh-lock.js +136 -0
- package/dist/common-auth-embedded/store/refresh.d.ts +72 -0
- package/dist/common-auth-embedded/store/refresh.js +225 -0
- package/dist/common-auth-embedded/store/reserved.js +13 -0
- package/dist/common-auth-embedded/store/rows.d.ts +313 -0
- package/dist/common-auth-embedded/store/rows.js +1258 -0
- package/dist/common-auth-embedded/store/runtime.d.ts +36 -0
- package/dist/common-auth-embedded/store/runtime.js +68 -0
- package/dist/common-auth-embedded/store/schema.d.ts +443 -0
- package/dist/common-auth-embedded/store/schema.js +754 -0
- package/dist/common-auth-embedded/store/settings.d.ts +63 -0
- package/dist/common-auth-embedded/store/settings.js +120 -0
- package/dist/common-auth-embedded/store/torn.d.ts +78 -0
- package/dist/common-auth-embedded/store/torn.js +294 -0
- package/dist/common-auth-embedded/util/any-signal.js +42 -0
- package/dist/common-auth-runtime.d.ts +73 -0
- package/dist/common-auth-runtime.d.ts.map +1 -0
- package/dist/common-auth-runtime.js +65 -0
- package/dist/common-auth-runtime.js.map +1 -0
- package/dist/credential-redaction.d.ts +13 -0
- package/dist/credential-redaction.d.ts.map +1 -0
- package/dist/credential-redaction.js +230 -0
- package/dist/credential-redaction.js.map +1 -0
- package/dist/fetch-timeout.d.ts +4 -2
- package/dist/fetch-timeout.d.ts.map +1 -1
- package/dist/fetch-timeout.js +121 -14
- package/dist/fetch-timeout.js.map +1 -1
- package/dist/fingerprint.d.ts +3 -3
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +4 -4
- package/dist/fingerprint.js.map +1 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/model-registry.d.ts +16 -0
- package/dist/model-registry.d.ts.map +1 -1
- package/dist/model-registry.js +242 -30
- package/dist/model-registry.js.map +1 -1
- package/dist/quota-manager.d.ts.map +1 -1
- package/dist/quota-manager.js +35 -10
- package/dist/quota-manager.js.map +1 -1
- package/dist/quota-presentation.d.ts +10 -0
- package/dist/quota-presentation.d.ts.map +1 -0
- package/dist/quota-presentation.js +60 -0
- package/dist/quota-presentation.js.map +1 -0
- package/dist/quota-types.d.ts +2 -0
- package/dist/quota-types.d.ts.map +1 -1
- package/dist/rotation.d.ts +8 -0
- package/dist/rotation.d.ts.map +1 -1
- package/dist/rotation.js +24 -0
- package/dist/rotation.js.map +1 -1
- package/dist/transform/agy-generation.d.ts +3 -0
- package/dist/transform/agy-generation.d.ts.map +1 -0
- package/dist/transform/agy-generation.js +28 -0
- package/dist/transform/agy-generation.js.map +1 -0
- package/dist/transform/claude.d.ts +7 -3
- package/dist/transform/claude.d.ts.map +1 -1
- package/dist/transform/claude.js +8 -2
- package/dist/transform/claude.js.map +1 -1
- package/dist/transform/index.d.ts +1 -0
- package/dist/transform/index.d.ts.map +1 -1
- package/dist/transform/index.js +1 -0
- package/dist/transform/index.js.map +1 -1
- package/dist/transform/model-resolver.d.ts +2 -1
- package/dist/transform/model-resolver.d.ts.map +1 -1
- package/dist/transform/model-resolver.js +46 -5
- package/dist/transform/model-resolver.js.map +1 -1
- package/dist/transform/types.d.ts +1 -1
- package/dist/transform/types.d.ts.map +1 -1
- package/dist/vault-account-source.d.ts +183 -0
- package/dist/vault-account-source.d.ts.map +1 -0
- package/dist/vault-account-source.js +296 -0
- package/dist/vault-account-source.js.map +1 -0
- package/dist/vault-enrollment-authority.d.ts +16 -0
- package/dist/vault-enrollment-authority.d.ts.map +1 -0
- package/dist/vault-enrollment-authority.js +19 -0
- package/dist/vault-enrollment-authority.js.map +1 -0
- package/dist/vault-family.d.ts +11 -0
- package/dist/vault-family.d.ts.map +1 -0
- package/dist/vault-family.js +24 -0
- package/dist/vault-family.js.map +1 -0
- package/dist/vault-provider-state.d.ts +162 -0
- package/dist/vault-provider-state.d.ts.map +1 -0
- package/dist/vault-provider-state.js +422 -0
- package/dist/vault-provider-state.js.map +1 -0
- package/package.json +39 -2
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `/antigravity` command menu, shared by every host adapter.
|
|
3
|
+
*
|
|
4
|
+
* The menu itself (payloads, confirmation, redaction, per-invocation
|
|
5
|
+
* isolation and action dispatch) is common-auth's public `./commands` entry;
|
|
6
|
+
* this module only supplies Antigravity's section bodies. The Accounts,
|
|
7
|
+
* Quota, Routing and Limits slots replace the library's store-backed
|
|
8
|
+
* built-ins, because the built-ins would put each account's row id and
|
|
9
|
+
* recorded identity (its email) into the payload a renderer receives.
|
|
10
|
+
*
|
|
11
|
+
* Accounts are shown by position ("Account 2") and carry an opaque item id:
|
|
12
|
+
* a random string bound for the life of the menu to one exact credential
|
|
13
|
+
* (row id, credential epoch and recorded identity). An action runs against
|
|
14
|
+
* the credential captured in the read that built it, and the repository
|
|
15
|
+
* refuses it if that credential has since changed. Item ids are never reused
|
|
16
|
+
* for another credential and positions are never accepted as targets.
|
|
17
|
+
*
|
|
18
|
+
* Nothing here imports a host SDK; the commands module, the account source
|
|
19
|
+
* and the settings arrive from the caller.
|
|
20
|
+
*/
|
|
21
|
+
import { randomBytes } from 'node:crypto';
|
|
22
|
+
import { rowRefKey } from "./account-identity.js";
|
|
23
|
+
import { formatAntigravityQuota } from "./quota-presentation.js";
|
|
24
|
+
/** The slash command's name, without the slash. */
|
|
25
|
+
export const ANTIGRAVITY_MENU_COMMAND = 'antigravity';
|
|
26
|
+
export const ANTIGRAVITY_MENU_TITLE = 'Antigravity';
|
|
27
|
+
/** `disabledReason` recorded when the user disables an account from the menu. */
|
|
28
|
+
export const ANTIGRAVITY_MENU_DISABLED_REASON = 'disabled from the command menu';
|
|
29
|
+
function createItemIds(create) {
|
|
30
|
+
const byRef = new Map();
|
|
31
|
+
const issued = new Set();
|
|
32
|
+
return {
|
|
33
|
+
idFor(ref) {
|
|
34
|
+
const key = rowRefKey(ref);
|
|
35
|
+
const existing = byRef.get(key);
|
|
36
|
+
if (existing !== undefined)
|
|
37
|
+
return existing;
|
|
38
|
+
let id = create();
|
|
39
|
+
while (issued.has(id))
|
|
40
|
+
id = create();
|
|
41
|
+
issued.add(id);
|
|
42
|
+
byRef.set(key, id);
|
|
43
|
+
return id;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function randomItemId() {
|
|
48
|
+
return `acct-${randomBytes(16).toString('base64url')}`;
|
|
49
|
+
}
|
|
50
|
+
function notReadyLines(read) {
|
|
51
|
+
switch (read.status) {
|
|
52
|
+
case 'ready':
|
|
53
|
+
return [];
|
|
54
|
+
case 'pending-migration':
|
|
55
|
+
return [
|
|
56
|
+
'The account store is waiting for migration. Run `antigravity-auth migrate --offline`.',
|
|
57
|
+
];
|
|
58
|
+
case 'management-pending':
|
|
59
|
+
return ['An account operation is still finishing; try again shortly.'];
|
|
60
|
+
case 'error':
|
|
61
|
+
return [`The account store could not be read (${read.file} file).`];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function isActive(read, ref) {
|
|
65
|
+
const active = read.routing?.activeRow;
|
|
66
|
+
return (active !== undefined &&
|
|
67
|
+
active !== null &&
|
|
68
|
+
rowRefKey(active) === rowRefKey(ref));
|
|
69
|
+
}
|
|
70
|
+
/** What blocks the row, from its metadata; never its email or reason text. */
|
|
71
|
+
function blockOf(row) {
|
|
72
|
+
if (row.metadata.status !== 'present')
|
|
73
|
+
return 'metadata unavailable';
|
|
74
|
+
const metadata = row.metadata.metadata;
|
|
75
|
+
if (metadata.verificationRequired === true)
|
|
76
|
+
return 'verification required';
|
|
77
|
+
if (metadata.accountIneligible === true)
|
|
78
|
+
return 'ineligible';
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
function statusOf(row, now) {
|
|
82
|
+
if (!row.enabled)
|
|
83
|
+
return 'disabled';
|
|
84
|
+
const block = blockOf(row);
|
|
85
|
+
if (block)
|
|
86
|
+
return block;
|
|
87
|
+
if (row.metadata.status === 'present') {
|
|
88
|
+
const until = row.metadata.metadata.coolingDownUntil;
|
|
89
|
+
if (typeof until === 'number' && until > now)
|
|
90
|
+
return 'cooling down';
|
|
91
|
+
}
|
|
92
|
+
return row.usable ? 'ready' : 'unusable';
|
|
93
|
+
}
|
|
94
|
+
function quotaLine(row, position) {
|
|
95
|
+
const quota = row.quota.status === 'present' ? row.quota.quota : undefined;
|
|
96
|
+
return `Account ${position + 1}: ${formatAntigravityQuota(quota, { now: Date.now() })}`;
|
|
97
|
+
}
|
|
98
|
+
function failure(text, code) {
|
|
99
|
+
return { ok: false, text, code };
|
|
100
|
+
}
|
|
101
|
+
/** Repository failures that mean the captured credential has changed. */
|
|
102
|
+
const STALE_KINDS = new Set(['attribution', 'unknown-row', 'id-removed']);
|
|
103
|
+
function staleOrRethrow(error) {
|
|
104
|
+
const kind = typeof error === 'object' &&
|
|
105
|
+
error !== null &&
|
|
106
|
+
'failure' in error &&
|
|
107
|
+
typeof error.failure === 'object' &&
|
|
108
|
+
error.failure !== null &&
|
|
109
|
+
'kind' in error.failure
|
|
110
|
+
? error.failure.kind
|
|
111
|
+
: undefined;
|
|
112
|
+
if (typeof kind === 'string' && STALE_KINDS.has(kind))
|
|
113
|
+
return failure('That account changed since the menu was opened; nothing was changed.', 'stale-account');
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Sections
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
const ROUTING_TARGETS = [
|
|
120
|
+
{ value: 'active', label: 'All models' },
|
|
121
|
+
{ value: 'claude', label: 'Claude models' },
|
|
122
|
+
{ value: 'gemini', label: 'Gemini models' },
|
|
123
|
+
];
|
|
124
|
+
function isRoutingTarget(value) {
|
|
125
|
+
return ROUTING_TARGETS.some((target) => target.value === value);
|
|
126
|
+
}
|
|
127
|
+
/** The account item's re-authentication action, over the host's sign-in. */
|
|
128
|
+
function reauthorizeAction(reauthorize, ref) {
|
|
129
|
+
return {
|
|
130
|
+
id: 'reauthorize',
|
|
131
|
+
label: reauthorize.label ?? 'Reauthorize',
|
|
132
|
+
description: "Sign in again to replace this account's saved login.",
|
|
133
|
+
run: ({ invocation }) => reauthorize.run(ref, invocation),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** The account item's quota floor action, over the host's floor source. */
|
|
137
|
+
function floorAction(source, ref, position, floor) {
|
|
138
|
+
return {
|
|
139
|
+
id: 'limit',
|
|
140
|
+
label: 'Set quota floor',
|
|
141
|
+
description: 'Stop using this account below this remaining quota; leave empty to follow the global floor.',
|
|
142
|
+
knobs: [
|
|
143
|
+
{
|
|
144
|
+
kind: 'number',
|
|
145
|
+
id: 'minimumRemainingPercent',
|
|
146
|
+
label: 'Minimum remaining percent',
|
|
147
|
+
...(floor !== null ? { value: floor } : {}),
|
|
148
|
+
min: 0,
|
|
149
|
+
max: 100,
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
run: async ({ values }) => {
|
|
153
|
+
const value = values.minimumRemainingPercent;
|
|
154
|
+
const next = typeof value === 'number' ? value : null;
|
|
155
|
+
let outcome;
|
|
156
|
+
try {
|
|
157
|
+
outcome = await source.write(ref, next);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return staleOrRethrow(error);
|
|
161
|
+
}
|
|
162
|
+
if (outcome === 'stale')
|
|
163
|
+
return failure('That account changed since the menu was opened; nothing was changed.', 'stale-account');
|
|
164
|
+
return next === null
|
|
165
|
+
? `Account ${position + 1} follows the global quota floor`
|
|
166
|
+
: `Account ${position + 1} quota floor set to ${next}%`;
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function accountsSection(options, ids, now) {
|
|
171
|
+
const accounts = options.accounts;
|
|
172
|
+
return {
|
|
173
|
+
title: 'Accounts',
|
|
174
|
+
async build() {
|
|
175
|
+
const read = await accounts.read();
|
|
176
|
+
const sectionActions = options.login
|
|
177
|
+
? [
|
|
178
|
+
{
|
|
179
|
+
id: 'add',
|
|
180
|
+
label: options.login.label ?? 'Add account',
|
|
181
|
+
run: ({ invocation }) => options.login
|
|
182
|
+
? options.login.run(invocation)
|
|
183
|
+
: Promise.resolve(failure('Login is unavailable.', 'refused')),
|
|
184
|
+
},
|
|
185
|
+
]
|
|
186
|
+
: [];
|
|
187
|
+
if (read.status !== 'ready')
|
|
188
|
+
return { lines: notReadyLines(read), actions: sectionActions };
|
|
189
|
+
const at = now();
|
|
190
|
+
const limitSource = options.accountLimits;
|
|
191
|
+
const floors = limitSource
|
|
192
|
+
? await Promise.all(read.rows.map((row) => limitSource.read(row.ref)))
|
|
193
|
+
: [];
|
|
194
|
+
const items = read.rows.map((row, position) => {
|
|
195
|
+
const floor = floors[position] ?? null;
|
|
196
|
+
const ref = row.ref;
|
|
197
|
+
const active = isActive(read, ref);
|
|
198
|
+
const actions = [
|
|
199
|
+
row.enabled
|
|
200
|
+
? {
|
|
201
|
+
id: 'disable',
|
|
202
|
+
label: 'Disable',
|
|
203
|
+
run: async () => {
|
|
204
|
+
try {
|
|
205
|
+
await accounts.setEnabled(ref, {
|
|
206
|
+
enabled: false,
|
|
207
|
+
actor: 'user',
|
|
208
|
+
reason: ANTIGRAVITY_MENU_DISABLED_REASON,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
return staleOrRethrow(error);
|
|
213
|
+
}
|
|
214
|
+
return `Account ${position + 1} disabled`;
|
|
215
|
+
},
|
|
216
|
+
}
|
|
217
|
+
: {
|
|
218
|
+
id: 'enable',
|
|
219
|
+
label: 'Enable',
|
|
220
|
+
run: async () => {
|
|
221
|
+
try {
|
|
222
|
+
await accounts.setEnabled(ref, {
|
|
223
|
+
enabled: true,
|
|
224
|
+
actor: 'user',
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
return staleOrRethrow(error);
|
|
229
|
+
}
|
|
230
|
+
return `Account ${position + 1} enabled`;
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
id: 'select',
|
|
235
|
+
label: 'Use this account',
|
|
236
|
+
knobs: [
|
|
237
|
+
{
|
|
238
|
+
kind: 'choice',
|
|
239
|
+
id: 'target',
|
|
240
|
+
label: 'For',
|
|
241
|
+
choices: ROUTING_TARGETS.map((target) => ({
|
|
242
|
+
value: target.value,
|
|
243
|
+
label: target.label,
|
|
244
|
+
})),
|
|
245
|
+
value: 'active',
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
run: async ({ values }) => {
|
|
249
|
+
const target = values.target ?? 'active';
|
|
250
|
+
if (!isRoutingTarget(target))
|
|
251
|
+
return failure('Choose which models to route.', 'invalid-input');
|
|
252
|
+
try {
|
|
253
|
+
await accounts.selectAccount(target, ref);
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
return staleOrRethrow(error);
|
|
257
|
+
}
|
|
258
|
+
return `Account ${position + 1} selected`;
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
id: 'remove',
|
|
263
|
+
label: 'Remove',
|
|
264
|
+
irreversible: true,
|
|
265
|
+
confirm: `Remove account ${position + 1}? Its saved login is deleted.`,
|
|
266
|
+
run: async () => {
|
|
267
|
+
try {
|
|
268
|
+
await accounts.remove(ref);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
return staleOrRethrow(error);
|
|
272
|
+
}
|
|
273
|
+
return `Account ${position + 1} removed`;
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
...(limitSource
|
|
277
|
+
? [floorAction(limitSource, ref, position, floor)]
|
|
278
|
+
: []),
|
|
279
|
+
...(options.reauthorize
|
|
280
|
+
? [reauthorizeAction(options.reauthorize, ref)]
|
|
281
|
+
: []),
|
|
282
|
+
];
|
|
283
|
+
return {
|
|
284
|
+
id: ids.idFor(ref),
|
|
285
|
+
label: `Account ${position + 1}`,
|
|
286
|
+
detail: `${statusOf(row, at)}${active ? ' · active' : ''}${floor !== null ? ` · floor ${floor}%` : ''}`,
|
|
287
|
+
facts: {
|
|
288
|
+
status: statusOf(row, at),
|
|
289
|
+
active,
|
|
290
|
+
...(floor !== null ? { quotaFloorPercent: floor } : {}),
|
|
291
|
+
},
|
|
292
|
+
actions,
|
|
293
|
+
};
|
|
294
|
+
});
|
|
295
|
+
return {
|
|
296
|
+
lines: items.length === 0
|
|
297
|
+
? ['No accounts yet.']
|
|
298
|
+
: [`${items.length} accounts`],
|
|
299
|
+
items,
|
|
300
|
+
actions: sectionActions,
|
|
301
|
+
};
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
function quotaSection(options) {
|
|
306
|
+
return {
|
|
307
|
+
title: 'Quota',
|
|
308
|
+
async build() {
|
|
309
|
+
const read = await options.accounts.read();
|
|
310
|
+
if (read.status !== 'ready')
|
|
311
|
+
return { lines: notReadyLines(read) };
|
|
312
|
+
const refs = read.rows.map((row) => row.ref);
|
|
313
|
+
const refresh = options.refreshQuota;
|
|
314
|
+
return {
|
|
315
|
+
lines: read.rows.length === 0
|
|
316
|
+
? ['No accounts yet.']
|
|
317
|
+
: read.rows.map((row, position) => quotaLine(row, position)),
|
|
318
|
+
actions: refresh
|
|
319
|
+
? [
|
|
320
|
+
{
|
|
321
|
+
id: 'refresh',
|
|
322
|
+
label: 'Check quota now',
|
|
323
|
+
run: async ({ invocation }) => {
|
|
324
|
+
const report = await refresh(refs, invocation);
|
|
325
|
+
return quotaCheckOutcome(report);
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
]
|
|
329
|
+
: [],
|
|
330
|
+
};
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/** What a quota check shows: never success when no reading was taken. */
|
|
335
|
+
export function quotaCheckOutcome(report) {
|
|
336
|
+
const total = report.checked + report.notChecked;
|
|
337
|
+
if (total === 0)
|
|
338
|
+
return 'No accounts to check';
|
|
339
|
+
if (report.checked === 0)
|
|
340
|
+
return failure(`Quota could not be checked for any of the ${total} accounts.`, 'quota-unavailable');
|
|
341
|
+
if (report.notChecked === 0)
|
|
342
|
+
return `Quota checked for ${report.checked} of ${total} accounts`;
|
|
343
|
+
return `Quota checked for ${report.checked} of ${total} accounts; ${report.notChecked} could not be checked`;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* The Routing and Limits sections over a settings source, for a host that
|
|
347
|
+
* supplies its own account slots (sections mode) but keeps the same
|
|
348
|
+
* operator settings as the repository-mode menu.
|
|
349
|
+
*/
|
|
350
|
+
export function antigravitySettingsSections(settings) {
|
|
351
|
+
return {
|
|
352
|
+
routing: routingSection({ settings }),
|
|
353
|
+
limits: limitsSection({ settings }),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
function onOff(value) {
|
|
357
|
+
return value ? 'on' : 'off';
|
|
358
|
+
}
|
|
359
|
+
function routingSection(options) {
|
|
360
|
+
return {
|
|
361
|
+
title: 'Routing',
|
|
362
|
+
async build() {
|
|
363
|
+
const current = (await options.settings.read()).routing;
|
|
364
|
+
return {
|
|
365
|
+
lines: [
|
|
366
|
+
`Gemini CLI headers first: ${onOff(current.cliFirst)}`,
|
|
367
|
+
`Fall back to the other header style on quota: ${onOff(current.quotaStyleFallback)}`,
|
|
368
|
+
],
|
|
369
|
+
actions: [
|
|
370
|
+
{
|
|
371
|
+
id: 'set',
|
|
372
|
+
label: 'Change routing',
|
|
373
|
+
knobs: [
|
|
374
|
+
{
|
|
375
|
+
kind: 'toggle',
|
|
376
|
+
id: 'cliFirst',
|
|
377
|
+
label: 'Gemini CLI headers first',
|
|
378
|
+
value: current.cliFirst,
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
kind: 'toggle',
|
|
382
|
+
id: 'quotaStyleFallback',
|
|
383
|
+
label: 'Header-style fallback on quota',
|
|
384
|
+
value: current.quotaStyleFallback,
|
|
385
|
+
},
|
|
386
|
+
],
|
|
387
|
+
run: async ({ values }) => {
|
|
388
|
+
const latest = (await options.settings.read()).routing;
|
|
389
|
+
await options.settings.updateRouting({
|
|
390
|
+
cliFirst: typeof values.cliFirst === 'boolean'
|
|
391
|
+
? values.cliFirst
|
|
392
|
+
: latest.cliFirst,
|
|
393
|
+
quotaStyleFallback: typeof values.quotaStyleFallback === 'boolean'
|
|
394
|
+
? values.quotaStyleFallback
|
|
395
|
+
: latest.quotaStyleFallback,
|
|
396
|
+
});
|
|
397
|
+
return 'Routing updated';
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
],
|
|
401
|
+
};
|
|
402
|
+
},
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
function limitsSection(options) {
|
|
406
|
+
return {
|
|
407
|
+
title: 'Limits',
|
|
408
|
+
async build() {
|
|
409
|
+
const current = (await options.settings.read()).killswitch;
|
|
410
|
+
return {
|
|
411
|
+
lines: [
|
|
412
|
+
`Quota killswitch: ${onOff(current.enabled)}`,
|
|
413
|
+
`Stop using an account below: ${current.minimumRemainingPercent}% remaining`,
|
|
414
|
+
],
|
|
415
|
+
actions: [
|
|
416
|
+
{
|
|
417
|
+
id: 'set',
|
|
418
|
+
label: 'Change limits',
|
|
419
|
+
knobs: [
|
|
420
|
+
{
|
|
421
|
+
kind: 'toggle',
|
|
422
|
+
id: 'enabled',
|
|
423
|
+
label: 'Quota killswitch',
|
|
424
|
+
value: current.enabled,
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
kind: 'number',
|
|
428
|
+
id: 'minimumRemainingPercent',
|
|
429
|
+
label: 'Minimum remaining percent',
|
|
430
|
+
value: current.minimumRemainingPercent,
|
|
431
|
+
min: 0,
|
|
432
|
+
max: 100,
|
|
433
|
+
},
|
|
434
|
+
],
|
|
435
|
+
run: async ({ values }) => {
|
|
436
|
+
const latest = (await options.settings.read()).killswitch;
|
|
437
|
+
await options.settings.updateKillswitch({
|
|
438
|
+
enabled: typeof values.enabled === 'boolean'
|
|
439
|
+
? values.enabled
|
|
440
|
+
: latest.enabled,
|
|
441
|
+
minimumRemainingPercent: typeof values.minimumRemainingPercent === 'number'
|
|
442
|
+
? values.minimumRemainingPercent
|
|
443
|
+
: latest.minimumRemainingPercent,
|
|
444
|
+
});
|
|
445
|
+
return 'Limits updated';
|
|
446
|
+
},
|
|
447
|
+
},
|
|
448
|
+
],
|
|
449
|
+
};
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
// ---------------------------------------------------------------------------
|
|
454
|
+
// Factory
|
|
455
|
+
// ---------------------------------------------------------------------------
|
|
456
|
+
const SECTION_SLOTS = ['accounts', 'quota', 'routing', 'limits'];
|
|
457
|
+
function isPluginSection(value) {
|
|
458
|
+
return (typeof value === 'object' &&
|
|
459
|
+
value !== null &&
|
|
460
|
+
'title' in value &&
|
|
461
|
+
typeof value.title === 'string' &&
|
|
462
|
+
'build' in value &&
|
|
463
|
+
typeof value.build === 'function');
|
|
464
|
+
}
|
|
465
|
+
/** The four account slots for the chosen mode; refuses an incomplete mode. */
|
|
466
|
+
function accountSlots(options) {
|
|
467
|
+
switch (options.source) {
|
|
468
|
+
case 'repository': {
|
|
469
|
+
if (typeof options.accounts?.read !== 'function' ||
|
|
470
|
+
typeof options.settings?.read !== 'function') {
|
|
471
|
+
throw new TypeError('repository menu mode needs an account repository and a settings source');
|
|
472
|
+
}
|
|
473
|
+
const ids = createItemIds(options.createItemId ?? randomItemId);
|
|
474
|
+
const now = options.now ?? Date.now;
|
|
475
|
+
return {
|
|
476
|
+
accounts: accountsSection(options, ids, now),
|
|
477
|
+
quota: quotaSection(options),
|
|
478
|
+
routing: routingSection(options),
|
|
479
|
+
limits: limitsSection(options),
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
case 'sections': {
|
|
483
|
+
const sections = options.sections;
|
|
484
|
+
for (const slot of SECTION_SLOTS) {
|
|
485
|
+
if (!isPluginSection(sections?.[slot])) {
|
|
486
|
+
throw new TypeError(`sections menu mode needs a ${slot} section`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return sections;
|
|
490
|
+
}
|
|
491
|
+
default: {
|
|
492
|
+
const unsupported = options;
|
|
493
|
+
void unsupported;
|
|
494
|
+
throw new TypeError('the menu source must be repository or sections');
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Builds the `/antigravity` menu on common-auth's `createCommandMenu`. The
|
|
500
|
+
* four account slots replace the library's store-backed built-ins in both
|
|
501
|
+
* modes, so no pool store is passed; Cache, Diagnostics and extras are the
|
|
502
|
+
* host's.
|
|
503
|
+
*/
|
|
504
|
+
export function createAntigravityCommandMenu(options) {
|
|
505
|
+
const replace = accountSlots(options);
|
|
506
|
+
return options.commands.createCommandMenu({
|
|
507
|
+
command: ANTIGRAVITY_MENU_COMMAND,
|
|
508
|
+
title: ANTIGRAVITY_MENU_TITLE,
|
|
509
|
+
replace: {
|
|
510
|
+
accounts: replace.accounts,
|
|
511
|
+
quota: replace.quota,
|
|
512
|
+
routing: replace.routing,
|
|
513
|
+
limits: replace.limits,
|
|
514
|
+
},
|
|
515
|
+
...(options.cache ? { cache: options.cache } : {}),
|
|
516
|
+
...(options.diagnostics ? { diagnostics: options.diagnostics } : {}),
|
|
517
|
+
...(options.extras ? { extras: options.extras } : {}),
|
|
518
|
+
...(options.logger ? { logger: options.logger } : {}),
|
|
519
|
+
...(options.redaction ? { redaction: options.redaction } : {}),
|
|
520
|
+
...(options.now ? { now: options.now } : {}),
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
//# sourceMappingURL=antigravity-command-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity-command-menu.js","sourceRoot":"","sources":["../src/antigravity-command-menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AASjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAgBhE,mDAAmD;AACnD,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CAAA;AACrD,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAA;AAEnD,iFAAiF;AACjF,MAAM,CAAC,MAAM,gCAAgC,GAAG,gCAAgC,CAAA;AA6JhF,SAAS,aAAa,CAAC,MAAoB;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAChC,OAAO;QACL,KAAK,CAAC,GAAG;YACP,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,QAAQ,CAAA;YAC3C,IAAI,EAAE,GAAG,MAAM,EAAE,CAAA;YACjB,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,EAAE,GAAG,MAAM,EAAE,CAAA;YACpC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACd,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YAClB,OAAO,EAAE,CAAA;QACX,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,QAAQ,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAA;AACxD,CAAC;AAQD,SAAS,aAAa,CAAC,IAA2B;IAChD,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,EAAE,CAAA;QACX,KAAK,mBAAmB;YACtB,OAAO;gBACL,uFAAuF;aACxF,CAAA;QACH,KAAK,oBAAoB;YACvB,OAAO,CAAC,6DAA6D,CAAC,CAAA;QACxE,KAAK,OAAO;YACV,OAAO,CAAC,wCAAwC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAA;IACvE,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAe,EAAE,GAAW;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAA;IACtC,OAAO,CACL,MAAM,KAAK,SAAS;QACpB,MAAM,KAAK,IAAI;QACf,SAAS,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,GAAG,CAAC,CACrC,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,OAAO,CAAC,GAAe;IAC9B,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAA;IACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAA;IACtC,IAAI,QAAQ,CAAC,oBAAoB,KAAK,IAAI;QAAE,OAAO,uBAAuB,CAAA;IAC1E,IAAI,QAAQ,CAAC,iBAAiB,KAAK,IAAI;QAAE,OAAO,YAAY,CAAA;IAC5D,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAe,EAAE,GAAW;IAC5C,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,UAAU,CAAA;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAA;IACvB,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAA;QACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,GAAG;YAAE,OAAO,cAAc,CAAA;IACrE,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAA;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,GAAe,EAAE,QAAgB;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1E,OAAO,WAAW,QAAQ,GAAG,CAAC,KAAK,sBAAsB,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAA;AACzF,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,IAAY;IACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AAClC,CAAC;AAED,yEAAyE;AACzE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,CAAA;AAEzE,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,KAAK,CAAC,OAAO,KAAK,IAAI;QACtB,MAAM,IAAI,KAAK,CAAC,OAAO;QACrB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI;QACpB,CAAC,CAAC,SAAS,CAAA;IACf,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QACnD,OAAO,OAAO,CACZ,sEAAsE,EACtE,eAAe,CAChB,CAAA;IACH,MAAM,KAAK,CAAA;AACb,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,eAAe,GAAuD;IAC1E,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;IACxC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE;IAC3C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE;CAC5C,CAAA;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;AACjE,CAAC;AAED,4EAA4E;AAC5E,SAAS,iBAAiB,CACxB,WAAyE,EACzE,GAAW;IAEX,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,aAAa;QACzC,WAAW,EAAE,sDAAsD;QACnE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC;KAC1D,CAAA;AACH,CAAC;AAED,2EAA2E;AAC3E,SAAS,WAAW,CAClB,MAAqC,EACrC,GAAW,EACX,QAAgB,EAChB,KAAoB;IAEpB,OAAO;QACL,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,6FAA6F;QAC/F,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,yBAAyB;gBAC7B,KAAK,EAAE,2BAA2B;gBAClC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,GAAG,EAAE,CAAC;gBACN,GAAG,EAAE,GAAG;aACT;SACF;QACD,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,MAAM,CAAC,uBAAuB,CAAA;YAC5C,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;YACrD,IAAI,OAA4B,CAAA;YAChC,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;YAC9B,CAAC;YACD,IAAI,OAAO,KAAK,OAAO;gBACrB,OAAO,OAAO,CACZ,sEAAsE,EACtE,eAAe,CAChB,CAAA;YACH,OAAO,IAAI,KAAK,IAAI;gBAClB,CAAC,CAAC,WAAW,QAAQ,GAAG,CAAC,iCAAiC;gBAC1D,CAAC,CAAC,WAAW,QAAQ,GAAG,CAAC,uBAAuB,IAAI,GAAG,CAAA;QAC3D,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CACtB,OAAyC,EACzC,GAAY,EACZ,GAAiB;IAEjB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IACjC,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,MAAM,cAAc,GAAuB,OAAO,CAAC,KAAK;gBACtD,CAAC,CAAC;oBACE;wBACE,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,aAAa;wBAC3C,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACtB,OAAO,CAAC,KAAK;4BACX,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;4BAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,CACb,OAAO,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAC5C;qBACR;iBACF;gBACH,CAAC,CAAC,EAAE,CAAA;YACN,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;gBACzB,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAA;YAChE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAA;YAChB,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAA;YACzC,MAAM,MAAM,GAAG,WAAW;gBACxB,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtE,CAAC,CAAC,EAAE,CAAA;YACN,MAAM,KAAK,GAAqB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;gBAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;gBACtC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAA;gBACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;gBAClC,MAAM,OAAO,GAAuB;oBAClC,GAAG,CAAC,OAAO;wBACT,CAAC,CAAC;4BACE,EAAE,EAAE,SAAS;4BACb,KAAK,EAAE,SAAS;4BAChB,GAAG,EAAE,KAAK,IAAI,EAAE;gCACd,IAAI,CAAC;oCACH,MAAM,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE;wCAC7B,OAAO,EAAE,KAAK;wCACd,KAAK,EAAE,MAAM;wCACb,MAAM,EAAE,gCAAgC;qCACzC,CAAC,CAAA;gCACJ,CAAC;gCAAC,OAAO,KAAK,EAAE,CAAC;oCACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;gCAC9B,CAAC;gCACD,OAAO,WAAW,QAAQ,GAAG,CAAC,WAAW,CAAA;4BAC3C,CAAC;yBACF;wBACH,CAAC,CAAC;4BACE,EAAE,EAAE,QAAQ;4BACZ,KAAK,EAAE,QAAQ;4BACf,GAAG,EAAE,KAAK,IAAI,EAAE;gCACd,IAAI,CAAC;oCACH,MAAM,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE;wCAC7B,OAAO,EAAE,IAAI;wCACb,KAAK,EAAE,MAAM;qCACd,CAAC,CAAA;gCACJ,CAAC;gCAAC,OAAO,KAAK,EAAE,CAAC;oCACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;gCAC9B,CAAC;gCACD,OAAO,WAAW,QAAQ,GAAG,CAAC,UAAU,CAAA;4BAC1C,CAAC;yBACF;oBACL;wBACE,EAAE,EAAE,QAAQ;wBACZ,KAAK,EAAE,kBAAkB;wBACzB,KAAK,EAAE;4BACL;gCACE,IAAI,EAAE,QAAQ;gCACd,EAAE,EAAE,QAAQ;gCACZ,KAAK,EAAE,KAAK;gCACZ,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oCACxC,KAAK,EAAE,MAAM,CAAC,KAAK;oCACnB,KAAK,EAAE,MAAM,CAAC,KAAK;iCACpB,CAAC,CAAC;gCACH,KAAK,EAAE,QAAQ;6BAChB;yBACF;wBACD,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;4BACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAA;4BACxC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;gCAC1B,OAAO,OAAO,CAAC,+BAA+B,EAAE,eAAe,CAAC,CAAA;4BAClE,IAAI,CAAC;gCACH,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;4BAC3C,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;4BAC9B,CAAC;4BACD,OAAO,WAAW,QAAQ,GAAG,CAAC,WAAW,CAAA;wBAC3C,CAAC;qBACF;oBACD;wBACE,EAAE,EAAE,QAAQ;wBACZ,KAAK,EAAE,QAAQ;wBACf,YAAY,EAAE,IAAI;wBAClB,OAAO,EAAE,kBAAkB,QAAQ,GAAG,CAAC,+BAA+B;wBACtE,GAAG,EAAE,KAAK,IAAI,EAAE;4BACd,IAAI,CAAC;gCACH,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;4BAC5B,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,OAAO,cAAc,CAAC,KAAK,CAAC,CAAA;4BAC9B,CAAC;4BACD,OAAO,WAAW,QAAQ,GAAG,CAAC,UAAU,CAAA;wBAC1C,CAAC;qBACF;oBACD,GAAG,CAAC,WAAW;wBACb,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;wBAClD,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,OAAO,CAAC,WAAW;wBACrB,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;wBAC/C,CAAC,CAAC,EAAE,CAAC;iBACR,CAAA;gBACD,OAAO;oBACL,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;oBAClB,KAAK,EAAE,WAAW,QAAQ,GAAG,CAAC,EAAE;oBAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACvG,KAAK,EAAE;wBACL,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;wBACzB,MAAM;wBACN,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACxD;oBACD,OAAO;iBACR,CAAA;YACH,CAAC,CAAC,CAAA;YACF,OAAO;gBACL,KAAK,EACH,KAAK,CAAC,MAAM,KAAK,CAAC;oBAChB,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACtB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,WAAW,CAAC;gBAClC,KAAK;gBACL,OAAO,EAAE,cAAc;aACxB,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CACnB,OAAyC;IAEzC,OAAO;QACL,KAAK,EAAE,OAAO;QACd,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;YAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;gBAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAA;YAClE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAA;YACpC,OAAO;gBACL,KAAK,EACH,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;oBACpB,CAAC,CAAC,CAAC,kBAAkB,CAAC;oBACtB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAChE,OAAO,EAAE,OAAO;oBACd,CAAC,CAAC;wBACE;4BACE,EAAE,EAAE,SAAS;4BACb,KAAK,EAAE,iBAAiB;4BACxB,GAAG,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;gCAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;gCAC9C,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAA;4BAClC,CAAC;yBACF;qBACF;oBACH,CAAC,CAAC,EAAE;aACP,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAC/B,MAAmC;IAEnC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAA;IAChD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,sBAAsB,CAAA;IAC9C,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;QACtB,OAAO,OAAO,CACZ,6CAA6C,KAAK,YAAY,EAC9D,mBAAmB,CACpB,CAAA;IACH,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC;QACzB,OAAO,qBAAqB,MAAM,CAAC,OAAO,OAAO,KAAK,WAAW,CAAA;IACnE,OAAO,qBAAqB,MAAM,CAAC,OAAO,OAAO,KAAK,cAAc,MAAM,CAAC,UAAU,uBAAuB,CAAA;AAC9G,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAAuC;IAEvC,OAAO;QACL,OAAO,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;QACrC,MAAM,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;KACpC,CAAA;AACH,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;AAC7B,CAAC;AAED,SAAS,cAAc,CAAC,OAEvB;IACC,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAA;YACvD,OAAO;gBACL,KAAK,EAAE;oBACL,6BAA6B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;oBACtD,iDAAiD,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;iBACrF;gBACD,OAAO,EAAE;oBACP;wBACE,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,gBAAgB;wBACvB,KAAK,EAAE;4BACL;gCACE,IAAI,EAAE,QAAQ;gCACd,EAAE,EAAE,UAAU;gCACd,KAAK,EAAE,0BAA0B;gCACjC,KAAK,EAAE,OAAO,CAAC,QAAQ;6BACxB;4BACD;gCACE,IAAI,EAAE,QAAQ;gCACd,EAAE,EAAE,oBAAoB;gCACxB,KAAK,EAAE,gCAAgC;gCACvC,KAAK,EAAE,OAAO,CAAC,kBAAkB;6BAClC;yBACF;wBACD,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;4BACxB,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAA;4BACtD,MAAM,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;gCACnC,QAAQ,EACN,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS;oCAClC,CAAC,CAAC,MAAM,CAAC,QAAQ;oCACjB,CAAC,CAAC,MAAM,CAAC,QAAQ;gCACrB,kBAAkB,EAChB,OAAO,MAAM,CAAC,kBAAkB,KAAK,SAAS;oCAC5C,CAAC,CAAC,MAAM,CAAC,kBAAkB;oCAC3B,CAAC,CAAC,MAAM,CAAC,kBAAkB;6BAChC,CAAC,CAAA;4BACF,OAAO,iBAAiB,CAAA;wBAC1B,CAAC;qBACF;iBACF;aACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAEtB;IACC,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAA;YAC1D,OAAO;gBACL,KAAK,EAAE;oBACL,qBAAqB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC7C,gCAAgC,OAAO,CAAC,uBAAuB,aAAa;iBAC7E;gBACD,OAAO,EAAE;oBACP;wBACE,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,eAAe;wBACtB,KAAK,EAAE;4BACL;gCACE,IAAI,EAAE,QAAQ;gCACd,EAAE,EAAE,SAAS;gCACb,KAAK,EAAE,kBAAkB;gCACzB,KAAK,EAAE,OAAO,CAAC,OAAO;6BACvB;4BACD;gCACE,IAAI,EAAE,QAAQ;gCACd,EAAE,EAAE,yBAAyB;gCAC7B,KAAK,EAAE,2BAA2B;gCAClC,KAAK,EAAE,OAAO,CAAC,uBAAuB;gCACtC,GAAG,EAAE,CAAC;gCACN,GAAG,EAAE,GAAG;6BACT;yBACF;wBACD,GAAG,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;4BACxB,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAA;4BACzD,MAAM,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gCACtC,OAAO,EACL,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS;oCACjC,CAAC,CAAC,MAAM,CAAC,OAAO;oCAChB,CAAC,CAAC,MAAM,CAAC,OAAO;gCACpB,uBAAuB,EACrB,OAAO,MAAM,CAAC,uBAAuB,KAAK,QAAQ;oCAChD,CAAC,CAAC,MAAM,CAAC,uBAAuB;oCAChC,CAAC,CAAC,MAAM,CAAC,uBAAuB;6BACrC,CAAC,CAAA;4BACF,OAAO,gBAAgB,CAAA;wBACzB,CAAC;qBACF;iBACF;aACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAEzE,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,CAClC,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,YAAY,CACnB,OAAsC;IAEtC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,IACE,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,KAAK,UAAU;gBAC5C,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,KAAK,UAAU,EAC5C,CAAC;gBACD,MAAM,IAAI,SAAS,CACjB,wEAAwE,CACzE,CAAA;YACH,CAAC;YACD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,IAAI,YAAY,CAAC,CAAA;YAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;YACnC,OAAO;gBACL,QAAQ,EAAE,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC;gBAC5C,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;gBAC5B,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC;gBAChC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;aAC/B,CAAA;QACH,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;YACjC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,SAAS,CAAC,8BAA8B,IAAI,UAAU,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,OAAO,CAAA;YAClC,KAAK,WAAW,CAAA;YAChB,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAsC;IAEtC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IACrC,OAAO,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACxC,OAAO,EAAE,wBAAwB;QACjC,KAAK,EAAE,sBAAsB;QAC7B,OAAO,EAAE;YACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB;QACD,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/atomic-write.d.ts
CHANGED
|
@@ -9,15 +9,32 @@
|
|
|
9
9
|
* bits and relies on the current user's inherited ACL — we do not attempt
|
|
10
10
|
* to harden ACLs from Node.
|
|
11
11
|
*
|
|
12
|
+
* Callers holding a lease (for example a fenced file lock) can pass an
|
|
13
|
+
* optional `beforeRename` guard. It runs once the temp file is fully
|
|
14
|
+
* written, immediately before the rename; if it throws, the temp file is
|
|
15
|
+
* removed and the target is left untouched. This narrows the window in
|
|
16
|
+
* which a writer that lost its lease can still replace the file, but it is
|
|
17
|
+
* not a compare-and-swap: the lease can still change hands between the
|
|
18
|
+
* guard resolving and the rename landing.
|
|
19
|
+
*
|
|
12
20
|
* Failures are deliberately NOT masked by a copy fallback: a blind
|
|
13
21
|
* copy-then-unlink after a failing replace can paper over partial writes
|
|
14
22
|
* and let concurrent writers silently corrupt state. The caller decides
|
|
15
23
|
* whether to retry, surface, or back off.
|
|
16
24
|
*/
|
|
25
|
+
export interface WriteJsonAtomicOptions {
|
|
26
|
+
/**
|
|
27
|
+
* Called with the staged temp file's path after it has been fully
|
|
28
|
+
* written and immediately before it is renamed onto the target. Throw
|
|
29
|
+
* (or reject) to abort the write: the temp file is removed, the target
|
|
30
|
+
* keeps its previous contents, and the error is rethrown to the caller.
|
|
31
|
+
*/
|
|
32
|
+
beforeRename?: (tempPath: string) => Promise<void> | void;
|
|
33
|
+
}
|
|
17
34
|
/**
|
|
18
35
|
* Atomically serialize `value` as pretty-printed JSON and rename it onto
|
|
19
36
|
* `path`. Throws if any step fails; the staged temp file is removed before
|
|
20
37
|
* rethrow so no `${path}.<uuid>.tmp` is left behind.
|
|
21
38
|
*/
|
|
22
|
-
export declare function writeJsonAtomic(path: string, value: unknown): Promise<void>;
|
|
39
|
+
export declare function writeJsonAtomic(path: string, value: unknown, options?: WriteJsonAtomicOptions): Promise<void>;
|
|
23
40
|
//# sourceMappingURL=atomic-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../src/atomic-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"atomic-write.d.ts","sourceRoot":"","sources":["../src/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAC1D;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAyBf"}
|
package/dist/atomic-write.js
CHANGED
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
* bits and relies on the current user's inherited ACL — we do not attempt
|
|
10
10
|
* to harden ACLs from Node.
|
|
11
11
|
*
|
|
12
|
+
* Callers holding a lease (for example a fenced file lock) can pass an
|
|
13
|
+
* optional `beforeRename` guard. It runs once the temp file is fully
|
|
14
|
+
* written, immediately before the rename; if it throws, the temp file is
|
|
15
|
+
* removed and the target is left untouched. This narrows the window in
|
|
16
|
+
* which a writer that lost its lease can still replace the file, but it is
|
|
17
|
+
* not a compare-and-swap: the lease can still change hands between the
|
|
18
|
+
* guard resolving and the rename landing.
|
|
19
|
+
*
|
|
12
20
|
* Failures are deliberately NOT masked by a copy fallback: a blind
|
|
13
21
|
* copy-then-unlink after a failing replace can paper over partial writes
|
|
14
22
|
* and let concurrent writers silently corrupt state. The caller decides
|
|
@@ -22,7 +30,7 @@ import { dirname } from 'node:path';
|
|
|
22
30
|
* `path`. Throws if any step fails; the staged temp file is removed before
|
|
23
31
|
* rethrow so no `${path}.<uuid>.tmp` is left behind.
|
|
24
32
|
*/
|
|
25
|
-
export async function writeJsonAtomic(path, value) {
|
|
33
|
+
export async function writeJsonAtomic(path, value, options) {
|
|
26
34
|
const serialized = `${JSON.stringify(value, null, 2)}\n`;
|
|
27
35
|
const tempPath = `${path}.${randomUUID()}.tmp`;
|
|
28
36
|
await mkdir(dirname(path), { recursive: true });
|
|
@@ -32,14 +40,18 @@ export async function writeJsonAtomic(path, value) {
|
|
|
32
40
|
encoding: 'utf8',
|
|
33
41
|
mode: 0o600,
|
|
34
42
|
});
|
|
43
|
+
const beforeRename = options?.beforeRename;
|
|
44
|
+
if (beforeRename)
|
|
45
|
+
await beforeRename(tempPath);
|
|
35
46
|
await rename(tempPath, path);
|
|
36
47
|
renamed = true;
|
|
37
48
|
}
|
|
38
49
|
finally {
|
|
39
50
|
if (!renamed) {
|
|
40
51
|
// Cleanup the staged temp whether `writeFile` threw after a partial
|
|
41
|
-
// write or `rename` failed.
|
|
42
|
-
// when the file never landed on
|
|
52
|
+
// write, the `beforeRename` guard refused, or `rename` failed.
|
|
53
|
+
// `force: true` makes the call a no-op when the file never landed on
|
|
54
|
+
// disk.
|
|
43
55
|
await rm(tempPath, { force: true }).catch(() => { });
|
|
44
56
|
}
|
|
45
57
|
}
|
package/dist/atomic-write.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../src/atomic-write.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../src/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,KAAc,EACd,OAAgC;IAEhC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;IACxD,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAA;IAE9C,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE/C,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE;YACpC,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAA;QACF,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAA;QAC1C,IAAI,YAAY;YAAE,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC9C,MAAM,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC5B,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,oEAAoE;YACpE,+DAA+D;YAC/D,qEAAqE;YACrE,QAAQ;YACR,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ex Machina
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|