@cortexkit/antigravity-auth-core 3.0.7 → 3.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/common-auth-embedded/claustrum/availability.d.ts +89 -0
  2. package/dist/common-auth-embedded/claustrum/availability.js +106 -0
  3. package/dist/common-auth-embedded/claustrum/consumer.d.ts +31 -1
  4. package/dist/common-auth-embedded/claustrum/consumer.js +114 -5
  5. package/dist/common-auth-embedded/claustrum/custody.d.ts +106 -14
  6. package/dist/common-auth-embedded/claustrum/custody.js +294 -16
  7. package/dist/common-auth-embedded/claustrum/errors.d.ts +1 -0
  8. package/dist/common-auth-embedded/claustrum/index.d.ts +5 -3
  9. package/dist/common-auth-embedded/claustrum/index.js +4 -1
  10. package/dist/common-auth-embedded/claustrum/insula.d.ts +48 -0
  11. package/dist/common-auth-embedded/claustrum/insula.js +286 -21
  12. package/dist/common-auth-embedded/claustrum/watch.d.ts +141 -0
  13. package/dist/common-auth-embedded/claustrum/watch.js +254 -0
  14. package/dist/common-auth-embedded/fs/private-files.js +10 -2
  15. package/dist/common-auth-embedded/quota/format.d.ts +3 -0
  16. package/dist/common-auth-embedded/quota/format.js +69 -1
  17. package/dist/common-auth-embedded/quota/index.d.ts +1 -1
  18. package/dist/common-auth-embedded/quota/projection.d.ts +16 -0
  19. package/dist/common-auth-embedded/source-output.json +81 -49
  20. package/dist/quota-presentation.d.ts.map +1 -1
  21. package/dist/quota-presentation.js +9 -1
  22. package/dist/quota-presentation.js.map +1 -1
  23. package/dist/vault-account-source.d.ts +6 -1
  24. package/dist/vault-account-source.d.ts.map +1 -1
  25. package/dist/vault-account-source.js +7 -1
  26. package/dist/vault-account-source.js.map +1 -1
  27. package/dist/vault-folder-refusal.js +3 -3
  28. package/package.json +3 -3
