mnfst 0.5.199-next.1 → 0.5.199-next.2

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.
@@ -2239,6 +2239,7 @@ function initializeTeamsCore() {
2239
2239
  this.error = null;
2240
2240
 
2241
2241
  try {
2242
+ invalidateRolesCache(teamId);
2242
2243
  const result = await this._appwrite.teams.updatePrefs({
2243
2244
  teamId: teamId,
2244
2245
  prefs: prefs
@@ -2950,6 +2951,7 @@ function initializeTeamsRolesDefaults() {
2950
2951
  roles: updatedRoles,
2951
2952
  deletedTemplateRoles: deletedRoles // Update deleted list in team preferences
2952
2953
  };
2954
+ invalidateRolesCache(teamId);
2953
2955
  await this._appwrite.teams.updatePrefs({
2954
2956
  teamId: teamId,
2955
2957
  prefs: updatedPrefs
@@ -3053,6 +3055,7 @@ function initializeTeamsRolesDefaults() {
3053
3055
  ...currentPrefs,
3054
3056
  roles: updatedRoles
3055
3057
  };
3058
+ invalidateRolesCache(teamId);
3056
3059
  await this._appwrite.teams.updatePrefs({
3057
3060
  teamId: teamId,
3058
3061
  prefs: updatedPrefs
@@ -3204,12 +3207,29 @@ function roleHasAllOwnerPermissions(roleName, memberRoles) {
3204
3207
  return OWNER_PERMISSIONS.every(perm => permissions.includes(perm));
3205
3208
  }
3206
3209
 
3207
- // Get user-generated roles from team preferences
3210
+ // User-generated roles live in team prefs; one read per team is shared by every permission check
3211
+ // for a short window and dropped on any auth change or prefs write
3212
+ const ROLES_CACHE_TTL_MS = 15000;
3213
+ const rolesCache = new Map(); // teamId -> { at, promise }
3214
+ function invalidateRolesCache(teamId) { if (teamId === undefined) rolesCache.clear(); else rolesCache.delete(teamId); }
3215
+ if (typeof window !== 'undefined') {
3216
+ ['manifest:auth:login', 'manifest:auth:logout', 'manifest:auth:anonymous', 'manifest:auth:session-cleared', 'manifest:auth:initialized', 'manifest:auth:teams-loaded']
3217
+ .forEach(type => window.addEventListener(type, () => invalidateRolesCache()));
3218
+ }
3219
+
3208
3220
  async function getUserGeneratedRoles(teamId, appwrite) {
3209
3221
  if (!appwrite || !appwrite.teams) {
3210
3222
  return null;
3211
3223
  }
3224
+ const hit = rolesCache.get(teamId);
3225
+ if (hit && Date.now() - hit.at < ROLES_CACHE_TTL_MS) return hit.promise;
3226
+ const promise = readUserGeneratedRoles(teamId, appwrite);
3227
+ rolesCache.set(teamId, { at: Date.now(), promise });
3228
+ promise.catch(() => rolesCache.delete(teamId)); // a null result (no custom roles) is a valid, cached answer
3229
+ return promise;
3230
+ }
3212
3231
 
3232
+ async function readUserGeneratedRoles(teamId, appwrite) {
3213
3233
  try {
3214
3234
  const prefs = await appwrite.teams.getPrefs({ teamId });
3215
3235
  return prefs?.roles || null;
@@ -3661,6 +3681,7 @@ function initializeTeamsUserRoles() {
3661
3681
  ...currentPrefs,
3662
3682
  roles: updatedRoles
3663
3683
  };
3684
+ invalidateRolesCache(teamId);
3664
3685
  await this._appwrite.teams.updatePrefs({
3665
3686
  teamId: teamId,
3666
3687
  prefs: updatedPrefs
@@ -3779,6 +3800,7 @@ function initializeTeamsUserRoles() {
3779
3800
  ...currentPrefs,
3780
3801
  roles: updatedRoles
3781
3802
  };
3803
+ invalidateRolesCache(teamId);
3782
3804
  await this._appwrite.teams.updatePrefs({
3783
3805
  teamId: teamId,
3784
3806
  prefs: updatedPrefs
@@ -3880,6 +3902,7 @@ function initializeTeamsUserRoles() {
3880
3902
  ...currentPrefs,
3881
3903
  roles: updatedRoles
3882
3904
  };
3905
+ invalidateRolesCache(teamId);
3883
3906
  await this._appwrite.teams.updatePrefs({
3884
3907
  teamId: teamId,
3885
3908
  prefs: updatedPrefs
@@ -4045,6 +4068,8 @@ function initializeTeamsUserRoles() {
4045
4068
  deletedTemplateRoles: deletedRoles
4046
4069
  };
4047
4070
 
4071
+ invalidateRolesCache(teamId);
4072
+
4048
4073
  await this._appwrite.teams.updatePrefs({
4049
4074
  teamId: teamId,
4050
4075
  prefs: updatedPrefs
@@ -4080,6 +4105,7 @@ function initializeTeamsUserRoles() {
4080
4105
  ...currentPrefs,
4081
4106
  roles: updatedRoles
4082
4107
  };
4108
+ invalidateRolesCache(teamId);
4083
4109
  await this._appwrite.teams.updatePrefs({
4084
4110
  teamId: teamId,
4085
4111
  prefs: updatedPrefs
@@ -2,7 +2,7 @@
2
2
 
3
3
  (function () {
4
4
 
5
- const MANIFEST_BUILD_VERSION = '0.5.199-next.1';
5
+ const MANIFEST_BUILD_VERSION = '0.5.199-next.2';
6
6
 
7
7
  /* Manifest Data Sources - Appwrite Integration */
8
8
 
@@ -35,6 +35,7 @@
35
35
  pending: new Map(), // conversationId | INDEX -> due time
36
36
  timer: null,
37
37
  saved: new Map(), // conversationId -> { messages, savedAt }
38
+ windows: new Map(), // conversationId -> { messages, savedAt } last known window (disk read or written snapshot) for synchronous re-opens
38
39
  generation: 0,
39
40
  watching: false,
40
41
  resetQueued: false
@@ -132,6 +133,7 @@
132
133
  state.indexPromise = null;
133
134
  state.indexDirty = false;
134
135
  state.saved.clear();
136
+ state.windows.clear();
135
137
  for (const h of state.handles.values()) { try { h.reset(); } catch (_) { } }
136
138
  cancel();
137
139
  }
@@ -158,25 +160,36 @@
158
160
  return state.indexPromise;
159
161
  }
160
162
 
161
- // Recency bump; beyond the cap the oldest conversations' records are deleted
163
+ // Move to the front of the index; beyond the cap the oldest conversations' records are deleted
164
+ function promote(recent, conversationId) {
165
+ const i = recent.indexOf(conversationId);
166
+ if (i === 0) return;
167
+ if (i > -1) recent.splice(i, 1);
168
+ recent.unshift(conversationId);
169
+ const evicted = recent.splice(state.config.conversations);
170
+ const r = records();
171
+ for (const id of evicted) { state.pending.delete(id); state.saved.delete(id); state.windows.delete(id); }
172
+ if (evicted.length) r.delete(evicted.map(id => r.key('chat', id))).catch(noop);
173
+ state.indexDirty = true;
174
+ state.pending.set(INDEX, Date.now() + WRITE_DEBOUNCE_MS);
175
+ schedule();
176
+ }
177
+
178
+ // Recency bump for a conversation already in the index; a new one earns its slot on its first non-empty write
162
179
  function opened(conversationId) {
163
180
  if (conversationId == null) return;
164
181
  const gen = state.generation;
165
182
  ensureIndex().then(recent => {
166
183
  if (gen !== state.generation || !enabled()) return;
167
- const i = recent.indexOf(conversationId);
168
- if (i > -1) recent.splice(i, 1);
169
- recent.unshift(conversationId);
170
- const evicted = recent.splice(state.config.conversations);
171
- const r = records();
172
- for (const id of evicted) { state.pending.delete(id); state.saved.delete(id); }
173
- if (evicted.length) r.delete(evicted.map(id => r.key('chat', id))).catch(noop);
174
- state.indexDirty = true;
175
- state.pending.set(INDEX, Date.now() + WRITE_DEBOUNCE_MS);
176
- schedule();
184
+ if (recent.includes(conversationId)) promote(recent, conversationId);
177
185
  }).catch(noop);
178
186
  }
179
187
 
188
+ // Last known window for a conversation this generation (synchronous; re-opens and handle swaps)
189
+ function peek(conversationId) {
190
+ return (enabled() && conversationId != null && state.windows.get(conversationId)) || null;
191
+ }
192
+
180
193
  // ---- hydrate (read path) ----------------------------------------------------
181
194
  // Record + index in one transaction on the first open; later opens read the record only
182
195
  function hydrate(conversationId) {
@@ -208,7 +221,9 @@
208
221
  return null;
209
222
  }
210
223
  state.saved.set(conversationId, { messages: rec.rows.length, savedAt: rec.savedAt });
211
- return { messages: rec.rows, savedAt: rec.savedAt };
224
+ const window_ = { messages: rec.rows, savedAt: rec.savedAt };
225
+ if (!state.windows.has(conversationId)) state.windows.set(conversationId, window_);
226
+ return window_;
212
227
  }
213
228
 
214
229
  // ---- snapshot (write path) --------------------------------------------------
@@ -267,14 +282,21 @@
267
282
  const gen = state.generation;
268
283
  const r = records();
269
284
  const savedAt = Date.now();
270
- const list = [];
285
+ const candidates = new Map();
271
286
  for (const id of due) {
272
287
  if (id === INDEX) continue;
273
288
  const h = state.handles.get(id);
274
- if (!h || !recent.includes(id)) continue;
289
+ if (!h) continue;
275
290
  let rows = null;
276
291
  try { const msgs = h.snapshot(); rows = msgs && msgs.length ? snapshotOf(msgs) : null; } catch (_) { rows = null; }
277
292
  if (!rows) continue;
293
+ if (!recent.includes(id)) promote(recent, id); // first non-empty write earns the slot
294
+ candidates.set(id, rows);
295
+ }
296
+ const list = [];
297
+ for (const [id, rows] of candidates) {
298
+ if (!recent.includes(id)) continue; // evicted by a later candidate in this same flush
299
+ state.windows.set(id, { messages: rows, savedAt });
278
300
  list.push({ key: r.key('chat', id), kind: 'chat', conversation: id, rows, savedAt });
279
301
  }
280
302
  if (state.indexDirty) { list.push({ key: r.key('chat'), kind: 'chat-index', recent: recent.slice(), savedAt }); state.indexDirty = false; }
@@ -317,7 +339,7 @@
317
339
 
318
340
  window.ManifestChatPersist = {
319
341
  WRITE_DEBOUNCE_MS,
320
- configure, bootstrap, enabled, hydrate, opened, touch, attach, anyStale, persistence, flushPending, reset,
342
+ configure, bootstrap, enabled, hydrate, opened, peek, touch, attach, anyStale, persistence, flushPending, reset,
321
343
  config: () => state.config,
322
344
  state
323
345
  };
@@ -562,12 +584,14 @@
562
584
  commit(); commitParticipants(); commitTyping();
563
585
  }
564
586
 
565
- if (P() && !isAggregate) detach = P().attach(conversationId, { snapshot, reset, stale: () => state.stale, count: () => _msgs.length });
587
+ if (P() && !isAggregate && opts.persist !== false) detach = P().attach(conversationId, { snapshot, reset, stale: () => state.stale, count: () => _msgs.length });
566
588
 
567
589
  async function open() {
568
590
  state.status = 'loading';
569
591
  if (detach) {
570
- P().hydrate(conversationId).then(h => { if (h) hydrateWindow(h.messages); }).catch(() => { });
592
+ const known = P().peek(conversationId); // re-open or handle swap: window already in memory, no read to lose the race
593
+ if (known) hydrateWindow(known.messages);
594
+ else P().hydrate(conversationId).then(h => { if (h) hydrateWindow(h.messages); }).catch(() => { });
571
595
  P().opened(conversationId);
572
596
  }
573
597
  try {
@@ -2,7 +2,7 @@
2
2
 
3
3
  (function () {
4
4
 
5
- const MANIFEST_BUILD_VERSION = '0.5.199-next.1';
5
+ const MANIFEST_BUILD_VERSION = '0.5.199-next.2';
6
6
 
7
7
  /* Manifest Data Sources - Configuration */
8
8
 
@@ -1536,6 +1536,11 @@ window.ManifestDataStore = {
1536
1536
  sources: new Map(), // source -> config (+ rows/savedAt bookkeeping)
1537
1537
  filters: new Map(), // source -> row filter
1538
1538
  scopeExpr: null,
1539
+ scopePending: false, // a scope expression that has not resolved yet (auth still booting): no keys, no wipes, no resets
1540
+ authExpected: false, // manifest.appwrite.auth present: the scope may still resolve once identity/teams load
1541
+ teamsExpected: false,
1542
+ authSettled: false,
1543
+ settleTimer: null,
1539
1544
  scopeFn: null,
1540
1545
  scope: '',
1541
1546
  generation: 0,
@@ -1634,7 +1639,9 @@ window.ManifestDataStore = {
1634
1639
  state.dbName = `manifest:${origin}${projectId ? `:${projectId}` : ''}`;
1635
1640
  state.enabled = (state.sources.size > 0 || state.external) && typeof indexedDB !== 'undefined' && !!indexedDB;
1636
1641
  if (!state.enabled) return false;
1642
+ watchAuthSettle(manifest);
1637
1643
  state.scope = evaluateScope();
1644
+ state.scopePending = pendingScope(state.scope);
1638
1645
  watchScope();
1639
1646
  return state.sources.size > 0;
1640
1647
  }
@@ -1648,6 +1655,7 @@ window.ManifestDataStore = {
1648
1655
  if (!state.dbName) state.dbName = `manifest:${(typeof location !== 'undefined' && location.origin) || 'null'}`;
1649
1656
  if (!state.frameworkVersion) state.frameworkVersion = buildVersion;
1650
1657
  state.scope = evaluateScope();
1658
+ state.scopePending = pendingScope(state.scope);
1651
1659
  watchScope();
1652
1660
  return true;
1653
1661
  }
@@ -1692,6 +1700,36 @@ window.ManifestDataStore = {
1692
1700
  });
1693
1701
  }
1694
1702
 
1703
+ // With an expression configured and auth still booting, an empty value means "not known yet"
1704
+ function pendingScope(value) { return !!state.scopeExpr && value === '' && state.authExpected && !state.authSettled; }
1705
+
1706
+ // Identity and teams are known (or will never load): an empty scope is now a real single-tenant scope
1707
+ function settleAuth() {
1708
+ if (state.authSettled) return;
1709
+ state.authSettled = true;
1710
+ if (state.settleTimer) { clearTimeout(state.settleTimer); state.settleTimer = null; }
1711
+ if (state.enabled && state.scopePending) changeScope(evaluateScope());
1712
+ }
1713
+
1714
+ function watchAuthSettle(manifest) {
1715
+ state.authExpected = !!(manifest && manifest.appwrite && manifest.appwrite.auth);
1716
+ state.teamsExpected = !!(state.authExpected && manifest.appwrite.auth.teams);
1717
+ state.authSettled = false;
1718
+ if (!state.authExpected || typeof window === 'undefined') { state.authSettled = true; return; }
1719
+ const auth = (typeof Alpine !== 'undefined' && Alpine.store) ? Alpine.store('auth') : null;
1720
+ if (auth && auth._initialized && (!state.teamsExpected || !auth.isAuthenticated || (auth.teams && auth.teams.length))) { state.authSettled = true; return; }
1721
+ if (!state.settleWatching) {
1722
+ state.settleWatching = true;
1723
+ window.addEventListener('manifest:auth:teams-loaded', settleAuth);
1724
+ window.addEventListener('manifest:auth:initialized', (e) => { if (!state.teamsExpected || !(e.detail && e.detail.isAuthenticated)) settleAuth(); });
1725
+ window.addEventListener('manifest:auth:logout', settleAuth);
1726
+ window.addEventListener('manifest:auth:session-cleared', settleAuth);
1727
+ window.addEventListener('manifest:auth:anonymous', () => { if (!state.teamsExpected) settleAuth(); });
1728
+ }
1729
+ if (state.settleTimer) clearTimeout(state.settleTimer);
1730
+ state.settleTimer = setTimeout(settleAuth, 10000); // never pending forever
1731
+ }
1732
+
1695
1733
  function evaluateScope() {
1696
1734
  if (!state.scopeExpr) return '';
1697
1735
  try {
@@ -1734,19 +1772,27 @@ window.ManifestDataStore = {
1734
1772
  // cleared (older loads discarded), new scope hydrates
1735
1773
  function changeScope(next) {
1736
1774
  const prev = state.scope;
1775
+ const wasPending = state.scopePending;
1737
1776
  state.scope = next;
1777
+ state.scopePending = pendingScope(next);
1738
1778
  state.generation++;
1739
1779
  cancelWrites();
1740
1780
  state.hydrated.clear();
1741
1781
  state.fetchKicked.clear();
1742
- const ds = dataStore();
1743
- for (const [source, cfg] of state.sources) {
1744
- cfg.rows = null;
1745
- cfg.savedAt = null;
1746
- ds?.resetSource?.(source);
1782
+ // pending → resolved is boot, not a switch: rows loaded meanwhile stay (hydrate skips fresh sources), nothing is wiped
1783
+ if (!wasPending) {
1784
+ const ds = dataStore();
1785
+ for (const [source, cfg] of state.sources) {
1786
+ cfg.rows = null;
1787
+ cfg.savedAt = null;
1788
+ ds?.resetSource?.(source);
1789
+ }
1790
+ if (prev !== next) deleteScope(prev);
1791
+ }
1792
+ if (!state.scopePending) {
1793
+ hydrateBoot();
1794
+ if (wasPending) onLanded([...state.sources.keys()]); // rows that landed while pending get written under the real scope
1747
1795
  }
1748
- if (prev !== next) deleteScope(prev);
1749
- hydrateBoot();
1750
1796
  if (typeof window !== 'undefined') {
1751
1797
  try { window.dispatchEvent(new CustomEvent('manifest:persist:scope', { detail: { scope: next, previous: prev } })); } catch { /* no-op */ }
1752
1798
  }
@@ -1948,7 +1994,7 @@ window.ManifestDataStore = {
1948
1994
 
1949
1995
  // Landing hook (store flush): each landing restarts that source's 500ms debounce
1950
1996
  function onLanded(sources) {
1951
- if (!state.enabled || state.disabled) return;
1997
+ if (!state.enabled || state.disabled || state.scopePending) return; // nothing is keyed under an unresolved scope
1952
1998
  const at = Date.now() + WRITE_DEBOUNCE_MS;
1953
1999
  for (const source of sources) if (state.sources.has(source)) state.pending.set(source, at);
1954
2000
  if (state.writeTimer !== null) { clearTimeout(state.writeTimer); state.writeTimer = null; }
@@ -1971,7 +2017,7 @@ window.ManifestDataStore = {
1971
2017
  async function hydrate(sources) {
1972
2018
  const ds = dataStore();
1973
2019
  const pending = sources.filter(source => state.sources.has(source) && !state.hydrated.has(source));
1974
- if (!ds || !pending.length || !state.enabled || state.disabled) return;
2020
+ if (!ds || !pending.length || !state.enabled || state.disabled || state.scopePending) return;
1975
2021
  for (const source of pending) state.hydrated.add(source);
1976
2022
  const generation = state.generation;
1977
2023
  const scope = state.scope;
@@ -2002,7 +2048,7 @@ window.ManifestDataStore = {
2002
2048
 
2003
2049
  // Boot tier: all keys in one read; the caller caps the wait (cold boot never blocks)
2004
2050
  function hydrateBoot(options = {}) {
2005
- if (!state.enabled || state.disabled) return Promise.resolve();
2051
+ if (!state.enabled || state.disabled || state.scopePending) return Promise.resolve();
2006
2052
  const run = hydrate(bootSources()).catch(() => { /* disabled */ });
2007
2053
  const maxWaitMs = options.maxWaitMs;
2008
2054
  if (!Number.isFinite(maxWaitMs)) return run;
@@ -1,17 +1,17 @@
1
1
  {
2
- "manifest.appwrite.auth.js": "sha384-lWvffK6C2Zs9dOiMh/0OQTnU2ycZq1USOeJDlPUgJsbtrdA9+3zq4VHcIdS40qR0",
3
- "manifest.appwrite.data.js": "sha384-C2EDm2EsuWW9PTtvXtU1nTBrDAUaIjWc3fY5YuuHsRV0MjRlZ0u9J0UYuQW4g41o",
2
+ "manifest.appwrite.auth.js": "sha384-Dy5NIqlV3TdKC87VYMqikQ2kZAPGdGy7wVIqcR92XYb47v+0Dn/YTPZsJdg6YhMT",
3
+ "manifest.appwrite.data.js": "sha384-rBxJHvm65pKByB3p5uNmCPvm56LXOJ5BFprVuZPcEFjSbi17WBQL0q49hAXl5gxW",
4
4
  "manifest.appwrite.presences.js": "sha384-JyVDWFT69b7Svq8J8p9tNWe2v9PZNQBY5UyhtOl1vnuHFAX0CRQ3MA9SiKq5wzNh",
5
5
  "manifest.bindings.js": "sha384-lPtMf8Ykaic9gNVZKq8Scia1881ZeMAyxer3WCIkUNwwrgzGBWto1OXADUwjvORF",
6
6
  "manifest.charts.js": "sha384-qQrjhWkIDi4oU5uQrpy8DdlMjY+gfiivBuX6mssNiFdkawgkVBvKneGgp+nd3PYJ",
7
- "manifest.chat.js": "sha384-1c6+WsGivAlFSeTegFLmL0hjs48hIjlpLP7bWW/cjK+glQlWIYq76KfJiBBHRRxj",
7
+ "manifest.chat.js": "sha384-5SEd0T5cInCswUcbAH7CuKYuzCu9nPoGOsCjSo22UVksHkxZ5OY78ZWTjeVQtR9M",
8
8
  "manifest.code.js": "sha384-aoQ4E26vrhNe/+tL7K0h90c8/0ies7e8oIR6Ay92he2X3dnWZ+OPcn2Dna8fmc+c",
9
9
  "manifest.color.js": "sha384-6Rv3LxyTcZNjrhtayQfqRdCx0uSZ4BiEbgEI98I62eTvp8Aw7LBIoNJ0Je1oktwL",
10
10
  "manifest.colorpicker.js": "sha384-1+ZV5Hhjf7WnGP7b71Cqa5h3BKW8UgGT5V14i8Q+aF5zH8Xxwowt/ibSUVsiIHSm",
11
11
  "manifest.combobox.js": "sha384-SN3XHumoebxcduFQqx5zt65/Cd10y8nuf9Gkco6UnsZ42sadRd+gvVLfWPdkkuPH",
12
12
  "manifest.components.js": "sha384-HEyeJtV20k7po8WH0LEj800MlsqgDH0vE5GTAl62SgdEhn1aJ7VfryQcA6yIi18U",
13
13
  "manifest.computed.js": "sha384-GYML/e81gQfN+iDbqhPUgny8bINCyL+SrbTofoGk4hlCnLLjv51mCv42JMqq+ku5",
14
- "manifest.data.js": "sha384-5hH1ym307YXcSqTGfUKoRPnj1lZI6bjnkRr/okJhWLy+QyUN7pcrOe6TbNxKOPCU",
14
+ "manifest.data.js": "sha384-2PDbtqCZnYLWR4enzYvj93csIQX2pC1HhFDmTGFrTb3v0IS2FzZ0cgatZ6RPR50y",
15
15
  "manifest.datepicker.js": "sha384-8vTJYkLqqvgXgm1w1becuaRR/jUEpiLBjBJ6RsRbUr+ZkypvspD6EsssuDrX4SQq",
16
16
  "manifest.defer.js": "sha384-t/g++osVS3qDXeY8+gfxUtLF9o0SCQQJKNxHGpb8NkIciDvxOAvA6sFIVcM0AKeA",
17
17
  "manifest.dropdowns.js": "sha384-4HuHkBt4i8sTPUDLB9rNLli2/lWLY1tjtCLzey37gRwueG+FRLCnVH1q7ljiVvJR",
@@ -27,7 +27,7 @@
27
27
  "manifest.slides.js": "sha384-3uRTkyK9XPLmnxI2+igZlpi4EyPlU/7IHj5j3BZJJ2KN455vXyk99fiXV3feO/XY",
28
28
  "manifest.status.js": "sha384-fXqDnKwldB7XRxcfEQYTm/WqLl2oP24xY2Znq8FqnFM9LQo0zrQkXszqAOksArUX",
29
29
  "manifest.svg.js": "sha384-qr/8H9+2cIhSXNbRWRtIdrDlTOxKlNJqwEefHvCYoiBNW/kKhPTFa109Orv/EBnb",
30
- "manifest.sw.js": "sha384-99glzEjzhOxUy6yUID+Exx7mHVs78XKdoPRL7nWvdXpdX9uMgFHWSIWBinuRYfml",
30
+ "manifest.sw.js": "sha384-lzc4R7OpLBlr8VS6OfudGQVrKdEny+1etglkfsLUQ3pX0Z3JJWagy0rl/amf5xnW",
31
31
  "manifest.tabs.js": "sha384-OIIcyaQnGS0eNYk4zgAFEDboNYect7THvUd9D0V6nqCeDOxQcoiqLrBEmmWVTTet",
32
32
  "manifest.tailwind.js": "sha384-r/Jvqb+Piz21jUts10BbVAJoKkShOdJRVFpywyi4HPIi/OfOJq5CtPyWAPbdkMgt",
33
33
  "manifest.text.edit.js": "sha384-1LsuOJyMCgab7W9w6DJEu5URzbadYxtq/cHtB8sN3hBFa/BHPnjdnTRbiKyM0FcC",
@@ -16,7 +16,7 @@
16
16
 
17
17
  // Build stamps the published version here; unstamped (dev) falls back to the
18
18
  // registration URL's `v`, then 'dev'.
19
- const BUILD_VERSION = '0.5.199-next.1';
19
+ const BUILD_VERSION = '0.5.199-next.2';
20
20
  const CACHE_PREFIX = 'mnfst-sw:';
21
21
  const META_CACHE = CACHE_PREFIX + 'meta';
22
22
  const SWR_CAP = 200;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mnfst",
3
- "version": "0.5.199-next.1",
3
+ "version": "0.5.199-next.2",
4
4
  "private": false,
5
5
  "workspaces": [
6
6
  "templates/starter",