@@ -0,0 +1,254 @@
1
+ /**
2
+ * While a vault watch is healthy, the roster is still read this often: the
3
+ * watch carries no history, so a lost notice or a silently dead stream is
4
+ * caught within this period.
5
+ */
6
+ export const SAFETY_POLL_MS = 5 * 60_000;
7
+ /**
8
+ * After a watch fails without being accepted, the host polls and tries one
9
+ * new watch this much later, so a refusing or draining module is never asked
10
+ * in a tight loop.
11
+ */
12
+ export const WATCH_RETRY_MS = 5 * 60_000;
13
+ /**
14
+ * First wait before re-subscribing a watch that closed after it had been
15
+ * accepted. It doubles for each further close in a row, up to WATCH_RETRY_MS.
16
+ */
17
+ export const RESUBSCRIBE_BACKOFF_MS = 1_000;
18
+ /**
19
+ * Tells whether a notice follows the previous one with nothing lost between
20
+ * them. `seq` restarts at 1 for every watch and `epoch` names the sending
21
+ * module's process lifetime. A sequence gap (notices are sheddable), a
22
+ * different epoch (the module restarted) or a notice of an unknown kind all
23
+ * mean changes may have been missed, so the caller must re-read everything.
24
+ */
25
+ export class ChangeNoticeReader {
26
+ #epoch;
27
+ #seq = 0;
28
+ /**
29
+ * Begin a new watch, whose first notice is seq 1 again. The epoch is kept,
30
+ * so a module restart between two watches still reads as a break.
31
+ */
32
+ restart() {
33
+ this.#seq = 0;
34
+ }
35
+ continuous(notice) {
36
+ const continuous = notice.kind === 'changed' &&
37
+ notice.seq === this.#seq + 1 &&
38
+ (this.#epoch === undefined || notice.epoch === this.#epoch);
39
+ this.#epoch = notice.epoch;
40
+ this.#seq = notice.seq;
41
+ return continuous;
42
+ }
43
+ }
44
+ /**
45
+ * Runs `read` with at most one call in flight and at most one more queued
46
+ * behind it, however many requests arrive meanwhile. A request made while a
47
+ * read is running may have arrived after that read took its snapshot, so it
48
+ * earns exactly one more read; any further requests share that one.
49
+ */
50
+ export class CoalescedRead {
51
+ #read;
52
+ #onError;
53
+ #running;
54
+ #queued = false;
55
+ constructor(read, onError) {
56
+ this.#read = read;
57
+ this.#onError = onError;
58
+ }
59
+ /** The read in flight (including its queued follow-up), if any. */
60
+ get running() {
61
+ return this.#running;
62
+ }
63
+ request() {
64
+ if (this.#running) {
65
+ this.#queued = true;
66
+ return this.#running;
67
+ }
68
+ this.#running = (async () => {
69
+ do {
70
+ this.#queued = false;
71
+ try {
72
+ await this.#read();
73
+ }
74
+ catch (error) {
75
+ this.#onError(error);
76
+ }
77
+ } while (this.#queued);
78
+ })().finally(() => {
79
+ this.#running = undefined;
80
+ });
81
+ return this.#running;
82
+ }
83
+ }
84
+ /**
85
+ * Keeps one vault `watchScoped` open for a host and runs the host's discovery
86
+ * when a notice shows the visible account list changed. Discovery runs only
87
+ * when the notice's view differs from the last discovered roster's view, when
88
+ * a notice shows a gap or a new epoch, or on the first notice of a watch that
89
+ * was re-subscribed after a close (the time between two watches was not
90
+ * observed). It never opens a second watch while one is open.
91
+ */
92
+ export class ScopedRosterWatch {
93
+ #options;
94
+ #reader = new ChangeNoticeReader();
95
+ #reads;
96
+ #mode = 'polling';
97
+ #watch;
98
+ #timer;
99
+ #stopped = false;
100
+ #latestView;
101
+ #force = false;
102
+ /**
103
+ * How many accepted watches in a row have closed; each one doubles the wait
104
+ * before the next re-subscribe. Reset once a watch stays up five minutes.
105
+ */
106
+ #closes = 0;
107
+ constructor(options) {
108
+ this.#options = options;
109
+ this.#reads = new CoalescedRead(async () => {
110
+ const force = this.#force;
111
+ this.#force = false;
112
+ // A read is only ever requested by a notice, which set #latestView.
113
+ if (force || this.#latestView !== this.#options.view())
114
+ await this.#options.discover(this.#latestView ?? '');
115
+ }, (error) => {
116
+ if (!this.#stopped)
117
+ this.#options.onError?.(error);
118
+ });
119
+ }
120
+ get mode() {
121
+ return this.#mode;
122
+ }
123
+ start() {
124
+ if (this.#stopped || this.#watch || this.#timer)
125
+ return;
126
+ if (typeof this.#options.client.watchScoped !== 'function') {
127
+ // A claustrum-client older than 0.12.0: poll exactly as before.
128
+ this.#setMode('fallback', 'client-without-watch');
129
+ return;
130
+ }
131
+ void this.#open(false);
132
+ }
133
+ stop() {
134
+ if (this.#stopped)
135
+ return;
136
+ this.#stopped = true;
137
+ if (this.#timer)
138
+ (this.#options.clearTimeoutImpl ?? clearTimeout)(this.#timer);
139
+ this.#timer = undefined;
140
+ const watch = this.#watch;
141
+ this.#watch = undefined;
142
+ watch?.handle.stop();
143
+ }
144
+ #setMode(mode, reason) {
145
+ if (this.#mode === mode)
146
+ return;
147
+ this.#mode = mode;
148
+ this.#options.logger?.debug('claustrum vault watch', { mode, reason });
149
+ this.#options.onMode?.(mode);
150
+ }
151
+ #later(delay, run) {
152
+ this.#timer = (this.#options.setTimeoutImpl ?? setTimeout)(() => {
153
+ this.#timer = undefined;
154
+ if (!this.#stopped)
155
+ run();
156
+ }, delay);
157
+ this.#timer.unref?.();
158
+ }
159
+ async #open(resubscribed) {
160
+ let token;
161
+ try {
162
+ token = await this.#options.enrollmentToken();
163
+ }
164
+ catch (error) {
165
+ if (this.#stopped)
166
+ return;
167
+ this.#options.onError?.(error);
168
+ this.#fallback('token-unreadable');
169
+ return;
170
+ }
171
+ const watchScoped = this.#options.client.watchScoped;
172
+ if (this.#stopped || this.#watch || !watchScoped)
173
+ return;
174
+ this.#reader.restart();
175
+ // A re-subscribed watch reads on its first notice: changes made while no
176
+ // watch was open were never announced.
177
+ this.#force = resubscribed;
178
+ let watch;
179
+ let handle;
180
+ try {
181
+ handle = watchScoped.call(this.#options.client, (notice) => {
182
+ if (this.#stopped || !watch || this.#watch !== watch)
183
+ return;
184
+ watch.notices++;
185
+ if (watch.notices === 1) {
186
+ this.#options.onReachable?.();
187
+ watch.acceptedAt = (this.#options.now ?? Date.now)();
188
+ this.#setMode('watching', 'accepted');
189
+ }
190
+ if (!this.#reader.continuous(notice))
191
+ this.#force = true;
192
+ this.#latestView = notice.view;
193
+ // The read itself decides whether to list, against the roster as
194
+ // it stands when the read runs.
195
+ void this.#reads.request();
196
+ }, { enrollmentToken: token });
197
+ }
198
+ catch (error) {
199
+ this.#options.onError?.(error);
200
+ this.#fallback('watch-failed');
201
+ return;
202
+ }
203
+ watch = { handle, notices: 0 };
204
+ this.#watch = watch;
205
+ this.#setMode('polling', resubscribed ? 'resubscribing' : 'opening');
206
+ const opened = watch;
207
+ handle.closed.then((end) => this.#closed(opened, end), (error) => this.#closed(opened, { kind: 'transport_lost', error }));
208
+ }
209
+ #closed(watch, end) {
210
+ if (this.#stopped || this.#watch !== watch)
211
+ return;
212
+ this.#watch = undefined;
213
+ if (end.kind === 'stopped')
214
+ return;
215
+ if (end.kind === 'transport_lost')
216
+ this.#options.onTransportLost?.();
217
+ if (end.kind === 'unsupported') {
218
+ // An older vault answers unknown_method: poll exactly as before.
219
+ this.#setMode('fallback', 'vault-without-watch');
220
+ return;
221
+ }
222
+ if (end.kind === 'refused') {
223
+ this.#fallback('refused');
224
+ try {
225
+ this.#options.onRefused(end.error);
226
+ }
227
+ catch (error) {
228
+ this.#options.onError?.(error);
229
+ }
230
+ return;
231
+ }
232
+ if (watch.notices > 0) {
233
+ // An accepted watch that closed (the vault restarted, or a revocation
234
+ // ended it) gets one new watch. A revocation then shows up as that
235
+ // watch's refusal.
236
+ const now = (this.#options.now ?? Date.now)();
237
+ if (watch.acceptedAt !== undefined &&
238
+ now - watch.acceptedAt >= SAFETY_POLL_MS)
239
+ this.#closes = 0;
240
+ const delay = Math.min(RESUBSCRIBE_BACKOFF_MS * 2 ** Math.min(this.#closes, 16), WATCH_RETRY_MS);
241
+ this.#closes++;
242
+ this.#setMode('polling', 'resubscribing');
243
+ this.#later(delay, () => void this.#open(true));
244
+ return;
245
+ }
246
+ // Zero notices: the watch was never accepted (the vault is draining, or
247
+ // the connection failed). The client already made one read to learn why.
248
+ this.#fallback(end.kind);
249
+ }
250
+ #fallback(reason) {
251
+ this.#setMode('fallback', reason);
252
+ this.#later(WATCH_RETRY_MS, () => void this.#open(false));
253
+ }
254
+ }
@@ -184,19 +184,25 @@ export async function replaceWindowsFile(from, to, options = {}) {
184
184
  to = resolve(to);
185
185
  const now = options.now ?? (() => performance.now());
186
186
  const start = now();
187
- const deadline = Math.min(start + 500, options.deadline ?? Infinity);
187
+ const leaseDeadline = options.deadline ?? Infinity;
188
+ let retryDeadline;
188
189
  const delays = [0, 10, 20, 40, 80, 100];
189
190
  let original;
190
191
  let attempts = 0;
191
192
  for (const delay of delays) {
193
+ const deadline = Math.min(retryDeadline ?? Infinity, leaseDeadline);
192
194
  if (now() >= deadline)
193
195
  break;
194
196
  if (delay)
195
197
  await (options.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms))))(Math.min(delay, Math.max(0, deadline - now())));
196
198
  if (now() >= deadline)
197
199
  break;
200
+ const fenceStart = now();
198
201
  await options.beforeRename?.();
199
- if (now() >= deadline)
202
+ // Ownership checks fence every attempt but do not spend the sharing-retry budget.
203
+ if (retryDeadline !== undefined)
204
+ retryDeadline += now() - fenceStart;
205
+ if (now() >= leaseDeadline)
200
206
  break;
201
207
  attempts++;
202
208
  try {
@@ -212,6 +218,8 @@ export async function replaceWindowsFile(from, to, options = {}) {
212
218
  !detail.reason;
213
219
  if (!candidate)
214
220
  break;
221
+ // Start the retry window only once a rename has actually failed.
222
+ retryDeadline ??= now() + 500;
215
223
  }
216
224
  }
217
225
  const error = new PrivateFileError(to, 'rename', original ??
@@ -14,6 +14,9 @@ export declare const NO_LIMITS_REPORTED = "no limits reported";
14
14
  * `narrow` fits one line per account in a narrow sidebar: `5h 92% · 7d 66%
15
15
  * · Fa 98% left`, the account-wide windows plus at most one model-scoped
16
16
  * window or the budget (as `cr`), and no stale marker (see `isQuotaStale`).
17
+ * A reading whose windows belong to named groups and that has no
18
+ * account-wide window reads up to two groups instead:
19
+ * `Ge 7d 62% · Ot 7d 48% left`.
17
20
  */
18
21
  export type QuotaTextForm = 'compact' | 'full' | 'narrow';
19
22
  export interface QuotaTextOptions {
@@ -122,6 +122,9 @@ function scopedWindowParts(quota, options) {
122
122
  const remainingPercent = clampPercent(limit.remainingPercent ?? 0);
123
123
  return {
124
124
  scope: limit.scope,
125
+ ...(limit.windowMinutes === undefined
126
+ ? {}
127
+ : { windowMinutes: limit.windowMinutes }),
125
128
  part: {
126
129
  kind: 'window',
127
130
  name: quotaWindowName(limit),
@@ -212,6 +215,66 @@ function scopeAbbreviations(scopes) {
212
215
  }
213
216
  return new Map(scopes.map((scope) => [scope, short(scopeDisplayName(scope))]));
214
217
  }
218
+ /** The most groups a grouped narrow line shows. */
219
+ const NARROW_GROUP_LIMIT = 2;
220
+ /**
221
+ * The names the groups read under in the narrow line, one per listed group:
222
+ * each label's short name, derived exactly as a model window's is (`Gemini`
223
+ * → `Ge`, `Other models` → `Ot`, colliding names extended until they
224
+ * differ), computed over every listed group so a group keeps its name
225
+ * whichever groups show. A blank label falls back to the group's scope.
226
+ */
227
+ function groupShortNames(groups) {
228
+ const labels = groups.map((group) => group.label.trim() || group.scope);
229
+ const short = scopeAbbreviations(labels);
230
+ return labels.map((label) => short.get(label) ?? label);
231
+ }
232
+ /**
233
+ * The narrow line of a reading whose windows belong to named groups and that
234
+ * has no account-wide window: for each group, its tightest window as
235
+ * `Ge 7d 62%`, with ` left` once at the end. The tightest window is the
236
+ * one with least left, compared before rounding; on a tie the first in
237
+ * display order (the shorter window) wins. At most two groups show: the two
238
+ * with least left, earlier-listed first on a tie, and always in the order
239
+ * the reading lists them, so the line does not reorder as the figures move.
240
+ * A group with no reported window is skipped. Windows outside the listed
241
+ * groups and the credit budget are left out. Undefined when the rule does
242
+ * not apply, so the caller uses the ordinary narrow rule.
243
+ */
244
+ function groupedNarrowPieces(groups, windows) {
245
+ if (!groups || groups.length === 0)
246
+ return undefined;
247
+ const reported = windows.filter(({ part }) => part.kind === 'window');
248
+ if (reported.some(({ scope }) => scope === ALL_SCOPE))
249
+ return undefined;
250
+ const candidates = groups.flatMap((group, listed) => {
251
+ const inGroup = reported.filter(({ scope }) => scope === group.scope);
252
+ // `windows` is already in display order, and strictly lower wins, so on
253
+ // a tie the shorter window keeps the place.
254
+ const groupTightest = inGroup.reduce((least, window) => least === undefined ||
255
+ (window.part.remainingPercent ?? 0) < (least.part.remainingPercent ?? 0)
256
+ ? window
257
+ : least, undefined);
258
+ return groupTightest ? [{ group, listed, window: groupTightest }] : [];
259
+ });
260
+ if (candidates.length === 0)
261
+ return undefined;
262
+ const names = groupShortNames(groups);
263
+ const left = (candidate) => candidate.window.part.remainingPercent ?? 0;
264
+ const shown = [...candidates]
265
+ .sort((a, b) => left(a) - left(b) || a.listed - b.listed)
266
+ .slice(0, NARROW_GROUP_LIMIT)
267
+ .sort((a, b) => a.listed - b.listed);
268
+ return shown.map((candidate, index) => {
269
+ const { windowMinutes } = candidate.window;
270
+ const piece = [
271
+ names[candidate.listed] ?? candidate.group.scope,
272
+ ...(windowMinutes === undefined ? [] : [lengthName(windowMinutes)]),
273
+ `${wholePercent(left(candidate))}%`,
274
+ ].join(' ');
275
+ return index === shown.length - 1 ? `${piece} left` : piece;
276
+ });
277
+ }
215
278
  /**
216
279
  * The narrow form's pieces: every account-wide window as `5h 92%`, then at
217
280
  * most one more item, with ` left` added once to the last piece. That item is
@@ -224,10 +287,15 @@ function scopeAbbreviations(scopes) {
224
287
  * be chosen; when nothing at all is shown it keeps its compact wording
225
288
  * (`credits available`). No age is added; `isQuotaStale` says whether the
226
289
  * reading is stale. A window whose reset arrived after the reading keeps its
227
- * figure, as in the other forms.
290
+ * figure, as in the other forms. A reading that lists named groups and has no
291
+ * account-wide window reads one item per group instead (see
292
+ * `groupedNarrowPieces`).
228
293
  */
229
294
  function narrowTextParts(quota, options) {
230
295
  const { windows } = scopedWindowParts(quota, options);
296
+ const grouped = groupedNarrowPieces(quota?.groups, windows);
297
+ if (grouped)
298
+ return grouped;
231
299
  const general = windows.filter(({ part, scope }) => part.kind === 'window' && scope === ALL_SCOPE);
232
300
  const scoped = windows.filter(({ part, scope }) => part.kind === 'window' && scope !== ALL_SCOPE);
233
301
  const abbreviations = scopeAbbreviations(scoped.map(({ scope }) => scope));
@@ -6,5 +6,5 @@ export type { CreditBudgetCleared, CreditBudgetEntry, CreditBudgetReading, Quota
6
6
  export { ALL_SCOPE, DEFAULT_REQUIRED_LABELS, decodeQuotaMap, emptyQuotaMap, isQuotaMap, } from './map.js';
7
7
  export type { ObservedBudget, ObservedPair, ObservedReading, QuotaObservation, } from './merge.js';
8
8
  export { isQuotaObservation, mergeQuotaObservation, QuotaCodecError, } from './merge.js';
9
- export type { ExhaustionReset, ProjectedBudget, ProjectedLimit, ProjectedQuota, } from './projection.js';
9
+ export type { ExhaustionReset, ProjectedBudget, ProjectedLimit, ProjectedQuota, QuotaGroup, } from './projection.js';
10
10
  export { budgetExhaustedResetAt, futureResetAt, projectQuota, readsExhausted, } from './projection.js';
@@ -19,6 +19,15 @@ export interface ProjectedBudget {
19
19
  remainingPercent?: number;
20
20
  resetsAt?: string;
21
21
  }
22
+ /**
23
+ * A named group of windows, such as antigravity-auth's `Gemini` and
24
+ * `Other models`: every window stored under `scope` belongs to it, and
25
+ * `label` is the group's display name.
26
+ */
27
+ export interface QuotaGroup {
28
+ scope: string;
29
+ label: string;
30
+ }
22
31
  export interface ProjectedQuota {
23
32
  scope: string;
24
33
  /** One entry per label: longest known window first, unknown lengths last. */
@@ -31,6 +40,13 @@ export interface ProjectedQuota {
31
40
  /** Present only when the stored budget is a reading, not cleared. */
32
41
  budget?: ProjectedBudget;
33
42
  counters?: Record<string, QuotaCounter>;
43
+ /**
44
+ * The named groups the windows belong to, in the order the plugin lists
45
+ * them. Set only by a plugin whose windows all belong to such groups; the
46
+ * narrow form then shows one item per group (see `formatQuota`).
47
+ * `projectQuota` never sets it.
48
+ */
49
+ groups?: readonly QuotaGroup[];
34
50
  }
35
51
  /**
36
52
  * Resolves `map` for a request in `scope` (`all` or a model family). A family
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": 1,
3
3
  "package": "@cortexkit/common-auth",
4
- "version": "0.19.0",
4
+ "version": "0.21.1",
5
5
  "artifactStatus": "published",
6
6
  "publicRoots": {
7
7
  "./store": {
@@ -37,15 +37,15 @@
37
37
  "import": "./dist/pi-slot/index.js"
38
38
  }
39
39
  },
40
- "input": "tools/common-auth-build/inputs/cortexkit-common-auth-0.19.0.tgz",
41
- "tarballSha256": "dd32b53e849a7d98ed861a5f9d3d81645b31169350257ef1732f7827b8684885",
42
- "sri": "sha512-p7oy26dBllFF6mkQinsyyqqFP8FKoyVvHyt/aQWEGTljn0AbVRj++Co5Mict4ffQUPrujlQwThilUoPn/AsB8Q==",
43
- "canonicalFiles": 133,
44
- "canonicalBytes": 766798,
40
+ "input": "tools/common-auth-build/inputs/cortexkit-common-auth-0.21.1.tgz",
41
+ "tarballSha256": "4ff9c514bfa7d539483ce9c25e054267c4dc368a0ce8c7f60c74ddac36613a65",
42
+ "sri": "sha512-DORasuyhF7FOTiw0kiL1DlIw9aPvMmBsdoxzkXJEIrKvNzUuv2lcOvHkflpot9KcoqPLCRJxyZLtMO+LVN61gw==",
43
+ "canonicalFiles": 137,
44
+ "canonicalBytes": 829952,
45
45
  "generator": {
46
46
  "path": "packages/opencode/scripts/embed-common-auth.ts",
47
47
  "version": 3,
48
- "sha256": "c701471b1c52e731528039f0ed121c9cfa4328f533fe9023c0a49eecca17ba2b"
48
+ "sha256": "18d41d6b7a3db681b7873981c03d88bb19691116f96e0a37a11fabc1f63e5977"
49
49
  },
50
50
  "files": [
51
51
  {
@@ -208,36 +208,52 @@
208
208
  "outputSha256": "134d4950e10d5cd67fd28dba7af51f67e801e719d40b2824bf48e8dde55a1b7b",
209
209
  "transform": "verbatim"
210
210
  },
211
+ {
212
+ "source": "package/dist/claustrum/availability.d.ts",
213
+ "output": "claustrum/availability.d.ts",
214
+ "bytes": 3375,
215
+ "sourceSha256": "eba8ff78abed434be6194715d214a53322f4414a28e6a7389fe14f8a52b772ac",
216
+ "outputSha256": "eba8ff78abed434be6194715d214a53322f4414a28e6a7389fe14f8a52b772ac",
217
+ "transform": "verbatim"
218
+ },
219
+ {
220
+ "source": "package/dist/claustrum/availability.js",
221
+ "output": "claustrum/availability.js",
222
+ "bytes": 4107,
223
+ "sourceSha256": "4bfb03de131ed7d036631a6d6455cc6f465ab7a9ea61575a7378d2f447c7cf67",
224
+ "outputSha256": "4bfb03de131ed7d036631a6d6455cc6f465ab7a9ea61575a7378d2f447c7cf67",
225
+ "transform": "verbatim"
226
+ },
211
227
  {
212
228
  "source": "package/dist/claustrum/consumer.d.ts",
213
229
  "output": "claustrum/consumer.d.ts",
214
- "bytes": 7516,
215
- "sourceSha256": "5bd8eae33d4d0098376fe5b6d6d0171eb6041ba1d0ae9ef5da40e569a36897bd",
216
- "outputSha256": "5bd8eae33d4d0098376fe5b6d6d0171eb6041ba1d0ae9ef5da40e569a36897bd",
230
+ "bytes": 9037,
231
+ "sourceSha256": "5d508c6b0e62ada6e60f09f52052fd6ee26fe6dacd626ef4e5e1430bd8535fdb",
232
+ "outputSha256": "5d508c6b0e62ada6e60f09f52052fd6ee26fe6dacd626ef4e5e1430bd8535fdb",
217
233
  "transform": "verbatim"
218
234
  },
219
235
  {
220
236
  "source": "package/dist/claustrum/consumer.js",
221
237
  "output": "claustrum/consumer.js",
222
- "bytes": 18272,
223
- "sourceSha256": "82726ae5b1f14f5bb3a19d1e9a9d312dd8f8339f837f1efbecd65e8195f3c01c",
224
- "outputSha256": "82726ae5b1f14f5bb3a19d1e9a9d312dd8f8339f837f1efbecd65e8195f3c01c",
238
+ "bytes": 23139,
239
+ "sourceSha256": "7b97c80964eaffa9f4c4fc3334885ce4c2da80ed330288311d08b0c8c7edca31",
240
+ "outputSha256": "7b97c80964eaffa9f4c4fc3334885ce4c2da80ed330288311d08b0c8c7edca31",
225
241
  "transform": "verbatim"
226
242
  },
227
243
  {
228
244
  "source": "package/dist/claustrum/custody.d.ts",
229
245
  "output": "claustrum/custody.d.ts",
230
- "bytes": 10126,
231
- "sourceSha256": "053619f193ea68739125624cf1bcb078c78cb38e506c7009894d92c672f88b88",
232
- "outputSha256": "053619f193ea68739125624cf1bcb078c78cb38e506c7009894d92c672f88b88",
246
+ "bytes": 14842,
247
+ "sourceSha256": "f776af511c7a02f8e5c4cb0361845d1e740eec96244fee5cfa1289d2212dffd9",
248
+ "outputSha256": "f776af511c7a02f8e5c4cb0361845d1e740eec96244fee5cfa1289d2212dffd9",
233
249
  "transform": "verbatim"
234
250
  },
235
251
  {
236
252
  "source": "package/dist/claustrum/custody.js",
237
253
  "output": "claustrum/custody.js",
238
- "bytes": 15835,
239
- "sourceSha256": "ba5c42a9ad00f66b4e33ae8e810d1b0e8a57c433179dec7c939706c682e49a8f",
240
- "outputSha256": "ba5c42a9ad00f66b4e33ae8e810d1b0e8a57c433179dec7c939706c682e49a8f",
254
+ "bytes": 27016,
255
+ "sourceSha256": "5d2ead857d6e6384980dace94d308f1f47afe831c82e2b644ab434ffb0bcf151",
256
+ "outputSha256": "5d2ead857d6e6384980dace94d308f1f47afe831c82e2b644ab434ffb0bcf151",
241
257
  "transform": "verbatim"
242
258
  },
243
259
  {
@@ -259,9 +275,9 @@
259
275
  {
260
276
  "source": "package/dist/claustrum/errors.d.ts",
261
277
  "output": "claustrum/errors.d.ts",
262
- "bytes": 1095,
263
- "sourceSha256": "ba3dbd69b13c521944bd700b063afaaced9a1312bbfbfcebb8ae8b4f3785c52a",
264
- "outputSha256": "ba3dbd69b13c521944bd700b063afaaced9a1312bbfbfcebb8ae8b4f3785c52a",
278
+ "bytes": 1145,
279
+ "sourceSha256": "b7533d4c281807224d6d05f4bb7a596006862a6c05dc4462fae02af388054bce",
280
+ "outputSha256": "b7533d4c281807224d6d05f4bb7a596006862a6c05dc4462fae02af388054bce",
265
281
  "transform": "verbatim"
266
282
  },
267
283
  {
@@ -291,33 +307,33 @@
291
307
  {
292
308
  "source": "package/dist/claustrum/index.d.ts",
293
309
  "output": "claustrum/index.d.ts",
294
- "bytes": 2939,
295
- "sourceSha256": "cd2f374dec9e06a7962d2c262c08c965213610107ff1f4f972c2c76c35fe8254",
296
- "outputSha256": "cd2f374dec9e06a7962d2c262c08c965213610107ff1f4f972c2c76c35fe8254",
310
+ "bytes": 3613,
311
+ "sourceSha256": "b8f9cb374e5d5545d50a1521d85e4337d28b17d4b0dabdb3548186675b1c2965",
312
+ "outputSha256": "b8f9cb374e5d5545d50a1521d85e4337d28b17d4b0dabdb3548186675b1c2965",
297
313
  "transform": "verbatim"
298
314
  },
299
315
  {
300
316
  "source": "package/dist/claustrum/index.js",
301
317
  "output": "claustrum/index.js",
302
- "bytes": 2141,
303
- "sourceSha256": "33dc58809d432ea7bbe3f3d4425fe575589a018854444b63e0874f917981ab19",
304
- "outputSha256": "33dc58809d432ea7bbe3f3d4425fe575589a018854444b63e0874f917981ab19",
318
+ "bytes": 2456,
319
+ "sourceSha256": "1e2ae0ee6f2754189e846298a1c6ce2dd4a5eb8cb7f9293f6c24f9725b8537be",
320
+ "outputSha256": "1e2ae0ee6f2754189e846298a1c6ce2dd4a5eb8cb7f9293f6c24f9725b8537be",
305
321
  "transform": "verbatim"
306
322
  },
307
323
  {
308
324
  "source": "package/dist/claustrum/insula.d.ts",
309
325
  "output": "claustrum/insula.d.ts",
310
- "bytes": 2489,
311
- "sourceSha256": "21a92525f04810a15a877e1c1ff9d7cf2fc2eb4ffe8a6aa408db22da6337d30f",
312
- "outputSha256": "21a92525f04810a15a877e1c1ff9d7cf2fc2eb4ffe8a6aa408db22da6337d30f",
326
+ "bytes": 4643,
327
+ "sourceSha256": "be11868f8d766b8c3dc105b3891743bbec1388005be8d2688d617c95b0194e2a",
328
+ "outputSha256": "be11868f8d766b8c3dc105b3891743bbec1388005be8d2688d617c95b0194e2a",
313
329
  "transform": "verbatim"
314
330
  },
315
331
  {
316
332
  "source": "package/dist/claustrum/insula.js",
317
333
  "output": "claustrum/insula.js",
318
- "bytes": 6097,
319
- "sourceSha256": "1db6a99b9db96635bbf846e58ab54eaaa1892bf8939801a181741022d47ce428",
320
- "outputSha256": "1db6a99b9db96635bbf846e58ab54eaaa1892bf8939801a181741022d47ce428",
334
+ "bytes": 16715,
335
+ "sourceSha256": "98ac4011e091b142618b83e3258eda3ccfb40ec75ee0c5a2cbeff89aa1f88003",
336
+ "outputSha256": "98ac4011e091b142618b83e3258eda3ccfb40ec75ee0c5a2cbeff89aa1f88003",
321
337
  "transform": "verbatim"
322
338
  },
323
339
  {
@@ -352,6 +368,22 @@
352
368
  "outputSha256": "e6ac8f59dab51db4756ccbaa89fc73acd213a7a4795fdf5a7c7e4f653455fe94",
353
369
  "transform": "verbatim"
354
370
  },
371
+ {
372
+ "source": "package/dist/claustrum/watch.d.ts",
373
+ "output": "claustrum/watch.d.ts",
374
+ "bytes": 5760,
375
+ "sourceSha256": "54f088f0e6c863d75295721700a423e682bfd4a6735e02a03556b2faa379d991",
376
+ "outputSha256": "54f088f0e6c863d75295721700a423e682bfd4a6735e02a03556b2faa379d991",
377
+ "transform": "verbatim"
378
+ },
379
+ {
380
+ "source": "package/dist/claustrum/watch.js",
381
+ "output": "claustrum/watch.js",
382
+ "bytes": 9226,
383
+ "sourceSha256": "6fdd6ed31d349da6cd016ebbd5f283ce595e9fab376a44cc6587cc9a13d8f589",
384
+ "outputSha256": "6fdd6ed31d349da6cd016ebbd5f283ce595e9fab376a44cc6587cc9a13d8f589",
385
+ "transform": "verbatim"
386
+ },
355
387
  {
356
388
  "source": "package/dist/commands/builtins.d.ts",
357
389
  "output": "commands/builtins.d.ts",
@@ -507,9 +539,9 @@
507
539
  {
508
540
  "source": "package/dist/fs/private-files.js",
509
541
  "output": "fs/private-files.js",
510
- "bytes": 12025,
511
- "sourceSha256": "4b46f7b37c11da02f655a6ca841fa51189ceefffaa4476f4fa7a27f953c54ad4",
512
- "outputSha256": "4b46f7b37c11da02f655a6ca841fa51189ceefffaa4476f4fa7a27f953c54ad4",
542
+ "bytes": 12448,
543
+ "sourceSha256": "1c8f34202b535d774d8c1a53bd403255f02701760c7378e020756c02c55a97c4",
544
+ "outputSha256": "1c8f34202b535d774d8c1a53bd403255f02701760c7378e020756c02c55a97c4",
513
545
  "transform": "verbatim"
514
546
  },
515
547
  {
@@ -667,25 +699,25 @@
667
699
  {
668
700
  "source": "package/dist/quota/format.d.ts",
669
701
  "output": "quota/format.d.ts",
670
- "bytes": 4260,
671
- "sourceSha256": "f76541a2f0e1e04782ee8b61a3d0f6b3ba3c156bc0e57bfcbd427e00baf279b4",
672
- "outputSha256": "f76541a2f0e1e04782ee8b61a3d0f6b3ba3c156bc0e57bfcbd427e00baf279b4",
702
+ "bytes": 4415,
703
+ "sourceSha256": "293073e9f75e7f15790669f4be8340061566e889259593fcfaf17be9fa4f0a01",
704
+ "outputSha256": "293073e9f75e7f15790669f4be8340061566e889259593fcfaf17be9fa4f0a01",
673
705
  "transform": "verbatim"
674
706
  },
675
707
  {
676
708
  "source": "package/dist/quota/format.js",
677
709
  "output": "quota/format.js",
678
- "bytes": 12897,
679
- "sourceSha256": "69e546dbc935300ff3b01294479844177be3e288626e5edf0341e820a20c5580",
680
- "outputSha256": "69e546dbc935300ff3b01294479844177be3e288626e5edf0341e820a20c5580",
710
+ "bytes": 16323,
711
+ "sourceSha256": "d4856ea40dc4269f9a6ffa78bee8564ba648170530e8ff71af4cf38ba5f3baaa",
712
+ "outputSha256": "d4856ea40dc4269f9a6ffa78bee8564ba648170530e8ff71af4cf38ba5f3baaa",
681
713
  "transform": "verbatim"
682
714
  },
683
715
  {
684
716
  "source": "package/dist/quota/index.d.ts",
685
717
  "output": "quota/index.d.ts",
686
- "bytes": 1047,
687
- "sourceSha256": "1ed8a3feaf208860182d738c2ba732fbaa61b6613c1e0e14442418a76d743663",
688
- "outputSha256": "1ed8a3feaf208860182d738c2ba732fbaa61b6613c1e0e14442418a76d743663",
718
+ "bytes": 1059,
719
+ "sourceSha256": "fbb7a865108f98da1f3bb44fba20614a2998ccf5c906b271419b49d37a814214",
720
+ "outputSha256": "fbb7a865108f98da1f3bb44fba20614a2998ccf5c906b271419b49d37a814214",
689
721
  "transform": "verbatim"
690
722
  },
691
723
  {
@@ -731,9 +763,9 @@
731
763
  {
732
764
  "source": "package/dist/quota/projection.d.ts",
733
765
  "output": "quota/projection.d.ts",
734
- "bytes": 2975,
735
- "sourceSha256": "65a1b13db0a4d21f8b4136af65888494c6d8a7e117e80879c96f75fc0b763ad9",
736
- "outputSha256": "65a1b13db0a4d21f8b4136af65888494c6d8a7e117e80879c96f75fc0b763ad9",
766
+ "bytes": 3549,
767
+ "sourceSha256": "2bbf4942bc034f3521c6c35e30446d73de525a099f7ba49c004d160e4dd917ea",
768
+ "outputSha256": "2bbf4942bc034f3521c6c35e30446d73de525a099f7ba49c004d160e4dd917ea",
737
769
  "transform": "verbatim"
738
770
  },
739
771
  {